[
  {
    "path": ".github/ISSUE_TEMPLATE/bug-report-------.md",
    "content": "---\nname: Bug report | 故障报告\nabout: To help us improve | 帮助我们变得更好\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Describe the bug | 问题描述**\n\n**To Reproduce | 如何重现**\n\n**Expected behavior | 期望结果**\n\n**Screenshots | 相关截图**\n\n**System Info | 系统信息:**\n - Mouse: [e.g. Logitech MX Master]\n - OS: [e.g. iOS]\n - Browser [e.g. chrome, safari]\n - Version [e.g. v69]\n -  Application [e.g. Safari, Chrome, Whole System]\n\n**Additional context | 额外说明**\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature-request-------.md",
    "content": "---\nname: Feature request | 功能请求\nabout: Suggest an idea for this project | 提出你的新点子\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**这个问题是否源自某个缺陷？如果是，可于此处描述一下 | Is your feature request related to a problem? Please describe.**\n\n**说说你的新点子 | Describe the solution you'd like**\n\n**还有别的替代方案吗？ | Describe alternatives you've considered**\n\n**额外说明 | Additional context**\n"
  },
  {
    "path": ".gitignore",
    "content": "# docs\nwebsite/.idea\nwebsite/.next\nwebsite/node_modules\nwebsite/out\n\n# macOS\n.DS_Store\n\n# XCode\nxcuserdata\n*.xcuserstate\n*.xcuserdated\n\n# Sparkle signing keys (keep private!)\nsparkle_private_key.txt\n\n# build\nbuild/*.zip\n/build\n/spec\n"
  },
  {
    "path": ".last-release-commit",
    "content": "428607d00ab65498e548b2d942bf675069cf40a2\n"
  },
  {
    "path": ".skills/release-preparation/SKILL.md",
    "content": "---\nname: release-preparation\ndescription: Use when preparing a new Mos release (stable, beta, or alpha) - covers version bump, xcodebuild archive, Developer ID signing, notarization, zip packaging, changelog generation, Sparkle appcast signing, and GitHub release draft creation. Trigger this skill whenever the user mentions releasing, publishing, shipping a new version, bumping version, updating appcast, or creating a release build of Mos.\n---\n\n# Release Preparation\n\nFull release pipeline: bump version → build → sign → notarize → package zip → generate changelog → sign appcast → create GH draft.\n\n## Inputs\n\n| Input | Source |\n|-------|--------|\n| Mos.app | Built via xcodebuild archive + Developer ID export (Step 0) |\n| Version / Build | `MARKETING_VERSION` / `CURRENT_PROJECT_VERSION` in `Mos.xcodeproj/project.pbxproj` |\n| Channel | User specifies: `stable`, `beta`, or `alpha` |\n| Signing key | macOS Keychain — Apple Developer ID (code signing) + Sparkle EdDSA (appcast) |\n| Notarization | macOS Keychain profile `notarytool` (stores Apple ID + app-specific password) |\n\n## Flow\n\n```dot\ndigraph release {\n  rankdir=TB;\n  node [shape=box];\n\n  \"0. Build, sign & notarize\" -> \"1. Package zip\";\n  \"1. Package zip\" -> \"2. Generate changelog\";\n  \"2. Generate changelog\" -> \"3. Interactive confirm\";\n  \"3. Interactive confirm\" -> \"4. Sign & update appcast\";\n  \"4. Sign & update appcast\" -> \"5. Commit appcast\";\n  \"5. Commit appcast\" -> \"6. Create GH draft\";\n  \"6. Create GH draft\" -> \"7. Verify\";\n  \"7. Verify\" -> \"8. User publishes + git push\";\n}\n```\n\n### Step 0: Build, Sign & Notarize\n\n1. **Bump version** in `Mos.xcodeproj/project.pbxproj`:\n   - `MARKETING_VERSION` — e.g., `4.0.2` (appears twice, use `replace_all`)\n   - `CURRENT_PROJECT_VERSION` — build number in `YYYYMMDD.N` format (appears twice, use `replace_all`).\n     **CRITICAL**: Every release MUST have a unique `CURRENT_PROJECT_VERSION`. Sparkle uses this value (`sparkle:version`) to detect updates — if two releases share the same build number, users on the older version will never see the update. Always bump this even for hotfix releases.\n   - Commit the version bump.\n\n2. **Archive**:\n   ```bash\n   xcodebuild archive \\\n     -scheme Debug \\\n     -project Mos.xcodeproj \\\n     -configuration Release \\\n     -archivePath /tmp/Mos.xcarchive\n   ```\n   Note: The scheme is named \"Debug\" but `-configuration Release` ensures Release build settings.\n\n3. **Export with Developer ID** (Direct Distribution):\n   ```bash\n   cat > /tmp/ExportOptions.plist << 'PLIST'\n   <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n   <!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n   <plist version=\"1.0\">\n   <dict>\n     <key>method</key><string>developer-id</string>\n     <key>teamID</key><string>N7Z52F27XK</string>\n     <key>signingStyle</key><string>automatic</string>\n   </dict>\n   </plist>\n   PLIST\n\n   xcodebuild -exportArchive \\\n     -archivePath /tmp/Mos.xcarchive \\\n     -exportOptionsPlist /tmp/ExportOptions.plist \\\n     -exportPath /tmp/MosExport \\\n     -allowProvisioningUpdates\n   ```\n   If export fails with \"network connection was lost\", retry — Apple's notarization service can be flaky.\n\n4. **Notarize** (`xcodebuild -exportArchive` does NOT auto-notarize via CLI — must always do manually):\n   ```bash\n   # Note: this zip is only for notarization submission, not for distribution.\n   # AppleDouble flags (--norsrc --noextattr) are not needed here — only in prepare_zip.sh for the release zip.\n   ditto -c -k --keepParent /tmp/MosExport/Mos.app /tmp/Mos-notarize.zip\n   xcrun notarytool submit /tmp/Mos-notarize.zip --keychain-profile \"notarytool\" --wait\n   xcrun stapler staple /tmp/MosExport/Mos.app\n   ```\n\n5. **Verify**:\n   ```bash\n   codesign -dvv /tmp/MosExport/Mos.app 2>&1 | grep Authority\n   # Should show: Developer ID Application: BIAO CHEN (N7Z52F27XK)\n   spctl --assess --type execute --verbose /tmp/MosExport/Mos.app\n   # Should show: accepted, source=Notarized Developer ID\n   ```\n\nThe notarized app at `/tmp/MosExport/Mos.app` is used for Step 1.\n\n### Step 1: Package Zip\n\n```bash\nbash .skills/release-preparation/scripts/prepare_zip.sh /tmp/MosExport/Mos.app [--channel beta]\n```\n\nReturns JSON with `zip_path`, `version`, `build`, `tag`, `zip_name`, `length`.\n\n**IMPORTANT — AppleDouble / Gatekeeper**: The script uses `ditto -c -k --norsrc --noextattr --keepParent` to create the zip. The `--norsrc --noextattr` flags are **mandatory** — without them, `ditto` serializes macOS extended attributes as AppleDouble (`._*`) files inside the zip. When users extract via Finder/Archive Utility (not `ditto -x -k`), these `._*` entries appear as real files in embedded framework root directories (e.g., `Sparkle.framework/._Autoupdate`), causing Gatekeeper to reject with \"unsealed contents present in the root directory of an embedded framework\". This issue is **not detectable** by `spctl --assess` on the build machine because `ditto -x -k` correctly reconverts `._*` files back to xattrs — only Finder extraction triggers the failure.\n\nAfter packaging, verify the zip is clean:\n```bash\n# Must show NO ._* entries\nzipinfo -1 \"$ZIP_PATH\" | grep '/\\._' && echo \"ERROR: AppleDouble files found!\" || echo \"OK: no AppleDouble files\"\n```\n\n### Step 2: Generate Changelog\n\n**This is AI work, not scripted.** Follow these rules:\n\n1. Find last release tag:\n   ```bash\n   gh release list --repo Caldis/Mos --limit 1 --json tagName,isPrerelease\n   git rev-parse <tag>  # get exact commit SHA\n   ```\n2. Get changes: `git log <last_tag>..HEAD --no-merges --oneline` excluding `website/`, `docs/`, `.issues-archive/`, `CLAUDE.md`, `LOCALIZATION.md`, `build/`, `dmg/`, `CRASH_FIX_DESIGN*`.\n3. Categorize into: 新功能/New Features, 优化/Improvements, 修复/Fixes.\n4. Find contributors: cross-reference `git log --format=\"%an\"` with `gh api repos/.../commits/<sha> --jq '.author.login'`. Inline credit in the relevant section (e.g., \"修复鼠标中键映射问题, 感谢 @GonzFC\"), NOT in a separate section.\n5. Match tone of `CHANGELOG.md` — bilingual (Chinese first, `---` separator, then English).\n6. Write both formats:\n   - **Markdown** → `~/Desktop/release-notes-{version}.md` (for GH release body). Must include wiki links header before each language section:\n     ```markdown\n     > 如果应用无法启动或遇到权限问题, 请参考 [Wiki: 如果应用无法正常运行](https://github.com/Caldis/Mos/wiki/%E5%A6%82%E6%9E%9C%E5%BA%94%E7%94%A8%E6%97%A0%E6%B3%95%E6%AD%A3%E5%B8%B8%E8%BF%90%E8%A1%8C)\n\n     ## 修复\n     - ...\n\n     ---\n\n     > If the application fails to start or encounters permission issues, please refer [Wiki: If the App not work properly](https://github.com/Caldis/Mos/wiki/If-the-App-not-work-properly)\n\n     ## Fixes\n     - ...\n     ```\n   - **HTML** → `/tmp/changelog-{version}.html` (for appcast CDATA). Use `<h2>` + `<ul><li>`, with `<hr/>` separating Chinese and English:\n     ```html\n     <h2>修复</h2>\n     <ul>\n     <li>修复平滑滚动导致的崩溃问题</li>\n     </ul>\n\n     <hr/>\n\n     <h2>Fixes</h2>\n     <ul>\n     <li>Fix crash caused by smooth scrolling</li>\n     </ul>\n     ```\n\n### Step 3: Interactive Confirm\n\n**MUST use `AskUserQuestion`** to confirm changelog items. Never list items as text and ask user to type numbers.\n\nAfter confirmation, sync any user edits from markdown back to HTML. Always keep both formats in sync.\n\n### Step 4: Sign & Update Appcast\n\n```bash\nbash .skills/release-preparation/scripts/update_appcast.sh <zip_path> /tmp/changelog-{version}.html [--tag TAG]\n```\n\nUses Sparkle `sign_update` from Xcode DerivedData (reads EdDSA key from Keychain). If key missing, guide user:\n```bash\n# Find generate_keys tool\nfind ~/Library/Developer/Xcode/DerivedData -name \"generate_keys\" -not -path \"*/checkouts/*\" | head -1\n# Import: generate_keys -f <key_file>\n# Export: generate_keys -x <output_file>\n```\n\nThe script writes to both `build/appcast.xml` and `docs/appcast.xml`.\n\n### Step 5: Commit Appcast\n\nOnly `docs/appcast.xml` is tracked by git (`build/` is gitignored):\n```bash\ngit add docs/appcast.xml\ngit commit -m \"chore: update appcast for {version}\"\n```\n\n### Step 6: Create GitHub Draft\n\n```bash\nbash .skills/release-preparation/scripts/create_gh_draft.sh <tag> <zip_path> ~/Desktop/release-notes-{version}.md [--prerelease]\n```\n\nAdd `--prerelease` for beta/alpha channels. This creates a **draft** — never publish without user approval.\n\n### Step 7: Verify\n\n```bash\ngh release view <tag> --repo Caldis/Mos --json tagName,isDraft,assets \\\n  --jq '{tag: .tagName, draft: .isDraft, assets: [.assets[] | {name: .name, size: .size}]}'\n```\n\nConfirm asset URL matches appcast `<enclosure url=\"...\">`.\n\n### Step 8: User Publishes\n\nUser reviews draft on GitHub and publishes. After publishing:\n```bash\ngit push origin master\n```\nThis pushes the appcast update so Sparkle auto-update can find it.\n\n## Naming Conventions\n\n| | Stable | Beta/Alpha |\n|---|---|---|\n| Zip | `Mos.Versions.{ver}-{YYYYMMDD.N}.zip` | `Mos.Versions.{ver}-beta-{YYYYMMDD.N}.zip` |\n| Tag | `{ver}` | `{ver}-beta-{YYYYMMDD.N}` |\n| Download URL | `.../download/{ver}/Mos.Versions...zip` | `.../download/{ver}-beta-.../Mos.Versions...zip` |\n\n## Common Issues\n\n| Problem | Fix |\n|---------|-----|\n| Export fails with \"network connection was lost\" | Retry — Apple notarization service can be intermittent |\n| `spctl --assess` rejected after export | Notarization not auto-applied; manually submit with `notarytool` + `stapler staple` |\n| `sign_update` not found | Build project in Xcode first to fetch Sparkle SPM package |\n| Signing key not in Keychain | Use `generate_keys -f <key_file>` to import Sparkle EdDSA key |\n| Developer ID cert missing from `security find-identity` | Download from Apple Developer portal or use Xcode → Settings → Accounts → Manage Certificates |\n| Appcast URL mismatch | Verify GH release tag matches appcast `<enclosure>` URL path |\n| Changelog out of sync | Always edit markdown first, then regenerate HTML before updating appcast |\n| Sparkle update not detected | Each release MUST have a unique `CURRENT_PROJECT_VERSION` (= `sparkle:version`). Sparkle compares this value, not `MARKETING_VERSION`. If two releases share the same build number, users will never see the update. |\n| Gatekeeper rejects downloaded app (\"Apple 无法验证\") | Zip likely contains AppleDouble `._*` files. Verify with `zipinfo -1 <zip> \\| grep '/\\._'`. Fix: use `ditto -c -k --norsrc --noextattr --keepParent` (already in `prepare_zip.sh`). Note: `spctl --assess` on build machine won't catch this — only Finder extraction triggers failure. |\n| `COPYFILE_DISABLE=1` doesn't work with `ditto` | This env var only works with `cp`, `tar`, etc. For `ditto`, use `--norsrc --noextattr` flags instead. |\n"
  },
  {
    "path": ".skills/release-preparation/scripts/create_gh_draft.sh",
    "content": "#!/usr/bin/env bash\n# create_gh_draft.sh - Create a GitHub release draft\n# Usage: create_gh_draft.sh <tag> <zip_path> <release_notes_md_file> [--prerelease]\nset -euo pipefail\n\nGITHUB_REPO=\"Caldis/Mos\"\n\ndie() { echo \"Error: $*\" >&2; exit 1; }\ncommand -v gh >/dev/null 2>&1 || die \"gh CLI not found\"\n\nTAG=\"${1:-}\"\nZIP_PATH=\"${2:-}\"\nNOTES_FILE=\"${3:-}\"\nPRERELEASE=()\n\nshift 3 2>/dev/null || true\nwhile [[ $# -gt 0 ]]; do\n  case \"$1\" in\n    --prerelease) PRERELEASE=(--prerelease); shift ;;\n    *) die \"Unknown arg: $1\" ;;\n  esac\ndone\n\n[[ -n \"$TAG\" ]] || die \"Usage: create_gh_draft.sh <tag> <zip_path> <notes_md_file> [--prerelease]\"\n[[ -f \"$ZIP_PATH\" ]] || die \"Zip not found: $ZIP_PATH\"\n[[ -f \"$NOTES_FILE\" ]] || die \"Notes file not found: $NOTES_FILE\"\n\n# Check if release already exists\nif gh release view \"$TAG\" --repo \"$GITHUB_REPO\" >/dev/null 2>&1; then\n  echo \"Release $TAG already exists. Updating...\"\n  gh release edit \"$TAG\" \\\n    --repo \"$GITHUB_REPO\" \\\n    --draft \\\n    --title \"$TAG\" \\\n    --notes-file \"$NOTES_FILE\" \\\n    ${PRERELEASE[@]+\"${PRERELEASE[@]}\"}\n  # Upload/replace asset\n  gh release upload \"$TAG\" \"$ZIP_PATH\" --repo \"$GITHUB_REPO\" --clobber\nelse\n  gh release create \"$TAG\" \"$ZIP_PATH\" \\\n    --repo \"$GITHUB_REPO\" \\\n    --draft \\\n    --notes-file \"$NOTES_FILE\" \\\n    --title \"$TAG\" \\\n    ${PRERELEASE[@]+\"${PRERELEASE[@]}\"}\nfi\n\necho \"[release] Draft created: https://github.com/${GITHUB_REPO}/releases/tag/${TAG}\"\n"
  },
  {
    "path": ".skills/release-preparation/scripts/prepare_zip.sh",
    "content": "#!/usr/bin/env bash\n# prepare_zip.sh - Package Mos.app into a release zip\n# Usage: prepare_zip.sh <path-to-Mos.app> [--channel stable|beta|alpha]\n# Output: JSON with zip_path, version, build, tag, zip_name\nset -euo pipefail\n\nROOT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")/../../../..\" && pwd)\"\nBUILD_DIR=\"$ROOT_DIR/build\"\n\ndie() { echo \"Error: $*\" >&2; exit 1; }\n\nAPP_PATH=\"${1:-}\"\nCHANNEL=\"stable\"\n\nshift || true\nwhile [[ $# -gt 0 ]]; do\n  case \"$1\" in\n    --channel) CHANNEL=\"$2\"; shift 2 ;;\n    *) die \"Unknown arg: $1\" ;;\n  esac\ndone\n\n[[ -n \"$APP_PATH\" ]] || die \"Usage: prepare_zip.sh <path-to-Mos.app> [--channel stable|beta|alpha]\"\n[[ -d \"$APP_PATH\" ]] || die \"Not found: $APP_PATH\"\n\n# Read version from app's Info.plist\nPLIST=\"$APP_PATH/Contents/Info.plist\"\n[[ -f \"$PLIST\" ]] || die \"Missing Info.plist: $PLIST\"\n\nSHORT_VERSION=$(/usr/libexec/PlistBuddy -c \"Print :CFBundleShortVersionString\" \"$PLIST\" 2>/dev/null) || die \"Cannot read CFBundleShortVersionString\"\nBUNDLE_VERSION=$(/usr/libexec/PlistBuddy -c \"Print :CFBundleVersion\" \"$PLIST\" 2>/dev/null) || die \"Cannot read CFBundleVersion\"\n\n# Build zip filename: Mos.Versions.{version}[-(alpha|beta)]-{YYYYMMDD.N}.zip\nCHANNEL_SUFFIX=\"\"\nTAG=\"$SHORT_VERSION\"\nif [[ \"$CHANNEL\" != \"stable\" ]]; then\n  CHANNEL_SUFFIX=\"-${CHANNEL}\"\n  TAG=\"${SHORT_VERSION}-${CHANNEL}-${BUNDLE_VERSION}\"\nfi\nZIP_NAME=\"Mos.Versions.${SHORT_VERSION}${CHANNEL_SUFFIX}-${BUNDLE_VERSION}.zip\"\n\nmkdir -p \"$BUILD_DIR\"\nZIP_PATH=\"$BUILD_DIR/$ZIP_NAME\"\n\n# Create zip without AppleDouble (._*) resource fork metadata.\n# ditto -c -k serializes extended attributes as ._* files inside the zip.\n# When extracted via Finder/Archive Utility, these appear as real files in\n# embedded framework root directories, causing Gatekeeper to reject with\n# \"unsealed contents present in the root directory of an embedded framework\".\n# --norsrc --noextattr prevent this entirely.\nditto -c -k --norsrc --noextattr --keepParent \"$APP_PATH\" \"$ZIP_PATH\"\n\nFILE_LENGTH=$(wc -c < \"$ZIP_PATH\" | tr -d '[:space:]')\n\ncat <<EOF\n{\n  \"zip_path\": \"$ZIP_PATH\",\n  \"zip_name\": \"$ZIP_NAME\",\n  \"version\": \"$SHORT_VERSION\",\n  \"build\": \"$BUNDLE_VERSION\",\n  \"channel\": \"$CHANNEL\",\n  \"tag\": \"$TAG\",\n  \"length\": $FILE_LENGTH\n}\nEOF\n"
  },
  {
    "path": ".skills/release-preparation/scripts/update_appcast.sh",
    "content": "#!/usr/bin/env bash\n# update_appcast.sh - Sign zip and update appcast.xml\n# Usage: update_appcast.sh <zip_path> <changelog_html_file> [--tag TAG]\n# Reads signing key from macOS Keychain via Sparkle sign_update tool\nset -euo pipefail\n\nROOT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")/../../../..\" && pwd)\"\nBUILD_DIR=\"$ROOT_DIR/build\"\nDOCS_DIR=\"$ROOT_DIR/docs\"\nGITHUB_REPO=\"Caldis/Mos\"\n\ndie() { echo \"Error: $*\" >&2; exit 1; }\ninfo() { echo \"[appcast] $*\"; }\n\nZIP_PATH=\"${1:-}\"\nCHANGELOG_FILE=\"${2:-}\"\nTAG_OVERRIDE=\"\"\n\nshift 2 2>/dev/null || true\nwhile [[ $# -gt 0 ]]; do\n  case \"$1\" in\n    --tag) TAG_OVERRIDE=\"$2\"; shift 2 ;;\n    *) die \"Unknown arg: $1\" ;;\n  esac\ndone\n\n[[ -n \"$ZIP_PATH\" && -f \"$ZIP_PATH\" ]] || die \"Usage: update_appcast.sh <zip_path> <changelog_html_file> [--tag TAG]\"\n[[ -n \"$CHANGELOG_FILE\" && -f \"$CHANGELOG_FILE\" ]] || die \"Changelog HTML file required\"\n\n# Find Sparkle sign_update tool (scoped to Mos project DerivedData)\nSIGN_UPDATE=$(find ~/Library/Developer/Xcode/DerivedData/Mos-* -path \"*/artifacts/sparkle/Sparkle/bin/sign_update\" 2>/dev/null | head -1)\n[[ -n \"$SIGN_UPDATE\" ]] || SIGN_UPDATE=$(find ~/Library/Developer/Xcode/DerivedData -name \"sign_update\" -not -path \"*/old_dsa_scripts/*\" -not -path \"*/checkouts/*\" 2>/dev/null | head -1)\n[[ -n \"$SIGN_UPDATE\" ]] || die \"Sparkle sign_update not found. Build the project in Xcode first.\"\n\n# Sign the zip (reads EdDSA key from Keychain)\nSIGN_OUTPUT=$(\"$SIGN_UPDATE\" \"$ZIP_PATH\" 2>&1) || die \"Signing failed. Import key first: generate_keys -f <key_file>\"\n\nED_SIGNATURE=$(echo \"$SIGN_OUTPUT\" | grep -o 'sparkle:edSignature=\"[^\"]*\"' | sed 's/sparkle:edSignature=\"//;s/\"//')\nFILE_LENGTH=$(echo \"$SIGN_OUTPUT\" | grep -o 'length=\"[^\"]*\"' | sed 's/length=\"//;s/\"//')\n\n[[ -n \"$ED_SIGNATURE\" ]] || die \"Failed to parse edSignature from sign_update output\"\n[[ -n \"$FILE_LENGTH\" ]] || FILE_LENGTH=$(wc -c < \"$ZIP_PATH\" | tr -d '[:space:]')\n\n# Read version from zip's Info.plist\nVERSION_JSON=$(python3 - \"$ZIP_PATH\" <<'PY'\nimport json, plistlib, sys, zipfile\nwith zipfile.ZipFile(sys.argv[1]) as z:\n    candidates = [n for n in z.namelist() if n.endswith(\".app/Contents/Info.plist\")]\n    if not candidates: raise SystemExit(\"No Info.plist in zip\")\n    # Prefer shortest path (root app plist, not nested framework plists)\n    candidates.sort(key=len)\n    plist = plistlib.loads(z.read(candidates[0]))\n    print(json.dumps({\n        \"short\": plist.get(\"CFBundleShortVersionString\", \"\"),\n        \"build\": plist.get(\"CFBundleVersion\", \"\"),\n    }))\nPY\n)\nSHORT_VERSION=$(echo \"$VERSION_JSON\" | python3 -c \"import json,sys; print(json.load(sys.stdin)['short'])\")\nBUNDLE_VERSION=$(echo \"$VERSION_JSON\" | python3 -c \"import json,sys; print(json.load(sys.stdin)['build'])\")\n\nZIP_NAME=$(basename \"$ZIP_PATH\")\nTAG=\"${TAG_OVERRIDE:-$SHORT_VERSION}\"\nDOWNLOAD_URL=\"https://github.com/${GITHUB_REPO}/releases/download/${TAG}/${ZIP_NAME}\"\nPUB_DATE=$(date -u \"+%a, %d %b %Y %H:%M:%S %z\")\nCHANGELOG_HTML=$(cat \"$CHANGELOG_FILE\")\n\n# Detect channel from zip name\nCHANNEL_ELEMENT=\"\"\nENCLOSURE_CHANNEL=\"\"\nif [[ \"$ZIP_NAME\" == *\"-beta-\"* ]]; then\n  CHANNEL_ELEMENT=$'\\n      <sparkle:channel>beta</sparkle:channel>'\n  ENCLOSURE_CHANNEL=$'\\n        sparkle:channel=\"beta\"'\nelif [[ \"$ZIP_NAME\" == *\"-alpha-\"* ]]; then\n  CHANNEL_ELEMENT=$'\\n      <sparkle:channel>alpha</sparkle:channel>'\n  ENCLOSURE_CHANNEL=$'\\n        sparkle:channel=\"alpha\"'\nfi\n\n# Build new <item>\nNEW_ITEM=$(cat <<EOF\n    <item>\n      <title>Mos ${SHORT_VERSION}</title>\n${CHANNEL_ELEMENT}\n      <description><![CDATA[${CHANGELOG_HTML}]]></description>\n      <pubDate>${PUB_DATE}</pubDate>\n\n      <enclosure\n        url=\"${DOWNLOAD_URL}\"\n        length=\"${FILE_LENGTH}\"\n        type=\"application/octet-stream\"\n        sparkle:shortVersionString=\"${SHORT_VERSION}\"\n        sparkle:version=\"${BUNDLE_VERSION}\"\n        sparkle:edSignature=\"${ED_SIGNATURE}\"${ENCLOSURE_CHANNEL}\n      />\n    </item>\nEOF\n)\n\n# Merge into existing appcast (prepend new item, dedup by version)\nAPPCAST_BUILD=\"$BUILD_DIR/appcast.xml\"\nAPPCAST_DOCS=\"$DOCS_DIR/appcast.xml\"\n\nBASE_APPCAST=\"\"\n[[ -s \"$APPCAST_DOCS\" ]] && BASE_APPCAST=\"$APPCAST_DOCS\"\n[[ -z \"$BASE_APPCAST\" && -s \"$APPCAST_BUILD\" ]] && BASE_APPCAST=\"$APPCAST_BUILD\"\n\nAPPCAST_XML=$(NEW_ITEM=\"$NEW_ITEM\" python3 - \"$BASE_APPCAST\" \"$BUNDLE_VERSION\" <<'PY'\nimport os, re, sys\n\nbase_path = sys.argv[1].strip()\nnew_version = sys.argv[2].strip()\nnew_item = os.environ.get(\"NEW_ITEM\", \"\").strip()\n\nDEFAULT = \"\"\"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<rss version=\"2.0\"\n    xmlns:sparkle=\"http://www.andymatuschak.org/xml-namespaces/sparkle\"\n    xmlns:dc=\"http://purl.org/dc/elements/1.1/\">\n  <channel>\n    <title>Mos</title>\n    <link>https://mos.caldis.me/</link>\n    <description>Mos Updates</description>\n    <language>en</language>\n  </channel>\n</rss>\n\"\"\"\n\ntext = open(base_path, \"r\").read() if base_path and os.path.exists(base_path) else DEFAULT\nitem_re = re.compile(r\"<item\\b.*?</item>\", flags=re.S)\nmatches = list(item_re.finditer(text))\n\nif matches:\n    prefix = text[:matches[0].start()]\n    suffix = text[matches[-1].end():]\n    items = [m.group(0) for m in matches]\nelse:\n    insert_at = text.rfind(\"</channel>\")\n    if insert_at == -1:\n        text = DEFAULT\n        insert_at = text.rfind(\"</channel>\")\n    prefix = text[:insert_at]\n    suffix = text[insert_at:]\n    items = []\n\ndef extract_version(item):\n    m = re.search(r'sparkle:version=\"([^\"]+)\"', item)\n    return m.group(1) if m else \"\"\n\nfiltered = []\nseen = set()\nfor item in items:\n    v = extract_version(item)\n    if v == new_version or v in seen:\n        continue\n    if v: seen.add(v)\n    filtered.append(item)\n\nall_items = [new_item] + filtered\nsep = \"\\n\\n    \"\nout = prefix + sep.join(i.strip() for i in all_items if i.strip()) + suffix\nsys.stdout.write(out if out.endswith(\"\\n\") else out + \"\\n\")\nPY\n)\n\nmkdir -p \"$BUILD_DIR\" \"$DOCS_DIR\"\nprintf '%s' \"$APPCAST_XML\" > \"$APPCAST_BUILD\"\ncp \"$APPCAST_BUILD\" \"$APPCAST_DOCS\"\n\ninfo \"Signed:    $ZIP_NAME\"\ninfo \"Signature: ${ED_SIGNATURE:0:20}...\"\ninfo \"Tag:       $TAG\"\ninfo \"URL:       $DOWNLOAD_URL\"\ninfo \"Wrote:     $APPCAST_BUILD\"\ninfo \"Copied:    $APPCAST_DOCS\"\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# 4.0.0\n\n> \n\n## 新功能\n- 全新加入「按钮」模块：现在可以直接将鼠标按键绑定到你想要的快捷动作。🎉\n- 加入「模拟触控板」模式，我不知道有什么用, 但有点新鲜感总不是坏事 😜\n- 现在可以在「滚动」中基于垂直、水平方向独立调味了\n\n## 优化\n- 欢迎指引、辅助功能授权流程 UI 翻新。\n- 翻译迁移到 string catalogs, 再也不需要面对 identify string 了\n- 基于 AI 补充了一些缺失的的多语言文本。(如果你觉得翻译有任何问题, 非常欢迎帮忙纠正!)\n\n## 修复\n- 修复部分场景下的滚动平滑滚动异常问题\n- 修复欢迎指引、辅助功能授权流程中偶尔不同步的问题，希望你启动时能顺顺利利。\n\n---\n\n## New\n- Brand-new Buttons module: record mouse and bind them to whatever shortcut you like. 🎉\n- Added Simulate Trackpad mode. Unsure how useful it is yet, but it seems fun. 😜\n- Vertical and horizontal scrolling can now be tuned independently inside the Scroll tab.\n\n## Improvements\n- Refreshed the welcome guide and accessibility permission in intro flow.\n- Translations now power by string catalogs, no more identify strings.\n- Filled a few missing translationg with a little help from AI. (If you find any problems with the translation, feel free to let us know!)\n\n## Fixes\n- Fixed the smooth scrolling issue in certain scenarios.\n- Fixed the intro flow sync logic, so first launch might go more smoothly.\n\n# [3.5.0](https://github.com/Caldis/Mos/releases/tag/3.5.0)\n\n![IMG_8987](https://github.com/user-attachments/assets/55fac01c-d774-46f3-b118-6eebc50bdcc9)\n\n> 由于 macOS 的安全性限制, 你需要允许 Mos 访问系统的辅助功能的访问权限以确保其正常运行\n\n若 Mos 已在辅助功能的授权列表中, 只需取消勾选后再度勾选即可; 如果仍然无效, 请尝试将其从列表中移除再添加\n可以在此处查看帮助: [无法正确获取辅助功能权限](https://github.com/Caldis/Mos/wiki/%E5%A6%82%E6%9E%9C%E5%BA%94%E7%94%A8%E6%97%A0%E6%B3%95%E6%AD%A3%E5%B8%B8%E8%BF%90%E8%A1%8C#%E6%97%A0%E6%B3%95%E6%AD%A3%E7%A1%AE%E8%8E%B7%E5%8F%96%E8%BE%85%E5%8A%A9%E5%8A%9F%E8%83%BD%E6%9D%83%E9%99%90)\n\n> 如果在初次启动应用时被系统阻止, 你可以查看帮助: [如果应用无法正常运行](https://github.com/Caldis/Mos/wiki/%E5%A6%82%E6%9E%9C%E5%BA%94%E7%94%A8%E6%97%A0%E6%B3%95%E6%AD%A3%E5%B8%B8%E8%BF%90%E8%A1%8C#%E6%97%A0%E6%B3%95%E6%AD%A3%E7%A1%AE%E8%8E%B7%E5%8F%96%E8%BE%85%E5%8A%A9%E5%8A%9F%E8%83%BD%E6%9D%83%E9%99%90)\n\n> [如果想看大咪点这里](https://meow.caldis.me)\n\n## 新特性\n\n- 希腊语支持, 感谢 @Valamorde \n- 乌克兰语支持, 感谢 @dittohead \n- 应用图标及状态栏图标更新\n\n## 修正\n \n- 在 Catalyst 应用中停止滚动后立即触发滚动无法被应用正常响应的问题, 包括 Maps / Messages / Weather 等 ... \n\n## 其他\n\n- App 文本校对, @novialriptide @udanfacy22 \n- 网站文本校对, 感谢 @kant @jfrsa\n\n---\n\n> Limited by macOS security strategy, you need to allow Mos to access to Accessibility Control to ensure that it is working properly.\nIf Mos already in the Accessibility Control list, just uncheck it and toggle it again. If it still doesn't work, try removing it from the list and adding it again.\nYou can check this for help: [Can't get access to accessibility correctly](https://github.com/Caldis/Mos/wiki/If-the-App-not-work-properly#cant-get-access-to-accessibility-correctly)\n\n> If the macOS preventing the application running, you can check this for help: [If the App not work properly](https://github.com/Caldis/Mos/wiki/If-the-App-not-work-properly)\n\n> [meow meow meow](https://meow.caldis.me)\n\n## New features\n\n- Greek language support, thanks to @Valamorde\n\n- Ukrainian language support, thanks to @dittohead\n\n- Updated application icon and status bar icon\n\n## Fix\n\n- In Catalyst apps, scrolling is not properly responded to immediately after scrolling stops, including Maps/Messages/Weather, etc...\n\n## Other\n\n- Wording improvement for App, @novialriptide @udanfacy22\n\n- Wording improvement for Web, thanks to @kant @jfrsa\n\n# [3.4.1](https://github.com/Caldis/Mos/releases/tag/3.4.1)\n\n![IMG_1565](https://user-images.githubusercontent.com/3529490/194695642-39b0e9dd-0094-4f02-8b2c-68a5445577fa.jpg)\n\n> 由于 macOS 的安全性限制, 你需要允许 Mos 访问系统的辅助功能的访问权限以确保其正常运行\n若 Mos 已在辅助功能的授权列表中, 只需取消勾选后再度勾选即可; 如果仍然无效, 请尝试将其从列表中移除再添加\n可以在此处查看帮助: [无法正确获取辅助功能权限](https://github.com/Caldis/Mos/wiki/%E5%A6%82%E6%9E%9C%E5%BA%94%E7%94%A8%E6%97%A0%E6%B3%95%E6%AD%A3%E5%B8%B8%E8%BF%90%E8%A1%8C#%E6%97%A0%E6%B3%95%E6%AD%A3%E7%A1%AE%E8%8E%B7%E5%8F%96%E8%BE%85%E5%8A%A9%E5%8A%9F%E8%83%BD%E6%9D%83%E9%99%90)\n\n> 如果在初次启动应用时被系统阻止, 你可以查看帮助: [如果应用无法正常运行](https://github.com/Caldis/Mos/wiki/%E5%A6%82%E6%9E%9C%E5%BA%94%E7%94%A8%E6%97%A0%E6%B3%95%E6%AD%A3%E5%B8%B8%E8%BF%90%E8%A1%8C#%E6%97%A0%E6%B3%95%E6%AD%A3%E7%A1%AE%E8%8E%B7%E5%8F%96%E8%BE%85%E5%8A%A9%E5%8A%9F%E8%83%BD%E6%9D%83%E9%99%90)\n\n> [如果想看大咪点这里](https://meow.caldis.me)\n\n## 修正\n \n- 隐藏状态栏图标功能无效的问题\n\n---\n\n> Limited by macOS security strategy, you need to allow Mos to access to Accessibility Control to ensure that it is working properly.\nIf Mos already in the Accessibility Control list, just uncheck it and toggle it again. If it still doesn't work, try removing it from the list and adding it again.\nYou can check this for help: [Can't get access to accessibility correctly](https://github.com/Caldis/Mos/wiki/If-the-App-not-work-properly#cant-get-access-to-accessibility-correctly)\n\n> If the macOS preventing the application running, you can check this for help: [If the App not work properly](https://github.com/Caldis/Mos/wiki/If-the-App-not-work-properly)\n\n> [meow meow meow](https://meow.caldis.me)\n\n## Bug fix\n\n- Fixed an issue will cause the hide status bar icon not working\n\n# [3.4.0](https://github.com/Caldis/Mos/releases/tag/3.4.0)\n\n![dji_fly_20220905_173318_321_1662372322759_pano](https://user-images.githubusercontent.com/3529490/193414140-26513387-606b-4a63-b88f-7402854038de.jpg)\n\n> 由于 macOS 的安全性限制, 你需要允许 Mos 访问系统的辅助功能的访问权限以确保其正常运行\n若 Mos 已在辅助功能的授权列表中, 只需取消勾选后再度勾选即可; 如果仍然无效, 请尝试将其从列表中移除再添加\n可以在此处查看帮助: [无法正确获取辅助功能权限](https://github.com/Caldis/Mos/wiki/%E5%A6%82%E6%9E%9C%E5%BA%94%E7%94%A8%E6%97%A0%E6%B3%95%E6%AD%A3%E5%B8%B8%E8%BF%90%E8%A1%8C#%E6%97%A0%E6%B3%95%E6%AD%A3%E7%A1%AE%E8%8E%B7%E5%8F%96%E8%BE%85%E5%8A%A9%E5%8A%9F%E8%83%BD%E6%9D%83%E9%99%90)\n\n> 如果在初次启动应用时被系统阻止, 你可以查看帮助: [如果应用无法正常运行](https://github.com/Caldis/Mos/wiki/%E5%A6%82%E6%9E%9C%E5%BA%94%E7%94%A8%E6%97%A0%E6%B3%95%E6%AD%A3%E5%B8%B8%E8%BF%90%E8%A1%8C#%E6%97%A0%E6%B3%95%E6%AD%A3%E7%A1%AE%E8%8E%B7%E5%8F%96%E8%BE%85%E5%8A%A9%E5%8A%9F%E8%83%BD%E6%9D%83%E9%99%90)\n\n> [如果想看大咪点这里](https://meow.caldis.me)\n\n## 优化\n\n- 少许性能优化\n- 繁體中文 (台灣) / 繁體中文 (香港) 的文本优化, 感谢 @pan93412 @ralphchung 的贡献\n- 德语文本优化, 感谢 @mmairle 的贡献\n- 英文文本优化, \"white list\" -> \"allow list\", 感谢 @tmchow 的贡献\n- README 更新, 感谢 @kant @Goooler 的贡献\n\n## 修正\n \n- 降低了一些了由于内存泄露导致应用异常崩溃的概率 (实在是找不到哪里漏了)\n\n---\n\n> Limited by macOS security strategy, you need to allow Mos to access to Accessibility Control to ensure that it is working properly.\nIf Mos already in the Accessibility Control list, just uncheck it and toggle it again. If it still doesn't work, try removing it from the list and adding it again.\nYou can check this for help: [Can't get access to accessibility correctly](https://github.com/Caldis/Mos/wiki/If-the-App-not-work-properly#cant-get-access-to-accessibility-correctly)\n\n> If the macOS preventing the application running, you can check this for help: [If the App not work properly](https://github.com/Caldis/Mos/wiki/If-the-App-not-work-properly)\n\n> [meow meow meow](https://meow.caldis.me)\n\n## Improvement\n\n- Some performance optimizations\n- Traditional Chinese (Taiwan) / Traditional Chinese (Hong Kong) language improvement, thanks to @pan93412 @ralphchung\n- German language improvement, thanks to @mmairle\n- English transition improvement, from term \"white list\" -> \"allow list\", thanks to @tmchow \n- README update, thanks to @kant @Goooler\n\n## Bug fix\n\n- Slightly reduced the probability of the application crash abnormally due to a memory leak\n\n# [3.3.2](https://github.com/Caldis/Mos/releases/tag/3.3.2)\n\n> 由于 macOS 的安全性限制, 你需要允许 Mos 访问系统的辅助功能的访问权限以确保其正常运行\n若 Mos 已在辅助功能的授权列表中, 只需取消勾选后再度勾选即可; 如果仍然无效, 请尝试将其从列表中移除再添加\n可以在此处查看帮助: [无法正确获取辅助功能权限](https://github.com/Caldis/Mos/wiki/%E5%A6%82%E6%9E%9C%E5%BA%94%E7%94%A8%E6%97%A0%E6%B3%95%E6%AD%A3%E5%B8%B8%E8%BF%90%E8%A1%8C#%E6%97%A0%E6%B3%95%E6%AD%A3%E7%A1%AE%E8%8E%B7%E5%8F%96%E8%BE%85%E5%8A%A9%E5%8A%9F%E8%83%BD%E6%9D%83%E9%99%90)\n\n> 如果在初次启动应用时被系统阻止, 你可以查看帮助: [如果应用无法正常运行](https://github.com/Caldis/Mos/wiki/%E5%A6%82%E6%9E%9C%E5%BA%94%E7%94%A8%E6%97%A0%E6%B3%95%E6%AD%A3%E5%B8%B8%E8%BF%90%E8%A1%8C#%E6%97%A0%E6%B3%95%E6%AD%A3%E7%A1%AE%E8%8E%B7%E5%8F%96%E8%BE%85%E5%8A%A9%E5%8A%9F%E8%83%BD%E6%9D%83%E9%99%90)\n\n## 修正\n\n- 修复了禁用键无法生效的问题\n- 修复恢复为预设值的状态不一致的问题\n- 修复了例外列表的样式偏移问题\n\n---\n\n> Limited by macOS security strategy, you need to allow Mos to access to Accessibility Control to ensure that it is working properly.\nIf Mos already in the Accessibility Control list, just uncheck it and toggle it again. If it still doesn't work, try removing it from the list and adding it again.\nYou can check this for help: [Can't get access to accessibility correctly](https://github.com/Caldis/Mos/wiki/If-the-App-not-work-properly#cant-get-access-to-accessibility-correctly)\n\n> If the macOS preventing the application running, you can check this for help: [If the App not work properly](https://github.com/Caldis/Mos/wiki/If-the-App-not-work-properly)\n\n## Bug Fix\n\n- Fixed an issue that the disabled key cannot take effect\n- Fixed inconsistent status of restoring to preset value\n- Fixed the style offset problem of exception list\n\n# [3.3.1](https://github.com/Caldis/Mos/releases/tag/3.3.1)\n\n![2020-12-13 8a214628](https://user-images.githubusercontent.com/3529490/108588794-028cc280-7396-11eb-9f8a-bddb5795f5b1.jpg)\n---\n\n> 由于 macOS 的安全性限制, 你需要允许 Mos 访问系统的辅助功能的访问权限以确保其正常运行\n若 Mos 已在辅助功能的授权列表中, 只需取消勾选后再度勾选即可\n\n> 如果在初次启动应用时被系统阻止, 你可以查看帮助: [如果你无法执行应用](https://github.com/Caldis/Mos/wiki/%E5%A6%82%E6%9E%9C%E4%BD%A0%E6%97%A0%E6%B3%95%E6%89%A7%E8%A1%8C%E5%BA%94%E7%94%A8)\n\n## 新特性\n\n- 适配 BigSur 界面\n- 适配 M1 芯片设备\n由于我还没有相应设备, 我们仅仅重新编译了 Universual 的代码来适配, 目前尚存在一些兼容性问题, 您可以追踪 https://github.com/Caldis/Mos/issues/333 来获取最新动态, 如果您可以协助测试, 也十分欢迎在问题单内留言\n- 例外应用的设置界面现在可以正确匹配其状态\n- 例外应用可以正确地添加任何非 Bundle 类型的应用, 如 MineCraft 这类 Java 应用, 或某些来自 Steam 的游戏可执行文件\n此外, 例外应用已经基于执行路径而不是 BundleID 匹配, 这意味着, 一旦你改变了应用的存放路径, 你需要重新配置其设置\n这一变更可能会影响某些已添加的例外应用, 你或许需要重新添加并配置它们\n- 例外应用现在可以修改显示的名称\n- 滚动时点击鼠标左键可以停止滚动\n- 俄文支持, 感谢 @mclvren 的翻译\n- 韩文支持, 感谢 @readingsnail 的翻译\n- 土耳其语支持, 感谢 @LeaveNhA Leav 的翻译\n- 德语支持, 感谢 @lima0 Seli 的翻译\n\n## 优化\n\n- 滚动行为现在不会被携带到其他目标窗口\n- 繁体中文文本优化, 感谢 @crizant 的翻译\n- 英文文本优化, 感谢 @flash76 的翻译\n- 文档支持, 感谢 @jackdcasey 的翻译\n\n## 修正\n\n- 修复了 BigSur 下状态栏图标无法完全隐藏的问题\n- 修复了例外应用在某些情况下无法正确生效的问题\n- 修复了在 Chrome 刷新时执行滚动导致页面被移出屏幕的问题\n- 修复了 Logitech MX Master 系列鼠标的拇指轮无法被正确识别的问题\n\n## 杂项\n\n- 通过 BundleID 添加例外应用的方式被移除\n- 现在使用 Swift Package 代替 CocoaPods\n\n---\n\n> Limited by macOS security strategy, you need to allow Mos to access to Accessibility Control to ensure that it is working properly.\nIf Mos already in the Accessibility Control list, just uncheck it and toggle it again.\n\n> If the macOS preventing the application running, you can check this for help: [If the App isn’t allowed to open](https://github.com/Caldis/Mos/wiki/If-the-App-isn%E2%80%99t-allowed-to-open)\n\n## New Features\n\n- BigSur UI adaptation\n- Adaptation to M1 chip\nSince I don't have the latest device yet, we just recompile the Universual code for adaptation, so there are still some compatibility issues, you can track https://github.com/Caldis/Mos/issues/333 to get the latest news, if you can help to test, you are also very welcome in the questionnaire Leave a comment\n- The exceptions settings screen now correctly matches its status\n- Exceptions can correctly add any non-Bundle type application, such as Java applications like MineCraft, or certain game executables from Steam\nIn addition, the exceptions have been matched based on the execution path rather than the BundleID, which means that once you change the path where the app is stored, you will need to reconfigure its settings\nThis change may affect some of the exception apps that have been added, and you may need to re-add and reconfigure them\n- Exceptional apps can change the displayed name now\n- Scrolling can be stopped by clicking the left mouse button when scrolling\n- Russian support, thanks to @mclvren for the translation\n- Korean support, thanks to @readingsnail for the translation\n- Turkish support, thanks to @LeaveNhA Leav for the translation\n- German support, thanks to @lima0Seli for the translation\n\n## Improvement\n\n- Scrolling behavior is now not carried to other target windows\n- Traditional Chinese text optimization, thanks to @crizant for translation\n- English text optimization, thanks to @flash76 for translation\n- Documentation support, thanks to @jackdcasey for the translation\n\n## Bug Fix\n\n- Fixed an issue  that the status bar icon could not be completely hidden under BigSur\n- Fixed an issue where the exception application did not work correctly in some cases\n- Fixed an issue that caused pages to be moved off the screen when performing scrolling on Chrome refresh\n- Fixed an issue where the thumbwheel on Logitech MX Master series mouse was not recognized correctly\n\n## Miscellaneous\n\n- Adding exception apps via BundleID has been removed\n- Now uses Swift Package instead of CocoaPods\n\n# [3.1.0](https://github.com/Caldis/Mos/releases/tag/3.1.0)\n\n![DJI_0236-HDR](https://user-images.githubusercontent.com/3529490/69168252-54122600-0b31-11ea-94c7-5074a35eba6d.jpg)\n----\n\n```\n由于 macOS 的安全性限制, 你需要允许 Mos 访问系统的辅助功能的访问权限以确保其正常运行\n如果 Mos 已在辅助功能的授权列表中却无法正常使用, 只需取消勾选后再度勾选即可\n```\n\n```\n若系统提示 “程序已损坏” ，你需要在 “系统偏好设置 -> 安全性与隐私 -> 通用” 中允许程序运行\n对于高版本的系统，你可能还需要借助命令行来编辑应用的 “com.apple.quarantine” 属性以允许程序的运行，请参考\nhttps://superuser.com/questions/28384/what-should-i-do-about-com-apple-quarantine\n```\n\n## 新特性\n\n- 现在你可以指定一个按钮为**加速键**, 按下后只需要轻轻滑动滚轮就可以在页面中来回冲刺\n- 你现在可以为每个例外应用程序设定单独的滚动行为了。\n- 在例外应用列表中, 你可以直接从正在运行的窗口程序中选择并添加爱。\n- 在例外应用列表中, 现在可以手动输入应用程序的识别信息。如果你先前无法通过从文件选择的方式添加一个应用到例外列表中, 不妨用这个试试。不过使用这个路径添加的应用，列表将无法正确展示其图标。\n- 在设置中增加了一个用于隐藏状态栏图标的选项。\n\n## 优化\n\n- 图标更新。\n- 导览界面更新。\n- 偏好设置界面更新。\n- 考虑到**滚动监控**的使用频率, 现在它被雪藏了, 只有在按下 **Options** 并点击状态栏的图标后才能看到滚动监控的选项。\n\n## 修正\n\n- 重写了热键功能, (应该)修复了在某些情况下会卡住的问题。\n- 在 macOS Catalina 下无法正常识别 Launchpad 的问题。\n- 一些 UI 问题。\n- 版本号过低的问题。\n\n---\n\n```\nLimited by macOS security strategy, you need to allow Mos to access to Accessibility Control to ensure that it is working properly.\nIf Mos is not working properly when it's in the Accessibility Control list, just uncheck it and toggle it again.\n```\n\n```\nIf the system says \"The program is damaged\", you need to allow the program to run in \"System Preferences -> Security and Privacy -> General\"\nFor higher version systems, you may also need to edit the \"com.apple.quarantine\" property of the application with the help of the command line to allow the program to run, please refer to\nhttps://superuser.com/questions/28384/what-should-i-do-about-com-apple-quarantine\n```\n\n## New Features\n\n- Now you can specify a button for the **Acceleration button**. After enabled, you just need to scroll the wheel gracefully and you can swipe the page rapidly.\n- You can now set its own independent scrolling behavior for each exception application.\n- In the Exceptions application list, you can now select directly from the running window program.\n- In the Exceptions application list, you can now manually enter the identification information for your application. If you can't add an app to the exception list by selecting it from a file, try this with a try. But for this reason, the list will not display its icon correctly.\n- Added an option to hide the status bar icon.\n\n## Improvement\n\n- New icon.\n- Improved introduction interface.\n- Improved preferences interface.\n- Since **Rolling Monitor** is used less frequently, it is now hidden. You can only see the options for scrolling monitoring when you press **Options** and click on the icon in the status bar.\n\n## Bug Fix\n\n- Rewritten the hotkey function, (should) fix the problem that will get stuck in some cases.\n- Fix an issue with macOS Catalina that is not working properly due to its security policy\n- There are some problems that are not there.\n\n# [2.4.0-beta](https://github.com/Caldis/Mos/releases/tag/2.4.0-beta)\n\n```\n由于 macOS 10.14 的限制, Mos 只有在获取了辅助功能的访问权限后才可正常使用\n更新版本后，你需要重新在设置的辅助功能中再次给 Mos 授权\n如果已授权，请取消勾选并重新勾选一次\n```\n\n## 修正\n\n亮色模式下的部分样式的问题\n\n部分在例外应用程序列表中的应用程序无法被正确检测到的问题 \n- 一般情况下, Mos 会检测指针所在位置的应用程序是否在例外应用列表中, 不管该窗口是否被激活或前置显示. 但部分应用程序无法通过该方式被识别, 如 Adobe Acrobat DC 等. 对于该类应用程序, 只有在其被激活或前置显示时, 才能被识别为例外应用程序.\n- https://github.com/Caldis/Mos/issues/100, https://github.com/Caldis/Mos/issues/107\n\n---\n\n```\nLimited by macOS 10.14, you need to allow Mos to access to Accessibility control.\nAfter update Mos, you need to go to the System Preferences to allow Mos access Accessibility again.\nIf the entry has been checked, uncheck it and tick again.\n```\n\n## Fixed\n\nFixed some style problem in brightness mode\n\nFixed an issue will cause the applications in the exceptions application list are not correctly detected.\n- In general, Mos will detect if the application at the location of the cursor is in the exception application list, regardless of whether the window is activated. However, some applications cannot be identified in this way, such as Adobe Acrobat DC, etc. This type of application can only be recognized as an exception application when it is activated.\n- https://github.com/Caldis/Mos/issues/100, https://github.com/Caldis/Mos/issues/107\n\n# [2.3.0](https://github.com/Caldis/Mos/releases/tag/2.3.0)\n\n![img_8813](https://user-images.githubusercontent.com/3529490/42519702-3391c15a-8497-11e8-8358-9a551bc0c863.jpg)\n\n```\n由于 macOS 10.14 的限制, Mos 只有在获取到了辅助功能的访问权限后才可正常使用\n更新版本后，你需要重新在设置的辅助功能中再次给 Mos 授权\n如果已授权，请取消勾选并重新勾选一次\n```\n\n## 新功能\n\n现已支持 MacOS 10.14 的 Dark Mode\n\n现在, 首次启动 Mos 时将会有一个引导界面提供相关的使用指引, 并指导你开启辅助功能权限\n\n## 优化\n\n於偏好设置的关于页内增加了贡献者名单\n\n翻转/禁用键现在将不会对新用户默认启用\n\n## 修正\n\n修正长时间使用的内存泄漏问题 https://github.com/Caldis/Mos/issues/85\n\n---\n\n```\nLimited by macOS 10.14, you need to allow Mos to access to Accessibility control.\nAfter update Mos, you need to go to the System Preferences to allow Mos access Accessibility again.\nIf the entry has been checked, uncheck it and tick again.\n```\n\n## New Feature\n\nSupport Dark Mode in macOS 10.14\n\nWill show a Welcome Window when Mos first launch or just updated.\n\n## Enhancement\n\nAdd contributors list in Preferences - About\n\nThe Toggle/Block Key is changed to disabled for new users\n\n## Fixed\n\nFixed an issue will cause the memory leak when scrolling. https://github.com/Caldis/Mos/issues/85\n\n# [2.2.6](https://github.com/Caldis/Mos/releases/tag/2.2.6)\n\n```\n更新版本后，你需要重新在设置的辅助功能中再次给 Mos 授权\n如果已授权，请取消勾选并重新勾选一次, 否则例外应用检测功能将会失效\n```\n\n## 优化\n\n优化了窗口检测机制，降低 CPU 占用，同时减少了平滑滚动失效的概率\n\n优化了英文的界面文本，非常感谢 🎉 @godly-devotion 👏\n\n你现在可以直接在偏好设置面板中直接输入数值来调整参数\n- https://github.com/Caldis/Mos/issues/76\n\n打开偏好设置面板或监控面板时将于 Dock 显示应用图标\n- https://github.com/Caldis/Mos/issues/76\n\n---\n\n```\nAfter update Mos, you need to go to the System Preferences to allow Mos access Accessibility again.\nIf the entry has been checked, uncheck it and tick again, otherwise the Exceptional setting will not apply.\n```\n\n## Enhancement\n\nImproved the application detection mechanism, reduced CPU usage.\n\nImproved English translation, thanks for contribution of 🎉 @godly-devotion 👏.\n\nYou can now directly enter values in the Preferences to adjust parameters.\n- https://github.com/Caldis/Mos/issues/76\n\nShows the app icon on the Dock when opening the Preferences and Scroll Monitor\n- https://github.com/Caldis/Mos/issues/76\n\n# [2.2.2](https://github.com/Caldis/Mos/releases/tag/2.2.2)\n\n![28113313528_b66f14fcb3_h](https://user-images.githubusercontent.com/3529490/39876445-c451acea-54a5-11e8-987e-f4523ba66a62.jpg)\n- via [Playstation Blog](https://blog.us.playstation.com/2018/05/09/photo-mode-comes-to-god-of-war-today)\n\n---\n\n### 更新版本后, 你需要重新在设置的辅助功能中给 Mos 授权, 否则例外应用将会失效\n\n## 修正\n\n修复了在某些情况下可能导致平滑滚动失效的问题\n- https://github.com/Caldis/Mos/issues/63\n- https://github.com/Caldis/Mos/issues/69\n\n修复了水平滚动无效的问题\n- https://github.com/Caldis/Mos/issues/67\n\n---\n\n### After you update Mos, you need to go to the System Preferences to allow Mos access Accessibility again., otherwise the Exceptional Application's setting will not apply\n\n## Fixed\n\nFixed an issue will cause smooth scrolling core crash in some situation.\n- https://github.com/Caldis/Mos/issues/63\n- https://github.com/Caldis/Mos/issues/69\n\nFixed an issue will cause horizon scrolling unprocessed. \n- https://github.com/Caldis/Mos/issues/67\n\n# [2.2.0](https://github.com/Caldis/Mos/releases/tag/2.2.0)\n\n真帅\n\n![p2515058700](https://user-images.githubusercontent.com/3529490/38407226-37cf67cc-39ab-11e8-9c9a-20368beec006.jpg)\n\n\n## 新功能\n\n你现在可以为 \"变换方向\", \"禁用平滑\" 分别设定一个热键, 当按下热键时, 相应的操作将会被触发\n你可以在高级设置界面找到这个选项\n- https://github.com/Caldis/Mos/issues/33\n- https://github.com/Caldis/Mos/issues/15\n\n滚动监控界面现在可以同时呈现水平与垂直方向的数据\n\n滚动监控界面增加了图表的重置按钮, 点击即可清空图表数据\n\n## 优化\n\n更新了 Chart 库的版本\n\n优化了开始滚动时的加速效果\n\n优化了繁体中文的部分翻译文本\n\n优化了滚动监控界面的样式与执行效率\n\n优化了例外应用的侦测逻辑\n- 我们重写了侦测例外程序的逻辑, 目前基于指针坐标侦测对应坐标的窗口信息. 因此现在, 无需目标窗口处于激活状态也可正常侦测到对应的例外程序了. \n但是相应地, 由于侦测过程中使用到了更高级的系统 API [(AXUIElement)](https://developer.apple.com/documentation/applicationservices/axuielement.h). 因此, 你需要先授权 Mos 访问辅助功能的权限, 例外程序才能被启用. 当你进入设置界面的 \"例外\" 选项卡时, 你会看到相应的提示与引导帮助.\n\n## 修正\n\n修复了启动台中平滑滚动影响翻页的问题\n\n修复了取消勾选界面上的 \"开机启动\" 时无法正确从用户登录项中移除的问题\n- 使用了 https://github.com/Clipy/LoginServiceKit\n\n---\n\n## New Feature\n\nYou can now set a hotkey for \"change direction\" and \"disable smoothing\" respectively. When the hotkey is pressed, the corresponding operation will be triggered.\nYou can find this option in the advanced settings interface\n- https://github.com/Caldis/Mos/issues/33\n- https://github.com/Caldis/Mos/issues/15\n\nThe scrolling monitoring interface can now present horizontal and vertical data simultaneously\n\nThe scroll monitoring interface adds a reset button to the chart. Click to clear the chart data\n\n## Enhance\n\nUpdated the version of the Chart library\n\nOptimized the acceleration effect when starting scrolling\n\nPartially translated text in Traditional Chinese is optimized\n\nOptimize the style and execution efficiency of the scroll monitor interface\n\nOptimized exception detection logic\n- We have rewritten the logic to detect exceptions, currently based on the pointer coordinates to detect the corresponding window information. So now, the corresponding exception program can be normally detected without the target window active.\nHowever, due to the use of the more advanced system API [(AXUIElement)](https://developer.apple.com/documentation/applicationservices/axuielement.h) in the detection process, you need to authorize Mos to access the Accessibility first. The permission of the function, the exception procedure can be enabled. When you enter the \"Exceptions\" tab of the settings screen, you will see the corresponding prompt and guide help.\n\n## Fixed\n\nFixed issue with starting smooth scrolling in Taiwan\n\nFixed an issue that could not be properly removed from user login items when unchecking \"Startup\" on the interface\n- Power by https://github.com/Clipy/LoginServiceKit\n\n\n# [2.0.0](https://github.com/Caldis/Mos/releases/tag/2.0.0)\n\n各位猎人们, 2.0 版本来啦 !\n重构了所有代码, 大量的优化, 运行起来更高效.\n我们还重写了主页, 欢迎造访: http://mos.caldis.me\n\n不过, 如果不是它的话, 这次 Release 或许会来的更早一点,  一点点啦\n> Monster Hunter : World\n\n![monster hunter_ world_20180210161050](https://user-images.githubusercontent.com/3529490/37877380-eb44f678-308c-11e8-9148-af937ae9bdf6.jpg)\n\n![monster hunter_ world_20180214222658](https://user-images.githubusercontent.com/3529490/37877381-ec69baa2-308c-11e8-860c-22ad9a764c29.png)\n\n\n## 优化\n\n重写了平滑滚动的插值算法, 一般情况下 CPU 占用下降较原先约 40-50%, 不过, 手感也会有所不同\n- https://github.com/Caldis/Mos/issues/44\n\n优化了内存占用, 较原先下降约 70-80%\n\n状态栏菜单增加了图标示意, 语义更加明确了\n\n## 新功能\n\n现在你可以隐藏状态栏的图标了, 只需要按住 option 键, 再单击状态栏图标, 根据提示操作即可. 如果您需要重新显示状态栏的图标, 请使用活动监视器关闭 Mos, 再重新运行, 并点击通知中出现的 \"显示图标\" 按钮\n- https://github.com/Caldis/Mos/issues/3\n\n新增繁體中文支持, 如果您為港台地區用戶, 若發現任何語義問題, 我們非常歡迎您的反饋\n\n## 修正\n\n部分情况下的内存泄露\n\n---\n\n## Enhance\n\nRewrite the smooth scrolling interpolation algorithm. Under normal circumstances, the CPU usage is about 40-50% lower than the original. However, the feel will be little different.\n\nOptimized memory footprint, about 70-80% lower than the original.\n\nThe status bar menu adds icons to clarify the semantics.\n\n## New Feature\n\nNow you can hide the icon of the status bar, just hold down the option key, click on the status bar icon, and follow the prompts. If you need to re-display the icon in the status bar, use the activity monitor to turn off Mos, and then Run, and click the \"Show Icon\" button that appears in the notification.\n\n## Fixed \n\nMemory leak in some cases.\n\n\n# [1.7.0](https://github.com/Caldis/Mos/releases/tag/1.7.0)\n\n## 新功能\n\n现在支持鼠标横向滚动的平滑效果\n\n## 修正\n\nMacOS 10.13 下的偏好设置窗口错位问题\n- https://github.com/Caldis/Mos/issues/35\n\n切换系统用户时滚动失效的问题\n- https://github.com/Caldis/Mos/issues/31\n\n## 优化\n\n更新了 Charts 的版本\n\n---\n\n## New Feature\n\nSupport handling the horizon scrolling smooth.\n\n## Fixed \n\nFixed preferences window size problem in MacOS 10.13.\n\nFixed problem that cause system can't handling scrolling correctly when user session switched.\n\n## Enhance\n\nUpgrade Charts.\n\n\n# [1.6.1](https://github.com/Caldis/Mos/releases/tag/1.6.1)\n\n想起了当年玩PSP的日子\n\n> DJMAX: Respect\n\n![dfafa3b1-27b2-4762-ac9a-413b4412a2e8](https://user-images.githubusercontent.com/3529490/29993023-d4bbb8e8-8fdc-11e7-8290-4c295a94cb12.jpg)\n\n\n## 修正\n\n在某些应用窗口中 Mos 会异常崩溃的问题 \n- 由于某些应用窗口是以子进程方式执行(如 Android Studio 的模拟器窗口, 感谢 @CasparGX 的反馈) 而子进程本身并不拥有 BundleID, 其 BundleID 是依赖其父进程的 , 导致无法在忽略列表中找到对应的排除项而导致应用异常退出\n\n## Fixed \n\nFixed a problem that could cause Mos to crash. \n- When the target application was running in a child process state.\n\n# [1.6.0](https://github.com/Caldis/Mos/releases/tag/1.6.0)\n\n隔了几个月看回之前写的代码, 真的是一泡污... ...  得找个时间重写一次\n\n> 塞尔达传说：荒野之息\n> The Legend of Zelda：Breath of the Wild\n\n![link_lrg](https://user-images.githubusercontent.com/3529490/29495421-6c77895a-85f1-11e7-91f0-eca123ceadf9.png)\n\n> https://dribbble.com/shots/3488659-Hero-of-the-Wild\n\n## 新功能\n\n忽略的面板改成了 \"例外\", 且新增了白名单模式\n- 白名单模式在启用之后 Mos 就仅针对列表内的应用有效, 然后你可以基于此再来调整是不是要禁用 Mos 的平滑或者翻转滚动效果\n\n高级设置内加了个峰值位置调整, 你可以用它来调整加速曲线什么时候该加速什么时候该减速\n- 如果你想滚动启动时反应更灵敏, 停止时更为缓慢, 就往小了调\n- 如果你想滚动在启动开始时更为平缓, 停止时更迅速, 就往大了整\n\n## 修正\n\n开机启动勾选框的状态无法保存的问题\n\n## 优化\n\n现在在Launchpad中会始终禁用平滑滚动\n\n稍微改进了下写的很烂的判断逻辑\n\n提高了可以最大滚动的峰值\n\n---\n\n## New Feature\n\nAdd allow list mode in Ignore panel.\n\nAdd Peak setting in Advance panel.\n\n## Fixed \n\nFix the issue of checkbox's state can't be save currently which in General panel of Launch on login.\n\n## Enhance\n\nThe smooth scrolling will always disabled on launchpad.\n\nIncrease the maximum value of the Speed Setting and Time Setting on advance panel.\n\n\n# [1.5.0](https://github.com/Caldis/Mos/releases/tag/1.5.0)\n\n久违的双休...\n\n![qq20170324-230657](https://cloud.githubusercontent.com/assets/3529490/24300202/a1f30b48-10e6-11e7-9bea-c4cd1b1d9514.png)\n\n## 新功能\n\n您现在可以在设置面板中直接将Mos设为开机启动\n\n## 修正\n\n修正了滚动监控界面的布局样式问题\n\n修正了Launchpad添加到忽略列表后无效的问题\n\n修正了忽略列表中的应用程序在特定情况下忽略翻转滚动失效的问题\n\n---\n\n## New Feature\n\nNow you can directly add Mos to login item from preferences panel. \n\n## Fixed\n\nFix a layout issue on Scroll Monitor\n\nFix a issue that will cause Launchpad.app could not be handled properly in ignore list.\n\nFix a issue that scroll reverse option in ignore list could not be handled properly.\n\n\n# [1.4.4](https://github.com/Caldis/Mos/releases/tag/1.4.2)\n\n## 修正\n\n修正了在 MacOS El Capitan (10.11) 下无法正常使用的问题 (仅在10.11.6下测试)\n\n---\n\n## Fixed\n\nFixed a problem will cause the Mos could not be handled properly while using MacOS El Capitan (Test on 10.11.6).\n\n\n# [1.4.2](https://github.com/Caldis/Mos/releases/tag/1.4.2)\n\n## 修正\n\n(或许) 修正了部分鼠标在缓慢滚动时无法正确处理的问题\n\n---\n\n## Fixed\n\n(Maybe) Fixed a problem where some of the mouse wheel could not be handled properly while scrolling slowly.\n\n\n# [1.4.0](https://github.com/Caldis/Mos/releases/tag/1.4.0)\n\n现已采用DMG打包方式\n\n## 新功能\n\n鼠标滚动事件的Log功能, 用户可以通过在滚动监视器内的记录功能来记录自己的问题滚动数据, 便于反馈修正问题\n\n## 修正\n\n部分英文翻译语法错误\n\n---\n\nNow using DMG file to package the application.\n\n## New Feature\n\nScroll Event Recorder, user now can record the scroll event and feedback to us.\n\n## Fixed\n\nSome translation mistake.\n\n\n# [1.3.1](https://github.com/Caldis/Mos/releases/tag/1.3.1)\n\n## 修正\n\n部分英文翻译语法错误, 感谢 @OrcaXS 对英文国际化的支持\n忽略应用列表中的应用名称乱码问题\n\n---\n\n## Fixed\n\nSome translation mistake, special thanks to @OrcaXS support for English localization.\nIgnore list characters garbled.\n\n\n# [1.3.0](https://github.com/Caldis/Mos/releases/tag/1.3.0)\n\n## 新功能\n\n应用程序忽略列表功能, 可以在设置-忽略中将特定的程序禁用平滑滚动/反转滚动\n\n## 修正\n\n平滑滚动的部分判断逻辑\n\n---\n\n## New Feature\n\nAdded new feature \"Application Ignored List\", you can disable the smooth/reverse scroll in specific application.\n\n## Fixed\n\nSmoothScroll performance improved.\n\n\n# [1.0.0](https://github.com/Caldis/Mos/releases/tag/1.0.0)\n\n第一版发布 !\n\n---\n\nFirst version released !\n"
  },
  {
    "path": "CLAUDE.md",
    "content": "# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## IMPORTANT\n\nThis Project's macoOS Deployment Target 10.13+, so every API should be compatible with it.\n\n## Project Overview\n\nMos is a macOS utility application that provides smooth scrolling for mouse wheels, making them behave more like trackpads. Built with Swift and Xcode, it's a menu bar application that intercepts and modifies scroll events in real-time.\n\n## Build System & Development Commands\n\n### Building the Application\n- **Primary IDE**: Xcode (requires Xcode 9.0+, Swift 4.0+)\n- **Project File**: `Mos.xcodeproj`\n- **Build Target**: macOS application bundle\n\n### Dependencies\n- **Charts**: Data visualization for the monitor window\n- **LoginServiceKit**: Auto-launch functionality\n- Dependencies are managed via Swift Package Manager (SPM)\n\n### Creating Distribution Package\n```bash\ncd dmg/\n# Requires create-dmg tool: https://github.com/create-dmg/create-dmg\n# Requires Mos.app in dmg/ directory (copy from build output)\n./create-dmg.command\n```\n\nThe script automatically:\n- Reads version from Info.plist\n- Creates DMG with custom background and icon\n- Generates versioned DMG filename (Mos.X.X.X.dmg)\n- Includes application and Applications folder link\n\n### Running and Development\n\n**First-time setup:**\n```bash\n# 1. Open the project\nopen Mos.xcodeproj\n\n# 2. Xcode will automatically resolve SPM dependencies (Charts, LoginServiceKit)\n# 3. Wait for package resolution to complete (shown in top status bar)\n# 4. Build and run (⌘+R)\n```\n\n**Runtime requirements:**\n- App requires Accessibility permissions to intercept events\n- On first launch, grant permissions in System Preferences → Security & Privacy → Accessibility\n- Use the Monitor window during development to visualize scroll events in real-time\n\n## Architecture Overview\n\nMinimum macOS version: 10.13, all API should be compatible with it\n\n### Core Components\n\n**ScrollCore Engine** (`Mos/ScrollCore/`):\n- **ScrollCore.swift**: Main scrolling interception and processing engine\n- **ScrollPoster.swift**: Smooth scroll event posting using CVDisplayLink\n- **Interpolator.swift**: Smooth scrolling interpolation algorithms\n- **ScrollEvent.swift**: Event data structures\n- **ScrollFilter.swift**: Event filtering and processing logic\n\n**ButtonCore System** (`Mos/ButtonCore/`):\n- **ButtonCore.swift**: Core mouse button event interception and processing\n- **ButtonFilter.swift**: Event filtering logic for button actions\n- **ButtonUtils.swift**: Button binding configuration utilities\n- **ShortcutExecutor.swift**: System shortcut execution engine\n\n**Key Recording System** (`Mos/Keys/`):\n- **KeyRecorder.swift**: Event recording orchestrator with timeout protection\n- **KeyPopover.swift**: Popover UI component for displaying recording status\n- **KeyPreview.swift**: Visual preview of recorded key combinations\n- **KeyCode.swift**: Comprehensive keyboard and mouse button code mappings\n- **SystemShortcut.swift**: System shortcut definitions and management\n\n**Manager Pattern** (`Mos/Managers/`):\n- **WindowManager**: Controls window lifecycle and presentation\n- **StatusItemManager**: Menu bar status item and menu management\n- **ShortcutManager**: Global shortcut registration and management\n\n**Configuration System** (`Mos/Options/`):\n- **Options.swift**: Centralized configuration using UserDefaults\n- **Application.swift**: Per-application settings and exception handling\n\n### Window Architecture\n\nThe app uses multiple specialized windows:\n\n**IntroductionWindow**: First-time setup and permission requests\n**PreferencesWindow**: Complex tabbed preferences with multiple view controllers:\n  - GeneralView: Basic scrolling settings\n  - ScrollingView: Advanced scrolling configuration options\n  - ButtonsView: Mouse button recording and action binding\n  - ApplicationView: Per-application exception rules\n  - AboutView: Application information and credits\n  - UpdateView: Update checking and management\n**MonitorWindow**: Real-time scroll event visualization using Charts framework\n**WelcomeWindow**: User onboarding experience\n\nEach window follows the WindowController + ViewController pattern.\n\n### Key Technical Details\n\n**Event Interception**: Uses `Interceptor` utility (wraps CGEventTap) for low-level event capture\n  - ScrollCore: Captures scroll wheel events (scrollWheel)\n  - ButtonCore: Captures mouse button events (leftMouseDown, rightMouseDown, otherMouseDown) and key events\n**Smooth Scrolling**: CVDisplayLink-based event posting for 60fps smoothness via ScrollPoster\n**Event Recording**: `KeyRecorder` orchestrates event capture with timeout protection and visual feedback\n**Permissions**: Requires accessibility permissions (LSUIElement=true for menu bar app)\n**Localization**: Supports 11 languages + English with dual .xcstrings system\n**Per-App Settings**: `Application` class enables different scroll behaviors per application\n**Singleton Pattern**: Core systems (ScrollCore, ButtonCore, Options, managers) use singleton pattern\n\n## File Structure Patterns\n\n**Managers**: Singleton pattern for system integration (WindowManager, StatusItemManager, ShortcutManager)\n**Windows**: WindowController + ViewController pairs, each in separate subdirectories\n**ScrollCore**: Core scrolling logic and algorithms (ScrollCore, ScrollPoster, Interpolator, ScrollFilter)\n**ButtonCore**: Mouse button event handling and shortcut execution\n**Keys**: Key/mouse event recording system (KeyRecorder, KeyPopover, KeyPreview, KeyCode, SystemShortcut)\n**Utils**: Utility classes (Interceptor for CGEventTap, EventMonitor, Logger, Constants)\n**Extension**: Swift extensions for CGEvent and other system types\n**Options**: Configuration management (Options, Application)\n**Components**: Reusable UI components (PrimaryButton)\n\n## Development Guidelines\n\n### Adding New Features\n1. Follow the manager pattern for system integration\n2. Use WindowController + ViewController for new windows\n3. Add configuration options to `Options.swift`\n4. Consider per-app exceptions via `Application` class\n5. For button-related features, extend `ButtonCore` system and use `KeyRecorder` for event capture\n6. UI components should support both Light and Dark mode with dynamic color adaptation\n7. Use `Interceptor` utility (in Utils/) to wrap CGEventTap for event interception\n8. Follow localization patterns - all strings must be localizable\n\n### Modifying Scroll Behavior  \n- Core logic is in `ScrollCore/ScrollCore.swift`\n- Interpolation algorithms in `ScrollCore/Interpolator.swift` \n- Event filtering in `ScrollCore/ScrollFilter.swift`\n\n### UI Changes\n- Storyboard files are localized - modify Base.lproj first\n- Follow existing popover patterns for menu bar UI\n- Monitor window uses Charts framework for visualization\n\n### Testing\n- Test with various mouse types and scroll behaviors\n- Verify accessibility permissions are properly requested\n- Test per-application exception system\n- Use Monitor window to verify scroll event processing\n\n### Common Development Issues\n\n**Build fails with SPM errors:**\n```bash\n# Clear SPM cache and DerivedData\nrm -rf ~/Library/Developer/Xcode/DerivedData\n# Re-resolve packages in Xcode: File → Packages → Reset Package Caches\n```\n\n**Scrolling not working at runtime:**\n- Check Accessibility permissions in System Preferences → Security & Privacy → Accessibility\n- Verify `ScrollCore.shared.start()` is called after permissions granted\n- Use Monitor window to verify events are being captured\n\n**Button bindings not triggering:**\n- Open Monitor window to see if events are being captured\n- Check `ButtonCore.shared.start()` is called\n- Verify key codes in `KeyCode.swift` match expected values\n\n**UI not updating after preference changes:**\n- Options are stored in UserDefaults - verify `Options.shared` singleton is being used\n- Check if NotificationCenter observers are properly registered\n- Preferences window uses bindings - verify `@objc dynamic` on properties\n\n## Localization\n\nThe app supports 12 languages using Xcode's String Catalog system (.xcstrings).\n\n**Two separate localization files:**\n- `Mos/Localizable.xcstrings` - Code strings via `NSLocalizedString()`\n- `Mos/mul.lproj/Main.xcstrings` - Auto-generated from Storyboard (never merge these)\n\n**Key requirements:**\n- Use `NSLocalizedString()` (not `String(localized:)`) for macOS 10.13 compatibility\n- Follow macOS official terminology (e.g., \"偏好设置\" not \"设置\")\n- Preserve modifier key symbols: ⌘⌥⌃⇧\n- Never translate: \"Mos\", person names, brand names\n\n**For detailed translation guidelines, see `LOCALIZATION.md`**\n\n## Important Considerations\n\n**Accessibility**: App requires accessibility permissions to intercept events\n**System Integration**: Menu bar app behavior, auto-launch functionality\n**Performance**: Real-time event processing at system level\n**Localization**: All UI strings must be localized following the guidelines above\n**Distribution**: Cannot be uploaded to App Store per license restrictions"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment include:\n\n* Using welcoming and inclusive language\n* Being respectful of differing viewpoints and experiences\n* Gracefully accepting constructive criticism\n* Focusing on what is best for the community\n* Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n* The use of sexualized language or imagery and unwelcome sexual attention or advances\n* Trolling, insulting/derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or electronic address, without explicit permission\n* Other conduct which could reasonably be considered inappropriate in a professional setting\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at 532607446@qq.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]\n\n[homepage]: http://contributor-covenant.org\n[version]: http://contributor-covenant.org/version/1/4/\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# How to contribute\n\nBug-fixes and features often come from users of the Mos, and improving it greatly. We want to keep it as easy as possible to contribute changes that improve the experience for users all around the world. There are a few guidelines that we\nneed contributors to follow so that we can have a chance of keeping on\ntop of things.\n\n## Simple issues and bug reports\n\nIf you are reporting a bug which can be observed visually, please add to your issue either:\n\n* Screenshots, if the bug is easily explainable\n* A working sample project that we can compile, run, and immediately observe the issue\n\n## Getting Started with Contributions\n\n* Make sure you have a [GitHub account](https://github.com/signup/free)\n* Submit a ticket for your issue, assuming one does not already exist.\n  * Clearly describe the issue including steps to reproduce when it is a bug.\n  * Make sure you fill in the earliest version (or commit number) that you know has the issue.\n* Fork the repository on GitHub\n\n## Making Changes\n\n* Create a topic branch from where you want to base your work. This is usually the master branch.\n* Make commits of logical units.\n* Make sure your code conforms to the code style around it. It's easy, just look around!\n* If you have made changes back and forth, or have made merges, your commit history might look messy and hard to understand. A single issue or change should still be in one commit. So please squash those commits together and rebase them however you need to - to make our lives easier when reading it later.\n* Check for unnecessary whitespace with `git diff --check` before committing.\n* Make sure your commit messages are in the proper format.\n\n````\n    First line must be up to 50 chars (Fixes #1234)\n\n    The first line should be a short statement as to what have changed, and should also include an issue number, prefixed with a hash.\n    The body of the message comes after an empty new line, and describes the changes\n    more thoroughly, especially if there was a special case handled there,\n    or maybe some trickery that only code wizards can understand.\n````\n\n* Make sure you have tested your changes well.\n* If your changes could theoretically affect some other component or case, which you do not necessarily use, you still have to test it.\n* Create a Pull Request from your topic branch to the relevant branch in the main repo. If you go to the main repo of the framework, you'll see a big green button which pretty much prepares the PR for you. You just have to hit it.\n\n## Making Trivial Changes\n\nFor changes of a trivial nature to comments and documentation, it is not\nalways necessary to create a new ticket. In this case, it is\nappropriate to start the first line of a commit with '(doc)' instead of\na ticket number. Even the default commit message the GitHub generates is fine with us.\n"
  },
  {
    "path": "ISSUE_TEMPLATE.md",
    "content": "> 提供尽可能完整的内容可以让我们更快速地定位问题\n\n- 问题描述 | Issue description:\n\n\n- 如何重现 | How to reproduce it:\n\n\n- 期望结果 | What is expected:\n\n\n- 实际结果 | What is actually happening:\n\n\n- 软件版本 | Application version:\n\n\n- 系统版本 | System version:\n\n\n- 您系统中的其他鼠标管理软件 | Other mouse management application in your system:\n\n"
  },
  {
    "path": "LICENSE",
    "content": "Attribution-NonCommercial 4.0 International (CC BY-NC 4.0)\nThis is a human-readable summary of (and not a substitute for) the license. Disclaimer.\nYou are free to:\n\nShare — copy and redistribute the material in any medium or format\nAdapt — remix, transform, and build upon the material\nThe licensor cannot revoke these freedoms as long as you follow the license terms.\nUnder the following terms:\n\nAttribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.\nNonCommercial — You may not use the material for commercial purposes.\nNo additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits.\nNotices:\n\nYou do not have to comply with the license for elements of the material in the public domain or where your use is permitted by an applicable exception or limitation.\nNo warranties are given. The license may not give you all of the permissions necessary for your intended use. For example, other rights such as publicity, privacy, or moral rights may limit how you use the material.\n"
  },
  {
    "path": "LOCALIZATION.md",
    "content": "# Localization Guide for Mos\n\nThis guide describes how Mos 4.0 handles localisation, how to extend it, and how to keep every language in sync with new features such as the Buttons panel and shortcut catalog.\n\n---\n\n## 1. String Catalog Layout\n\nMos ships Xcode’s string catalogs instead of legacy `.strings` files. There are **two catalogs** and they must remain separate:\n\n| File | Scope | Notes |\n|------|-------|-------|\n| `Mos/Localizable.xcstrings` | Strings referenced from Swift (`NSLocalizedString`) | Keys are either human-readable phrases (`\"Auth\"`, `\"Current Version\"`) **or** camelCase identifiers that mirror code constants (e.g. `appExpose`, `categoryFunctionKeys`, shortcut identifiers in `SystemShortcut.Shortcut`). Do not rename identifiers—Swift enums and persistence depend on them. |\n| `Mos/mul.lproj/Main.xcstrings` | Interface Builder (storyboards / XIBs) | Keys are Interface Builder Object IDs (`2AK-Pu-mot.title`). Xcode regenerates them on build. Never hand-edit Object IDs. |\n\n`mul.lproj` is the canonical bundle for storyboard strings because we support many locales. Xcode fans out per-language nibs at build time, so do **not** split `Main.xcstrings` into multiple folders manually.\n\nThe project still targets macOS 10.13, so always use `NSLocalizedString(_:comment:)` in Swift rather than `String(localized:)`.\n\n---\n\n## 2. Current Language Coverage\n\nBoth catalogs expose the same set of locales (plus the English source column):\n\n`de`, `el`, `ja`, `ko`, `ru`, `tr`, `uk`, `zh-Hans`, `zh-Hant`, `zh-Hant-HK`, `zh-Hant-TW`\n\nTo verify coverage and catch untranslated rows:\n\n```bash\npython3 - <<'PY'\nimport json, pathlib\ncatalog = json.loads(pathlib.Path(\"Mos/Localizable.xcstrings\").read_text())\ndupes = [(k, lang) for k, row in catalog[\"strings\"].items()\n         for lang, unit in row[\"localizations\"].items()\n         if lang != \"en\" and unit[\"stringUnit\"][\"value\"] == row[\"localizations\"][\"en\"][\"stringUnit\"][\"value\"]]\nprint(f\"{len(dupes)} duplicate values (same as English). Sample:\", dupes[:10])\nPY\n```\n\nRun the same script against `Mos/mul.lproj/Main.xcstrings` if you suspect orphaned storyboard strings. A “duplicate” is acceptable when the official term matches English (e.g. “Launchpad”), but treat the report as a to-do list for translators.\n\nThe 4.0 release added ~40 strings across the Buttons panel, shortcut catalog, onboarding, and the refreshed Preferences UI. Make sure every locale is updated before tagging a new build.\n\n---\n\n## 3. Terminology Rules\n\n### macOS Official Terms\n\nUse the terminology Apple ships in System Preferences / System Settings. Never swap in colloquial variants.\n\n| English | 简体中文 | 繁體中文 | 日本語 | Notes |\n|---------|---------|---------|--------|-------|\n| Preferences | 偏好设置 | 偏好設定 | 環境設定 | NOT “设置” or “Settings” |\n| Accessibility | 辅助功能 | 輔助使用 | アクセシビリティ | System feature name |\n| Mission Control | 任务控制 | Mission Control | ミッションコントロール | Use Apple’s official translation even if it matches English |\n| Trackpad | 触控板 | 觸控式軌跡板 | トラックパッド | Hardware name |\n\n### Modifier Keys\n\nKeep modifier symbols intact and append translated names only if the locale expects it:\n\n```\n✓  \"⌘ Command\"  \"⌥ Option\"  \"⌃ Control\"  \"⇧ Shift\"\n✗  \"Command\"    \"Option键\"   \"Ctrl\"\n```\n\n### Proper Nouns\n\n- App name “Mos”, brand names (GitHub, macOS) and contributor credits remain unchanged.\n- System features (Mission Control, Spotlight) use Apple’s official localisation.\n\n### Numbers & Symbols\n\n- Leave numbers, mathematical operators, and special characters untouched.\n- Pay attention to locale-specific punctuation (e.g. Japanese full-width brackets) only when Apple’s UI uses them.\n\n---\n\n## 4. Adding Strings\n\n### 4.1 Code (`Localizable.xcstrings`)\n\n```swift\n// Step 1 – Add the string in code\nbutton.title = NSLocalizedString(\"Auth\", comment: \"Authorization button title\")\n\n// Step 2 – Build once (⌘B) so Xcode refreshes the catalog\n// Step 3 – Open Localizable.xcstrings and fill every locale column\n// Step 4 – Keep the key identical; do not rename identifiers already used in code\n```\n\n**Shortcut catalog:** When adding a new `SystemShortcut.Shortcut`, make sure its `identifier` property becomes a key in `Localizable.xcstrings`. The Buttons panel and popup menus rely on `NSLocalizedString(identifier, …)` to show the translated shortcut name.\n\n### 4.2 Storyboards (`Main.xcstrings`)\n\n1. Modify the base storyboard/XIB under `Base.lproj`.\n2. Build (⌘B); Xcode extracts new Object IDs into `mul.lproj/Main.xcstrings`.\n3. Translate the generated rows in Xcode’s catalog editor.\n4. Do **not** change Object IDs. If you delete a UI element, search for its Object ID and remove the stale entry manually.\n\n---\n\n## 5. Maintenance Checklist\n\n- [ ] macOS terms match Apple’s official localisation.\n- [ ] Modifier symbols (⌘⌥⌃⇧) are preserved in every language.\n- [ ] Keys in `Localizable.xcstrings` match the Swift constants (`SystemShortcut` identifiers, category names, etc.).\n- [ ] No empty strings or placeholder text in any locale column.\n- [ ] Duplicate values (translation == English) are intentional and documented with translators.\n- [ ] Chinese variants respect locale: 简体 (`zh-Hans`), 台湾 (`zh-Hant-TW`), 香港 (`zh-Hant-HK`).\n- [ ] Japanese strings use polite です／ます form unless Apple’s UI uses dictionary form.\n- [ ] Buttons panel recorder, Application tab, Welcome flow, and Monitor window were sanity-checked in the new/edited locale.\n\n---\n\n## 6. Adding a New Language\n\n1. In Xcode, Project ▸ Info ▸ Localizations → add the language.\n2. Ensure Xcode offers to localise both catalogs; tick every checkbox.\n3. Translate *all* keys in `Localizable.xcstrings` and `Main.xcstrings`.\n4. Update external documentation (README variants, website) if the language is publicly visible.\n5. Switch macOS to the new language (System Preferences ▸ Language & Region) and run through:\n   - Welcome / Introduction windows\n   - Preferences tabs (General, Scrolling, Application, Buttons, Updates, About)\n   - Buttons recorder, shortcut pop-ups, simulated trackpad switches\n6. Capture screenshots or notes for strings that require layout tweaks (long text, truncation).\n\n---\n\n## 7. Handy QA Commands\n\n```bash\n# Pretty-print a catalog for manual diffing\njq '.' Mos/Localizable.xcstrings | less\n\n# List storyboard keys that no longer exist in Base.lproj\npython3 Scripts/find_orphan_storyboard_keys.py  # create alongside other scripts if needed\n\n# Export catalogs for external translators (creates XLIFF)\nxcodebuild -exportLocalizations -project Mos.xcodeproj -localizationPath DerivedData/Localizations\n\n# Reimport translated XLIFF back into the project\nxcodebuild -importLocalizations -project Mos.xcodeproj -localizationPath DerivedData/Localizations\n```\n\n---\n\n## 8. Module Reference\n\n- **Shortcuts:** `Shortcut/SystemShortcut.swift` defines identifiers used in menus and the Buttons panel.\n- **Buttons panel:** Strings originate from `Windows/PreferencesWindow/ButtonsView/`, especially `ButtonTableCellView.swift` and `PreferencesButtonsViewController.swift`.\n- **Welcome & Introduction:** See `Windows/WelcomeWindow` and `Windows/IntroductionWindow` for onboarding copy.\n- **Monitor window:** Mixing scroll/button logs relies on keys such as `buttonsLog`, `eventMonitor`, etc. in `Localizable.xcstrings`.\n\nWhen new modules land (e.g. gesture editor, theme manager), append them here so translators know where to look.\n\n---\n\nKeeping localisation healthy is part of every feature cycle. Touch the catalog as soon as you add UI copy, run the duplicate check before merging, and leave notes for community translators whenever the wording carries product context. That habit keeps all 12 languages launch-ready the moment we ship a new build.\n"
  },
  {
    "path": "Mos/AppDelegate.swift",
    "content": "//\n//  AppDelegate.swift\n//  Mos\n//\n//  Created by Caldis on 2017/1/10.\n//  Copyright © 2017年 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\n@main\nclass AppDelegate: NSObject, NSApplicationDelegate {\n\n    // 运行前预处理\n    func applicationWillFinishLaunching(_ notification: Notification) {\n        // 禁止重复运行, 结束正在运行的实例\n        Utils.preventMultiRunning(killExist: true)\n        \n        // DEBUG: 清空用户设置\n        // UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)\n        \n        // 读取用户设置\n        Options.shared.readOptions()\n        \n        // DEBUG: 直接弹出设置窗口\n        #if DEBUG\n        WindowManager.shared.showWindow(withIdentifier: WINDOW_IDENTIFIER.preferencesWindowController)\n        #endif\n\n        // 监听用户切换, 在切换用户 session 时停止运行\n        NSWorkspace.shared.notificationCenter.addObserver(\n            self,\n            selector: #selector(AppDelegate.sessionDidActive),\n            name: NSWorkspace.sessionDidBecomeActiveNotification,\n            object: nil\n        )\n        NSWorkspace.shared.notificationCenter.addObserver(\n            self,\n            selector: #selector(AppDelegate.sessionDidResign),\n            name: NSWorkspace.sessionDidResignActiveNotification,\n            object: nil\n        )\n        // 监听系统休眠/唤醒, 复用 session 生命周期方法\n        NSWorkspace.shared.notificationCenter.addObserver(\n            self,\n            selector: #selector(AppDelegate.sessionDidResign),\n            name: NSWorkspace.willSleepNotification,\n            object: nil\n        )\n        NSWorkspace.shared.notificationCenter.addObserver(\n            self,\n            selector: #selector(AppDelegate.sessionDidActive),\n            name: NSWorkspace.didWakeNotification,\n            object: nil\n        )\n    }\n    // 运行后启动滚动处理\n    func applicationDidFinishLaunching(_ aNotification: Notification) {\n        startWithAccessibilityPermissionsChecker(nil)\n        UpdateManager.shared.scheduleCheckOnAppStartIfNeeded()\n    }\n\n    // 用户双击打开应用程序\n    func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool {\n        guard !flag else {\n            return true\n        }\n        if Utils.isHadAccessibilityPermissions() {\n            WindowManager.shared.showWindow(withIdentifier: WINDOW_IDENTIFIER.preferencesWindowController)\n        }\n        return false\n    }\n    \n    // 关闭前停止滚动处理\n    func applicationWillTerminate(_ aNotification: Notification) {\n        LogitechHIDManager.shared.stop()\n        ScrollCore.shared.disable()\n        ButtonCore.shared.disable()\n    }\n    \n    // 检查是否有访问 accessibility 权限, 如果有则启动滚动处理, 并结束计时器\n    // 10.14(Mojave) 后, 若无该权限会直接在创建 eventTap 时报错 (https://developer.apple.com/videos/play/wwdc2018/702/)\n    @objc func startWithAccessibilityPermissionsChecker(_ timer: Timer?) {\n        if let validTimer = timer {\n            // 开启辅助权限后, 关闭定时器, 开始处理\n            if Utils.isHadAccessibilityPermissions() {\n                validTimer.invalidate()\n                NSLog(\"First Initialization (Accessibility Authorization Needed)\")\n                ScrollCore.shared.enable()\n                ButtonCore.shared.enable()\n                LogitechHIDManager.shared.start()\n            }\n        } else {\n            if Utils.isHadAccessibilityPermissions() {\n                NSLog(\"Regular Initialization\")\n                ScrollCore.shared.enable()\n                ButtonCore.shared.enable()\n                LogitechHIDManager.shared.start()\n            } else {\n                // 如果应用不在辅助权限列表内, 则弹出欢迎窗口\n                WindowManager.shared.showWindow(withIdentifier: WINDOW_IDENTIFIER.introductionWindowController, withTitle: \"\")\n                // 启动定时器检测权限, 当拥有授权时启动滚动处理\n                Timer.scheduledTimer(\n                    timeInterval: 2.0,\n                    target: self,\n                    selector: #selector(startWithAccessibilityPermissionsChecker(_:)),\n                    userInfo: nil,\n                    repeats: true\n                )\n            }\n        }\n    }\n    \n    // 在切换用户时停止滚动处理\n    @objc func sessionDidActive(notification: NSNotification){\n        ScrollCore.shared.enable()\n        ButtonCore.shared.enable()\n        LogitechHIDManager.shared.start()\n    }\n    @objc func sessionDidResign(notification: NSNotification){\n        LogitechHIDManager.shared.stop()\n        ScrollCore.shared.disable()\n        ButtonCore.shared.disable()\n    }\n}\n"
  },
  {
    "path": "Mos/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"Base-16.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"16x16\"\n    },\n    {\n      \"filename\" : \"Base-32.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"16x16\"\n    },\n    {\n      \"filename\" : \"Base-32 1.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"32x32\"\n    },\n    {\n      \"filename\" : \"Base-64.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"32x32\"\n    },\n    {\n      \"filename\" : \"Base-128.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"128x128\"\n    },\n    {\n      \"filename\" : \"Base-256.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"128x128\"\n    },\n    {\n      \"filename\" : \"Base-256 1.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"256x256\"\n    },\n    {\n      \"filename\" : \"Base-512.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"256x256\"\n    },\n    {\n      \"filename\" : \"Base-512 1.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"512x512\"\n    },\n    {\n      \"filename\" : \"Base-1024.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"512x512\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Mos/Assets.xcassets/AppStatusBarIcon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\"\n    },\n    {\n      \"filename\" : \"MenubarIcon-16 1.png\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"filename\" : \"MenubarIcon-32 1.png\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"filename\" : \"MenubarIcon-64.png\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"mac\"\n    },\n    {\n      \"filename\" : \"MenubarIcon-16.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"filename\" : \"MenubarIcon-32.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  },\n  \"properties\" : {\n    \"template-rendering-intent\" : \"template\"\n  }\n}\n"
  },
  {
    "path": "Mos/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Mos/Assets.xcassets/Donate/AlipayLogo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"AliPayForLight.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"AliPayForDark.png\",\n      \"appearances\" : [\n        {\n          \"appearance\" : \"luminosity\",\n          \"value\" : \"dark\"\n        }\n      ]\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Mos/Assets.xcassets/Donate/AlipayQR.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"AliPayQRForLight.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"AliPayQRForDark.png\",\n      \"appearances\" : [\n        {\n          \"appearance\" : \"luminosity\",\n          \"value\" : \"dark\"\n        }\n      ]\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Mos/Assets.xcassets/Donate/BuyMeACoffee.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"bmc-brand-logo.svg\",\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Mos/Assets.xcassets/Donate/Contents.json",
    "content": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Mos/Assets.xcassets/Donate/MEOW.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"IMG_0412.jpeg\",\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Mos/Assets.xcassets/Donate/PaypalLogo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"PayPalForLight.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"PayPalForDark.pdf\",\n      \"appearances\" : [\n        {\n          \"appearance\" : \"luminosity\",\n          \"value\" : \"dark\"\n        }\n      ]\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Mos/Assets.xcassets/Donate/WechatpayLogo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"WeChatPayForLight.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"WeChatPayForDark.png\",\n      \"appearances\" : [\n        {\n          \"appearance\" : \"luminosity\",\n          \"value\" : \"dark\"\n        }\n      ]\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Mos/Assets.xcassets/Donate/WechatpayQR.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"WeChatPayQRForLight.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"WeChatPayQRForDark.png\",\n      \"appearances\" : [\n        {\n          \"appearance\" : \"luminosity\",\n          \"value\" : \"dark\"\n        }\n      ]\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Mos/Assets.xcassets/Guidance/Contents.json",
    "content": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Mos/Assets.xcassets/Guidance/drag-arrow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"drag-arrow.png\",\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Mos/Assets.xcassets/Guidance/manual-remove.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"manual-remove.png\",\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Mos/Assets.xcassets/Guidance/sparkle.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"sparkle.png\",\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Mos/Assets.xcassets/Monitor/Contents.json",
    "content": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Mos/Assets.xcassets/Monitor/SF.arrow.clockwise.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"SF.arrow.clockwise.svg\",\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  },\n  \"properties\" : {\n    \"template-rendering-intent\" : \"template\"\n  }\n}\n"
  },
  {
    "path": "Mos/Assets.xcassets/Preferences/Contents.json",
    "content": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Mos/Assets.xcassets/Preferences/SF.app.background.dotted.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"SF.app.background.dotted.svg\",\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  },\n  \"properties\" : {\n    \"template-rendering-intent\" : \"template\"\n  }\n}\n"
  },
  {
    "path": "Mos/Assets.xcassets/Preferences/SF.arrow.triangle.capsulepath.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"SF.arrow.triangle.capsulepath.svg\",\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  },\n  \"properties\" : {\n    \"template-rendering-intent\" : \"template\"\n  }\n}\n"
  },
  {
    "path": "Mos/Assets.xcassets/Preferences/SF.button.horizontal.top.press.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"SF.button.horizontal.top.press.svg\",\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  },\n  \"properties\" : {\n    \"template-rendering-intent\" : \"template\"\n  }\n}\n"
  },
  {
    "path": "Mos/Assets.xcassets/Preferences/SF.circle.dotted.circle.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"SF.circle.dotted.circle.svg\",\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  },\n  \"properties\" : {\n    \"template-rendering-intent\" : \"template\"\n  }\n}\n"
  },
  {
    "path": "Mos/Assets.xcassets/Preferences/SF.ellipsis.circle.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"SF.ellipsis.circle.svg\",\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  },\n  \"properties\" : {\n    \"template-rendering-intent\" : \"template\"\n  }\n}\n"
  },
  {
    "path": "Mos/Assets.xcassets/Preferences/SF.gearshape.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"SF.gearshape.svg\",\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  },\n  \"properties\" : {\n    \"template-rendering-intent\" : \"template\"\n  }\n}\n"
  },
  {
    "path": "Mos/Assets.xcassets/Preferences/SF.lasso.badge.sparkles.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"SF.lasso.badge.sparkles.svg\",\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  },\n  \"properties\" : {\n    \"template-rendering-intent\" : \"template\"\n  }\n}\n"
  },
  {
    "path": "Mos/Assets.xcassets/Preferences/SF.minus.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"minus.pdf\",\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  },\n  \"properties\" : {\n    \"template-rendering-intent\" : \"template\"\n  }\n}\n"
  },
  {
    "path": "Mos/Assets.xcassets/Preferences/SF.person.crop.circle.dashed.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"SF.person.crop.circle.dashed.svg\",\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  },\n  \"properties\" : {\n    \"template-rendering-intent\" : \"template\"\n  }\n}\n"
  },
  {
    "path": "Mos/Assets.xcassets/Preferences/SF.plus.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"plus.pdf\",\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  },\n  \"properties\" : {\n    \"template-rendering-intent\" : \"template\"\n  }\n}\n"
  },
  {
    "path": "Mos/Assets.xcassets/Preferences/SF.scribble.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"scribble.pdf\",\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  },\n  \"properties\" : {\n    \"template-rendering-intent\" : \"template\"\n  }\n}\n"
  },
  {
    "path": "Mos/Assets.xcassets/Preferences/SF.tray.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"tray.pdf\",\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  },\n  \"properties\" : {\n    \"template-rendering-intent\" : \"template\"\n  }\n}\n"
  },
  {
    "path": "Mos/Assets.xcassets/Preferences/SF.wand.and.rays.inverse.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"wand.and.rays.inverse.pdf\",\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  },\n  \"properties\" : {\n    \"template-rendering-intent\" : \"template\"\n  }\n}\n"
  },
  {
    "path": "Mos/Assets.xcassets/StatusItem/Contents.json",
    "content": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Mos/Assets.xcassets/StatusItem/SF.escape.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"escape.pdf\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"properties\" : {\n    \"template-rendering-intent\" : \"template\"\n  }\n}"
  },
  {
    "path": "Mos/Assets.xcassets/StatusItem/SF.gauge.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"gauge.pdf\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"properties\" : {\n    \"template-rendering-intent\" : \"template\"\n  }\n}"
  },
  {
    "path": "Mos/Assets.xcassets/StatusItem/SF.hidpp.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"hidpp.pdf\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"properties\" : {\n    \"template-rendering-intent\" : \"template\"\n  }\n}"
  },
  {
    "path": "Mos/Assets.xcassets/StatusItem/SF.square.stack.3d.down.right.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"square.stack.3d.down.right.pdf\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"properties\" : {\n    \"template-rendering-intent\" : \"template\"\n  }\n}"
  },
  {
    "path": "Mos/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"24506\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"24506\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--Application-->\n        <scene sceneID=\"JPo-4y-FX3\">\n            <objects>\n                <customObject id=\"Ady-hI-5gd\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n                <customObject id=\"Voe-Tx-rLC\" customClass=\"AppDelegate\" customModule=\"Mos\" customModuleProvider=\"target\"/>\n                <application id=\"hnw-xV-0zn\" sceneMemberID=\"viewController\">\n                    <menu key=\"mainMenu\" title=\"Main Menu\" systemMenu=\"main\" id=\"AYu-sK-qS6\"/>\n                    <connections>\n                        <outlet property=\"delegate\" destination=\"Voe-Tx-rLC\" id=\"PrD-fu-P6m\"/>\n                    </connections>\n                </application>\n                <customObject id=\"tYq-jF-nNM\" customClass=\"StatusItemManager\" customModule=\"Mos\" customModuleProvider=\"target\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1086\" y=\"-85\"/>\n        </scene>\n        <!--Window Controller-->\n        <scene sceneID=\"R2V-B0-nI4\">\n            <objects>\n                <windowController storyboardIdentifier=\"monitorWindowController\" showSeguePresentationStyle=\"single\" id=\"B8D-0N-5wS\" customClass=\"MonitorWindowController\" customModule=\"Mos\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <window key=\"window\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" visibleAtLaunch=\"NO\" animationBehavior=\"default\" titlebarAppearsTransparent=\"YES\" id=\"IQv-IB-iLA\" userLabel=\"Monitor Window\">\n                        <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\" miniaturizable=\"YES\" resizable=\"YES\" fullSizeContentView=\"YES\"/>\n                        <rect key=\"contentRect\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"271\"/>\n                        <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"1680\" height=\"1027\"/>\n                        <connections>\n                            <outlet property=\"delegate\" destination=\"B8D-0N-5wS\" id=\"tcQ-Cv-MfP\"/>\n                        </connections>\n                    </window>\n                    <connections>\n                        <outlet property=\"monitorWindow\" destination=\"IQv-IB-iLA\" id=\"Wd4-PR-xVs\"/>\n                        <segue destination=\"XfG-lQ-9wD\" kind=\"relationship\" relationship=\"window.shadowedContentViewController\" id=\"cq2-FE-JQM\"/>\n                    </connections>\n                </windowController>\n                <customObject id=\"Oky-zY-oP4\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"-34\" y=\"-119\"/>\n        </scene>\n        <!--Window Controller-->\n        <scene sceneID=\"d5U-6w-uQ6\">\n            <objects>\n                <windowController storyboardIdentifier=\"preferencesWindowController\" showSeguePresentationStyle=\"single\" id=\"7TR-R5-fGE\" customClass=\"PreferencesWindowController\" customModule=\"Mos\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <window key=\"window\" title=\"Preferences\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" visibleAtLaunch=\"NO\" frameAutosaveName=\"\" animationBehavior=\"default\" titlebarAppearsTransparent=\"YES\" id=\"cvF-hf-KVW\">\n                        <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\"/>\n                        <rect key=\"contentRect\" x=\"13\" y=\"0.0\" width=\"450\" height=\"315\"/>\n                        <rect key=\"screenRect\" x=\"-412\" y=\"1050\" width=\"2560\" height=\"1080\"/>\n                        <connections>\n                            <outlet property=\"delegate\" destination=\"7TR-R5-fGE\" id=\"aq4-gh-Ch5\"/>\n                        </connections>\n                    </window>\n                    <connections>\n                        <outlet property=\"preferenceWindow\" destination=\"cvF-hf-KVW\" id=\"8z2-JT-6sK\"/>\n                        <segue destination=\"0iY-5N-JBV\" kind=\"relationship\" relationship=\"window.shadowedContentViewController\" id=\"sCL-N4-ofN\"/>\n                    </connections>\n                </windowController>\n                <customObject id=\"28S-c5-IKX\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1086\" y=\"272\"/>\n        </scene>\n        <!--Preferences Tab View Controller-->\n        <scene sceneID=\"fde-aU-5x8\">\n            <objects>\n                <tabViewController showSeguePresentationStyle=\"single\" selectedTabViewItemIndex=\"0\" tabStyle=\"toolbar\" id=\"0iY-5N-JBV\" customClass=\"PreferencesTabViewController\" customModule=\"Mos\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <tabViewItems>\n                        <tabViewItem identifier=\"general\" image=\"SF.gearshape\" id=\"Qwc-OE-zHR\"/>\n                        <tabViewItem identifier=\"scrolling\" image=\"SF.circle.dotted.circle\" id=\"P9R-tX-qfW\"/>\n                        <tabViewItem identifier=\"buttons\" image=\"SF.button.horizontal.top.press\" id=\"BTN-UI-123\"/>\n                        <tabViewItem identifier=\"application\" image=\"SF.app.background.dotted\" id=\"gfS-Ix-zI5\"/>\n                        <tabViewItem identifier=\"updates\" image=\"SF.arrow.triangle.capsulepath\" id=\"1sm-Qq-6GS\"/>\n                        <tabViewItem identifier=\"about\" image=\"SF.person.crop.circle.dashed\" id=\"MrA-I8-n0Z\"/>\n                    </tabViewItems>\n                    <viewControllerTransitionOptions key=\"transitionOptions\"/>\n                    <tabView key=\"tabView\" wantsLayer=\"YES\" misplaced=\"YES\" type=\"noTabsNoBorder\" id=\"sxC-q7-Qs6\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"450\" height=\"314\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMinX=\"YES\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\" flexibleMaxY=\"YES\"/>\n                        <font key=\"font\" metaFont=\"system\"/>\n                        <connections>\n                            <outlet property=\"delegate\" destination=\"0iY-5N-JBV\" id=\"VmR-wj-laa\"/>\n                        </connections>\n                    </tabView>\n                    <connections>\n                        <outlet property=\"tabView\" destination=\"sxC-q7-Qs6\" id=\"CNF-oh-eK6\"/>\n                        <segue destination=\"ITL-GD-CPd\" kind=\"relationship\" relationship=\"tabItems\" id=\"z3c-tg-aDc\"/>\n                        <segue destination=\"iW5-CD-5OC\" kind=\"relationship\" relationship=\"tabItems\" id=\"GA4-xY-65w\"/>\n                        <segue destination=\"BTN-VC-123\" kind=\"relationship\" relationship=\"tabItems\" id=\"BTN-SG-123\"/>\n                        <segue destination=\"bga-wG-iim\" kind=\"relationship\" relationship=\"tabItems\" id=\"QV9-il-C7g\"/>\n                        <segue destination=\"EWu-DP-7Gj\" kind=\"relationship\" relationship=\"tabItems\" id=\"gsT-c8-cJ3\"/>\n                        <segue destination=\"RfV-Ow-3mF\" kind=\"relationship\" relationship=\"tabItems\" id=\"djr-7D-XVN\"/>\n                    </connections>\n                </tabViewController>\n                <customObject id=\"Huf-MT-zgs\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1086\" y=\"767\"/>\n        </scene>\n        <!--General-->\n        <scene sceneID=\"5zC-sP-JZj\">\n            <objects>\n                <viewController title=\"General\" storyboardIdentifier=\"general\" id=\"ITL-GD-CPd\" customClass=\"PreferencesGeneralViewController\" customModule=\"Mos\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <visualEffectView key=\"view\" blendingMode=\"behindWindow\" material=\"toolTip\" state=\"followsWindowActiveState\" id=\"LZw-qp-NWH\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"450\" height=\"105\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMinX=\"YES\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\" flexibleMaxY=\"YES\"/>\n                        <subviews>\n                            <box hidden=\"YES\" verticalHuggingPriority=\"750\" verticalCompressionResistancePriority=\"751\" boxType=\"separator\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"vPz-kM-wAq\">\n                                <rect key=\"frame\" x=\"20\" y=\"92\" width=\"410\" height=\"5\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" constant=\"410\" id=\"KJL-ZZ-WMT\"/>\n                                </constraints>\n                            </box>\n                            <textField wantsLayer=\"YES\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" verifyAmbiguity=\"off\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"WWH-56-xDd\">\n                                <rect key=\"frame\" x=\"18\" y=\"37\" width=\"140\" height=\"14\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" relation=\"greaterThanOrEqual\" constant=\"136\" id=\"W3A-cF-zN1\"/>\n                                </constraints>\n                                <textFieldCell key=\"cell\" sendsActionOnEndEditing=\"YES\" alignment=\"right\" title=\"Status Bar Icon\" id=\"AGU-43-8RD\">\n                                    <font key=\"font\" metaFont=\"smallSystem\"/>\n                                    <color key=\"textColor\" name=\"secondaryLabelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <button translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Xzk-6e-mKA\">\n                                <rect key=\"frame\" x=\"171\" y=\"71\" width=\"259\" height=\"14\"/>\n                                <buttonCell key=\"cell\" type=\"check\" title=\"Launch Mos at Login\" bezelStyle=\"regularSquare\" imagePosition=\"left\" inset=\"2\" id=\"xoR-7p-3qj\">\n                                    <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                </buttonCell>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"14\" id=\"EoC-6m-csZ\"/>\n                                </constraints>\n                                <connections>\n                                    <action selector=\"launchOnLoginClick:\" target=\"ITL-GD-CPd\" id=\"YUz-Ue-6it\"/>\n                                </connections>\n                            </button>\n                            <button verticalHuggingPriority=\"751\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"1OP-ac-77Z\">\n                                <rect key=\"frame\" x=\"171\" y=\"37\" width=\"146\" height=\"14\"/>\n                                <buttonCell key=\"cell\" type=\"check\" title=\"Hide Status Bar Icon\" bezelStyle=\"regularSquare\" imagePosition=\"left\" inset=\"2\" id=\"hGj-vV-zcY\">\n                                    <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                </buttonCell>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" relation=\"greaterThanOrEqual\" id=\"PpN-tw-d3S\"/>\n                                    <constraint firstAttribute=\"height\" constant=\"14\" id=\"fky-mC-gj8\"/>\n                                </constraints>\n                                <connections>\n                                    <action selector=\"hideStatusBarIconClick:\" target=\"ITL-GD-CPd\" id=\"b1n-8N-zLk\"/>\n                                </connections>\n                            </button>\n                            <button horizontalHuggingPriority=\"750\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"sTG-Fn-P3P\">\n                                <rect key=\"frame\" x=\"321\" y=\"36\" width=\"16\" height=\"16\"/>\n                                <buttonCell key=\"cell\" type=\"help\" bezelStyle=\"helpButton\" alignment=\"center\" controlSize=\"mini\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"q3R-0Q-jlP\">\n                                    <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"miniSystem\"/>\n                                </buttonCell>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"16\" id=\"SAG-IT-83w\"/>\n                                    <constraint firstAttribute=\"width\" relation=\"greaterThanOrEqual\" constant=\"16\" id=\"YGZ-L6-Pta\"/>\n                                </constraints>\n                                <connections>\n                                    <segue destination=\"3aa-uW-Wet\" kind=\"popover\" popoverAnchorView=\"sTG-Fn-P3P\" popoverBehavior=\"t\" preferredEdge=\"maxY\" id=\"QkR-g6-VEC\"/>\n                                </connections>\n                            </button>\n                            <textField wantsLayer=\"YES\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Gt2-mv-Ris\" userLabel=\"Launch On Login Description\">\n                                <rect key=\"frame\" x=\"169\" y=\"20\" width=\"264\" height=\"11\"/>\n                                <textFieldCell key=\"cell\" controlSize=\"small\" sendsActionOnEndEditing=\"YES\" title=\"Re-run Mos again to show the hidden Icon\" id=\"bB5-2R-9Da\">\n                                    <font key=\"font\" metaFont=\"miniSystem\"/>\n                                    <color key=\"textColor\" name=\"secondaryLabelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <textField wantsLayer=\"YES\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" verifyAmbiguity=\"off\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"4ng-X7-dRa\">\n                                <rect key=\"frame\" x=\"18\" y=\"71\" width=\"140\" height=\"14\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" relation=\"greaterThanOrEqual\" constant=\"136\" id=\"TJD-cl-63A\"/>\n                                </constraints>\n                                <textFieldCell key=\"cell\" sendsActionOnEndEditing=\"YES\" alignment=\"right\" title=\"Startup\" id=\"E82-7w-YCr\">\n                                    <font key=\"font\" metaFont=\"smallSystem\"/>\n                                    <color key=\"textColor\" name=\"secondaryLabelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                        </subviews>\n                        <constraints>\n                            <constraint firstItem=\"WWH-56-xDd\" firstAttribute=\"leading\" secondItem=\"LZw-qp-NWH\" secondAttribute=\"leading\" constant=\"20\" id=\"3Oo-fz-qqM\"/>\n                            <constraint firstItem=\"1OP-ac-77Z\" firstAttribute=\"centerY\" secondItem=\"WWH-56-xDd\" secondAttribute=\"centerY\" id=\"5aC-Pg-ol9\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"vPz-kM-wAq\" secondAttribute=\"trailing\" constant=\"20\" id=\"A6q-H4-qFP\"/>\n                            <constraint firstItem=\"1OP-ac-77Z\" firstAttribute=\"leading\" secondItem=\"Xzk-6e-mKA\" secondAttribute=\"leading\" id=\"BLN-CR-xdb\"/>\n                            <constraint firstItem=\"sTG-Fn-P3P\" firstAttribute=\"centerY\" secondItem=\"1OP-ac-77Z\" secondAttribute=\"centerY\" id=\"CbM-Dv-tbc\"/>\n                            <constraint firstItem=\"sTG-Fn-P3P\" firstAttribute=\"leading\" secondItem=\"1OP-ac-77Z\" secondAttribute=\"trailing\" constant=\"4\" id=\"ECw-uh-DpE\"/>\n                            <constraint firstItem=\"Xzk-6e-mKA\" firstAttribute=\"leading\" secondItem=\"4ng-X7-dRa\" secondAttribute=\"trailing\" constant=\"15\" id=\"Eea-ai-Voa\"/>\n                            <constraint firstItem=\"vPz-kM-wAq\" firstAttribute=\"leading\" secondItem=\"LZw-qp-NWH\" secondAttribute=\"leading\" constant=\"20\" id=\"Hjc-z6-JQI\"/>\n                            <constraint firstItem=\"WWH-56-xDd\" firstAttribute=\"trailing\" secondItem=\"4ng-X7-dRa\" secondAttribute=\"trailing\" id=\"Ilv-kY-IzH\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"Gt2-mv-Ris\" secondAttribute=\"bottom\" constant=\"20\" id=\"PEZ-EE-k79\"/>\n                            <constraint firstAttribute=\"trailing\" relation=\"greaterThanOrEqual\" secondItem=\"sTG-Fn-P3P\" secondAttribute=\"trailing\" constant=\"20\" symbolic=\"YES\" id=\"QCs-a8-qOl\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"Gt2-mv-Ris\" secondAttribute=\"trailing\" constant=\"19\" id=\"QIz-Bj-PTh\"/>\n                            <constraint firstItem=\"4ng-X7-dRa\" firstAttribute=\"leading\" secondItem=\"LZw-qp-NWH\" secondAttribute=\"leading\" constant=\"20\" id=\"RNz-ur-say\"/>\n                            <constraint firstItem=\"1OP-ac-77Z\" firstAttribute=\"top\" secondItem=\"Xzk-6e-mKA\" secondAttribute=\"bottom\" constant=\"20\" id=\"XQy-uw-780\"/>\n                            <constraint firstItem=\"Gt2-mv-Ris\" firstAttribute=\"top\" secondItem=\"1OP-ac-77Z\" secondAttribute=\"bottom\" constant=\"6\" id=\"XY4-ay-hRV\"/>\n                            <constraint firstItem=\"Gt2-mv-Ris\" firstAttribute=\"leading\" secondItem=\"Xzk-6e-mKA\" secondAttribute=\"leading\" id=\"Yvi-cN-EWJ\"/>\n                            <constraint firstItem=\"Xzk-6e-mKA\" firstAttribute=\"centerY\" secondItem=\"4ng-X7-dRa\" secondAttribute=\"centerY\" id=\"gza-xU-tdS\"/>\n                            <constraint firstItem=\"Xzk-6e-mKA\" firstAttribute=\"top\" secondItem=\"LZw-qp-NWH\" secondAttribute=\"top\" constant=\"20\" id=\"is7-Ds-fnD\"/>\n                            <constraint firstItem=\"vPz-kM-wAq\" firstAttribute=\"top\" secondItem=\"LZw-qp-NWH\" secondAttribute=\"top\" constant=\"10\" id=\"k8K-MT-aLo\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"Xzk-6e-mKA\" secondAttribute=\"trailing\" constant=\"20\" id=\"uwt-6G-UwH\"/>\n                        </constraints>\n                    </visualEffectView>\n                    <connections>\n                        <outlet property=\"hideStatusBarIconCheckBox\" destination=\"1OP-ac-77Z\" id=\"eAY-em-HEE\"/>\n                        <outlet property=\"launchOnLoginCheckBox\" destination=\"Xzk-6e-mKA\" id=\"Dx6-Zs-rVj\"/>\n                    </connections>\n                </viewController>\n                <customObject id=\"KsC-af-ap0\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"460\" y=\"1168\"/>\n        </scene>\n        <!--Buttons-->\n        <scene sceneID=\"BTN-SC-123\">\n            <objects>\n                <viewController title=\"Buttons\" storyboardIdentifier=\"buttons\" id=\"BTN-VC-123\" customClass=\"PreferencesButtonsViewController\" customModule=\"Mos\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <visualEffectView key=\"view\" blendingMode=\"behindWindow\" material=\"toolTip\" state=\"followsWindowActiveState\" id=\"BTN-VW-123\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"450\" height=\"321\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMinX=\"YES\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\" flexibleMaxY=\"YES\"/>\n                        <subviews>\n                            <visualEffectView blendingMode=\"behindWindow\" material=\"toolTip\" state=\"followsWindowActiveState\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"2W2-hM-ME3\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"291\" width=\"450\" height=\"30\"/>\n                                <subviews>\n                                    <textField wantsLayer=\"YES\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" verifyAmbiguity=\"off\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"c5F-kF-CwS\">\n                                        <rect key=\"frame\" x=\"29\" y=\"8\" width=\"40\" height=\"14\"/>\n                                        <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" alignment=\"left\" title=\"Button\" id=\"AbN-7n-hF7\">\n                                            <font key=\"font\" metaFont=\"systemMedium\" size=\"11\"/>\n                                            <color key=\"textColor\" name=\"secondaryLabelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        </textFieldCell>\n                                    </textField>\n                                    <box verticalHuggingPriority=\"750\" boxType=\"separator\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Wa1-F9-Eyt\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"-2\" width=\"450\" height=\"5\"/>\n                                    </box>\n                                    <textField wantsLayer=\"YES\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" verifyAmbiguity=\"off\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"xNC-sb-7wF\">\n                                        <rect key=\"frame\" x=\"384\" y=\"8\" width=\"43\" height=\"14\"/>\n                                        <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" alignment=\"center\" title=\"Action\" id=\"sdr-Ih-rCr\">\n                                            <font key=\"font\" metaFont=\"systemMedium\" size=\"11\"/>\n                                            <color key=\"textColor\" name=\"secondaryLabelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        </textFieldCell>\n                                    </textField>\n                                </subviews>\n                                <constraints>\n                                    <constraint firstItem=\"c5F-kF-CwS\" firstAttribute=\"centerY\" secondItem=\"2W2-hM-ME3\" secondAttribute=\"centerY\" id=\"4XX-7s-FJL\"/>\n                                    <constraint firstItem=\"c5F-kF-CwS\" firstAttribute=\"leading\" secondItem=\"2W2-hM-ME3\" secondAttribute=\"leading\" constant=\"31\" id=\"8dG-MJ-pMB\"/>\n                                    <constraint firstAttribute=\"height\" constant=\"30\" id=\"I6t-Sp-fUx\"/>\n                                    <constraint firstAttribute=\"bottom\" secondItem=\"Wa1-F9-Eyt\" secondAttribute=\"bottom\" id=\"bWd-WO-ava\"/>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"Wa1-F9-Eyt\" secondAttribute=\"trailing\" id=\"eZC-lp-tCf\"/>\n                                    <constraint firstItem=\"xNC-sb-7wF\" firstAttribute=\"centerX\" secondItem=\"2W2-hM-ME3\" secondAttribute=\"centerX\" constant=\"180\" id=\"fxl-KY-Jzc\"/>\n                                    <constraint firstItem=\"xNC-sb-7wF\" firstAttribute=\"leading\" relation=\"greaterThanOrEqual\" secondItem=\"c5F-kF-CwS\" secondAttribute=\"trailing\" constant=\"8\" symbolic=\"YES\" id=\"g18-i4-Vrz\"/>\n                                    <constraint firstItem=\"Wa1-F9-Eyt\" firstAttribute=\"leading\" secondItem=\"2W2-hM-ME3\" secondAttribute=\"leading\" id=\"lQj-um-iK7\"/>\n                                    <constraint firstItem=\"xNC-sb-7wF\" firstAttribute=\"centerY\" secondItem=\"2W2-hM-ME3\" secondAttribute=\"centerY\" id=\"vl7-7z-Qn5\"/>\n                                </constraints>\n                            </visualEffectView>\n                            <scrollView borderType=\"none\" autohidesScrollers=\"YES\" horizontalLineScroll=\"52\" horizontalPageScroll=\"10\" verticalLineScroll=\"52\" verticalPageScroll=\"10\" hasHorizontalScroller=\"NO\" usesPredominantAxisScrolling=\"NO\" findBarPosition=\"aboveHorizontalRuler\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ftV-jh-kjD\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"31\" width=\"450\" height=\"260\"/>\n                                <clipView key=\"contentView\" drawsBackground=\"NO\" copiesOnScroll=\"NO\" id=\"9qm-Wz-Rwq\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"450\" height=\"260\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                    <subviews>\n                                        <tableView verticalHuggingPriority=\"750\" allowsExpansionToolTips=\"YES\" columnAutoresizingStyle=\"none\" tableStyle=\"inset\" columnReordering=\"NO\" columnSelection=\"YES\" columnResizing=\"NO\" multipleSelection=\"NO\" autosaveColumns=\"NO\" rowHeight=\"52\" rowSizeStyle=\"automatic\" viewBased=\"YES\" floatsGroupRows=\"NO\" id=\"tU8-ze-w7X\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"450\" height=\"260\"/>\n                                            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                            <size key=\"intercellSpacing\" width=\"17\" height=\"0.0\"/>\n                                            <color key=\"backgroundColor\" red=\"0.11764705882352941\" green=\"0.11764705882352941\" blue=\"0.11764705882352941\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                            <color key=\"gridColor\" name=\"gridColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            <tableColumns>\n                                                <tableColumn identifier=\"Hotkey\" width=\"418\" minWidth=\"40\" maxWidth=\"1000\" id=\"gd2-WO-uk9\">\n                                                    <tableHeaderCell key=\"headerCell\" lineBreakMode=\"truncatingTail\" borderStyle=\"border\" alignment=\"left\" title=\"Hotkey\">\n                                                        <color key=\"textColor\" name=\"headerTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                        <color key=\"backgroundColor\" name=\"headerColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                    </tableHeaderCell>\n                                                    <textFieldCell key=\"dataCell\" lineBreakMode=\"truncatingTail\" selectable=\"YES\" editable=\"YES\" title=\"Text Cell\" id=\"aP7-2e-zd4\">\n                                                        <font key=\"font\" metaFont=\"system\"/>\n                                                        <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                        <color key=\"backgroundColor\" name=\"controlBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                    </textFieldCell>\n                                                    <tableColumnResizingMask key=\"resizingMask\" resizeWithTable=\"YES\"/>\n                                                    <prototypeCellViews>\n                                                        <tableCellView id=\"zV9-2l-l6k\" customClass=\"ButtonTableCellView\" customModule=\"Mos\" customModuleProvider=\"target\">\n                                                            <rect key=\"frame\" x=\"18\" y=\"0.0\" width=\"413\" height=\"52\"/>\n                                                            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                                            <subviews>\n                                                                <box boxType=\"custom\" cornerRadius=\"5\" title=\"Box\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Hcf-QN-htP\">\n                                                                    <rect key=\"frame\" x=\"0.0\" y=\"5\" width=\"413\" height=\"42\"/>\n                                                                    <view key=\"contentView\" wantsLayer=\"YES\" id=\"sUm-mF-Rt9\">\n                                                                        <rect key=\"frame\" x=\"1\" y=\"1\" width=\"411\" height=\"40\"/>\n                                                                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                                                        <subviews>\n                                                                            <box boxType=\"custom\" borderWidth=\"0.0\" cornerRadius=\"4\" title=\"Box\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ei3-vh-6kV\">\n                                                                                <rect key=\"frame\" x=\"12\" y=\"5\" width=\"250\" height=\"30\"/>\n                                                                                <view key=\"contentView\" id=\"UjE-iu-X41\">\n                                                                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"250\" height=\"30\"/>\n                                                                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                                                                </view>\n                                                                                <color key=\"borderColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"0.10068822230879106\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                                                <color key=\"fillColor\" red=\"0.96062562677481145\" green=\"0.96754766589999996\" blue=\"0.93064895263721903\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"displayP3\"/>\n                                                                            </box>\n                                                                            <popUpButton verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"3eO-mD-7ue\">\n                                                                                <rect key=\"frame\" x=\"287\" y=\"8\" width=\"120\" height=\"24\"/>\n                                                                                <popUpButtonCell key=\"cell\" type=\"push\" title=\"No Action\" bezelStyle=\"rounded\" alignment=\"left\" lineBreakMode=\"truncatingTail\" state=\"on\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" selectedItem=\"epU-lS-atX\" id=\"DPN-ii-WxE\">\n                                                                                    <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                                                                    <font key=\"font\" metaFont=\"message\"/>\n                                                                                    <menu key=\"menu\" id=\"Q8S-vA-nvS\">\n                                                                                        <items>\n                                                                                            <menuItem title=\"No Action\" state=\"on\" id=\"epU-lS-atX\"/>\n                                                                                            <menuItem isSeparatorItem=\"YES\" id=\"tEC-yo-gDp\"/>\n                                                                                        </items>\n                                                                                    </menu>\n                                                                                </popUpButtonCell>\n                                                                                <constraints>\n                                                                                    <constraint firstAttribute=\"width\" relation=\"greaterThanOrEqual\" constant=\"120\" id=\"ycn-md-UBm\"/>\n                                                                                </constraints>\n                                                                            </popUpButton>\n                                                                        </subviews>\n                                                                        <constraints>\n                                                                            <constraint firstAttribute=\"trailing\" secondItem=\"3eO-mD-7ue\" secondAttribute=\"trailing\" constant=\"4\" id=\"2eY-s6-2qh\"/>\n                                                                            <constraint firstAttribute=\"bottom\" secondItem=\"ei3-vh-6kV\" secondAttribute=\"bottom\" constant=\"5\" id=\"FN4-2W-Rm1\"/>\n                                                                            <constraint firstItem=\"ei3-vh-6kV\" firstAttribute=\"top\" secondItem=\"sUm-mF-Rt9\" secondAttribute=\"top\" constant=\"5\" id=\"Ga7-qB-xL0\"/>\n                                                                            <constraint firstItem=\"3eO-mD-7ue\" firstAttribute=\"centerY\" secondItem=\"sUm-mF-Rt9\" secondAttribute=\"centerY\" id=\"I7g-BJ-jVc\"/>\n                                                                            <constraint firstItem=\"3eO-mD-7ue\" firstAttribute=\"leading\" secondItem=\"ei3-vh-6kV\" secondAttribute=\"trailing\" constant=\"25\" id=\"fTO-Xp-Lwf\"/>\n                                                                            <constraint firstItem=\"ei3-vh-6kV\" firstAttribute=\"leading\" secondItem=\"sUm-mF-Rt9\" secondAttribute=\"leading\" constant=\"12\" id=\"vbF-oh-1y2\"/>\n                                                                        </constraints>\n                                                                    </view>\n                                                                    <constraints>\n                                                                        <constraint firstAttribute=\"height\" constant=\"42\" id=\"cDH-Mh-whs\"/>\n                                                                    </constraints>\n                                                                    <color key=\"borderColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                                    <color key=\"fillColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                                </box>\n                                                            </subviews>\n                                                            <constraints>\n                                                                <constraint firstItem=\"Hcf-QN-htP\" firstAttribute=\"centerY\" secondItem=\"zV9-2l-l6k\" secondAttribute=\"centerY\" id=\"28R-oI-28a\"/>\n                                                                <constraint firstAttribute=\"trailing\" secondItem=\"Hcf-QN-htP\" secondAttribute=\"trailing\" id=\"B5f-Q7-1ek\"/>\n                                                                <constraint firstItem=\"Hcf-QN-htP\" firstAttribute=\"leading\" secondItem=\"zV9-2l-l6k\" secondAttribute=\"leading\" id=\"k9E-8E-a7l\"/>\n                                                            </constraints>\n                                                            <connections>\n                                                                <outlet property=\"actionPopUpButton\" destination=\"3eO-mD-7ue\" id=\"78f-cI-nk8\"/>\n                                                                <outlet property=\"keyDisplayContainerView\" destination=\"UjE-iu-X41\" id=\"kK1-dw-8ZY\"/>\n                                                            </connections>\n                                                        </tableCellView>\n                                                    </prototypeCellViews>\n                                                </tableColumn>\n                                            </tableColumns>\n                                        </tableView>\n                                    </subviews>\n                                    <nil key=\"backgroundColor\"/>\n                                </clipView>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" constant=\"450\" id=\"O6a-JW-Ptw\"/>\n                                    <constraint firstAttribute=\"height\" relation=\"greaterThanOrEqual\" constant=\"260\" id=\"wgU-xJ-cqJ\"/>\n                                </constraints>\n                                <scroller key=\"horizontalScroller\" hidden=\"YES\" wantsLayer=\"YES\" verticalHuggingPriority=\"750\" horizontal=\"YES\" id=\"R1g-hj-G0Y\">\n                                    <rect key=\"frame\" x=\"-100\" y=\"-100\" width=\"450\" height=\"15\"/>\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                </scroller>\n                                <scroller key=\"verticalScroller\" hidden=\"YES\" wantsLayer=\"YES\" verticalHuggingPriority=\"750\" horizontal=\"NO\" id=\"Hu3-iV-J5G\">\n                                    <rect key=\"frame\" x=\"224\" y=\"17\" width=\"15\" height=\"102\"/>\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                </scroller>\n                            </scrollView>\n                            <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"skg-W8-gS0\">\n                                <rect key=\"frame\" x=\"33\" y=\"133\" width=\"385\" height=\"148\"/>\n                                <subviews>\n                                    <textField wantsLayer=\"YES\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"AtR-B3-Yvi\">\n                                        <rect key=\"frame\" x=\"18\" y=\"20\" width=\"349\" height=\"14\"/>\n                                        <textFieldCell key=\"cell\" sendsActionOnEndEditing=\"YES\" alignment=\"center\" title=\"Customize mouse buttons to enhance your experience\" id=\"2hV-f7-8yO\">\n                                            <font key=\"font\" metaFont=\"menu\" size=\"11\"/>\n                                            <color key=\"textColor\" name=\"tertiaryLabelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        </textFieldCell>\n                                    </textField>\n                                    <textField wantsLayer=\"YES\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"EvW-FY-pRc\">\n                                        <rect key=\"frame\" x=\"18\" y=\"39\" width=\"349\" height=\"19\"/>\n                                        <textFieldCell key=\"cell\" sendsActionOnEndEditing=\"YES\" alignment=\"center\" title=\"No buttons are set up yet\" id=\"tum-Lo-TC6\">\n                                            <font key=\"font\" metaFont=\"system\" size=\"16\"/>\n                                            <color key=\"textColor\" name=\"secondaryLabelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        </textFieldCell>\n                                    </textField>\n                                    <imageView wantsLayer=\"YES\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"eyA-cJ-hnJ\">\n                                        <rect key=\"frame\" x=\"162\" y=\"68\" width=\"60\" height=\"60\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"height\" constant=\"60\" id=\"D9X-8a-rcb\"/>\n                                            <constraint firstAttribute=\"width\" constant=\"60\" id=\"t4B-oR-h2k\"/>\n                                        </constraints>\n                                        <imageCell key=\"cell\" refusesFirstResponder=\"YES\" alignment=\"left\" animates=\"YES\" imageScaling=\"proportionallyDown\" image=\"SF.scribble\" id=\"MGl-AO-ne3\"/>\n                                    </imageView>\n                                </subviews>\n                                <constraints>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"EvW-FY-pRc\" secondAttribute=\"trailing\" constant=\"20\" id=\"1IW-Ey-cwO\"/>\n                                    <constraint firstItem=\"eyA-cJ-hnJ\" firstAttribute=\"top\" secondItem=\"skg-W8-gS0\" secondAttribute=\"top\" constant=\"20\" id=\"1ku-1d-HVn\"/>\n                                    <constraint firstItem=\"AtR-B3-Yvi\" firstAttribute=\"top\" secondItem=\"EvW-FY-pRc\" secondAttribute=\"bottom\" constant=\"5\" id=\"6Sw-S3-MQf\"/>\n                                    <constraint firstItem=\"AtR-B3-Yvi\" firstAttribute=\"leading\" secondItem=\"skg-W8-gS0\" secondAttribute=\"leading\" constant=\"20\" id=\"Etv-0M-Rey\"/>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"AtR-B3-Yvi\" secondAttribute=\"trailing\" constant=\"20\" id=\"MTL-lb-t9I\"/>\n                                    <constraint firstAttribute=\"bottom\" secondItem=\"AtR-B3-Yvi\" secondAttribute=\"bottom\" constant=\"20\" id=\"OCv-E9-E1i\"/>\n                                    <constraint firstItem=\"EvW-FY-pRc\" firstAttribute=\"top\" secondItem=\"eyA-cJ-hnJ\" secondAttribute=\"bottom\" constant=\"10\" id=\"WK9-vD-CeY\"/>\n                                    <constraint firstItem=\"EvW-FY-pRc\" firstAttribute=\"leading\" secondItem=\"skg-W8-gS0\" secondAttribute=\"leading\" constant=\"20\" id=\"pYC-kZ-WYc\"/>\n                                    <constraint firstAttribute=\"width\" constant=\"385\" id=\"qqw-2g-JAd\"/>\n                                    <constraint firstItem=\"eyA-cJ-hnJ\" firstAttribute=\"centerX\" secondItem=\"skg-W8-gS0\" secondAttribute=\"centerX\" id=\"s45-1k-j6V\"/>\n                                </constraints>\n                            </customView>\n                            <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"uuZ-tE-wlr\" customClass=\"PrimaryButton\" customModule=\"Mos\" customModuleProvider=\"target\">\n                                <rect key=\"frame\" x=\"40\" y=\"38\" width=\"370\" height=\"60\"/>\n                                <subviews>\n                                    <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"QAD-KS-uBx\">\n                                        <rect key=\"frame\" x=\"13\" y=\"31\" width=\"91\" height=\"16\"/>\n                                        <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"Record Button\" id=\"l7O-So-nw1\">\n                                            <font key=\"font\" usesAppearanceFont=\"YES\"/>\n                                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        </textFieldCell>\n                                    </textField>\n                                    <textField wantsLayer=\"YES\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Ggg-Eq-Gh7\">\n                                        <rect key=\"frame\" x=\"13\" y=\"14\" width=\"189\" height=\"14\"/>\n                                        <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"Assign a button to a specific action\" id=\"fXu-uF-M3Q\">\n                                            <font key=\"font\" metaFont=\"smallSystem\"/>\n                                            <color key=\"textColor\" name=\"secondaryLabelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        </textFieldCell>\n                                    </textField>\n                                    <imageView wantsLayer=\"YES\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"djE-pP-ToX\">\n                                        <rect key=\"frame\" x=\"325\" y=\"18\" width=\"25\" height=\"25\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"width\" constant=\"25\" id=\"0t9-Ni-YdC\"/>\n                                            <constraint firstAttribute=\"height\" constant=\"25\" id=\"CWi-jr-Ib1\"/>\n                                        </constraints>\n                                        <imageCell key=\"cell\" refusesFirstResponder=\"YES\" alignment=\"left\" animates=\"YES\" imageScaling=\"proportionallyUpOrDown\" image=\"SF.lasso.badge.sparkles\" id=\"qFF-o8-J7D\"/>\n                                    </imageView>\n                                </subviews>\n                                <constraints>\n                                    <constraint firstItem=\"QAD-KS-uBx\" firstAttribute=\"leading\" secondItem=\"uuZ-tE-wlr\" secondAttribute=\"leading\" constant=\"15\" id=\"4oh-9p-l0q\"/>\n                                    <constraint firstItem=\"QAD-KS-uBx\" firstAttribute=\"centerY\" secondItem=\"uuZ-tE-wlr\" secondAttribute=\"centerY\" constant=\"-9\" id=\"8qk-QE-zQ4\"/>\n                                    <constraint firstAttribute=\"height\" constant=\"60\" id=\"9cR-Bw-AYg\"/>\n                                    <constraint firstItem=\"djE-pP-ToX\" firstAttribute=\"centerY\" secondItem=\"uuZ-tE-wlr\" secondAttribute=\"centerY\" id=\"LUw-ov-uQA\"/>\n                                    <constraint firstAttribute=\"width\" constant=\"370\" id=\"ROH-M2-7yk\"/>\n                                    <constraint firstItem=\"djE-pP-ToX\" firstAttribute=\"leading\" relation=\"greaterThanOrEqual\" secondItem=\"Ggg-Eq-Gh7\" secondAttribute=\"trailing\" constant=\"8\" symbolic=\"YES\" id=\"X0h-2A-V7I\"/>\n                                    <constraint firstItem=\"Ggg-Eq-Gh7\" firstAttribute=\"leading\" secondItem=\"uuZ-tE-wlr\" secondAttribute=\"leading\" constant=\"15\" id=\"Zqf-v7-Q6r\"/>\n                                    <constraint firstItem=\"Ggg-Eq-Gh7\" firstAttribute=\"centerY\" secondItem=\"uuZ-tE-wlr\" secondAttribute=\"centerY\" constant=\"9\" id=\"Zu1-PH-kb8\"/>\n                                    <constraint firstItem=\"djE-pP-ToX\" firstAttribute=\"leading\" relation=\"greaterThanOrEqual\" secondItem=\"QAD-KS-uBx\" secondAttribute=\"trailing\" constant=\"8\" symbolic=\"YES\" id=\"s81-tB-GM8\"/>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"djE-pP-ToX\" secondAttribute=\"trailing\" constant=\"20\" id=\"vwG-KS-2n2\"/>\n                                </constraints>\n                            </customView>\n                            <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"y2I-TF-AaH\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"450\" height=\"31\"/>\n                                <subviews>\n                                    <box verticalHuggingPriority=\"750\" boxType=\"separator\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"PME-e7-Shd\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"28\" width=\"450\" height=\"5\"/>\n                                    </box>\n                                    <button imageHugsTitle=\"YES\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"4Ef-t4-sPm\">\n                                        <rect key=\"frame\" x=\"36\" y=\"4\" width=\"30.5\" height=\"25\"/>\n                                        <buttonCell key=\"cell\" type=\"bevel\" bezelStyle=\"regularSquare\" image=\"NSRemoveTemplate\" imagePosition=\"only\" alignment=\"center\" lineBreakMode=\"truncatingTail\" enabled=\"NO\" state=\"on\" inset=\"2\" id=\"SGK-IN-m4l\">\n                                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                            <font key=\"font\" metaFont=\"system\"/>\n                                        </buttonCell>\n                                        <constraints>\n                                            <constraint firstAttribute=\"height\" constant=\"30\" id=\"RXI-KH-wYX\"/>\n                                            <constraint firstAttribute=\"width\" constant=\"30\" id=\"dun-z6-g2j\"/>\n                                        </constraints>\n                                        <connections>\n                                            <action selector=\"removeItemClick:\" target=\"BTN-VC-123\" id=\"CaV-9Y-dCa\"/>\n                                        </connections>\n                                    </button>\n                                    <button imageHugsTitle=\"YES\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"xql-gm-0mI\">\n                                        <rect key=\"frame\" x=\"6\" y=\"-0.5\" width=\"30.5\" height=\"34\"/>\n                                        <buttonCell key=\"cell\" type=\"bevel\" bezelStyle=\"regularSquare\" image=\"NSAddTemplate\" imagePosition=\"only\" alignment=\"center\" lineBreakMode=\"truncatingTail\" state=\"on\" inset=\"2\" id=\"Io4-fW-e2U\">\n                                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                            <font key=\"font\" metaFont=\"system\"/>\n                                        </buttonCell>\n                                        <constraints>\n                                            <constraint firstAttribute=\"width\" constant=\"30\" id=\"RUY-pE-WD4\"/>\n                                            <constraint firstAttribute=\"height\" constant=\"30\" id=\"UHR-XW-1aR\"/>\n                                        </constraints>\n                                        <connections>\n                                            <action selector=\"addItemClick:\" target=\"BTN-VC-123\" id=\"H66-KH-Yle\"/>\n                                        </connections>\n                                    </button>\n                                </subviews>\n                                <constraints>\n                                    <constraint firstItem=\"4Ef-t4-sPm\" firstAttribute=\"centerY\" secondItem=\"y2I-TF-AaH\" secondAttribute=\"centerY\" id=\"5YT-JK-VWp\"/>\n                                    <constraint firstItem=\"xql-gm-0mI\" firstAttribute=\"leading\" secondItem=\"y2I-TF-AaH\" secondAttribute=\"leading\" constant=\"6\" id=\"93f-wZ-k27\"/>\n                                    <constraint firstItem=\"4Ef-t4-sPm\" firstAttribute=\"leading\" secondItem=\"xql-gm-0mI\" secondAttribute=\"trailing\" id=\"Cuh-Nc-tdO\"/>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"PME-e7-Shd\" secondAttribute=\"trailing\" id=\"JTG-gd-tNF\"/>\n                                    <constraint firstItem=\"PME-e7-Shd\" firstAttribute=\"leading\" secondItem=\"y2I-TF-AaH\" secondAttribute=\"leading\" id=\"Jgf-sy-FRr\"/>\n                                    <constraint firstItem=\"xql-gm-0mI\" firstAttribute=\"centerY\" secondItem=\"y2I-TF-AaH\" secondAttribute=\"centerY\" id=\"LNg-c8-prT\"/>\n                                    <constraint firstAttribute=\"height\" constant=\"31\" id=\"r0c-BN-CCZ\"/>\n                                    <constraint firstItem=\"PME-e7-Shd\" firstAttribute=\"top\" secondItem=\"y2I-TF-AaH\" secondAttribute=\"top\" id=\"v77-cf-5Mn\"/>\n                                </constraints>\n                            </customView>\n                        </subviews>\n                        <constraints>\n                            <constraint firstItem=\"ftV-jh-kjD\" firstAttribute=\"top\" secondItem=\"2W2-hM-ME3\" secondAttribute=\"bottom\" id=\"7nE-RF-MKB\"/>\n                            <constraint firstItem=\"skg-W8-gS0\" firstAttribute=\"centerX\" secondItem=\"BTN-VW-123\" secondAttribute=\"centerX\" id=\"8H6-YI-eq0\"/>\n                            <constraint firstItem=\"2W2-hM-ME3\" firstAttribute=\"leading\" secondItem=\"BTN-VW-123\" secondAttribute=\"leading\" id=\"BdG-ja-NoC\"/>\n                            <constraint firstItem=\"y2I-TF-AaH\" firstAttribute=\"leading\" secondItem=\"BTN-VW-123\" secondAttribute=\"leading\" id=\"Dcd-bE-nqo\"/>\n                            <constraint firstItem=\"2W2-hM-ME3\" firstAttribute=\"top\" secondItem=\"BTN-VW-123\" secondAttribute=\"top\" id=\"F0I-ER-NKs\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"ftV-jh-kjD\" secondAttribute=\"trailing\" id=\"P8Z-6N-CpR\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"2W2-hM-ME3\" secondAttribute=\"trailing\" id=\"Q4P-LZ-2vh\"/>\n                            <constraint firstItem=\"2W2-hM-ME3\" firstAttribute=\"top\" secondItem=\"BTN-VW-123\" secondAttribute=\"top\" id=\"R11-z5-pFR\"/>\n                            <constraint firstItem=\"uuZ-tE-wlr\" firstAttribute=\"centerX\" secondItem=\"BTN-VW-123\" secondAttribute=\"centerX\" id=\"SwX-zy-m7I\"/>\n                            <constraint firstItem=\"2W2-hM-ME3\" firstAttribute=\"leading\" secondItem=\"BTN-VW-123\" secondAttribute=\"leading\" id=\"bBi-x6-hqs\"/>\n                            <constraint firstItem=\"ftV-jh-kjD\" firstAttribute=\"leading\" secondItem=\"BTN-VW-123\" secondAttribute=\"leading\" id=\"eF6-ka-pvJ\"/>\n                            <constraint firstItem=\"y2I-TF-AaH\" firstAttribute=\"top\" secondItem=\"ftV-jh-kjD\" secondAttribute=\"bottom\" id=\"fZW-Om-hhT\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"y2I-TF-AaH\" secondAttribute=\"bottom\" id=\"r1G-z8-ouo\"/>\n                            <constraint firstItem=\"skg-W8-gS0\" firstAttribute=\"top\" secondItem=\"BTN-VW-123\" secondAttribute=\"top\" constant=\"40\" id=\"tBg-oX-ddF\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"2W2-hM-ME3\" secondAttribute=\"trailing\" id=\"uOc-MD-2UB\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"uuZ-tE-wlr\" secondAttribute=\"bottom\" constant=\"38\" id=\"vG8-OX-AKv\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"y2I-TF-AaH\" secondAttribute=\"trailing\" id=\"w3a-c5-36o\"/>\n                        </constraints>\n                    </visualEffectView>\n                    <connections>\n                        <outlet property=\"addButton\" destination=\"xql-gm-0mI\" id=\"E6H-zi-qsW\"/>\n                        <outlet property=\"createButton\" destination=\"uuZ-tE-wlr\" id=\"h6U-Gs-MEr\"/>\n                        <outlet property=\"delButton\" destination=\"4Ef-t4-sPm\" id=\"80m-Qy-Vdg\"/>\n                        <outlet property=\"tableEmpty\" destination=\"skg-W8-gS0\" id=\"eHD-Fa-Gdk\"/>\n                        <outlet property=\"tableFoot\" destination=\"y2I-TF-AaH\" id=\"1nE-Ft-HI6\"/>\n                        <outlet property=\"tableHead\" destination=\"2W2-hM-ME3\" id=\"Y4J-wc-n9g\"/>\n                        <outlet property=\"tableView\" destination=\"tU8-ze-w7X\" id=\"CbL-cb-u12\"/>\n                    </connections>\n                </viewController>\n                <customObject id=\"BTN-FR-123\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1443\" y=\"1277\"/>\n        </scene>\n        <!--Application-->\n        <scene sceneID=\"UqT-28-MT6\">\n            <objects>\n                <customObject id=\"l11-a0-4Xa\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n                <viewController title=\"Application\" storyboardIdentifier=\"application\" id=\"bga-wG-iim\" customClass=\"PreferencesApplicationViewController\" customModule=\"Mos\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <visualEffectView key=\"view\" wantsLayer=\"YES\" blendingMode=\"behindWindow\" material=\"toolTip\" state=\"followsWindowActiveState\" id=\"jc3-9p-Bfo\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"450\" height=\"321\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <subviews>\n                            <visualEffectView appearanceType=\"inheritedVibrantLight\" blendingMode=\"behindWindow\" material=\"underWindowBackground\" state=\"active\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"VAL-LC-T3T\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"291\" width=\"450\" height=\"30\"/>\n                                <subviews>\n                                    <visualEffectView blendingMode=\"behindWindow\" material=\"toolTip\" state=\"followsWindowActiveState\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ouh-IG-LyJ\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"450\" height=\"30\"/>\n                                        <subviews>\n                                            <textField wantsLayer=\"YES\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" verifyAmbiguity=\"off\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Dph-wy-8sb\">\n                                                <rect key=\"frame\" x=\"35\" y=\"8\" width=\"65\" height=\"14\"/>\n                                                <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" alignment=\"left\" title=\"Application\" id=\"89F-B4-NIY\">\n                                                    <font key=\"font\" metaFont=\"systemMedium\" size=\"11\"/>\n                                                    <color key=\"textColor\" name=\"secondaryLabelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                </textFieldCell>\n                                            </textField>\n                                            <box verticalHuggingPriority=\"750\" boxType=\"separator\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"XUy-oo-mzG\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"-2\" width=\"450\" height=\"5\"/>\n                                            </box>\n                                            <textField wantsLayer=\"YES\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" verifyAmbiguity=\"off\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"W4G-c6-Zmz\">\n                                                <rect key=\"frame\" x=\"361\" y=\"8\" width=\"56\" height=\"14\"/>\n                                                <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" alignment=\"center\" title=\"Scrolling\" id=\"JQK-PN-VMN\">\n                                                    <font key=\"font\" metaFont=\"systemMedium\" size=\"11\"/>\n                                                    <color key=\"textColor\" name=\"secondaryLabelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                </textFieldCell>\n                                            </textField>\n                                        </subviews>\n                                        <constraints>\n                                            <constraint firstItem=\"W4G-c6-Zmz\" firstAttribute=\"leading\" relation=\"greaterThanOrEqual\" secondItem=\"Dph-wy-8sb\" secondAttribute=\"trailing\" constant=\"8\" symbolic=\"YES\" id=\"0ZH-vo-N8D\"/>\n                                            <constraint firstItem=\"Dph-wy-8sb\" firstAttribute=\"centerY\" secondItem=\"ouh-IG-LyJ\" secondAttribute=\"centerY\" id=\"6H6-5z-Sht\"/>\n                                            <constraint firstItem=\"W4G-c6-Zmz\" firstAttribute=\"centerX\" secondItem=\"ouh-IG-LyJ\" secondAttribute=\"centerX\" constant=\"164\" id=\"9EA-0U-hrm\"/>\n                                            <constraint firstItem=\"Dph-wy-8sb\" firstAttribute=\"leading\" secondItem=\"ouh-IG-LyJ\" secondAttribute=\"leading\" constant=\"37\" id=\"JAN-ad-8pf\"/>\n                                            <constraint firstItem=\"W4G-c6-Zmz\" firstAttribute=\"centerY\" secondItem=\"ouh-IG-LyJ\" secondAttribute=\"centerY\" id=\"KjP-Hk-a0i\"/>\n                                            <constraint firstAttribute=\"height\" constant=\"30\" id=\"Lth-gv-sxw\"/>\n                                            <constraint firstAttribute=\"bottom\" secondItem=\"XUy-oo-mzG\" secondAttribute=\"bottom\" id=\"WI9-RH-ERQ\"/>\n                                            <constraint firstItem=\"XUy-oo-mzG\" firstAttribute=\"leading\" secondItem=\"ouh-IG-LyJ\" secondAttribute=\"leading\" id=\"XRb-rf-T5L\"/>\n                                            <constraint firstAttribute=\"trailing\" secondItem=\"XUy-oo-mzG\" secondAttribute=\"trailing\" id=\"do1-QI-fda\"/>\n                                        </constraints>\n                                    </visualEffectView>\n                                </subviews>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"30\" id=\"Oci-9C-yUn\"/>\n                                    <constraint firstItem=\"ouh-IG-LyJ\" firstAttribute=\"top\" secondItem=\"VAL-LC-T3T\" secondAttribute=\"top\" id=\"Z0o-YV-eTd\"/>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"ouh-IG-LyJ\" secondAttribute=\"trailing\" id=\"cbY-du-LsV\"/>\n                                    <constraint firstItem=\"ouh-IG-LyJ\" firstAttribute=\"leading\" secondItem=\"VAL-LC-T3T\" secondAttribute=\"leading\" id=\"hkp-a2-qzN\"/>\n                                    <constraint firstAttribute=\"width\" constant=\"450\" id=\"nVH-oK-9VM\"/>\n                                </constraints>\n                            </visualEffectView>\n                            <scrollView borderType=\"none\" autohidesScrollers=\"YES\" horizontalLineScroll=\"57\" horizontalPageScroll=\"10\" verticalLineScroll=\"57\" verticalPageScroll=\"10\" hasHorizontalScroller=\"NO\" usesPredominantAxisScrolling=\"NO\" findBarPosition=\"aboveHorizontalRuler\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"2dP-HG-cdi\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"31\" width=\"450\" height=\"260\"/>\n                                <clipView key=\"contentView\" drawsBackground=\"NO\" copiesOnScroll=\"NO\" id=\"bif-Bv-tOQ\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"450\" height=\"260\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                    <subviews>\n                                        <tableView verticalHuggingPriority=\"750\" allowsExpansionToolTips=\"YES\" columnAutoresizingStyle=\"none\" tableStyle=\"inset\" columnReordering=\"NO\" columnSelection=\"YES\" columnResizing=\"NO\" multipleSelection=\"NO\" autosaveColumns=\"NO\" rowHeight=\"45\" rowSizeStyle=\"automatic\" viewBased=\"YES\" floatsGroupRows=\"NO\" id=\"LmV-gi-3fE\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"450\" height=\"260\"/>\n                                            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                            <size key=\"intercellSpacing\" width=\"0.0\" height=\"12\"/>\n                                            <color key=\"backgroundColor\" red=\"0.11764705882352941\" green=\"0.11764705882352941\" blue=\"0.11764705882352941\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                            <color key=\"gridColor\" name=\"gridColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            <tableColumns>\n                                                <tableColumn identifier=\"applicationCell\" width=\"328\" minWidth=\"1\" maxWidth=\"1000\" id=\"xfG-Cd-oIk\">\n                                                    <tableHeaderCell key=\"headerCell\" lineBreakMode=\"truncatingTail\" borderStyle=\"border\" alignment=\"left\" title=\" Application\">\n                                                        <color key=\"textColor\" name=\"headerTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                        <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"calibratedWhite\"/>\n                                                    </tableHeaderCell>\n                                                    <textFieldCell key=\"dataCell\" lineBreakMode=\"truncatingTail\" selectable=\"YES\" editable=\"YES\" alignment=\"left\" title=\"Text Cell\" id=\"HEV-nL-Tno\">\n                                                        <font key=\"font\" metaFont=\"system\"/>\n                                                        <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                        <color key=\"backgroundColor\" name=\"controlBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                    </textFieldCell>\n                                                    <tableColumnResizingMask key=\"resizingMask\" resizeWithTable=\"YES\"/>\n                                                    <prototypeCellViews>\n                                                        <tableCellView id=\"Bh2-DX-YFF\">\n                                                            <rect key=\"frame\" x=\"10\" y=\"6\" width=\"334\" height=\"45\"/>\n                                                            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                                            <subviews>\n                                                                <imageView wantsLayer=\"YES\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Obf-MQ-CcQ\">\n                                                                    <rect key=\"frame\" x=\"20\" y=\"11\" width=\"24\" height=\"24\"/>\n                                                                    <constraints>\n                                                                        <constraint firstAttribute=\"height\" constant=\"24\" id=\"0ZD-u6-p0A\"/>\n                                                                        <constraint firstAttribute=\"width\" constant=\"24\" id=\"Rgc-hC-hLt\"/>\n                                                                    </constraints>\n                                                                    <imageCell key=\"cell\" refusesFirstResponder=\"YES\" alignment=\"left\" imageScaling=\"proportionallyDown\" image=\"NSApplicationIcon\" id=\"QQO-uS-6gC\"/>\n                                                                </imageView>\n                                                                <textField focusRingType=\"none\" verticalHuggingPriority=\"750\" horizontalCompressionResistancePriority=\"250\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Fv1-rI-t5W\">\n                                                                    <rect key=\"frame\" x=\"47\" y=\"15\" width=\"284\" height=\"16\"/>\n                                                                    <textFieldCell key=\"cell\" lineBreakMode=\"truncatingTail\" sendsActionOnEndEditing=\"YES\" alignment=\"left\" title=\"Application Name\" id=\"XjY-7g-GLL\">\n                                                                        <font key=\"font\" metaFont=\"system\"/>\n                                                                        <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                        <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                    </textFieldCell>\n                                                                </textField>\n                                                            </subviews>\n                                                            <constraints>\n                                                                <constraint firstItem=\"Fv1-rI-t5W\" firstAttribute=\"leading\" secondItem=\"Obf-MQ-CcQ\" secondAttribute=\"trailing\" constant=\"5\" id=\"1oF-pE-Nfs\"/>\n                                                                <constraint firstAttribute=\"trailing\" secondItem=\"Fv1-rI-t5W\" secondAttribute=\"trailing\" constant=\"5\" id=\"46F-hT-feG\"/>\n                                                                <constraint firstItem=\"Obf-MQ-CcQ\" firstAttribute=\"leading\" secondItem=\"Bh2-DX-YFF\" secondAttribute=\"leading\" constant=\"20\" id=\"I6N-WL-HiX\"/>\n                                                                <constraint firstItem=\"Fv1-rI-t5W\" firstAttribute=\"centerY\" secondItem=\"Bh2-DX-YFF\" secondAttribute=\"centerY\" id=\"Sra-f5-PzL\"/>\n                                                                <constraint firstItem=\"Obf-MQ-CcQ\" firstAttribute=\"centerY\" secondItem=\"Bh2-DX-YFF\" secondAttribute=\"centerY\" id=\"hgv-FU-MDP\"/>\n                                                            </constraints>\n                                                            <connections>\n                                                                <outlet property=\"imageView\" destination=\"Obf-MQ-CcQ\" id=\"DTP-3r-2bS\"/>\n                                                                <outlet property=\"textField\" destination=\"Fv1-rI-t5W\" id=\"rBc-Yi-Qh1\"/>\n                                                            </connections>\n                                                        </tableCellView>\n                                                    </prototypeCellViews>\n                                                </tableColumn>\n                                                <tableColumn identifier=\"scrollingCell\" width=\"90\" minWidth=\"10\" maxWidth=\"1000\" id=\"8By-V1-U9w\">\n                                                    <tableHeaderCell key=\"headerCell\" lineBreakMode=\"truncatingTail\" borderStyle=\"border\" alignment=\"left\" title=\"Scrolling\">\n                                                        <color key=\"textColor\" name=\"headerTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                        <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                                                    </tableHeaderCell>\n                                                    <textFieldCell key=\"dataCell\" lineBreakMode=\"truncatingTail\" selectable=\"YES\" editable=\"YES\" alignment=\"left\" title=\"Text Cell\" id=\"BDu-5m-yrr\">\n                                                        <font key=\"font\" metaFont=\"system\"/>\n                                                        <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                        <color key=\"backgroundColor\" name=\"controlBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                    </textFieldCell>\n                                                    <prototypeCellViews>\n                                                        <tableCellView id=\"clT-5E-IUd\">\n                                                            <rect key=\"frame\" x=\"344\" y=\"6\" width=\"96\" height=\"45\"/>\n                                                            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                                            <subviews>\n                                                                <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"4qv-B4-GnV\">\n                                                                    <rect key=\"frame\" x=\"29\" y=\"10\" width=\"39\" height=\"25\"/>\n                                                                    <buttonCell key=\"cell\" type=\"roundRect\" bezelStyle=\"roundedRect\" image=\"SF.circle.dotted.circle\" imagePosition=\"only\" lineBreakMode=\"truncatingTail\" state=\"on\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"pZj-5N-agR\">\n                                                                        <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                                                        <font key=\"font\" metaFont=\"cellTitle\"/>\n                                                                    </buttonCell>\n                                                                    <constraints>\n                                                                        <constraint firstAttribute=\"width\" constant=\"39\" id=\"Cb7-ZH-zto\"/>\n                                                                        <constraint firstAttribute=\"height\" relation=\"lessThanOrEqual\" constant=\"25\" id=\"V9r-u0-1IM\"/>\n                                                                    </constraints>\n                                                                </button>\n                                                            </subviews>\n                                                            <constraints>\n                                                                <constraint firstItem=\"4qv-B4-GnV\" firstAttribute=\"centerY\" secondItem=\"clT-5E-IUd\" secondAttribute=\"centerY\" id=\"QNq-yV-bOb\"/>\n                                                                <constraint firstItem=\"4qv-B4-GnV\" firstAttribute=\"centerX\" secondItem=\"clT-5E-IUd\" secondAttribute=\"centerX\" id=\"VAV-K6-0Hb\"/>\n                                                            </constraints>\n                                                        </tableCellView>\n                                                    </prototypeCellViews>\n                                                </tableColumn>\n                                            </tableColumns>\n                                            <connections>\n                                                <outlet property=\"dataSource\" destination=\"bga-wG-iim\" id=\"VYA-DC-2nz\"/>\n                                                <outlet property=\"delegate\" destination=\"bga-wG-iim\" id=\"zmj-uZ-njc\"/>\n                                            </connections>\n                                        </tableView>\n                                    </subviews>\n                                    <nil key=\"backgroundColor\"/>\n                                </clipView>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" relation=\"greaterThanOrEqual\" constant=\"260\" id=\"W0X-YA-7Zq\"/>\n                                </constraints>\n                                <scroller key=\"horizontalScroller\" hidden=\"YES\" wantsLayer=\"YES\" verticalHuggingPriority=\"750\" horizontal=\"YES\" id=\"8dl-2h-i32\">\n                                    <rect key=\"frame\" x=\"-100\" y=\"-100\" width=\"450\" height=\"15\"/>\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                </scroller>\n                                <scroller key=\"verticalScroller\" hidden=\"YES\" wantsLayer=\"YES\" verticalHuggingPriority=\"750\" horizontal=\"NO\" id=\"LP2-dF-uOZ\">\n                                    <rect key=\"frame\" x=\"224\" y=\"17\" width=\"15\" height=\"102\"/>\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                </scroller>\n                            </scrollView>\n                            <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"LTZ-IH-4Vy\">\n                                <rect key=\"frame\" x=\"33\" y=\"133\" width=\"385\" height=\"148\"/>\n                                <subviews>\n                                    <textField wantsLayer=\"YES\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"OKC-Nf-egM\">\n                                        <rect key=\"frame\" x=\"18\" y=\"20\" width=\"349\" height=\"14\"/>\n                                        <textFieldCell key=\"cell\" sendsActionOnEndEditing=\"YES\" alignment=\"center\" title=\"Customize individual settings for each app\" id=\"jaq-Cb-dKM\">\n                                            <font key=\"font\" metaFont=\"menu\" size=\"11\"/>\n                                            <color key=\"textColor\" name=\"tertiaryLabelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        </textFieldCell>\n                                    </textField>\n                                    <textField wantsLayer=\"YES\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"JG0-5p-fCy\">\n                                        <rect key=\"frame\" x=\"18\" y=\"39\" width=\"349\" height=\"19\"/>\n                                        <textFieldCell key=\"cell\" sendsActionOnEndEditing=\"YES\" alignment=\"center\" title=\"No application is Special\" id=\"ThS-Rm-st2\">\n                                            <font key=\"font\" metaFont=\"system\" size=\"16\"/>\n                                            <color key=\"textColor\" name=\"secondaryLabelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        </textFieldCell>\n                                    </textField>\n                                    <imageView wantsLayer=\"YES\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"D09-cG-tQf\">\n                                        <rect key=\"frame\" x=\"162\" y=\"68\" width=\"60\" height=\"60\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"width\" constant=\"60\" id=\"40g-hZ-VbI\"/>\n                                            <constraint firstAttribute=\"height\" constant=\"60\" id=\"kmg-Qg-Vty\"/>\n                                        </constraints>\n                                        <imageCell key=\"cell\" refusesFirstResponder=\"YES\" alignment=\"left\" imageScaling=\"proportionallyDown\" image=\"SF.scribble\" id=\"jW5-3e-gHP\"/>\n                                    </imageView>\n                                </subviews>\n                                <constraints>\n                                    <constraint firstItem=\"D09-cG-tQf\" firstAttribute=\"top\" secondItem=\"LTZ-IH-4Vy\" secondAttribute=\"top\" constant=\"20\" id=\"1WC-hR-yr1\"/>\n                                    <constraint firstItem=\"JG0-5p-fCy\" firstAttribute=\"leading\" secondItem=\"LTZ-IH-4Vy\" secondAttribute=\"leading\" constant=\"20\" id=\"Agl-5Y-iG0\"/>\n                                    <constraint firstItem=\"OKC-Nf-egM\" firstAttribute=\"top\" secondItem=\"JG0-5p-fCy\" secondAttribute=\"bottom\" constant=\"5\" id=\"BSN-Ef-Tar\"/>\n                                    <constraint firstItem=\"JG0-5p-fCy\" firstAttribute=\"top\" secondItem=\"D09-cG-tQf\" secondAttribute=\"bottom\" constant=\"10\" id=\"Bg1-Jl-UbB\"/>\n                                    <constraint firstAttribute=\"bottom\" secondItem=\"OKC-Nf-egM\" secondAttribute=\"bottom\" constant=\"20\" id=\"RlD-Pn-Cfc\"/>\n                                    <constraint firstItem=\"D09-cG-tQf\" firstAttribute=\"centerX\" secondItem=\"LTZ-IH-4Vy\" secondAttribute=\"centerX\" id=\"UoQ-eW-VJN\"/>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"OKC-Nf-egM\" secondAttribute=\"trailing\" constant=\"20\" id=\"cv7-0n-itx\"/>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"JG0-5p-fCy\" secondAttribute=\"trailing\" constant=\"20\" id=\"ddp-rB-PaR\"/>\n                                    <constraint firstItem=\"OKC-Nf-egM\" firstAttribute=\"leading\" secondItem=\"LTZ-IH-4Vy\" secondAttribute=\"leading\" constant=\"20\" id=\"yX9-qf-jqc\"/>\n                                    <constraint firstAttribute=\"width\" constant=\"385\" id=\"yfO-jh-Pru\"/>\n                                </constraints>\n                            </customView>\n                            <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"2yz-Bt-IMN\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"450\" height=\"31\"/>\n                                <subviews>\n                                    <box verticalHuggingPriority=\"750\" boxType=\"separator\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"4AF-Dk-mkc\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"28\" width=\"450\" height=\"5\"/>\n                                    </box>\n                                    <button imageHugsTitle=\"YES\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ceK-ED-PfL\">\n                                        <rect key=\"frame\" x=\"6\" y=\"-0.5\" width=\"30.5\" height=\"34\"/>\n                                        <buttonCell key=\"cell\" type=\"bevel\" bezelStyle=\"regularSquare\" image=\"NSAddTemplate\" imagePosition=\"only\" alignment=\"center\" lineBreakMode=\"truncatingTail\" state=\"on\" inset=\"2\" id=\"ivF-Bk-aLA\">\n                                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                            <font key=\"font\" metaFont=\"system\"/>\n                                        </buttonCell>\n                                        <constraints>\n                                            <constraint firstAttribute=\"width\" constant=\"30\" id=\"8L2-mK-7u8\"/>\n                                            <constraint firstAttribute=\"height\" constant=\"30\" id=\"iZQ-k2-J7Z\"/>\n                                        </constraints>\n                                        <connections>\n                                            <action selector=\"addItemClick:\" target=\"bga-wG-iim\" id=\"DnW-Ss-eKk\"/>\n                                        </connections>\n                                    </button>\n                                    <button imageHugsTitle=\"YES\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"HZK-yc-ptT\">\n                                        <rect key=\"frame\" x=\"36\" y=\"4\" width=\"30.5\" height=\"25\"/>\n                                        <buttonCell key=\"cell\" type=\"bevel\" bezelStyle=\"regularSquare\" image=\"NSRemoveTemplate\" imagePosition=\"only\" alignment=\"center\" lineBreakMode=\"truncatingTail\" enabled=\"NO\" state=\"on\" inset=\"2\" id=\"dnI-fa-wgE\">\n                                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                            <font key=\"font\" metaFont=\"system\"/>\n                                        </buttonCell>\n                                        <constraints>\n                                            <constraint firstAttribute=\"width\" constant=\"30\" id=\"Q4w-np-mv4\"/>\n                                            <constraint firstAttribute=\"height\" constant=\"30\" id=\"fS1-f0-DuE\"/>\n                                        </constraints>\n                                        <connections>\n                                            <action selector=\"removeItemClick:\" target=\"bga-wG-iim\" id=\"NiX-aD-ohO\"/>\n                                        </connections>\n                                    </button>\n                                    <button horizontalHuggingPriority=\"750\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"8FH-Zr-4mB\">\n                                        <rect key=\"frame\" x=\"426\" y=\"7\" width=\"16\" height=\"17\"/>\n                                        <buttonCell key=\"cell\" type=\"help\" bezelStyle=\"helpButton\" alignment=\"center\" controlSize=\"mini\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"qvR-dH-4Bl\">\n                                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                            <font key=\"font\" metaFont=\"miniSystem\"/>\n                                        </buttonCell>\n                                        <constraints>\n                                            <constraint firstAttribute=\"height\" constant=\"17\" id=\"Wac-iP-hrm\"/>\n                                        </constraints>\n                                        <connections>\n                                            <segue destination=\"o12-9v-Ej5\" kind=\"popover\" popoverAnchorView=\"8FH-Zr-4mB\" popoverBehavior=\"t\" preferredEdge=\"maxY\" id=\"h3A-yE-W1x\"/>\n                                        </connections>\n                                    </button>\n                                    <button imageHugsTitle=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"gnb-pe-ZN5\">\n                                        <rect key=\"frame\" x=\"278\" y=\"9\" width=\"140\" height=\"14\"/>\n                                        <buttonCell key=\"cell\" type=\"check\" title=\"Allow list Mode\" bezelStyle=\"regularSquare\" imagePosition=\"left\" alignment=\"right\" controlSize=\"small\" inset=\"2\" id=\"Ksp-g1-48g\">\n                                            <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                                            <font key=\"font\" metaFont=\"menu\" size=\"11\"/>\n                                        </buttonCell>\n                                        <constraints>\n                                            <constraint firstAttribute=\"width\" relation=\"greaterThanOrEqual\" constant=\"140\" id=\"NS2-ZW-iDh\"/>\n                                        </constraints>\n                                        <connections>\n                                            <action selector=\"allowListModeClick:\" target=\"bga-wG-iim\" id=\"MZ6-m7-C6o\"/>\n                                        </connections>\n                                    </button>\n                                </subviews>\n                                <constraints>\n                                    <constraint firstItem=\"ceK-ED-PfL\" firstAttribute=\"centerY\" secondItem=\"2yz-Bt-IMN\" secondAttribute=\"centerY\" id=\"Baj-FX-zv2\"/>\n                                    <constraint firstItem=\"4AF-Dk-mkc\" firstAttribute=\"top\" secondItem=\"2yz-Bt-IMN\" secondAttribute=\"top\" id=\"Fc7-Cz-jHm\"/>\n                                    <constraint firstItem=\"gnb-pe-ZN5\" firstAttribute=\"leading\" relation=\"greaterThanOrEqual\" secondItem=\"HZK-yc-ptT\" secondAttribute=\"trailing\" constant=\"8\" symbolic=\"YES\" id=\"IGO-gn-q8C\"/>\n                                    <constraint firstAttribute=\"height\" constant=\"31\" id=\"NnL-yN-1Ha\"/>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"4AF-Dk-mkc\" secondAttribute=\"trailing\" id=\"OMI-qV-4ya\"/>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"8FH-Zr-4mB\" secondAttribute=\"trailing\" constant=\"8\" id=\"OQG-xJ-APd\"/>\n                                    <constraint firstItem=\"HZK-yc-ptT\" firstAttribute=\"centerY\" secondItem=\"2yz-Bt-IMN\" secondAttribute=\"centerY\" id=\"Rq2-Wm-faI\"/>\n                                    <constraint firstItem=\"HZK-yc-ptT\" firstAttribute=\"leading\" secondItem=\"ceK-ED-PfL\" secondAttribute=\"trailing\" id=\"SaG-wi-dX6\"/>\n                                    <constraint firstItem=\"4AF-Dk-mkc\" firstAttribute=\"leading\" secondItem=\"2yz-Bt-IMN\" secondAttribute=\"leading\" id=\"XrE-3e-vRg\"/>\n                                    <constraint firstItem=\"8FH-Zr-4mB\" firstAttribute=\"leading\" secondItem=\"gnb-pe-ZN5\" secondAttribute=\"trailing\" constant=\"8\" id=\"Zid-PW-aOD\"/>\n                                    <constraint firstItem=\"gnb-pe-ZN5\" firstAttribute=\"centerY\" secondItem=\"2yz-Bt-IMN\" secondAttribute=\"centerY\" id=\"cBf-yx-tg5\"/>\n                                    <constraint firstItem=\"8FH-Zr-4mB\" firstAttribute=\"centerY\" secondItem=\"2yz-Bt-IMN\" secondAttribute=\"centerY\" id=\"h5p-e1-ZbB\"/>\n                                    <constraint firstItem=\"ceK-ED-PfL\" firstAttribute=\"leading\" secondItem=\"2yz-Bt-IMN\" secondAttribute=\"leading\" constant=\"6\" id=\"jhO-JU-hzS\"/>\n                                </constraints>\n                            </customView>\n                            <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"lhT-1U-5Xh\" customClass=\"PrimaryButton\" customModule=\"Mos\" customModuleProvider=\"target\">\n                                <rect key=\"frame\" x=\"40\" y=\"38\" width=\"370\" height=\"60\"/>\n                                <subviews>\n                                    <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"MPG-5z-OT3\">\n                                        <rect key=\"frame\" x=\"13\" y=\"31\" width=\"100\" height=\"16\"/>\n                                        <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"Add Application\" id=\"Gmk-Ru-er7\">\n                                            <font key=\"font\" usesAppearanceFont=\"YES\"/>\n                                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        </textFieldCell>\n                                    </textField>\n                                    <textField wantsLayer=\"YES\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"V2s-M6-mOE\">\n                                        <rect key=\"frame\" x=\"13\" y=\"14\" width=\"254\" height=\"14\"/>\n                                        <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"Create a custom configuration for specific apps\" id=\"DS8-og-1pp\">\n                                            <font key=\"font\" metaFont=\"smallSystem\"/>\n                                            <color key=\"textColor\" name=\"secondaryLabelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        </textFieldCell>\n                                    </textField>\n                                    <imageView wantsLayer=\"YES\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"5uX-Iz-YQ7\">\n                                        <rect key=\"frame\" x=\"330\" y=\"15\" width=\"20\" height=\"31\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"height\" constant=\"20\" id=\"ALi-rt-jUu\"/>\n                                            <constraint firstAttribute=\"width\" constant=\"20\" id=\"csf-6L-GKj\"/>\n                                        </constraints>\n                                        <imageCell key=\"cell\" refusesFirstResponder=\"YES\" alignment=\"left\" animates=\"YES\" imageScaling=\"proportionallyUpOrDown\" image=\"NSTouchBarSearchTemplate\" id=\"4Mt-YO-qUx\"/>\n                                    </imageView>\n                                </subviews>\n                                <constraints>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"5uX-Iz-YQ7\" secondAttribute=\"trailing\" constant=\"20\" id=\"0lg-LB-HJa\"/>\n                                    <constraint firstItem=\"5uX-Iz-YQ7\" firstAttribute=\"centerY\" secondItem=\"lhT-1U-5Xh\" secondAttribute=\"centerY\" id=\"6lt-qw-e8A\"/>\n                                    <constraint firstItem=\"MPG-5z-OT3\" firstAttribute=\"centerY\" secondItem=\"lhT-1U-5Xh\" secondAttribute=\"centerY\" constant=\"-9\" id=\"H4W-Z9-mEf\"/>\n                                    <constraint firstItem=\"MPG-5z-OT3\" firstAttribute=\"leading\" secondItem=\"lhT-1U-5Xh\" secondAttribute=\"leading\" constant=\"15\" id=\"TQk-wA-dY6\"/>\n                                    <constraint firstItem=\"V2s-M6-mOE\" firstAttribute=\"centerY\" secondItem=\"lhT-1U-5Xh\" secondAttribute=\"centerY\" constant=\"9\" id=\"W9M-LF-h7f\"/>\n                                    <constraint firstItem=\"5uX-Iz-YQ7\" firstAttribute=\"leading\" relation=\"greaterThanOrEqual\" secondItem=\"MPG-5z-OT3\" secondAttribute=\"trailing\" constant=\"8\" symbolic=\"YES\" id=\"amL-O6-1DD\"/>\n                                    <constraint firstAttribute=\"height\" constant=\"60\" id=\"bYK-jU-WEc\"/>\n                                    <constraint firstAttribute=\"width\" constant=\"370\" id=\"iNf-4e-Q4K\"/>\n                                    <constraint firstItem=\"5uX-Iz-YQ7\" firstAttribute=\"leading\" relation=\"greaterThanOrEqual\" secondItem=\"V2s-M6-mOE\" secondAttribute=\"trailing\" constant=\"8\" symbolic=\"YES\" id=\"o2M-HU-xYe\"/>\n                                    <constraint firstItem=\"V2s-M6-mOE\" firstAttribute=\"leading\" secondItem=\"lhT-1U-5Xh\" secondAttribute=\"leading\" constant=\"15\" id=\"qq6-jH-ejI\"/>\n                                </constraints>\n                            </customView>\n                        </subviews>\n                        <constraints>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"2dP-HG-cdi\" secondAttribute=\"trailing\" id=\"6gh-ZQ-gJJ\"/>\n                            <constraint firstItem=\"VAL-LC-T3T\" firstAttribute=\"top\" secondItem=\"jc3-9p-Bfo\" secondAttribute=\"top\" id=\"9QK-kP-Jub\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"2yz-Bt-IMN\" secondAttribute=\"trailing\" id=\"Fm8-bP-i1Z\"/>\n                            <constraint firstItem=\"LTZ-IH-4Vy\" firstAttribute=\"centerX\" secondItem=\"jc3-9p-Bfo\" secondAttribute=\"centerX\" id=\"Fu9-Mt-We0\"/>\n                            <constraint firstItem=\"LTZ-IH-4Vy\" firstAttribute=\"top\" secondItem=\"jc3-9p-Bfo\" secondAttribute=\"top\" constant=\"40\" id=\"PE0-jE-Dbl\"/>\n                            <constraint firstItem=\"2dP-HG-cdi\" firstAttribute=\"leading\" secondItem=\"jc3-9p-Bfo\" secondAttribute=\"leading\" id=\"PmN-uQ-mSV\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"2yz-Bt-IMN\" secondAttribute=\"bottom\" id=\"SIB-8x-LBj\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"lhT-1U-5Xh\" secondAttribute=\"bottom\" constant=\"38\" id=\"UI1-Tn-4WQ\"/>\n                            <constraint firstItem=\"2dP-HG-cdi\" firstAttribute=\"top\" secondItem=\"VAL-LC-T3T\" secondAttribute=\"bottom\" id=\"amL-Rg-EUD\"/>\n                            <constraint firstItem=\"2yz-Bt-IMN\" firstAttribute=\"leading\" secondItem=\"jc3-9p-Bfo\" secondAttribute=\"leading\" id=\"pKb-NR-26E\"/>\n                            <constraint firstItem=\"lhT-1U-5Xh\" firstAttribute=\"centerX\" secondItem=\"jc3-9p-Bfo\" secondAttribute=\"centerX\" id=\"rjQ-PW-SWC\"/>\n                            <constraint firstItem=\"VAL-LC-T3T\" firstAttribute=\"leading\" secondItem=\"jc3-9p-Bfo\" secondAttribute=\"leading\" id=\"sP2-Xj-nWJ\"/>\n                            <constraint firstItem=\"2yz-Bt-IMN\" firstAttribute=\"top\" secondItem=\"2dP-HG-cdi\" secondAttribute=\"bottom\" id=\"u7y-lk-Ug0\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"VAL-LC-T3T\" secondAttribute=\"trailing\" id=\"yNN-sY-waa\"/>\n                        </constraints>\n                    </visualEffectView>\n                    <connections>\n                        <outlet property=\"addButton\" destination=\"ceK-ED-PfL\" id=\"6o3-ow-6Jm\"/>\n                        <outlet property=\"allowlistModeCheckBox\" destination=\"gnb-pe-ZN5\" id=\"HTP-3G-Zme\"/>\n                        <outlet property=\"applicationSourceMenuControl\" destination=\"v6G-mQ-Ddk\" id=\"dfx-xG-DcT\"/>\n                        <outlet property=\"createButton\" destination=\"lhT-1U-5Xh\" id=\"mGX-gX-oxZ\"/>\n                        <outlet property=\"delButton\" destination=\"HZK-yc-ptT\" id=\"Kww-VP-a9A\"/>\n                        <outlet property=\"manuallySelectFromFinderMenuItem\" destination=\"dhF-95-kUJ\" id=\"Ny0-LT-dUM\"/>\n                        <outlet property=\"runningAndInstalledManuItem\" destination=\"R0d-21-g6W\" id=\"a14-sX-cP3\"/>\n                        <outlet property=\"tableEmpty\" destination=\"LTZ-IH-4Vy\" id=\"DlB-dd-xPl\"/>\n                        <outlet property=\"tableFoot\" destination=\"2yz-Bt-IMN\" id=\"p9I-Ev-m33\"/>\n                        <outlet property=\"tableHead\" destination=\"VAL-LC-T3T\" id=\"odB-4n-XWl\"/>\n                        <outlet property=\"tableView\" destination=\"LmV-gi-3fE\" id=\"GOb-17-dvX\"/>\n                    </connections>\n                </viewController>\n                <menu id=\"v6G-mQ-Ddk\">\n                    <items>\n                        <menuItem title=\"Running Applications\" id=\"R0d-21-g6W\">\n                            <modifierMask key=\"keyEquivalentModifierMask\" shift=\"YES\"/>\n                        </menuItem>\n                        <menuItem title=\"Manually Select From Finder\" id=\"dhF-95-kUJ\">\n                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                            <connections>\n                                <action selector=\"addItemFromFinderClick:\" target=\"bga-wG-iim\" id=\"lxS-d8-5Mt\"/>\n                            </connections>\n                        </menuItem>\n                    </items>\n                </menu>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1928\" y=\"1276.5\"/>\n        </scene>\n        <!--Application Allowlist hint-->\n        <scene sceneID=\"57E-oo-PEW\">\n            <objects>\n                <viewController id=\"o12-9v-Ej5\" userLabel=\"Application Allowlist hint\" customClass=\"AdaptivePopover\" customModule=\"Mos\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" id=\"wdx-Jb-jwG\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"224\" height=\"62\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <subviews>\n                            <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" horizontalCompressionResistancePriority=\"250\" textCompletion=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"KGW-PK-8DX\">\n                                <rect key=\"frame\" x=\"10\" y=\"10\" width=\"204\" height=\"42\"/>\n                                <textFieldCell key=\"cell\" controlSize=\"mini\" sendsActionOnEndEditing=\"YES\" alignment=\"left\" title=\"The allow list mode will make Mos only apply to apps within the application list.\" id=\"v26-RK-BtL\">\n                                    <font key=\"font\" metaFont=\"smallSystem\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                        </subviews>\n                        <constraints>\n                            <constraint firstItem=\"KGW-PK-8DX\" firstAttribute=\"leading\" secondItem=\"wdx-Jb-jwG\" secondAttribute=\"leading\" constant=\"12\" id=\"5rV-8B-s42\"/>\n                            <constraint firstItem=\"KGW-PK-8DX\" firstAttribute=\"top\" secondItem=\"wdx-Jb-jwG\" secondAttribute=\"top\" constant=\"10\" id=\"Axi-G9-NcE\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"KGW-PK-8DX\" secondAttribute=\"bottom\" constant=\"10\" id=\"eB3-8M-xul\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"KGW-PK-8DX\" secondAttribute=\"trailing\" constant=\"12\" id=\"iBp-5y-gRA\"/>\n                        </constraints>\n                    </view>\n                </viewController>\n                <customObject id=\"ZNV-FD-bQh\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1928\" y=\"1653\"/>\n        </scene>\n        <!--Updates-->\n        <scene sceneID=\"VTW-lQ-Mfk\">\n            <objects>\n                <viewController title=\"Updates\" storyboardIdentifier=\"updates\" id=\"EWu-DP-7Gj\" customClass=\"PreferencesUpdatesViewController\" customModule=\"Mos\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <visualEffectView key=\"view\" blendingMode=\"behindWindow\" material=\"toolTip\" state=\"followsWindowActiveState\" id=\"YxW-TX-zxt\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"450\" height=\"120\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <subviews>\n                            <textField wantsLayer=\"YES\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Gxs-4f-Jdz\">\n                                <rect key=\"frame\" x=\"18\" y=\"85\" width=\"140\" height=\"16\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" relation=\"greaterThanOrEqual\" constant=\"136\" id=\"S8E-6O-qj5\"/>\n                                </constraints>\n                                <textFieldCell key=\"cell\" sendsActionOnEndEditing=\"YES\" alignment=\"right\" title=\"Check for updates:\" id=\"vdI-K4-SBh\">\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <button wantsLayer=\"YES\" springLoaded=\"YES\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"4kr-7i-Wm2\">\n                                <rect key=\"frame\" x=\"171\" y=\"82\" width=\"130\" height=\"18\"/>\n                                <buttonCell key=\"cell\" type=\"roundRect\" title=\"Check Now\" bezelStyle=\"roundedRect\" alignment=\"center\" state=\"on\" borderStyle=\"border\" allowsMixedState=\"YES\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"T9f-TL-GYj\">\n                                    <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"systemLight\" size=\"12\"/>\n                                </buttonCell>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"18\" id=\"eCL-n5-Cbk\"/>\n                                    <constraint firstAttribute=\"width\" relation=\"greaterThanOrEqual\" constant=\"130\" id=\"hhf-HO-fRT\"/>\n                                </constraints>\n                                <connections>\n                                    <action selector=\"checkButtonClick:\" target=\"EWu-DP-7Gj\" id=\"0pW-49-jYc\"/>\n                                </connections>\n                            </button>\n                            <textField wantsLayer=\"YES\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"114-aw-aH2\">\n                                <rect key=\"frame\" x=\"169\" y=\"63\" width=\"263\" height=\"13\"/>\n                                <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"left\" title=\"Current Version\" id=\"Aur-fR-tik\">\n                                    <font key=\"font\" metaFont=\"systemLight\" size=\"10\"/>\n                                    <color key=\"textColor\" name=\"disabledControlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <box hidden=\"YES\" verticalHuggingPriority=\"750\" boxType=\"separator\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Ay2-Qf-INN\" userLabel=\"WidthHolder\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"-2\" width=\"450\" height=\"5\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" constant=\"450\" id=\"qe5-ty-af9\"/>\n                                </constraints>\n                            </box>\n                            <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"XP2-Ag-gWP\">\n                                <rect key=\"frame\" x=\"171\" y=\"41\" width=\"118\" height=\"14\"/>\n                                <buttonCell key=\"cell\" type=\"check\" title=\"Check on app start\" bezelStyle=\"regularSquare\" imagePosition=\"left\" controlSize=\"small\" state=\"on\" inset=\"2\" id=\"Yj9-j0-202\">\n                                    <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"smallSystem\"/>\n                                </buttonCell>\n                                <connections>\n                                    <action selector=\"checkOnAppStartClick:\" target=\"EWu-DP-7Gj\" id=\"JjF-bh-feo\"/>\n                                </connections>\n                            </button>\n                            <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Gcv-jH-T60\">\n                                <rect key=\"frame\" x=\"171\" y=\"21\" width=\"134\" height=\"14\"/>\n                                <buttonCell key=\"cell\" type=\"check\" title=\"Including beta version\" bezelStyle=\"regularSquare\" imagePosition=\"left\" controlSize=\"small\" state=\"on\" inset=\"2\" id=\"Qx7-hF-cCG\">\n                                    <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"smallSystem\"/>\n                                    <connections>\n                                        <action selector=\"includingBetaVersionClick:\" target=\"EWu-DP-7Gj\" id=\"zNM-oQ-hg5\"/>\n                                    </connections>\n                                </buttonCell>\n                            </button>\n                        </subviews>\n                        <constraints>\n                            <constraint firstItem=\"4kr-7i-Wm2\" firstAttribute=\"leading\" secondItem=\"Gxs-4f-Jdz\" secondAttribute=\"trailing\" constant=\"15\" id=\"7gP-cK-NPN\"/>\n                            <constraint firstItem=\"Ay2-Qf-INN\" firstAttribute=\"leading\" secondItem=\"YxW-TX-zxt\" secondAttribute=\"leading\" id=\"CZu-vr-hcb\"/>\n                            <constraint firstItem=\"XP2-Ag-gWP\" firstAttribute=\"top\" secondItem=\"114-aw-aH2\" secondAttribute=\"bottom\" constant=\"8\" id=\"EeH-Ko-BbA\"/>\n                            <constraint firstItem=\"Gcv-jH-T60\" firstAttribute=\"top\" secondItem=\"XP2-Ag-gWP\" secondAttribute=\"bottom\" constant=\"6\" id=\"IRm-9c-a6v\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"Ay2-Qf-INN\" secondAttribute=\"bottom\" id=\"Ipw-hT-pK6\"/>\n                            <constraint firstItem=\"Gxs-4f-Jdz\" firstAttribute=\"leading\" secondItem=\"YxW-TX-zxt\" secondAttribute=\"leading\" constant=\"20\" id=\"Lde-P8-Qxj\"/>\n                            <constraint firstItem=\"Gcv-jH-T60\" firstAttribute=\"leading\" secondItem=\"4kr-7i-Wm2\" secondAttribute=\"leading\" id=\"MLs-zC-qRF\"/>\n                            <constraint firstItem=\"XP2-Ag-gWP\" firstAttribute=\"leading\" secondItem=\"4kr-7i-Wm2\" secondAttribute=\"leading\" id=\"StJ-kz-rSZ\"/>\n                            <constraint firstAttribute=\"trailing\" relation=\"greaterThanOrEqual\" secondItem=\"4kr-7i-Wm2\" secondAttribute=\"trailing\" constant=\"149\" id=\"XLg-y3-mIj\"/>\n                            <constraint firstItem=\"Ay2-Qf-INN\" firstAttribute=\"top\" secondItem=\"Gcv-jH-T60\" secondAttribute=\"bottom\" constant=\"20\" id=\"fII-Ii-J48\"/>\n                            <constraint firstItem=\"4kr-7i-Wm2\" firstAttribute=\"top\" secondItem=\"YxW-TX-zxt\" secondAttribute=\"top\" constant=\"20\" id=\"jEU-27-P8y\"/>\n                            <constraint firstItem=\"114-aw-aH2\" firstAttribute=\"leading\" secondItem=\"4kr-7i-Wm2\" secondAttribute=\"leading\" id=\"kgV-mZ-xs5\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"Ay2-Qf-INN\" secondAttribute=\"trailing\" id=\"kq0-s5-5TS\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"114-aw-aH2\" secondAttribute=\"trailing\" constant=\"20\" id=\"qU7-k7-1Us\"/>\n                            <constraint firstItem=\"4kr-7i-Wm2\" firstAttribute=\"top\" secondItem=\"Gxs-4f-Jdz\" secondAttribute=\"top\" constant=\"1\" id=\"svz-HX-9bc\"/>\n                            <constraint firstItem=\"114-aw-aH2\" firstAttribute=\"top\" secondItem=\"4kr-7i-Wm2\" secondAttribute=\"bottom\" constant=\"6\" id=\"x7Q-xV-7zj\"/>\n                        </constraints>\n                    </visualEffectView>\n                    <connections>\n                        <outlet property=\"checkOnAppStartCheckbox\" destination=\"XP2-Ag-gWP\" id=\"t2y-Le-yH8\"/>\n                        <outlet property=\"includingBetaVersionCheckbox\" destination=\"Gcv-jH-T60\" id=\"f2L-kE-XGH\"/>\n                        <outlet property=\"versionLabel\" destination=\"114-aw-aH2\" id=\"JzV-OD-FI1\"/>\n                    </connections>\n                </viewController>\n                <customObject id=\"Tfe-PH-zhM\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"2432\" y=\"1176\"/>\n        </scene>\n        <!--Scrolling-->\n        <scene sceneID=\"Fd7-iR-8pW\">\n            <objects>\n                <customObject id=\"T8g-3J-WxE\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n                <viewController title=\"Scrolling\" storyboardIdentifier=\"scrolling\" id=\"iW5-CD-5OC\" customClass=\"PreferencesScrollingViewController\" customModule=\"Mos\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <visualEffectView key=\"view\" wantsLayer=\"YES\" blendingMode=\"behindWindow\" material=\"toolTip\" state=\"followsWindowActiveState\" id=\"Jsi-ke-bNZ\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"450\" height=\"501\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <subviews>\n                            <textField wantsLayer=\"YES\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" verifyAmbiguity=\"off\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"DQH-h2-1Zk\">\n                                <rect key=\"frame\" x=\"18\" y=\"467\" width=\"140\" height=\"14\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" relation=\"greaterThanOrEqual\" constant=\"136\" id=\"uRN-Fz-sJm\"/>\n                                </constraints>\n                                <textFieldCell key=\"cell\" sendsActionOnEndEditing=\"YES\" alignment=\"right\" title=\"Smooth Scrolling\" id=\"Ngq-sZ-qrp\">\n                                    <font key=\"font\" metaFont=\"smallSystem\"/>\n                                    <color key=\"textColor\" name=\"secondaryLabelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <button translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"1Hp-EF-wSq\">\n                                <rect key=\"frame\" x=\"171\" y=\"467\" width=\"178\" height=\"14\"/>\n                                <buttonCell key=\"cell\" type=\"check\" title=\"Enable seamless scrolling\" bezelStyle=\"regularSquare\" imagePosition=\"left\" state=\"on\" inset=\"2\" id=\"bsq-Pe-sDy\">\n                                    <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                </buttonCell>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"14\" id=\"UgX-oA-88C\"/>\n                                </constraints>\n                                <connections>\n                                    <action selector=\"scrollSmoothClick:\" target=\"iW5-CD-5OC\" id=\"FpA-E0-l57\"/>\n                                </connections>\n                            </button>\n                            <textField wantsLayer=\"YES\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" verifyAmbiguity=\"off\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"aV7-KP-bgw\">\n                                <rect key=\"frame\" x=\"18\" y=\"435\" width=\"140\" height=\"14\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" relation=\"greaterThanOrEqual\" constant=\"136\" id=\"YBO-Nh-6aE\"/>\n                                </constraints>\n                                <textFieldCell key=\"cell\" sendsActionOnEndEditing=\"YES\" alignment=\"right\" title=\"Scroll Reverse\" id=\"H2Z-K0-g9o\">\n                                    <font key=\"font\" metaFont=\"smallSystem\"/>\n                                    <color key=\"textColor\" name=\"secondaryLabelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <button verticalHuggingPriority=\"751\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"PIE-3y-0sa\">\n                                <rect key=\"frame\" x=\"171\" y=\"435\" width=\"153\" height=\"14\"/>\n                                <buttonCell key=\"cell\" type=\"check\" title=\"Invert wheel direction\" bezelStyle=\"regularSquare\" imagePosition=\"left\" state=\"on\" inset=\"2\" id=\"vjK-Rg-us9\">\n                                    <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                </buttonCell>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"14\" id=\"XMp-ZY-7HT\"/>\n                                </constraints>\n                                <connections>\n                                    <action selector=\"scrollReverseClick:\" target=\"iW5-CD-5OC\" id=\"n5D-ak-qhs\"/>\n                                </connections>\n                            </button>\n                            <box verticalHuggingPriority=\"750\" verticalCompressionResistancePriority=\"751\" boxType=\"separator\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"rQj-g8-Y0N\">\n                                <rect key=\"frame\" x=\"20\" y=\"412\" width=\"410\" height=\"5\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" constant=\"410\" id=\"7Ge-xF-ZVC\"/>\n                                </constraints>\n                            </box>\n                            <textField wantsLayer=\"YES\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"mKO-0m-Vb0\">\n                                <rect key=\"frame\" x=\"18\" y=\"375\" width=\"140\" height=\"14\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" relation=\"greaterThanOrEqual\" constant=\"136\" id=\"rlL-do-7ec\"/>\n                                </constraints>\n                                <textFieldCell key=\"cell\" sendsActionOnEndEditing=\"YES\" alignment=\"right\" title=\"Dash Key\" id=\"hOO-M8-I1z\">\n                                    <font key=\"font\" metaFont=\"smallSystem\"/>\n                                    <color key=\"textColor\" name=\"secondaryLabelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <textField wantsLayer=\"YES\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" verticalCompressionResistancePriority=\"751\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"45l-vw-E0o\" userLabel=\"Dash Key Description\">\n                                <rect key=\"frame\" x=\"169\" y=\"353\" width=\"263\" height=\"11\"/>\n                                <textFieldCell key=\"cell\" sendsActionOnEndEditing=\"YES\" title=\"Increase scrolling speed on long pages\" id=\"Z59-tN-QjE\">\n                                    <font key=\"font\" metaFont=\"miniSystem\"/>\n                                    <color key=\"textColor\" name=\"secondaryLabelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <textField wantsLayer=\"YES\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"9Nm-TC-llN\">\n                                <rect key=\"frame\" x=\"18\" y=\"322\" width=\"140\" height=\"14\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" relation=\"greaterThanOrEqual\" constant=\"136\" id=\"i4m-8K-DpA\"/>\n                                </constraints>\n                                <textFieldCell key=\"cell\" sendsActionOnEndEditing=\"YES\" alignment=\"right\" title=\"Toggle Key\" id=\"bQw-5w-Yv0\">\n                                    <font key=\"font\" metaFont=\"smallSystem\"/>\n                                    <color key=\"textColor\" name=\"secondaryLabelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <textField wantsLayer=\"YES\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" verticalCompressionResistancePriority=\"751\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"gSx-dp-Tvn\" userLabel=\"Toggle Key Description\">\n                                <rect key=\"frame\" x=\"169\" y=\"300\" width=\"263\" height=\"11\"/>\n                                <textFieldCell key=\"cell\" sendsActionOnEndEditing=\"YES\" title=\"Change vertical scrolling to horizontal scrolling\" id=\"KnM-kA-wn5\">\n                                    <font key=\"font\" metaFont=\"miniSystem\"/>\n                                    <color key=\"textColor\" name=\"secondaryLabelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <textField wantsLayer=\"YES\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kMQ-Oj-Bvd\">\n                                <rect key=\"frame\" x=\"18\" y=\"269\" width=\"140\" height=\"14\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" relation=\"greaterThanOrEqual\" constant=\"136\" id=\"y87-5B-rDj\"/>\n                                </constraints>\n                                <textFieldCell key=\"cell\" sendsActionOnEndEditing=\"YES\" alignment=\"right\" title=\"Block Key\" id=\"ebE-Zf-T98\">\n                                    <font key=\"font\" metaFont=\"smallSystem\"/>\n                                    <color key=\"textColor\" name=\"secondaryLabelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <textField wantsLayer=\"YES\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" verticalCompressionResistancePriority=\"751\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"1eQ-Un-ZLh\" userLabel=\"Block Key Description\">\n                                <rect key=\"frame\" x=\"169\" y=\"247\" width=\"158\" height=\"11\"/>\n                                <textFieldCell key=\"cell\" sendsActionOnEndEditing=\"YES\" title=\"Temporarily block smooth scrolling\" id=\"iki-Jk-qSr\">\n                                    <font key=\"font\" metaFont=\"miniSystem\"/>\n                                    <color key=\"textColor\" name=\"secondaryLabelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <box verticalHuggingPriority=\"750\" verticalCompressionResistancePriority=\"751\" boxType=\"separator\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"iLA-i9-HEO\">\n                                <rect key=\"frame\" x=\"20\" y=\"224\" width=\"410\" height=\"5\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" constant=\"410\" id=\"dvS-fP-hkt\"/>\n                                </constraints>\n                            </box>\n                            <textField wantsLayer=\"YES\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"zKw-pT-YRj\">\n                                <rect key=\"frame\" x=\"18\" y=\"192\" width=\"140\" height=\"14\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" relation=\"greaterThanOrEqual\" constant=\"136\" id=\"DAn-rh-ycF\"/>\n                                </constraints>\n                                <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"right\" title=\"Step\" id=\"B8B-hi-x3v\">\n                                    <font key=\"font\" metaFont=\"smallSystem\"/>\n                                    <color key=\"textColor\" name=\"secondaryLabelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <slider wantsLayer=\"YES\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"TU2-J4-KYA\">\n                                <rect key=\"frame\" x=\"171\" y=\"191\" width=\"160\" height=\"15\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" constant=\"160\" id=\"oWf-Q1-9W7\"/>\n                                    <constraint firstAttribute=\"height\" constant=\"15\" id=\"srb-fM-rp2\"/>\n                                </constraints>\n                                <sliderCell key=\"cell\" controlSize=\"small\" alignment=\"left\" minValue=\"0.01\" maxValue=\"100\" doubleValue=\"35\" tickMarkPosition=\"above\" numberOfTickMarks=\"5\" sliderType=\"linear\" id=\"NW9-iV-Ilr\"/>\n                                <connections>\n                                    <action selector=\"scrollStepSliderChange:\" target=\"iW5-CD-5OC\" id=\"kjo-L9-w60\"/>\n                                </connections>\n                            </slider>\n                            <textField wantsLayer=\"YES\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" verticalCompressionResistancePriority=\"749\" textCompletion=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"lh7-BV-xfD\" userLabel=\"Scroll Step Input\">\n                                <rect key=\"frame\" x=\"339\" y=\"188\" width=\"62\" height=\"22\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"22\" id=\"LJv-CS-oLB\"/>\n                                </constraints>\n                                <textFieldCell key=\"cell\" selectable=\"YES\" editable=\"YES\" allowsUndo=\"NO\" sendsActionOnEndEditing=\"YES\" state=\"on\" borderStyle=\"bezel\" alignment=\"center\" title=\"35.00\" placeholderString=\"0.1-100\" usesSingleLineMode=\"YES\" bezelStyle=\"round\" id=\"vcQ-FZ-z8x\">\n                                    <numberFormatter key=\"formatter\" formatterBehavior=\"10_0\" positiveFormat=\"#,##0.00\" negativeFormat=\"-#,##0.00\" thousandSeparator=\",\" id=\"wQq-Kx-2lH\">\n                                        <attributedString key=\"attributedStringForNil\"/>\n                                        <attributedString key=\"attributedStringForNotANumber\"/>\n                                        <attributedString key=\"attributedStringForZero\"/>\n                                        <real key=\"minimum\" value=\"0.01\"/>\n                                        <real key=\"maximum\" value=\"100\"/>\n                                    </numberFormatter>\n                                    <font key=\"font\" metaFont=\"miniSystem\"/>\n                                    <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                                <connections>\n                                    <action selector=\"scrollStepInputChange:\" target=\"iW5-CD-5OC\" id=\"Ky3-r7-4Kh\"/>\n                                </connections>\n                            </textField>\n                            <stepper wantsLayer=\"YES\" horizontalHuggingPriority=\"750\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"a9X-MM-XsO\" userLabel=\"Scroll Step Stepper\">\n                                <rect key=\"frame\" x=\"409\" y=\"189\" width=\"13\" height=\"20\"/>\n                                <stepperCell key=\"cell\" controlSize=\"mini\" continuous=\"YES\" alignment=\"left\" increment=\"0.01\" minValue=\"0.01\" maxValue=\"100\" doubleValue=\"35\" id=\"l5w-H3-FUv\"/>\n                                <connections>\n                                    <action selector=\"scrollStepStepperChange:\" target=\"iW5-CD-5OC\" id=\"LSH-W5-eWh\"/>\n                                </connections>\n                            </stepper>\n                            <textField wantsLayer=\"YES\" focusRingType=\"none\" horizontalHuggingPriority=\"249\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ET3-bp-TfD\" userLabel=\"Scroll Step Description\">\n                                <rect key=\"frame\" x=\"169\" y=\"174\" width=\"263\" height=\"11\"/>\n                                <textFieldCell key=\"cell\" sendsActionOnEndEditing=\"YES\" alignment=\"left\" title=\"Sets the minimum scroll distance\" id=\"Jan-OY-m70\">\n                                    <font key=\"font\" metaFont=\"miniSystem\"/>\n                                    <color key=\"textColor\" name=\"secondaryLabelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <textField wantsLayer=\"YES\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"fAk-N9-naX\">\n                                <rect key=\"frame\" x=\"18\" y=\"138\" width=\"140\" height=\"14\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" relation=\"greaterThanOrEqual\" constant=\"136\" id=\"Axk-Bu-mvb\"/>\n                                </constraints>\n                                <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"right\" title=\"Speed\" id=\"Gcw-Ir-olP\">\n                                    <font key=\"font\" metaFont=\"smallSystem\"/>\n                                    <color key=\"textColor\" name=\"secondaryLabelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <slider wantsLayer=\"YES\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"YRx-cZ-Ol5\">\n                                <rect key=\"frame\" x=\"171\" y=\"136\" width=\"160\" height=\"18\"/>\n                                <sliderCell key=\"cell\" controlSize=\"small\" state=\"on\" alignment=\"left\" minValue=\"1\" maxValue=\"10\" doubleValue=\"3\" tickMarkPosition=\"above\" numberOfTickMarks=\"5\" sliderType=\"linear\" id=\"ovU-ME-3wf\"/>\n                                <connections>\n                                    <action selector=\"scrollSpeedSliderChange:\" target=\"iW5-CD-5OC\" id=\"eDS-0S-PZt\"/>\n                                </connections>\n                            </slider>\n                            <textField wantsLayer=\"YES\" focusRingType=\"none\" verticalHuggingPriority=\"750\" textCompletion=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Nbg-QY-VXM\" userLabel=\"Scroll Speed Input\">\n                                <rect key=\"frame\" x=\"339\" y=\"134\" width=\"62\" height=\"22\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"22\" id=\"fhi-bo-1m6\"/>\n                                </constraints>\n                                <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" allowsUndo=\"NO\" sendsActionOnEndEditing=\"YES\" state=\"on\" borderStyle=\"bezel\" alignment=\"center\" title=\"3.00\" placeholderString=\"1-10\" usesSingleLineMode=\"YES\" bezelStyle=\"round\" id=\"Fgm-mm-22Q\">\n                                    <numberFormatter key=\"formatter\" formatterBehavior=\"10_0\" positiveFormat=\"#,##0.00\" negativeFormat=\"-#,##0.00\" thousandSeparator=\",\" id=\"LUh-hA-gr3\">\n                                        <textAttributesForNegativeValues/>\n                                        <attributedString key=\"attributedStringForNil\"/>\n                                        <attributedString key=\"attributedStringForNotANumber\"/>\n                                        <attributedString key=\"attributedStringForZero\"/>\n                                        <real key=\"minimum\" value=\"1\"/>\n                                        <real key=\"maximum\" value=\"10\"/>\n                                    </numberFormatter>\n                                    <font key=\"font\" metaFont=\"miniSystem\"/>\n                                    <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                                <connections>\n                                    <action selector=\"scrollSpeedInputChange:\" target=\"iW5-CD-5OC\" id=\"Ald-c5-Tud\"/>\n                                </connections>\n                            </textField>\n                            <stepper wantsLayer=\"YES\" horizontalHuggingPriority=\"750\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"S6c-kz-cql\" userLabel=\"Scroll Speed Stepper\">\n                                <rect key=\"frame\" x=\"409\" y=\"135\" width=\"13\" height=\"20\"/>\n                                <stepperCell key=\"cell\" controlSize=\"mini\" continuous=\"YES\" alignment=\"left\" increment=\"0.01\" minValue=\"1\" maxValue=\"10\" doubleValue=\"3\" id=\"k4I-Zi-yIR\"/>\n                                <connections>\n                                    <action selector=\"scrollSpeedStepperChange:\" target=\"iW5-CD-5OC\" id=\"kbJ-4c-Epc\"/>\n                                </connections>\n                            </stepper>\n                            <textField wantsLayer=\"YES\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"U62-ME-IJk\" userLabel=\"Scroll Speed Description\">\n                                <rect key=\"frame\" x=\"169\" y=\"119\" width=\"263\" height=\"11\"/>\n                                <textFieldCell key=\"cell\" sendsActionOnEndEditing=\"YES\" alignment=\"left\" title=\"Sets scrolling acceleration\" id=\"B3O-iI-E7v\">\n                                    <font key=\"font\" metaFont=\"miniSystem\"/>\n                                    <color key=\"textColor\" name=\"secondaryLabelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <textField wantsLayer=\"YES\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"z8H-6h-kRv\">\n                                <rect key=\"frame\" x=\"18\" y=\"83\" width=\"140\" height=\"14\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" relation=\"greaterThanOrEqual\" constant=\"136\" id=\"ttO-Mn-fbd\"/>\n                                </constraints>\n                                <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"right\" title=\"Duration\" id=\"bqU-Is-gFB\">\n                                    <font key=\"font\" metaFont=\"smallSystem\"/>\n                                    <color key=\"textColor\" name=\"secondaryLabelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <slider wantsLayer=\"YES\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ILS-hD-J9N\" userLabel=\"Scroll Duration Slider\">\n                                <rect key=\"frame\" x=\"171\" y=\"81\" width=\"160\" height=\"18\"/>\n                                <sliderCell key=\"cell\" controlSize=\"small\" state=\"on\" alignment=\"left\" minValue=\"1\" maxValue=\"5\" doubleValue=\"4\" tickMarkPosition=\"above\" numberOfTickMarks=\"5\" sliderType=\"linear\" id=\"7tf-65-J41\"/>\n                                <connections>\n                                    <action selector=\"scrollDurationSliderChange:\" target=\"iW5-CD-5OC\" id=\"ILK-Vy-7ha\"/>\n                                </connections>\n                            </slider>\n                            <textField wantsLayer=\"YES\" focusRingType=\"none\" verticalHuggingPriority=\"750\" textCompletion=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"yLh-Cc-KrW\" userLabel=\"Scroll Duration Input\">\n                                <rect key=\"frame\" x=\"339\" y=\"79\" width=\"62\" height=\"22\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"22\" id=\"miX-5f-zbG\"/>\n                                </constraints>\n                                <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" allowsUndo=\"NO\" sendsActionOnEndEditing=\"YES\" state=\"on\" borderStyle=\"bezel\" alignment=\"center\" title=\"3.90\" placeholderString=\"1-5\" usesSingleLineMode=\"YES\" bezelStyle=\"round\" id=\"Qse-ik-rgy\">\n                                    <numberFormatter key=\"formatter\" formatterBehavior=\"10_0\" positiveFormat=\"#,##0.00\" negativeFormat=\"-#,##0.00\" thousandSeparator=\",\" id=\"oFk-D2-z9j\">\n                                        <attributedString key=\"attributedStringForZero\"/>\n                                        <real key=\"minimum\" value=\"1\"/>\n                                        <real key=\"maximum\" value=\"5\"/>\n                                    </numberFormatter>\n                                    <font key=\"font\" metaFont=\"miniSystem\"/>\n                                    <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                                <connections>\n                                    <action selector=\"scrollDurationInputChange:\" target=\"iW5-CD-5OC\" id=\"mxg-HD-2g6\"/>\n                                </connections>\n                            </textField>\n                            <stepper wantsLayer=\"YES\" horizontalHuggingPriority=\"750\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"d2K-LV-vnb\" userLabel=\"Scroll Duration Stepper\">\n                                <rect key=\"frame\" x=\"409\" y=\"80\" width=\"13\" height=\"20\"/>\n                                <stepperCell key=\"cell\" controlSize=\"mini\" continuous=\"YES\" alignment=\"left\" increment=\"0.01\" minValue=\"1\" maxValue=\"5\" doubleValue=\"3.8999999999999999\" id=\"Z41-rW-yF2\"/>\n                                <connections>\n                                    <action selector=\"scrollDurationStepperChange:\" target=\"iW5-CD-5OC\" id=\"cvd-fX-2VH\"/>\n                                </connections>\n                            </stepper>\n                            <textField wantsLayer=\"YES\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"sat-Nx-2q9\" userLabel=\"Scroll Duration Description\">\n                                <rect key=\"frame\" x=\"169\" y=\"64\" width=\"263\" height=\"11\"/>\n                                <textFieldCell key=\"cell\" sendsActionOnEndEditing=\"YES\" alignment=\"left\" title=\"Sets the duration of the scroll animation\" id=\"DsD-EW-zCH\">\n                                    <font key=\"font\" metaFont=\"miniSystem\"/>\n                                    <color key=\"textColor\" name=\"secondaryLabelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <button wantsLayer=\"YES\" springLoaded=\"YES\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"JjW-7S-QNG\">\n                                <rect key=\"frame\" x=\"20\" y=\"20\" width=\"410\" height=\"24\"/>\n                                <buttonCell key=\"cell\" type=\"roundRect\" title=\"Reset to defaults\" bezelStyle=\"roundedRect\" alignment=\"center\" state=\"on\" borderStyle=\"border\" allowsMixedState=\"YES\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"t2D-X2-Y6W\">\n                                    <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"smallSystem\"/>\n                                </buttonCell>\n                                <connections>\n                                    <action selector=\"resetToDefaultClick:\" target=\"iW5-CD-5OC\" id=\"YH6-Nc-6jU\"/>\n                                </connections>\n                            </button>\n                            <button translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"gxK-T9-rTz\">\n                                <rect key=\"frame\" x=\"357\" y=\"464\" width=\"18\" height=\"18\"/>\n                                <buttonCell key=\"cell\" type=\"inline\" bezelStyle=\"inline\" image=\"NSIconViewTemplate\" imagePosition=\"only\" alignment=\"center\" state=\"on\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"Zby-Nv-Yli\">\n                                    <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"smallSystemBold\"/>\n                                </buttonCell>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"18\" id=\"8SU-Sv-w3Z\"/>\n                                    <constraint firstAttribute=\"width\" constant=\"18\" id=\"9m6-75-HDu\"/>\n                                </constraints>\n                                <connections>\n                                    <segue destination=\"6NY-mX-uto\" kind=\"popover\" popoverAnchorView=\"gxK-T9-rTz\" popoverBehavior=\"t\" preferredEdge=\"maxY\" id=\"NkJ-8R-pRc\"/>\n                                </connections>\n                            </button>\n                            <button translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"W1h-Ae-pqa\">\n                                <rect key=\"frame\" x=\"332\" y=\"433\" width=\"18\" height=\"18\"/>\n                                <buttonCell key=\"cell\" type=\"inline\" bezelStyle=\"inline\" image=\"NSIconViewTemplate\" imagePosition=\"only\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"Ef3-I4-vMD\">\n                                    <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"smallSystem\"/>\n                                </buttonCell>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" constant=\"18\" id=\"Xox-dE-i6e\"/>\n                                    <constraint firstAttribute=\"height\" constant=\"18\" id=\"hSz-2Y-8FF\"/>\n                                </constraints>\n                                <connections>\n                                    <segue destination=\"LBo-ML-z89\" kind=\"popover\" popoverAnchorView=\"W1h-Ae-pqa\" popoverBehavior=\"t\" preferredEdge=\"maxY\" id=\"xKY-oA-iQp\"/>\n                                </connections>\n                            </button>\n                            <button translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"djY-Oz-zp6\">\n                                <rect key=\"frame\" x=\"295\" y=\"370\" width=\"24\" height=\"24\"/>\n                                <buttonCell key=\"cell\" type=\"bevel\" bezelStyle=\"regularSquare\" image=\"NSStopProgressFreestandingTemplate\" imagePosition=\"overlaps\" alignment=\"center\" lineBreakMode=\"truncatingTail\" state=\"on\" borderStyle=\"border\" inset=\"2\" id=\"mi7-t8-cQj\">\n                                    <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                </buttonCell>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"24\" id=\"cL9-Xm-UMd\"/>\n                                    <constraint firstAttribute=\"width\" constant=\"24\" id=\"e7h-hF-o4m\"/>\n                                </constraints>\n                                <connections>\n                                    <action selector=\"dashKeyDelButtonClick:\" target=\"iW5-CD-5OC\" id=\"Xnv-N0-DX8\"/>\n                                </connections>\n                            </button>\n                            <button translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"eok-QS-9XH\">\n                                <rect key=\"frame\" x=\"295\" y=\"317\" width=\"24\" height=\"24\"/>\n                                <buttonCell key=\"cell\" type=\"bevel\" bezelStyle=\"regularSquare\" image=\"NSStopProgressFreestandingTemplate\" imagePosition=\"overlaps\" alignment=\"center\" lineBreakMode=\"truncatingTail\" state=\"on\" borderStyle=\"border\" inset=\"2\" id=\"l8l-Zf-t0U\">\n                                    <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                </buttonCell>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" constant=\"24\" id=\"7Nq-Sj-O62\"/>\n                                    <constraint firstAttribute=\"height\" constant=\"24\" id=\"DY0-T4-SNb\"/>\n                                </constraints>\n                                <connections>\n                                    <action selector=\"toggleKeyDelButtonClick:\" target=\"iW5-CD-5OC\" id=\"PfQ-zU-vnr\"/>\n                                </connections>\n                            </button>\n                            <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"EFO-dA-m6V\">\n                                <rect key=\"frame\" x=\"171\" y=\"370\" width=\"120\" height=\"24\"/>\n                                <buttonCell key=\"cell\" type=\"push\" title=\"Disabled\" bezelStyle=\"rounded\" alignment=\"left\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"2dJ-u6-vHd\">\n                                    <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                </buttonCell>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" relation=\"greaterThanOrEqual\" constant=\"120\" id=\"JEJ-Qj-tna\"/>\n                                </constraints>\n                                <connections>\n                                    <action selector=\"dashKeyButtonClick:\" target=\"iW5-CD-5OC\" id=\"9RG-Sz-yqa\"/>\n                                </connections>\n                            </button>\n                            <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ViJ-9q-G0Y\">\n                                <rect key=\"frame\" x=\"171\" y=\"317\" width=\"120\" height=\"24\"/>\n                                <buttonCell key=\"cell\" type=\"push\" title=\"Disabled\" bezelStyle=\"rounded\" alignment=\"left\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"zTP-iu-A6h\">\n                                    <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                </buttonCell>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" relation=\"greaterThanOrEqual\" constant=\"120\" id=\"G5T-mQ-VNt\"/>\n                                    <constraint firstAttribute=\"width\" relation=\"greaterThanOrEqual\" constant=\"120\" id=\"RRT-lc-JKz\"/>\n                                </constraints>\n                                <connections>\n                                    <action selector=\"toggleKeyButtonClick:\" target=\"iW5-CD-5OC\" id=\"NpR-pf-lRy\"/>\n                                </connections>\n                            </button>\n                            <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"tqn-BT-jaW\">\n                                <rect key=\"frame\" x=\"171\" y=\"264\" width=\"120\" height=\"24\"/>\n                                <buttonCell key=\"cell\" type=\"push\" title=\"Disabled\" bezelStyle=\"rounded\" alignment=\"left\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"Ky0-gH-I3A\">\n                                    <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                </buttonCell>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" relation=\"greaterThanOrEqual\" constant=\"120\" id=\"1yT-Ch-4Fa\"/>\n                                    <constraint firstAttribute=\"width\" relation=\"greaterThanOrEqual\" constant=\"120\" id=\"Gfl-B9-3lQ\"/>\n                                </constraints>\n                                <connections>\n                                    <action selector=\"disableKeyButtonClick:\" target=\"iW5-CD-5OC\" id=\"tqX-fH-n6p\"/>\n                                </connections>\n                            </button>\n                            <button translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Lsg-Nt-2NN\">\n                                <rect key=\"frame\" x=\"295\" y=\"264\" width=\"24\" height=\"24\"/>\n                                <buttonCell key=\"cell\" type=\"bevel\" bezelStyle=\"regularSquare\" image=\"NSStopProgressFreestandingTemplate\" imagePosition=\"overlaps\" alignment=\"center\" lineBreakMode=\"truncatingTail\" state=\"on\" borderStyle=\"border\" inset=\"2\" id=\"Eqp-qB-x3d\">\n                                    <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                </buttonCell>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"24\" id=\"1Pa-gt-ACD\"/>\n                                    <constraint firstAttribute=\"width\" constant=\"24\" id=\"9ot-Gm-aLS\"/>\n                                </constraints>\n                                <connections>\n                                    <action selector=\"disableKeyDelButtonClick:\" target=\"iW5-CD-5OC\" id=\"i3n-cB-l9O\"/>\n                                </connections>\n                            </button>\n                        </subviews>\n                        <constraints>\n                            <constraint firstItem=\"1eQ-Un-ZLh\" firstAttribute=\"top\" secondItem=\"tqn-BT-jaW\" secondAttribute=\"bottom\" constant=\"6\" id=\"0MB-tP-Hdn\"/>\n                            <constraint firstItem=\"9Nm-TC-llN\" firstAttribute=\"leading\" secondItem=\"Jsi-ke-bNZ\" secondAttribute=\"leading\" constant=\"20\" id=\"0Vg-xD-9k8\"/>\n                            <constraint firstItem=\"1Hp-EF-wSq\" firstAttribute=\"leading\" secondItem=\"DQH-h2-1Zk\" secondAttribute=\"trailing\" constant=\"15\" id=\"0uZ-4R-HgZ\"/>\n                            <constraint firstItem=\"U62-ME-IJk\" firstAttribute=\"leading\" secondItem=\"YRx-cZ-Ol5\" secondAttribute=\"leading\" id=\"0w0-3f-SLg\"/>\n                            <constraint firstItem=\"1Hp-EF-wSq\" firstAttribute=\"top\" secondItem=\"Jsi-ke-bNZ\" secondAttribute=\"top\" constant=\"20\" id=\"2ci-KM-kFp\"/>\n                            <constraint firstItem=\"ILS-hD-J9N\" firstAttribute=\"top\" secondItem=\"U62-ME-IJk\" secondAttribute=\"bottom\" constant=\"20\" id=\"3II-QN-1Fz\"/>\n                            <constraint firstItem=\"YRx-cZ-Ol5\" firstAttribute=\"centerY\" secondItem=\"fAk-N9-naX\" secondAttribute=\"centerY\" id=\"3W1-LQ-kGl\"/>\n                            <constraint firstItem=\"gSx-dp-Tvn\" firstAttribute=\"top\" secondItem=\"ViJ-9q-G0Y\" secondAttribute=\"bottom\" constant=\"6\" id=\"41G-Nr-Pmv\"/>\n                            <constraint firstItem=\"Nbg-QY-VXM\" firstAttribute=\"centerY\" secondItem=\"fAk-N9-naX\" secondAttribute=\"centerY\" id=\"44n-Jg-xY8\"/>\n                            <constraint firstItem=\"TU2-J4-KYA\" firstAttribute=\"leading\" secondItem=\"zKw-pT-YRj\" secondAttribute=\"trailing\" constant=\"15\" id=\"5Rs-fL-Fg2\"/>\n                            <constraint firstItem=\"d2K-LV-vnb\" firstAttribute=\"centerX\" secondItem=\"a9X-MM-XsO\" secondAttribute=\"centerX\" id=\"5rC-KJ-6pm\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"ET3-bp-TfD\" secondAttribute=\"trailing\" constant=\"20\" id=\"6iJ-05-v4S\"/>\n                            <constraint firstItem=\"45l-vw-E0o\" firstAttribute=\"top\" secondItem=\"djY-Oz-zp6\" secondAttribute=\"bottom\" constant=\"6\" id=\"6w1-wr-qtQ\"/>\n                            <constraint firstItem=\"aV7-KP-bgw\" firstAttribute=\"trailing\" secondItem=\"DQH-h2-1Zk\" secondAttribute=\"trailing\" id=\"98P-64-XmI\"/>\n                            <constraint firstItem=\"fAk-N9-naX\" firstAttribute=\"leading\" secondItem=\"Jsi-ke-bNZ\" secondAttribute=\"leading\" constant=\"20\" id=\"98a-1h-cPd\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"sat-Nx-2q9\" secondAttribute=\"trailing\" constant=\"20\" id=\"A2T-iV-X8v\"/>\n                            <constraint firstItem=\"rQj-g8-Y0N\" firstAttribute=\"leading\" secondItem=\"Jsi-ke-bNZ\" secondAttribute=\"leading\" constant=\"20\" id=\"BIW-t6-s03\"/>\n                            <constraint firstItem=\"ViJ-9q-G0Y\" firstAttribute=\"centerY\" secondItem=\"9Nm-TC-llN\" secondAttribute=\"centerY\" id=\"C0S-HF-6di\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"a9X-MM-XsO\" secondAttribute=\"trailing\" constant=\"28\" id=\"C2J-vT-MV9\"/>\n                            <constraint firstItem=\"ViJ-9q-G0Y\" firstAttribute=\"top\" secondItem=\"45l-vw-E0o\" secondAttribute=\"bottom\" constant=\"12\" id=\"CWj-4B-i0a\"/>\n                            <constraint firstItem=\"eok-QS-9XH\" firstAttribute=\"leading\" secondItem=\"ViJ-9q-G0Y\" secondAttribute=\"trailing\" constant=\"4\" id=\"DLe-IX-hra\"/>\n                            <constraint firstItem=\"tqn-BT-jaW\" firstAttribute=\"top\" secondItem=\"gSx-dp-Tvn\" secondAttribute=\"bottom\" constant=\"12\" id=\"DQb-03-D0u\"/>\n                            <constraint firstItem=\"iLA-i9-HEO\" firstAttribute=\"top\" secondItem=\"1eQ-Un-ZLh\" secondAttribute=\"bottom\" constant=\"20\" id=\"DtP-Yi-Uyt\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"JjW-7S-QNG\" secondAttribute=\"trailing\" constant=\"20\" id=\"Dyz-xE-zke\"/>\n                            <constraint firstItem=\"djY-Oz-zp6\" firstAttribute=\"leading\" secondItem=\"EFO-dA-m6V\" secondAttribute=\"trailing\" constant=\"4\" id=\"E28-7d-NeK\"/>\n                            <constraint firstItem=\"TU2-J4-KYA\" firstAttribute=\"centerY\" secondItem=\"zKw-pT-YRj\" secondAttribute=\"centerY\" id=\"E4k-rd-3SV\"/>\n                            <constraint firstItem=\"tqn-BT-jaW\" firstAttribute=\"centerY\" secondItem=\"kMQ-Oj-Bvd\" secondAttribute=\"centerY\" id=\"FOp-cB-E3l\"/>\n                            <constraint firstItem=\"lh7-BV-xfD\" firstAttribute=\"centerY\" secondItem=\"zKw-pT-YRj\" secondAttribute=\"centerY\" id=\"Fqa-Pd-9Ih\"/>\n                            <constraint firstItem=\"kMQ-Oj-Bvd\" firstAttribute=\"leading\" secondItem=\"Jsi-ke-bNZ\" secondAttribute=\"leading\" constant=\"20\" id=\"G12-JL-MKC\"/>\n                            <constraint firstItem=\"sat-Nx-2q9\" firstAttribute=\"top\" secondItem=\"ILS-hD-J9N\" secondAttribute=\"bottom\" constant=\"6\" id=\"Gia-1t-IS7\"/>\n                            <constraint firstItem=\"TU2-J4-KYA\" firstAttribute=\"top\" secondItem=\"iLA-i9-HEO\" secondAttribute=\"bottom\" constant=\"20\" id=\"HFj-9b-fYI\"/>\n                            <constraint firstItem=\"aV7-KP-bgw\" firstAttribute=\"leading\" secondItem=\"Jsi-ke-bNZ\" secondAttribute=\"leading\" constant=\"20\" id=\"Ii8-a4-cEO\"/>\n                            <constraint firstItem=\"S6c-kz-cql\" firstAttribute=\"centerY\" secondItem=\"fAk-N9-naX\" secondAttribute=\"centerY\" id=\"IrJ-lk-88B\"/>\n                            <constraint firstItem=\"JjW-7S-QNG\" firstAttribute=\"top\" secondItem=\"sat-Nx-2q9\" secondAttribute=\"bottom\" constant=\"20\" id=\"Iv6-67-bzY\"/>\n                            <constraint firstItem=\"ET3-bp-TfD\" firstAttribute=\"leading\" secondItem=\"TU2-J4-KYA\" secondAttribute=\"leading\" id=\"J2U-dT-yfG\"/>\n                            <constraint firstAttribute=\"trailing\" relation=\"greaterThanOrEqual\" secondItem=\"W1h-Ae-pqa\" secondAttribute=\"trailing\" constant=\"69\" id=\"Kd4-65-JB5\"/>\n                            <constraint firstItem=\"PIE-3y-0sa\" firstAttribute=\"leading\" secondItem=\"1Hp-EF-wSq\" secondAttribute=\"leading\" id=\"Kjj-Xk-NCY\"/>\n                            <constraint firstItem=\"z8H-6h-kRv\" firstAttribute=\"leading\" secondItem=\"Jsi-ke-bNZ\" secondAttribute=\"leading\" constant=\"20\" id=\"Mdw-tv-G5c\"/>\n                            <constraint firstItem=\"JjW-7S-QNG\" firstAttribute=\"leading\" secondItem=\"Jsi-ke-bNZ\" secondAttribute=\"leading\" constant=\"20\" id=\"N4u-jg-GWf\"/>\n                            <constraint firstItem=\"rQj-g8-Y0N\" firstAttribute=\"top\" secondItem=\"aV7-KP-bgw\" secondAttribute=\"bottom\" constant=\"20\" id=\"Ngc-Un-6oj\"/>\n                            <constraint firstItem=\"a9X-MM-XsO\" firstAttribute=\"leading\" secondItem=\"lh7-BV-xfD\" secondAttribute=\"trailing\" constant=\"8\" id=\"Nha-4v-g46\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"JjW-7S-QNG\" secondAttribute=\"bottom\" constant=\"20\" id=\"NsJ-aX-ud9\"/>\n                            <constraint firstItem=\"W1h-Ae-pqa\" firstAttribute=\"centerY\" secondItem=\"PIE-3y-0sa\" secondAttribute=\"centerY\" id=\"PKU-i7-Eyi\"/>\n                            <constraint firstItem=\"kMQ-Oj-Bvd\" firstAttribute=\"trailing\" secondItem=\"mKO-0m-Vb0\" secondAttribute=\"trailing\" id=\"PoW-u4-7q1\"/>\n                            <constraint firstItem=\"yLh-Cc-KrW\" firstAttribute=\"centerY\" secondItem=\"z8H-6h-kRv\" secondAttribute=\"centerY\" id=\"Re1-rO-gOx\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"U62-ME-IJk\" secondAttribute=\"trailing\" constant=\"20\" id=\"RoV-WZ-Zi3\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"rQj-g8-Y0N\" secondAttribute=\"trailing\" constant=\"20\" id=\"SEW-B5-txw\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"45l-vw-E0o\" secondAttribute=\"trailing\" constant=\"20\" id=\"SSY-Ha-Tb9\"/>\n                            <constraint firstItem=\"YRx-cZ-Ol5\" firstAttribute=\"top\" secondItem=\"ET3-bp-TfD\" secondAttribute=\"bottom\" constant=\"20\" id=\"VdG-zy-Ryy\"/>\n                            <constraint firstItem=\"1eQ-Un-ZLh\" firstAttribute=\"leading\" secondItem=\"tqn-BT-jaW\" secondAttribute=\"leading\" id=\"Vxu-8f-ebU\"/>\n                            <constraint firstItem=\"9Nm-TC-llN\" firstAttribute=\"trailing\" secondItem=\"mKO-0m-Vb0\" secondAttribute=\"trailing\" id=\"YY1-Mm-gT9\"/>\n                            <constraint firstItem=\"DQH-h2-1Zk\" firstAttribute=\"leading\" secondItem=\"Jsi-ke-bNZ\" secondAttribute=\"leading\" constant=\"20\" id=\"Yd4-4g-ZvJ\"/>\n                            <constraint firstItem=\"gSx-dp-Tvn\" firstAttribute=\"leading\" secondItem=\"ViJ-9q-G0Y\" secondAttribute=\"leading\" id=\"bDy-C0-anG\"/>\n                            <constraint firstItem=\"d2K-LV-vnb\" firstAttribute=\"centerY\" secondItem=\"z8H-6h-kRv\" secondAttribute=\"centerY\" id=\"bsK-hu-vWG\"/>\n                            <constraint firstItem=\"gxK-T9-rTz\" firstAttribute=\"centerY\" secondItem=\"1Hp-EF-wSq\" secondAttribute=\"centerY\" constant=\"1\" id=\"bzy-gX-zKN\"/>\n                            <constraint firstItem=\"Lsg-Nt-2NN\" firstAttribute=\"centerY\" secondItem=\"tqn-BT-jaW\" secondAttribute=\"centerY\" id=\"dAB-Mi-so2\"/>\n                            <constraint firstItem=\"ILS-hD-J9N\" firstAttribute=\"leading\" secondItem=\"z8H-6h-kRv\" secondAttribute=\"trailing\" constant=\"15\" id=\"fWH-ia-3i7\"/>\n                            <constraint firstItem=\"yLh-Cc-KrW\" firstAttribute=\"leading\" secondItem=\"ILS-hD-J9N\" secondAttribute=\"trailing\" constant=\"8\" id=\"fdA-Ou-k7t\"/>\n                            <constraint firstItem=\"W1h-Ae-pqa\" firstAttribute=\"leading\" secondItem=\"PIE-3y-0sa\" secondAttribute=\"trailing\" constant=\"8\" id=\"gWA-5U-oAw\"/>\n                            <constraint firstItem=\"YRx-cZ-Ol5\" firstAttribute=\"leading\" secondItem=\"fAk-N9-naX\" secondAttribute=\"trailing\" constant=\"15\" id=\"geC-Vo-c6H\"/>\n                            <constraint firstItem=\"PIE-3y-0sa\" firstAttribute=\"centerY\" secondItem=\"aV7-KP-bgw\" secondAttribute=\"centerY\" id=\"gkh-p7-Xf5\"/>\n                            <constraint firstItem=\"tqn-BT-jaW\" firstAttribute=\"leading\" secondItem=\"EFO-dA-m6V\" secondAttribute=\"leading\" id=\"gnU-2h-l72\"/>\n                            <constraint firstItem=\"Lsg-Nt-2NN\" firstAttribute=\"leading\" secondItem=\"tqn-BT-jaW\" secondAttribute=\"trailing\" constant=\"4\" id=\"hZe-UF-mZX\"/>\n                            <constraint firstItem=\"gxK-T9-rTz\" firstAttribute=\"leading\" secondItem=\"1Hp-EF-wSq\" secondAttribute=\"trailing\" constant=\"8\" id=\"hl2-gp-Goo\"/>\n                            <constraint firstAttribute=\"trailing\" relation=\"greaterThanOrEqual\" secondItem=\"gxK-T9-rTz\" secondAttribute=\"trailing\" constant=\"74\" id=\"hn9-AF-A85\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"gSx-dp-Tvn\" secondAttribute=\"trailing\" constant=\"20\" id=\"i0c-P1-3nv\"/>\n                            <constraint firstItem=\"sat-Nx-2q9\" firstAttribute=\"leading\" secondItem=\"ILS-hD-J9N\" secondAttribute=\"leading\" id=\"i4R-S6-InG\"/>\n                            <constraint firstItem=\"lh7-BV-xfD\" firstAttribute=\"leading\" secondItem=\"TU2-J4-KYA\" secondAttribute=\"trailing\" constant=\"8\" id=\"jGV-sG-OUj\"/>\n                            <constraint firstItem=\"lh7-BV-xfD\" firstAttribute=\"leading\" secondItem=\"Nbg-QY-VXM\" secondAttribute=\"leading\" id=\"jr4-CL-sD6\"/>\n                            <constraint firstItem=\"EFO-dA-m6V\" firstAttribute=\"top\" secondItem=\"rQj-g8-Y0N\" secondAttribute=\"bottom\" constant=\"20\" id=\"kcO-F4-wnC\"/>\n                            <constraint firstItem=\"ViJ-9q-G0Y\" firstAttribute=\"leading\" secondItem=\"EFO-dA-m6V\" secondAttribute=\"leading\" id=\"kul-Sa-c8m\"/>\n                            <constraint firstItem=\"fAk-N9-naX\" firstAttribute=\"trailing\" secondItem=\"zKw-pT-YRj\" secondAttribute=\"trailing\" id=\"lt1-P4-0TH\"/>\n                            <constraint firstItem=\"mKO-0m-Vb0\" firstAttribute=\"leading\" secondItem=\"Jsi-ke-bNZ\" secondAttribute=\"leading\" constant=\"20\" id=\"luf-Zr-r7W\"/>\n                            <constraint firstItem=\"iLA-i9-HEO\" firstAttribute=\"leading\" secondItem=\"Jsi-ke-bNZ\" secondAttribute=\"leading\" constant=\"20\" id=\"m0c-Kl-2LN\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"iLA-i9-HEO\" secondAttribute=\"trailing\" constant=\"20\" id=\"mOI-wr-L2y\"/>\n                            <constraint firstItem=\"eok-QS-9XH\" firstAttribute=\"centerY\" secondItem=\"ViJ-9q-G0Y\" secondAttribute=\"centerY\" id=\"nb1-jM-ssb\"/>\n                            <constraint firstItem=\"45l-vw-E0o\" firstAttribute=\"leading\" secondItem=\"EFO-dA-m6V\" secondAttribute=\"leading\" id=\"o2c-hF-OEu\"/>\n                            <constraint firstItem=\"ET3-bp-TfD\" firstAttribute=\"top\" secondItem=\"TU2-J4-KYA\" secondAttribute=\"bottom\" constant=\"6\" id=\"p88-uc-Qe1\"/>\n                            <constraint firstItem=\"S6c-kz-cql\" firstAttribute=\"centerX\" secondItem=\"a9X-MM-XsO\" secondAttribute=\"centerX\" id=\"pHy-Zr-c2E\"/>\n                            <constraint firstItem=\"1Hp-EF-wSq\" firstAttribute=\"centerY\" secondItem=\"DQH-h2-1Zk\" secondAttribute=\"centerY\" id=\"pJk-Od-Xub\"/>\n                            <constraint firstItem=\"ILS-hD-J9N\" firstAttribute=\"centerY\" secondItem=\"z8H-6h-kRv\" secondAttribute=\"centerY\" id=\"pj0-FV-OUu\"/>\n                            <constraint firstItem=\"yLh-Cc-KrW\" firstAttribute=\"trailing\" secondItem=\"lh7-BV-xfD\" secondAttribute=\"trailing\" id=\"qIJ-PG-39b\"/>\n                            <constraint firstItem=\"zKw-pT-YRj\" firstAttribute=\"leading\" secondItem=\"Jsi-ke-bNZ\" secondAttribute=\"leading\" constant=\"20\" id=\"rfM-Zy-Wrg\"/>\n                            <constraint firstItem=\"a9X-MM-XsO\" firstAttribute=\"centerY\" secondItem=\"zKw-pT-YRj\" secondAttribute=\"centerY\" id=\"rv0-ow-SXe\"/>\n                            <constraint firstItem=\"Nbg-QY-VXM\" firstAttribute=\"trailing\" secondItem=\"lh7-BV-xfD\" secondAttribute=\"trailing\" id=\"shw-kB-Jhh\"/>\n                            <constraint firstItem=\"z8H-6h-kRv\" firstAttribute=\"trailing\" secondItem=\"zKw-pT-YRj\" secondAttribute=\"trailing\" id=\"ulJ-Kc-kgE\"/>\n                            <constraint firstItem=\"lh7-BV-xfD\" firstAttribute=\"leading\" secondItem=\"yLh-Cc-KrW\" secondAttribute=\"leading\" id=\"wIA-gp-ZRk\"/>\n                            <constraint firstItem=\"U62-ME-IJk\" firstAttribute=\"top\" secondItem=\"YRx-cZ-Ol5\" secondAttribute=\"bottom\" constant=\"6\" id=\"xJO-bU-dmn\"/>\n                            <constraint firstItem=\"djY-Oz-zp6\" firstAttribute=\"centerY\" secondItem=\"EFO-dA-m6V\" secondAttribute=\"centerY\" id=\"z5e-TG-WUT\"/>\n                            <constraint firstItem=\"EFO-dA-m6V\" firstAttribute=\"leading\" secondItem=\"mKO-0m-Vb0\" secondAttribute=\"trailing\" constant=\"15\" id=\"zCK-Je-Ym4\"/>\n                            <constraint firstItem=\"Nbg-QY-VXM\" firstAttribute=\"leading\" secondItem=\"YRx-cZ-Ol5\" secondAttribute=\"trailing\" constant=\"8\" id=\"zKX-aV-Ng7\"/>\n                            <constraint firstItem=\"PIE-3y-0sa\" firstAttribute=\"top\" secondItem=\"1Hp-EF-wSq\" secondAttribute=\"bottom\" constant=\"18\" id=\"zXK-ZB-H4d\"/>\n                            <constraint firstItem=\"EFO-dA-m6V\" firstAttribute=\"centerY\" secondItem=\"mKO-0m-Vb0\" secondAttribute=\"centerY\" id=\"zbA-rs-8kU\"/>\n                        </constraints>\n                    </visualEffectView>\n                    <connections>\n                        <outlet property=\"dashKeyBindButton\" destination=\"EFO-dA-m6V\" id=\"FB1-40-nl9\"/>\n                        <outlet property=\"dashKeyDelButton\" destination=\"djY-Oz-zp6\" id=\"OOJ-hd-KiK\"/>\n                        <outlet property=\"disableKeyBindButton\" destination=\"tqn-BT-jaW\" id=\"Ixz-Dg-J8J\"/>\n                        <outlet property=\"disableKeyDelButton\" destination=\"Lsg-Nt-2NN\" id=\"kve-01-kRl\"/>\n                        <outlet property=\"resetToDefaultsButton\" destination=\"JjW-7S-QNG\" id=\"bxA-s3-U5j\"/>\n                        <outlet property=\"scrollDurationDescriptionLabel\" destination=\"sat-Nx-2q9\" id=\"JPP-VY-Tch\"/>\n                        <outlet property=\"scrollDurationInput\" destination=\"yLh-Cc-KrW\" id=\"KB1-tR-39d\"/>\n                        <outlet property=\"scrollDurationSlider\" destination=\"ILS-hD-J9N\" id=\"LZW-wb-dCh\"/>\n                        <outlet property=\"scrollDurationStepper\" destination=\"d2K-LV-vnb\" id=\"wG5-7L-Anh\"/>\n                        <outlet property=\"scrollReverseCheckBox\" destination=\"PIE-3y-0sa\" id=\"fCm-8y-9iP\"/>\n                        <outlet property=\"scrollSmoothCheckBox\" destination=\"1Hp-EF-wSq\" id=\"2pe-uw-PEU\"/>\n                        <outlet property=\"scrollSpeedInput\" destination=\"Nbg-QY-VXM\" id=\"xh0-Qi-lLL\"/>\n                        <outlet property=\"scrollSpeedSlider\" destination=\"YRx-cZ-Ol5\" id=\"rnP-xz-Yv7\"/>\n                        <outlet property=\"scrollSpeedStepper\" destination=\"S6c-kz-cql\" id=\"IoA-M2-f1Y\"/>\n                        <outlet property=\"scrollStepInput\" destination=\"lh7-BV-xfD\" id=\"fwW-Zi-E2B\"/>\n                        <outlet property=\"scrollStepSlider\" destination=\"TU2-J4-KYA\" id=\"XB2-IU-NIg\"/>\n                        <outlet property=\"scrollStepStepper\" destination=\"a9X-MM-XsO\" id=\"cSm-4H-vRz\"/>\n                        <outlet property=\"toggleKeyBindButton\" destination=\"ViJ-9q-G0Y\" id=\"yV1-Ru-kgf\"/>\n                        <outlet property=\"toggleKeyDelButton\" destination=\"eok-QS-9XH\" id=\"9hZ-tg-FaS\"/>\n                    </connections>\n                </viewController>\n            </objects>\n            <point key=\"canvasLocation\" x=\"954\" y=\"1365.5\"/>\n        </scene>\n        <!--Adaptive Popover-->\n        <scene sceneID=\"79I-rH-ZaI\">\n            <objects>\n                <viewController id=\"mUR-85-jNE\" customClass=\"AdaptivePopover\" customModule=\"Mos\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" id=\"Adm-9b-xST\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"391\" height=\"34\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" horizontalCompressionResistancePriority=\"250\" textCompletion=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"zrl-5e-XRk\">\n                                <rect key=\"frame\" x=\"10\" y=\"10\" width=\"371\" height=\"14\"/>\n                                <textFieldCell key=\"cell\" controlSize=\"mini\" sendsActionOnEndEditing=\"YES\" alignment=\"left\" title=\"Temporarily disable smooth scrolling to improve scrolling accuracy.\" id=\"Rgq-87-vjY\">\n                                    <font key=\"font\" metaFont=\"smallSystem\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                        </subviews>\n                        <constraints>\n                            <constraint firstItem=\"zrl-5e-XRk\" firstAttribute=\"top\" secondItem=\"Adm-9b-xST\" secondAttribute=\"top\" constant=\"10\" id=\"QhL-S9-XQV\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"zrl-5e-XRk\" secondAttribute=\"trailing\" constant=\"12\" id=\"RfB-KE-4NC\"/>\n                            <constraint firstItem=\"zrl-5e-XRk\" firstAttribute=\"leading\" secondItem=\"Adm-9b-xST\" secondAttribute=\"leading\" constant=\"12\" id=\"XWU-Yt-4gW\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"zrl-5e-XRk\" secondAttribute=\"bottom\" constant=\"10\" id=\"bAx-rj-3OJ\"/>\n                        </constraints>\n                    </view>\n                </viewController>\n                <customObject id=\"9YO-Hc-WUu\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"955\" y=\"1882\"/>\n        </scene>\n        <!--Scroll Smooth Detail Settings Popover View Controller-->\n        <scene sceneID=\"cWM-rm-1Zc\">\n            <objects>\n                <viewController id=\"6NY-mX-uto\" customClass=\"ScrollSmoothDetailSettingsPopoverViewController\" customModule=\"Mos\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" id=\"Ii6-1I-pb4\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"215\" height=\"118\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <subviews>\n                            <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"xHE-gD-zSo\">\n                                <rect key=\"frame\" x=\"20\" y=\"84\" width=\"175\" height=\"14\"/>\n                                <buttonCell key=\"cell\" type=\"check\" title=\"Vertical Smooth\" bezelStyle=\"regularSquare\" imagePosition=\"left\" controlSize=\"small\" state=\"on\" inset=\"2\" id=\"GtT-zh-x8d\">\n                                    <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"smallSystem\"/>\n                                </buttonCell>\n                                <connections>\n                                    <action selector=\"verticalSmoothToggle:\" target=\"6NY-mX-uto\" id=\"xb6-7W-W0E\"/>\n                                </connections>\n                            </button>\n                            <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"k59-to-Z4j\">\n                                <rect key=\"frame\" x=\"20\" y=\"60\" width=\"175\" height=\"14\"/>\n                                <buttonCell key=\"cell\" type=\"check\" title=\"Horizontal Smooth\" bezelStyle=\"regularSquare\" imagePosition=\"left\" controlSize=\"small\" state=\"on\" inset=\"2\" id=\"Nh1-iw-yGN\">\n                                    <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"smallSystem\"/>\n                                </buttonCell>\n                                <connections>\n                                    <action selector=\"horizontalSmoothToggle:\" target=\"6NY-mX-uto\" id=\"XJ8-cd-9ho\"/>\n                                </connections>\n                            </button>\n                            <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Yww-b9-vE7\">\n                                <rect key=\"frame\" x=\"20\" y=\"36\" width=\"175\" height=\"14\"/>\n                                <buttonCell key=\"cell\" type=\"check\" title=\"Simulate Trackpad (Beta)\" bezelStyle=\"regularSquare\" imagePosition=\"left\" controlSize=\"small\" state=\"on\" inset=\"2\" id=\"p7Y-SJ-d6t\">\n                                    <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"smallSystem\"/>\n                                </buttonCell>\n                                <connections>\n                                    <action selector=\"simulateTrackpadToggle:\" target=\"6NY-mX-uto\" id=\"r6j-t3-d9L\"/>\n                                </connections>\n                            </button>\n                            <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"T2A-GP-RAS\">\n                                <rect key=\"frame\" x=\"37\" y=\"20\" width=\"160\" height=\"11\"/>\n                                <textFieldCell key=\"cell\" controlSize=\"mini\" lineBreakMode=\"clipping\" title=\"May affect the scrolling behavior\" id=\"W2z-NX-9UO\">\n                                    <font key=\"font\" metaFont=\"miniSystem\"/>\n                                    <color key=\"textColor\" name=\"secondaryLabelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                        </subviews>\n                        <constraints>\n                            <constraint firstItem=\"Yww-b9-vE7\" firstAttribute=\"top\" secondItem=\"k59-to-Z4j\" secondAttribute=\"bottom\" constant=\"10\" id=\"1Df-VR-P0o\"/>\n                            <constraint firstItem=\"Yww-b9-vE7\" firstAttribute=\"trailing\" secondItem=\"xHE-gD-zSo\" secondAttribute=\"trailing\" id=\"2rK-qE-Mwl\"/>\n                            <constraint firstItem=\"k59-to-Z4j\" firstAttribute=\"leading\" secondItem=\"xHE-gD-zSo\" secondAttribute=\"leading\" id=\"4KB-Hs-tVK\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"xHE-gD-zSo\" secondAttribute=\"trailing\" constant=\"20\" symbolic=\"YES\" id=\"4bD-Ld-Xdx\"/>\n                            <constraint firstItem=\"T2A-GP-RAS\" firstAttribute=\"leading\" secondItem=\"Yww-b9-vE7\" secondAttribute=\"leading\" constant=\"19\" id=\"7JZ-0X-goA\"/>\n                            <constraint firstItem=\"xHE-gD-zSo\" firstAttribute=\"top\" secondItem=\"Ii6-1I-pb4\" secondAttribute=\"top\" constant=\"20\" symbolic=\"YES\" id=\"EEv-wf-TaC\"/>\n                            <constraint firstItem=\"Yww-b9-vE7\" firstAttribute=\"leading\" secondItem=\"xHE-gD-zSo\" secondAttribute=\"leading\" id=\"M1T-ng-xhj\"/>\n                            <constraint firstItem=\"k59-to-Z4j\" firstAttribute=\"trailing\" secondItem=\"xHE-gD-zSo\" secondAttribute=\"trailing\" id=\"N99-DU-Lrz\"/>\n                            <constraint firstItem=\"T2A-GP-RAS\" firstAttribute=\"trailing\" secondItem=\"Yww-b9-vE7\" secondAttribute=\"trailing\" id=\"VeS-ix-CF2\"/>\n                            <constraint firstItem=\"k59-to-Z4j\" firstAttribute=\"top\" secondItem=\"xHE-gD-zSo\" secondAttribute=\"bottom\" constant=\"10\" id=\"iBr-mq-zbi\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"T2A-GP-RAS\" secondAttribute=\"bottom\" constant=\"20\" symbolic=\"YES\" id=\"oMp-uu-4Di\"/>\n                            <constraint firstItem=\"xHE-gD-zSo\" firstAttribute=\"leading\" secondItem=\"Ii6-1I-pb4\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"qH5-So-jW9\"/>\n                            <constraint firstItem=\"T2A-GP-RAS\" firstAttribute=\"top\" secondItem=\"Yww-b9-vE7\" secondAttribute=\"bottom\" constant=\"5\" id=\"rcX-pt-2Pv\"/>\n                        </constraints>\n                    </view>\n                    <connections>\n                        <outlet property=\"horizontalSmoothCheckBox\" destination=\"k59-to-Z4j\" id=\"h4G-3M-qMA\"/>\n                        <outlet property=\"simulateTrackpadCheckBox\" destination=\"Yww-b9-vE7\" id=\"K2i-qm-Qml\"/>\n                        <outlet property=\"verticalSmoothCheckBox\" destination=\"xHE-gD-zSo\" id=\"kA0-Us-rIW\"/>\n                    </connections>\n                </viewController>\n                <customObject id=\"dcu-MQ-byg\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1310.5\" y=\"1924\"/>\n        </scene>\n        <!--Preferences Scrolling With Application View Controller-->\n        <scene sceneID=\"brY-DW-5LE\">\n            <objects>\n                <viewController storyboardIdentifier=\"scrollingWithApplication\" id=\"lS3-AT-V8l\" customClass=\"PreferencesScrollingWithApplicationViewController\" customModule=\"Mos\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <visualEffectView key=\"view\" blendingMode=\"behindWindow\" material=\"toolTip\" state=\"active\" id=\"Ta8-Xb-8AA\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"450\" height=\"450\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <subviews>\n                            <box borderType=\"line\" titlePosition=\"noTitle\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"w6P-sv-e44\">\n                                <rect key=\"frame\" x=\"20\" y=\"392\" width=\"410\" height=\"38\"/>\n                                <view key=\"contentView\" id=\"fSk-td-UEy\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"410\" height=\"38\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                    <subviews>\n                                        <imageView wantsLayer=\"YES\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"HdN-0Z-MoG\">\n                                            <rect key=\"frame\" x=\"10\" y=\"9\" width=\"20\" height=\"20\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"height\" constant=\"20\" id=\"NvE-vx-6w4\"/>\n                                                <constraint firstAttribute=\"width\" constant=\"20\" id=\"lXO-4W-5eR\"/>\n                                            </constraints>\n                                            <imageCell key=\"cell\" refusesFirstResponder=\"YES\" alignment=\"left\" imageScaling=\"proportionallyDown\" image=\"NSApplicationIcon\" id=\"lAK-rG-M61\"/>\n                                        </imageView>\n                                        <textField wantsLayer=\"YES\" focusRingType=\"none\" verticalHuggingPriority=\"750\" horizontalCompressionResistancePriority=\"250\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"XWB-6z-vOS\">\n                                            <rect key=\"frame\" x=\"34\" y=\"11\" width=\"208\" height=\"16\"/>\n                                            <textFieldCell key=\"cell\" lineBreakMode=\"truncatingTail\" selectable=\"YES\" editable=\"YES\" refusesFirstResponder=\"YES\" alignment=\"left\" title=\"Application Name\" usesSingleLineMode=\"YES\" id=\"a3I-0T-N5a\">\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                                <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                            <connections>\n                                                <action selector=\"currentTargetApplicationNameChange:\" target=\"lS3-AT-V8l\" id=\"DJL-iB-xZW\"/>\n                                            </connections>\n                                        </textField>\n                                        <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"mbk-Nr-nk4\">\n                                            <rect key=\"frame\" x=\"260\" y=\"12\" width=\"135\" height=\"14\"/>\n                                            <buttonCell key=\"cell\" type=\"check\" title=\"Inherit Global Settings\" bezelStyle=\"regularSquare\" imagePosition=\"right\" controlSize=\"small\" state=\"on\" inset=\"2\" id=\"Wls-5g-cNZ\">\n                                                <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                                                <font key=\"font\" metaFont=\"menu\" size=\"11\"/>\n                                            </buttonCell>\n                                            <connections>\n                                                <action selector=\"inheritGlobalSettingClick:\" target=\"lS3-AT-V8l\" id=\"2eW-6Q-MQI\"/>\n                                            </connections>\n                                        </button>\n                                    </subviews>\n                                    <constraints>\n                                        <constraint firstItem=\"mbk-Nr-nk4\" firstAttribute=\"leading\" secondItem=\"XWB-6z-vOS\" secondAttribute=\"trailing\" constant=\"20\" id=\"9Zn-HQ-w60\"/>\n                                        <constraint firstItem=\"HdN-0Z-MoG\" firstAttribute=\"centerY\" secondItem=\"fSk-td-UEy\" secondAttribute=\"centerY\" id=\"FsH-d1-Wgu\"/>\n                                        <constraint firstItem=\"HdN-0Z-MoG\" firstAttribute=\"leading\" secondItem=\"fSk-td-UEy\" secondAttribute=\"leading\" constant=\"10\" id=\"Mze-3I-nDK\"/>\n                                        <constraint firstAttribute=\"trailing\" secondItem=\"mbk-Nr-nk4\" secondAttribute=\"trailing\" constant=\"15\" id=\"Y4t-z6-erz\"/>\n                                        <constraint firstItem=\"XWB-6z-vOS\" firstAttribute=\"leading\" secondItem=\"HdN-0Z-MoG\" secondAttribute=\"trailing\" constant=\"6\" id=\"aMk-ql-3cY\"/>\n                                        <constraint firstItem=\"mbk-Nr-nk4\" firstAttribute=\"centerY\" secondItem=\"fSk-td-UEy\" secondAttribute=\"centerY\" id=\"kV7-ZK-Iqx\"/>\n                                        <constraint firstItem=\"XWB-6z-vOS\" firstAttribute=\"centerY\" secondItem=\"fSk-td-UEy\" secondAttribute=\"centerY\" id=\"vGk-zI-ifM\"/>\n                                    </constraints>\n                                </view>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"38\" id=\"Qq2-ir-g51\"/>\n                                </constraints>\n                            </box>\n                            <containerView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"lmW-eg-1ds\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"450\" height=\"392\"/>\n                                <connections>\n                                    <segue destination=\"iW5-CD-5OC\" kind=\"embed\" id=\"i8p-Ht-8EX\"/>\n                                </connections>\n                            </containerView>\n                        </subviews>\n                        <constraints>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"lmW-eg-1ds\" secondAttribute=\"trailing\" id=\"Zbi-DR-PP4\"/>\n                            <constraint firstItem=\"w6P-sv-e44\" firstAttribute=\"top\" secondItem=\"Ta8-Xb-8AA\" secondAttribute=\"top\" constant=\"20\" id=\"dFD-Mj-0Mb\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"lmW-eg-1ds\" secondAttribute=\"bottom\" id=\"hDv-23-d9i\"/>\n                            <constraint firstItem=\"w6P-sv-e44\" firstAttribute=\"leading\" secondItem=\"Ta8-Xb-8AA\" secondAttribute=\"leading\" constant=\"20\" id=\"m75-o6-Zms\"/>\n                            <constraint firstItem=\"lmW-eg-1ds\" firstAttribute=\"top\" secondItem=\"w6P-sv-e44\" secondAttribute=\"bottom\" id=\"nlk-PX-ibK\"/>\n                            <constraint firstItem=\"lmW-eg-1ds\" firstAttribute=\"leading\" secondItem=\"Ta8-Xb-8AA\" secondAttribute=\"leading\" id=\"x4L-SU-tFc\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"w6P-sv-e44\" secondAttribute=\"trailing\" constant=\"20\" id=\"ziK-wp-vv3\"/>\n                        </constraints>\n                    </visualEffectView>\n                    <connections>\n                        <outlet property=\"currentTargetApplicationIcon\" destination=\"HdN-0Z-MoG\" id=\"8fA-8B-uVM\"/>\n                        <outlet property=\"currentTargetApplicationName\" destination=\"XWB-6z-vOS\" id=\"lYq-g7-F0a\"/>\n                        <outlet property=\"inheritGlobalSettingCheckBox\" destination=\"mbk-Nr-nk4\" id=\"hwI-GE-Vw4\"/>\n                    </connections>\n                </viewController>\n                <customObject id=\"jKt-Ae-8x9\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1710\" y=\"2090\"/>\n        </scene>\n        <!--About-->\n        <scene sceneID=\"cHd-3e-zIv\">\n            <objects>\n                <viewController title=\"About\" storyboardIdentifier=\"about\" showSeguePresentationStyle=\"single\" id=\"RfV-Ow-3mF\" customClass=\"PreferencesAboutViewController\" customModule=\"Mos\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <visualEffectView key=\"view\" blendingMode=\"behindWindow\" material=\"toolTip\" state=\"followsWindowActiveState\" id=\"YL0-R0-moU\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"450\" height=\"156\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <subviews>\n                            <textField wantsLayer=\"YES\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"S8y-Am-MEW\">\n                                <rect key=\"frame\" x=\"18\" y=\"73\" width=\"124\" height=\"83\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"83\" id=\"3Ih-IA-IFu\"/>\n                                    <constraint firstAttribute=\"width\" relation=\"greaterThanOrEqual\" constant=\"120\" id=\"Yzz-YW-b1q\"/>\n                                </constraints>\n                                <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"left\" title=\"Mos\" id=\"2AK-Pu-mot\">\n                                    <font key=\"font\" metaFont=\"systemUltraLight\" size=\"70\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <textField wantsLayer=\"YES\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"uMH-2l-9yi\">\n                                <rect key=\"frame\" x=\"148\" y=\"84\" width=\"284\" height=\"14\"/>\n                                <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"left\" title=\"Just some little job for your mouse.\" id=\"5cx-xS-eRe\">\n                                    <font key=\"font\" metaFont=\"systemLight\" size=\"11\"/>\n                                    <color key=\"textColor\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <textField wantsLayer=\"YES\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Zyp-G9-CBv\">\n                                <rect key=\"frame\" x=\"148\" y=\"103\" width=\"284\" height=\"11\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" relation=\"greaterThanOrEqual\" constant=\"280\" id=\"PB6-M9-C9R\"/>\n                                </constraints>\n                                <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" title=\"© 2017-2026 Caldis. All rights reserved.\" id=\"MI6-Tq-Nev\">\n                                    <font key=\"font\" metaFont=\"label\" size=\"9\"/>\n                                    <color key=\"textColor\" name=\"disabledControlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <button wantsLayer=\"YES\" springLoaded=\"YES\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"QC7-yb-ZOk\">\n                                <rect key=\"frame\" x=\"20\" y=\"47\" width=\"120\" height=\"18\"/>\n                                <buttonCell key=\"cell\" type=\"roundRect\" title=\"Home Page\" bezelStyle=\"roundedRect\" alignment=\"center\" state=\"on\" borderStyle=\"border\" allowsMixedState=\"YES\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"yDf-dn-Mcz\">\n                                    <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"systemLight\" size=\"12\"/>\n                                </buttonCell>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" relation=\"greaterThanOrEqual\" constant=\"120\" id=\"72y-IV-trp\"/>\n                                    <constraint firstAttribute=\"height\" constant=\"18\" id=\"wim-td-EhK\"/>\n                                </constraints>\n                                <connections>\n                                    <action selector=\"homepageButtonClick:\" target=\"RfV-Ow-3mF\" id=\"wKC-Uo-lMi\"/>\n                                </connections>\n                            </button>\n                            <button wantsLayer=\"YES\" springLoaded=\"YES\" horizontalHuggingPriority=\"249\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"38d-cH-Mcc\">\n                                <rect key=\"frame\" x=\"168\" y=\"15\" width=\"262\" height=\"18\"/>\n                                <buttonCell key=\"cell\" type=\"roundRect\" title=\"Feed 🍥 a fet MEOW\" bezelStyle=\"roundedRect\" alignment=\"center\" state=\"on\" borderStyle=\"border\" allowsMixedState=\"YES\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"AM8-cj-DnH\">\n                                    <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"systemLight\" size=\"12\"/>\n                                </buttonCell>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" relation=\"greaterThanOrEqual\" id=\"DjX-Ce-f1D\"/>\n                                    <constraint firstAttribute=\"height\" constant=\"18\" id=\"GxZ-Ef-ny7\"/>\n                                </constraints>\n                                <connections>\n                                    <segue destination=\"HYX-CS-fYi\" kind=\"popover\" popoverAnchorView=\"38d-cH-Mcc\" popoverBehavior=\"t\" preferredEdge=\"maxX\" id=\"65s-Qo-69I\"/>\n                                </connections>\n                            </button>\n                            <button wantsLayer=\"YES\" springLoaded=\"YES\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"0Uz-Dg-331\">\n                                <rect key=\"frame\" x=\"20\" y=\"15\" width=\"140\" height=\"18\"/>\n                                <buttonCell key=\"cell\" type=\"roundRect\" title=\"Contributors\" bezelStyle=\"roundedRect\" alignment=\"center\" state=\"on\" borderStyle=\"border\" allowsMixedState=\"YES\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"265-WS-XEd\">\n                                    <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"systemLight\" size=\"12\"/>\n                                    <connections>\n                                        <action selector=\"contributorsListClick:\" target=\"RfV-Ow-3mF\" id=\"flh-r9-5Aq\"/>\n                                    </connections>\n                                </buttonCell>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" relation=\"greaterThanOrEqual\" constant=\"140\" id=\"En8-TA-RUc\"/>\n                                    <constraint firstAttribute=\"height\" constant=\"18\" id=\"ZPu-Cw-1AX\"/>\n                                </constraints>\n                            </button>\n                            <button wantsLayer=\"YES\" springLoaded=\"YES\" horizontalHuggingPriority=\"249\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"uow-FV-SZv\">\n                                <rect key=\"frame\" x=\"236\" y=\"47\" width=\"166\" height=\"18\"/>\n                                <buttonCell key=\"cell\" type=\"roundRect\" title=\"Welcome Window\" bezelStyle=\"roundedRect\" alignment=\"center\" state=\"on\" borderStyle=\"border\" allowsMixedState=\"YES\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"FIh-fA-18k\">\n                                    <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"systemLight\" size=\"12\"/>\n                                </buttonCell>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"18\" id=\"P7Q-Ib-WUH\"/>\n                                    <constraint firstAttribute=\"width\" relation=\"greaterThanOrEqual\" id=\"tpe-mw-EFR\"/>\n                                </constraints>\n                                <connections>\n                                    <action selector=\"welcomeWindowButtonClick:\" target=\"RfV-Ow-3mF\" id=\"SFh-jZ-N01\"/>\n                                </connections>\n                            </button>\n                            <button horizontalHuggingPriority=\"750\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Heq-gZ-eDZ\">\n                                <rect key=\"frame\" x=\"410\" y=\"47\" width=\"20\" height=\"18\"/>\n                                <buttonCell key=\"cell\" type=\"help\" bezelStyle=\"helpButton\" alignment=\"center\" controlSize=\"small\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"Jr3-Kp-i0B\">\n                                    <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"message\" size=\"11\"/>\n                                </buttonCell>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" relation=\"greaterThanOrEqual\" constant=\"18\" id=\"gNA-x0-CHU\"/>\n                                    <constraint firstAttribute=\"height\" constant=\"18\" id=\"sfd-bs-bc0\"/>\n                                </constraints>\n                                <connections>\n                                    <action selector=\"helpButtonClick:\" target=\"RfV-Ow-3mF\" id=\"qja-Nd-dvU\"/>\n                                </connections>\n                            </button>\n                            <button wantsLayer=\"YES\" springLoaded=\"YES\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"d3t-VS-dLU\">\n                                <rect key=\"frame\" x=\"148\" y=\"47\" width=\"80\" height=\"18\"/>\n                                <buttonCell key=\"cell\" type=\"roundRect\" title=\"GitHub\" bezelStyle=\"roundedRect\" alignment=\"center\" state=\"on\" borderStyle=\"border\" allowsMixedState=\"YES\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"99M-8D-HLN\">\n                                    <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"systemLight\" size=\"12\"/>\n                                </buttonCell>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"18\" id=\"gnv-sE-2i6\"/>\n                                    <constraint firstAttribute=\"width\" relation=\"greaterThanOrEqual\" constant=\"80\" id=\"v75-PM-ssi\"/>\n                                </constraints>\n                                <connections>\n                                    <action selector=\"githubButtonClick:\" target=\"RfV-Ow-3mF\" id=\"v5O-Wm-odK\"/>\n                                </connections>\n                            </button>\n                            <box hidden=\"YES\" verticalHuggingPriority=\"750\" boxType=\"separator\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"30e-M9-h0A\" userLabel=\"WidthHolder\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"-2\" width=\"450\" height=\"5\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" constant=\"450\" id=\"tBD-GV-RwM\"/>\n                                </constraints>\n                            </box>\n                        </subviews>\n                        <constraints>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"Heq-gZ-eDZ\" secondAttribute=\"trailing\" constant=\"20\" id=\"1Ex-yc-p6b\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"30e-M9-h0A\" secondAttribute=\"trailing\" id=\"3wM-xz-OXC\"/>\n                            <constraint firstItem=\"Heq-gZ-eDZ\" firstAttribute=\"leading\" secondItem=\"uow-FV-SZv\" secondAttribute=\"trailing\" constant=\"8\" id=\"9JI-Ru-gfM\"/>\n                            <constraint firstItem=\"d3t-VS-dLU\" firstAttribute=\"leading\" secondItem=\"QC7-yb-ZOk\" secondAttribute=\"trailing\" constant=\"8\" id=\"B8m-9L-5kP\"/>\n                            <constraint firstItem=\"38d-cH-Mcc\" firstAttribute=\"centerY\" secondItem=\"0Uz-Dg-331\" secondAttribute=\"centerY\" id=\"Dcp-fu-Yza\"/>\n                            <constraint firstItem=\"38d-cH-Mcc\" firstAttribute=\"top\" secondItem=\"uow-FV-SZv\" secondAttribute=\"bottom\" constant=\"14\" id=\"Hpy-G1-sPb\"/>\n                            <constraint firstItem=\"QC7-yb-ZOk\" firstAttribute=\"top\" secondItem=\"S8y-Am-MEW\" secondAttribute=\"bottom\" constant=\"8\" id=\"Lns-og-cu8\"/>\n                            <constraint firstItem=\"QC7-yb-ZOk\" firstAttribute=\"leading\" secondItem=\"YL0-R0-moU\" secondAttribute=\"leading\" constant=\"20\" id=\"OZq-0i-23N\"/>\n                            <constraint firstItem=\"d3t-VS-dLU\" firstAttribute=\"centerY\" secondItem=\"QC7-yb-ZOk\" secondAttribute=\"centerY\" id=\"Q4c-bv-VTQ\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"38d-cH-Mcc\" secondAttribute=\"bottom\" constant=\"15\" id=\"QVn-fU-A96\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"38d-cH-Mcc\" secondAttribute=\"trailing\" constant=\"20\" id=\"UeB-Az-6Rb\"/>\n                            <constraint firstItem=\"uow-FV-SZv\" firstAttribute=\"leading\" secondItem=\"d3t-VS-dLU\" secondAttribute=\"trailing\" constant=\"8\" id=\"XK9-PH-DUr\"/>\n                            <constraint firstItem=\"Heq-gZ-eDZ\" firstAttribute=\"centerY\" secondItem=\"QC7-yb-ZOk\" secondAttribute=\"centerY\" id=\"XXw-Jr-k3C\"/>\n                            <constraint firstItem=\"uMH-2l-9yi\" firstAttribute=\"top\" secondItem=\"Zyp-G9-CBv\" secondAttribute=\"bottom\" constant=\"5\" id=\"ZE7-Ws-jqj\"/>\n                            <constraint firstItem=\"S8y-Am-MEW\" firstAttribute=\"top\" secondItem=\"YL0-R0-moU\" secondAttribute=\"top\" id=\"eHj-pY-CcD\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"uMH-2l-9yi\" secondAttribute=\"trailing\" constant=\"20\" id=\"iTA-aE-og9\"/>\n                            <constraint firstItem=\"Zyp-G9-CBv\" firstAttribute=\"leading\" secondItem=\"S8y-Am-MEW\" secondAttribute=\"trailing\" constant=\"10\" id=\"jlt-Hh-2YK\"/>\n                            <constraint firstItem=\"30e-M9-h0A\" firstAttribute=\"leading\" secondItem=\"YL0-R0-moU\" secondAttribute=\"leading\" id=\"kSD-CS-OGY\"/>\n                            <constraint firstItem=\"uow-FV-SZv\" firstAttribute=\"centerY\" secondItem=\"QC7-yb-ZOk\" secondAttribute=\"centerY\" id=\"knr-WF-15p\"/>\n                            <constraint firstItem=\"Zyp-G9-CBv\" firstAttribute=\"top\" secondItem=\"YL0-R0-moU\" secondAttribute=\"top\" constant=\"42\" id=\"lVY-hk-B3m\"/>\n                            <constraint firstItem=\"uMH-2l-9yi\" firstAttribute=\"leading\" secondItem=\"S8y-Am-MEW\" secondAttribute=\"trailing\" constant=\"10\" id=\"m7O-Vz-xYJ\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"30e-M9-h0A\" secondAttribute=\"bottom\" id=\"n0J-wH-v3V\"/>\n                            <constraint firstItem=\"S8y-Am-MEW\" firstAttribute=\"leading\" secondItem=\"YL0-R0-moU\" secondAttribute=\"leading\" constant=\"20\" id=\"ont-k8-JHD\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"Zyp-G9-CBv\" secondAttribute=\"trailing\" constant=\"20\" id=\"pLl-10-hpw\"/>\n                            <constraint firstItem=\"0Uz-Dg-331\" firstAttribute=\"leading\" secondItem=\"YL0-R0-moU\" secondAttribute=\"leading\" constant=\"20\" id=\"rUd-fb-bPu\"/>\n                            <constraint firstItem=\"38d-cH-Mcc\" firstAttribute=\"leading\" secondItem=\"0Uz-Dg-331\" secondAttribute=\"trailing\" constant=\"8\" id=\"vF6-L7-NRr\"/>\n                        </constraints>\n                    </visualEffectView>\n                    <connections>\n                        <outlet property=\"donateButton\" destination=\"38d-cH-Mcc\" id=\"wXa-Sg-yMR\"/>\n                        <outlet property=\"githubButton\" destination=\"d3t-VS-dLU\" id=\"U9W-8Q-MbS\"/>\n                        <outlet property=\"homePageButton\" destination=\"yDf-dn-Mcz\" id=\"sUw-3W-edB\"/>\n                    </connections>\n                </viewController>\n                <customObject id=\"r6n-Nn-xNW\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"2931\" y=\"1193\"/>\n        </scene>\n        <!--Preferences Contributors View Controller-->\n        <scene sceneID=\"eHC-0y-R7N\">\n            <objects>\n                <viewController id=\"zex-mK-IcT\" customClass=\"PreferencesContributorsViewController\" customModule=\"Mos\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" id=\"NbZ-BN-bEt\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"470\" height=\"331\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <subviews>\n                            <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"CL7-Pu-ouN\">\n                                <rect key=\"frame\" x=\"18\" y=\"276\" width=\"434\" height=\"35\"/>\n                                <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"center\" title=\"Contributors\" id=\"ZJY-Yg-Qev\">\n                                    <font key=\"font\" metaFont=\"systemUltraLight\" size=\"30\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"wbo-Wg-RyO\">\n                                <rect key=\"frame\" x=\"18\" y=\"237\" width=\"434\" height=\"19\"/>\n                                <textFieldCell key=\"cell\" sendsActionOnEndEditing=\"YES\" alignment=\"center\" title=\"Translation\" id=\"Lhz-x5-X0I\">\n                                    <font key=\"font\" metaFont=\"systemUltraLight\" size=\"16\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"8ZB-BU-sKn\">\n                                <rect key=\"frame\" x=\"18\" y=\"211\" width=\"95\" height=\"11\"/>\n                                <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" alignment=\"right\" title=\"English\" id=\"wrT-sk-Qjf\">\n                                    <font key=\"font\" metaFont=\"miniSystemBold\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"K8n-u9-1XP\">\n                                <rect key=\"frame\" x=\"119\" y=\"209\" width=\"333\" height=\"13\"/>\n                                <textFieldCell key=\"cell\" selectable=\"YES\" sendsActionOnEndEditing=\"YES\" title=\"Joshua Park(@godly-devotion), OrcaXS(@OrcaXS) ...\" id=\"SuH-MV-uUc\">\n                                    <font key=\"font\" metaFont=\"systemUltraLight\" size=\"10\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"nmu-9V-mMs\">\n                                <rect key=\"frame\" x=\"18\" y=\"190\" width=\"95\" height=\"11\"/>\n                                <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" alignment=\"right\" title=\"Simplified Chinese\" id=\"ZMc-lN-S4q\">\n                                    <font key=\"font\" metaFont=\"miniSystemBold\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"e40-ep-Ivj\">\n                                <rect key=\"frame\" x=\"119\" y=\"188\" width=\"333\" height=\"13\"/>\n                                <textFieldCell key=\"cell\" selectable=\"YES\" sendsActionOnEndEditing=\"YES\" title=\"Wang Yudong(@wyudong)\" id=\"I6G-zh-cEt\">\n                                    <font key=\"font\" metaFont=\"systemUltraLight\" size=\"10\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"rXK-39-g8g\">\n                                <rect key=\"frame\" x=\"18\" y=\"169\" width=\"95\" height=\"11\"/>\n                                <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" alignment=\"right\" title=\"Traditional Chinese\" id=\"jzQ-oc-Ugr\">\n                                    <font key=\"font\" metaFont=\"miniSystemBold\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"OhB-iv-ZYO\">\n                                <rect key=\"frame\" x=\"18\" y=\"148\" width=\"95\" height=\"11\"/>\n                                <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" alignment=\"right\" title=\"Russian\" id=\"Gct-aO-hq1\">\n                                    <font key=\"font\" metaFont=\"miniSystemBold\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"dKF-OI-Qn5\">\n                                <rect key=\"frame\" x=\"119\" y=\"167\" width=\"333\" height=\"13\"/>\n                                <textFieldCell key=\"cell\" selectable=\"YES\" sendsActionOnEndEditing=\"YES\" title=\" jrthsr700tmax(@jrthsr700tmax), Crizant(@crizant)\" id=\"Imc-rJ-YnM\">\n                                    <font key=\"font\" metaFont=\"systemUltraLight\" size=\"10\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <textField focusRingType=\"none\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"2Oa-q8-f7F\">\n                                <rect key=\"frame\" x=\"119\" y=\"146\" width=\"333\" height=\"13\"/>\n                                <textFieldCell key=\"cell\" selectable=\"YES\" sendsActionOnEndEditing=\"YES\" title=\"Andrew Mclaren(@mclvren)\" id=\"2v8-3K-NkQ\">\n                                    <font key=\"font\" metaFont=\"systemUltraLight\" size=\"10\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"NBx-14-PHq\">\n                                <rect key=\"frame\" x=\"18\" y=\"127\" width=\"95\" height=\"11\"/>\n                                <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" alignment=\"right\" title=\"Korean\" id=\"5Yv-xg-jrn\">\n                                    <font key=\"font\" metaFont=\"miniSystemBold\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"OYG-R5-ewd\">\n                                <rect key=\"frame\" x=\"119\" y=\"125\" width=\"333\" height=\"13\"/>\n                                <textFieldCell key=\"cell\" selectable=\"YES\" sendsActionOnEndEditing=\"YES\" title=\"Woosuk Park(@readingsnail)\" id=\"Tje-UR-0oP\">\n                                    <font key=\"font\" metaFont=\"systemUltraLight\" size=\"10\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"YRG-Je-euE\">\n                                <rect key=\"frame\" x=\"18\" y=\"106\" width=\"95\" height=\"11\"/>\n                                <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" alignment=\"right\" title=\"Turkish\" id=\"Car-A5-sHp\">\n                                    <font key=\"font\" metaFont=\"miniSystemBold\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"EON-hr-qD7\">\n                                <rect key=\"frame\" x=\"119\" y=\"104\" width=\"333\" height=\"13\"/>\n                                <textFieldCell key=\"cell\" selectable=\"YES\" sendsActionOnEndEditing=\"YES\" title=\"Seçkin Kükrer(@LeaveNhA)\" id=\"n8O-2V-Zob\">\n                                    <font key=\"font\" metaFont=\"systemUltraLight\" size=\"10\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"mGO-En-tOR\">\n                                <rect key=\"frame\" x=\"18\" y=\"85\" width=\"95\" height=\"11\"/>\n                                <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" alignment=\"right\" title=\"German\" id=\"gz6-ih-1iJ\">\n                                    <font key=\"font\" metaFont=\"miniSystemBold\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"6Hw-4g-qhX\">\n                                <rect key=\"frame\" x=\"119\" y=\"83\" width=\"333\" height=\"13\"/>\n                                <textFieldCell key=\"cell\" selectable=\"YES\" sendsActionOnEndEditing=\"YES\" title=\"Selim(@lima0)\" id=\"NGY-5D-ZYm\">\n                                    <font key=\"font\" metaFont=\"systemUltraLight\" size=\"10\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"FB0-Zk-k1Y\">\n                                <rect key=\"frame\" x=\"18\" y=\"64\" width=\"95\" height=\"11\"/>\n                                <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" alignment=\"right\" title=\"Other\" id=\"SUM-eh-Lms\">\n                                    <font key=\"font\" metaFont=\"miniSystemBold\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"uh2-b5-ZUZ\">\n                                <rect key=\"frame\" x=\"119\" y=\"62\" width=\"333\" height=\"13\"/>\n                                <textFieldCell key=\"cell\" selectable=\"YES\" sendsActionOnEndEditing=\"YES\" title=\"Waiting for you\" id=\"xnQ-YR-qNR\">\n                                    <font key=\"font\" metaFont=\"systemUltraLight\" size=\"10\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <button springLoaded=\"YES\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"RuK-DK-wea\">\n                                <rect key=\"frame\" x=\"135\" y=\"20\" width=\"200\" height=\"22\"/>\n                                <buttonCell key=\"cell\" type=\"bevel\" title=\"Contributors List\" bezelStyle=\"regularSquare\" alignment=\"center\" state=\"on\" borderStyle=\"border\" allowsMixedState=\"YES\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"GWm-aK-UoV\">\n                                    <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"message\" size=\"11\"/>\n                                    <connections>\n                                        <action selector=\"contributorsListClick:\" target=\"zex-mK-IcT\" id=\"eFv-eb-mbW\"/>\n                                    </connections>\n                                </buttonCell>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" relation=\"greaterThanOrEqual\" constant=\"200\" id=\"9xz-Yt-Nvx\"/>\n                                </constraints>\n                            </button>\n                        </subviews>\n                        <constraints>\n                            <constraint firstItem=\"mGO-En-tOR\" firstAttribute=\"leading\" secondItem=\"NbZ-BN-bEt\" secondAttribute=\"leading\" constant=\"20\" id=\"1ZG-Z0-TmV\"/>\n                            <constraint firstItem=\"RuK-DK-wea\" firstAttribute=\"top\" secondItem=\"uh2-b5-ZUZ\" secondAttribute=\"bottom\" constant=\"20\" id=\"2uq-e4-13b\"/>\n                            <constraint firstItem=\"OYG-R5-ewd\" firstAttribute=\"leading\" secondItem=\"K8n-u9-1XP\" secondAttribute=\"leading\" id=\"303-uC-hsV\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"CL7-Pu-ouN\" secondAttribute=\"trailing\" constant=\"20\" id=\"3DD-pp-eho\"/>\n                            <constraint firstItem=\"uh2-b5-ZUZ\" firstAttribute=\"top\" secondItem=\"6Hw-4g-qhX\" secondAttribute=\"bottom\" constant=\"8\" id=\"3Z7-dj-Yp4\"/>\n                            <constraint firstItem=\"2Oa-q8-f7F\" firstAttribute=\"top\" secondItem=\"OhB-iv-ZYO\" secondAttribute=\"top\" id=\"3d9-Il-I08\"/>\n                            <constraint firstItem=\"e40-ep-Ivj\" firstAttribute=\"top\" secondItem=\"nmu-9V-mMs\" secondAttribute=\"top\" id=\"3dl-oD-OYS\"/>\n                            <constraint firstItem=\"mGO-En-tOR\" firstAttribute=\"trailing\" secondItem=\"8ZB-BU-sKn\" secondAttribute=\"trailing\" id=\"3sY-YH-4ch\"/>\n                            <constraint firstItem=\"CL7-Pu-ouN\" firstAttribute=\"leading\" secondItem=\"NbZ-BN-bEt\" secondAttribute=\"leading\" constant=\"20\" id=\"4Sh-ZA-Otj\"/>\n                            <constraint firstItem=\"NBx-14-PHq\" firstAttribute=\"trailing\" secondItem=\"8ZB-BU-sKn\" secondAttribute=\"trailing\" id=\"7WO-89-Png\"/>\n                            <constraint firstItem=\"6Hw-4g-qhX\" firstAttribute=\"top\" secondItem=\"mGO-En-tOR\" secondAttribute=\"top\" id=\"7kc-LC-0r2\"/>\n                            <constraint firstItem=\"uh2-b5-ZUZ\" firstAttribute=\"leading\" secondItem=\"K8n-u9-1XP\" secondAttribute=\"leading\" id=\"8Jf-Gp-rcX\"/>\n                            <constraint firstItem=\"FB0-Zk-k1Y\" firstAttribute=\"trailing\" secondItem=\"8ZB-BU-sKn\" secondAttribute=\"trailing\" id=\"Bpa-2m-HOt\"/>\n                            <constraint firstItem=\"e40-ep-Ivj\" firstAttribute=\"top\" secondItem=\"K8n-u9-1XP\" secondAttribute=\"bottom\" constant=\"8\" id=\"ByZ-YE-L1Y\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"2Oa-q8-f7F\" secondAttribute=\"trailing\" constant=\"20\" id=\"Bz2-rI-221\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"K8n-u9-1XP\" secondAttribute=\"trailing\" constant=\"20\" id=\"DOm-I3-670\"/>\n                            <constraint firstItem=\"OhB-iv-ZYO\" firstAttribute=\"trailing\" secondItem=\"8ZB-BU-sKn\" secondAttribute=\"trailing\" id=\"E2h-Vp-VAf\"/>\n                            <constraint firstItem=\"NBx-14-PHq\" firstAttribute=\"leading\" secondItem=\"NbZ-BN-bEt\" secondAttribute=\"leading\" constant=\"20\" id=\"EPq-mr-ego\"/>\n                            <constraint firstItem=\"e40-ep-Ivj\" firstAttribute=\"leading\" secondItem=\"K8n-u9-1XP\" secondAttribute=\"leading\" id=\"Esw-mw-Eii\"/>\n                            <constraint firstItem=\"nmu-9V-mMs\" firstAttribute=\"trailing\" secondItem=\"8ZB-BU-sKn\" secondAttribute=\"trailing\" id=\"Fb6-6l-b9z\"/>\n                            <constraint firstItem=\"6Hw-4g-qhX\" firstAttribute=\"top\" secondItem=\"EON-hr-qD7\" secondAttribute=\"bottom\" constant=\"8\" id=\"HJi-ts-Sjh\"/>\n                            <constraint firstItem=\"RuK-DK-wea\" firstAttribute=\"centerX\" secondItem=\"NbZ-BN-bEt\" secondAttribute=\"centerX\" id=\"Hit-G8-aCe\"/>\n                            <constraint firstItem=\"rXK-39-g8g\" firstAttribute=\"trailing\" secondItem=\"8ZB-BU-sKn\" secondAttribute=\"trailing\" id=\"Hmj-4q-POY\"/>\n                            <constraint firstItem=\"K8n-u9-1XP\" firstAttribute=\"top\" secondItem=\"8ZB-BU-sKn\" secondAttribute=\"top\" id=\"Hy9-ik-Hd0\"/>\n                            <constraint firstItem=\"dKF-OI-Qn5\" firstAttribute=\"top\" secondItem=\"e40-ep-Ivj\" secondAttribute=\"bottom\" constant=\"8\" id=\"J7R-GS-nHj\"/>\n                            <constraint firstItem=\"wbo-Wg-RyO\" firstAttribute=\"top\" secondItem=\"CL7-Pu-ouN\" secondAttribute=\"bottom\" constant=\"20\" id=\"JtI-OO-dbO\"/>\n                            <constraint firstItem=\"YRG-Je-euE\" firstAttribute=\"trailing\" secondItem=\"8ZB-BU-sKn\" secondAttribute=\"trailing\" id=\"KzA-zH-A0g\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"dKF-OI-Qn5\" secondAttribute=\"trailing\" constant=\"20\" id=\"LVL-S2-h8c\"/>\n                            <constraint firstItem=\"wbo-Wg-RyO\" firstAttribute=\"leading\" secondItem=\"8ZB-BU-sKn\" secondAttribute=\"leading\" id=\"N3f-Hg-bYz\"/>\n                            <constraint firstItem=\"OYG-R5-ewd\" firstAttribute=\"top\" secondItem=\"NBx-14-PHq\" secondAttribute=\"top\" id=\"OV5-SH-GFw\"/>\n                            <constraint firstItem=\"2Oa-q8-f7F\" firstAttribute=\"leading\" secondItem=\"K8n-u9-1XP\" secondAttribute=\"leading\" id=\"Odk-HS-lnY\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"e40-ep-Ivj\" secondAttribute=\"trailing\" constant=\"20\" id=\"Sgb-Sa-kK0\"/>\n                            <constraint firstItem=\"EON-hr-qD7\" firstAttribute=\"top\" secondItem=\"OYG-R5-ewd\" secondAttribute=\"bottom\" constant=\"8\" id=\"U8t-Vj-IjY\"/>\n                            <constraint firstItem=\"nmu-9V-mMs\" firstAttribute=\"leading\" secondItem=\"NbZ-BN-bEt\" secondAttribute=\"leading\" constant=\"20\" id=\"UY5-wR-925\"/>\n                            <constraint firstItem=\"K8n-u9-1XP\" firstAttribute=\"leading\" secondItem=\"8ZB-BU-sKn\" secondAttribute=\"trailing\" constant=\"10\" id=\"VgB-1Z-4UO\"/>\n                            <constraint firstItem=\"2Oa-q8-f7F\" firstAttribute=\"top\" secondItem=\"dKF-OI-Qn5\" secondAttribute=\"bottom\" constant=\"8\" id=\"WL4-Sr-FXu\"/>\n                            <constraint firstItem=\"wbo-Wg-RyO\" firstAttribute=\"leading\" secondItem=\"NbZ-BN-bEt\" secondAttribute=\"leading\" constant=\"20\" id=\"Y53-0L-aH3\"/>\n                            <constraint firstItem=\"OYG-R5-ewd\" firstAttribute=\"top\" secondItem=\"2Oa-q8-f7F\" secondAttribute=\"bottom\" constant=\"8\" id=\"dDR-JK-Gzc\"/>\n                            <constraint firstItem=\"CL7-Pu-ouN\" firstAttribute=\"top\" secondItem=\"NbZ-BN-bEt\" secondAttribute=\"top\" constant=\"20\" id=\"e7z-KW-XIe\"/>\n                            <constraint firstItem=\"rXK-39-g8g\" firstAttribute=\"leading\" secondItem=\"NbZ-BN-bEt\" secondAttribute=\"leading\" constant=\"20\" id=\"fs7-yg-ZPe\"/>\n                            <constraint firstItem=\"FB0-Zk-k1Y\" firstAttribute=\"leading\" secondItem=\"NbZ-BN-bEt\" secondAttribute=\"leading\" constant=\"20\" id=\"gn4-B4-t1s\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"OYG-R5-ewd\" secondAttribute=\"trailing\" constant=\"20\" id=\"gul-d5-bpY\"/>\n                            <constraint firstItem=\"uh2-b5-ZUZ\" firstAttribute=\"top\" secondItem=\"FB0-Zk-k1Y\" secondAttribute=\"top\" id=\"h64-pg-RmZ\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"RuK-DK-wea\" secondAttribute=\"bottom\" constant=\"20\" id=\"iJs-JT-Osq\"/>\n                            <constraint firstItem=\"EON-hr-qD7\" firstAttribute=\"leading\" secondItem=\"K8n-u9-1XP\" secondAttribute=\"leading\" id=\"kek-AV-PAc\"/>\n                            <constraint firstItem=\"dKF-OI-Qn5\" firstAttribute=\"top\" secondItem=\"rXK-39-g8g\" secondAttribute=\"top\" id=\"lR6-dW-q8u\"/>\n                            <constraint firstItem=\"K8n-u9-1XP\" firstAttribute=\"top\" secondItem=\"wbo-Wg-RyO\" secondAttribute=\"bottom\" constant=\"15\" id=\"lf8-gE-7yw\"/>\n                            <constraint firstItem=\"dKF-OI-Qn5\" firstAttribute=\"leading\" secondItem=\"K8n-u9-1XP\" secondAttribute=\"leading\" id=\"mYA-AL-WA5\"/>\n                            <constraint firstItem=\"OhB-iv-ZYO\" firstAttribute=\"leading\" secondItem=\"NbZ-BN-bEt\" secondAttribute=\"leading\" constant=\"20\" id=\"ms8-Du-sc5\"/>\n                            <constraint firstItem=\"YRG-Je-euE\" firstAttribute=\"leading\" secondItem=\"NbZ-BN-bEt\" secondAttribute=\"leading\" constant=\"20\" id=\"nbZ-ya-gY2\"/>\n                            <constraint firstItem=\"EON-hr-qD7\" firstAttribute=\"top\" secondItem=\"YRG-Je-euE\" secondAttribute=\"top\" id=\"oBP-PB-Pfa\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"wbo-Wg-RyO\" secondAttribute=\"trailing\" constant=\"20\" id=\"pdR-Ch-Ls8\"/>\n                            <constraint firstItem=\"6Hw-4g-qhX\" firstAttribute=\"leading\" secondItem=\"K8n-u9-1XP\" secondAttribute=\"leading\" id=\"tq7-Dq-SoF\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"6Hw-4g-qhX\" secondAttribute=\"trailing\" constant=\"20\" id=\"uQv-1M-7kh\"/>\n                            <constraint firstItem=\"8ZB-BU-sKn\" firstAttribute=\"leading\" secondItem=\"NbZ-BN-bEt\" secondAttribute=\"leading\" constant=\"20\" id=\"x4Y-fn-YeZ\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"EON-hr-qD7\" secondAttribute=\"trailing\" constant=\"20\" id=\"xGN-Me-hda\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"uh2-b5-ZUZ\" secondAttribute=\"trailing\" constant=\"20\" id=\"yCh-XW-jmt\"/>\n                        </constraints>\n                    </view>\n                </viewController>\n                <customObject id=\"xas-PE-1Rw\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"2688\" y=\"1627\"/>\n        </scene>\n        <!--Preferences Donate View Controller-->\n        <scene sceneID=\"YcU-UJ-LwR\">\n            <objects>\n                <viewController storyboardIdentifier=\"donate\" id=\"HYX-CS-fYi\" customClass=\"PreferencesDonateViewController\" customModule=\"Mos\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" misplaced=\"YES\" id=\"NWm-eD-Q0k\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"701\" height=\"691\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <subviews>\n                            <box horizontalHuggingPriority=\"750\" boxType=\"separator\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Xfu-49-XDZ\">\n                                <rect key=\"frame\" x=\"238\" y=\"0.0\" width=\"5\" height=\"618\"/>\n                            </box>\n                            <box verticalHuggingPriority=\"750\" boxType=\"separator\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"qDd-Su-rN7\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"616\" width=\"705\" height=\"5\"/>\n                            </box>\n                            <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Ky1-pk-TF3\">\n                                <rect key=\"frame\" x=\"24\" y=\"639\" width=\"657\" height=\"32\"/>\n                                <buttonCell key=\"cell\" type=\"bevel\" title=\"How fat is the cat ?\" bezelStyle=\"regularSquare\" alignment=\"center\" lineBreakMode=\"truncatingTail\" state=\"on\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"D0v-Oj-ekP\">\n                                    <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                </buttonCell>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"32\" id=\"WOc-ub-6eO\"/>\n                                </constraints>\n                                <connections>\n                                    <action selector=\"fatCatClick:\" target=\"HYX-CS-fYi\" id=\"vjg-hl-hxf\"/>\n                                </connections>\n                            </button>\n                            <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"QwK-sY-64R\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"240\" height=\"618\"/>\n                                <subviews>\n                                    <imageView horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"tVv-UV-KC0\">\n                                        <rect key=\"frame\" x=\"70\" y=\"555\" width=\"100\" height=\"33\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"width\" constant=\"100\" id=\"Dok-25-nvd\"/>\n                                            <constraint firstAttribute=\"height\" constant=\"33\" id=\"lgC-Xf-35h\"/>\n                                        </constraints>\n                                        <imageCell key=\"cell\" refusesFirstResponder=\"YES\" alignment=\"left\" imageScaling=\"proportionallyDown\" image=\"WechatpayLogo\" id=\"KxG-B6-8jE\"/>\n                                    </imageView>\n                                    <imageView horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" alphaValue=\"0.80000000000000004\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"3Gz-X2-Fwd\">\n                                        <rect key=\"frame\" x=\"45\" y=\"435\" width=\"150\" height=\"110\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"height\" constant=\"110\" id=\"4Hf-VY-Z17\"/>\n                                            <constraint firstAttribute=\"width\" constant=\"150\" id=\"XL4-NG-bpE\"/>\n                                        </constraints>\n                                        <imageCell key=\"cell\" refusesFirstResponder=\"YES\" alignment=\"left\" imageScaling=\"proportionallyDown\" image=\"WechatpayQR\" id=\"jdG-KX-g7K\"/>\n                                    </imageView>\n                                    <imageView horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"cTQ-RR-Izk\">\n                                        <rect key=\"frame\" x=\"70\" y=\"370\" width=\"100\" height=\"35\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"width\" constant=\"100\" id=\"N9C-zu-YJ4\"/>\n                                            <constraint firstAttribute=\"height\" constant=\"35\" id=\"rel-Mp-8km\"/>\n                                        </constraints>\n                                        <imageCell key=\"cell\" refusesFirstResponder=\"YES\" alignment=\"left\" imageScaling=\"proportionallyDown\" image=\"AlipayLogo\" id=\"dw7-en-g43\"/>\n                                    </imageView>\n                                    <imageView horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" alphaValue=\"0.80000000000000004\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"PxZ-JL-fgP\">\n                                        <rect key=\"frame\" x=\"45\" y=\"250\" width=\"150\" height=\"110\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"height\" constant=\"110\" id=\"Gfq-bZ-TdP\"/>\n                                            <constraint firstAttribute=\"width\" constant=\"150\" id=\"n89-cy-bbf\"/>\n                                        </constraints>\n                                        <imageCell key=\"cell\" refusesFirstResponder=\"YES\" alignment=\"left\" imageScaling=\"proportionallyDown\" image=\"AlipayQR\" id=\"86z-w2-DQf\"/>\n                                    </imageView>\n                                    <imageView horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"WhP-jP-gB6\">\n                                        <rect key=\"frame\" x=\"70\" y=\"180\" width=\"100\" height=\"40\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"width\" constant=\"100\" id=\"DXX-C2-lHC\"/>\n                                            <constraint firstAttribute=\"height\" constant=\"40\" id=\"lU8-H6-EfY\"/>\n                                        </constraints>\n                                        <imageCell key=\"cell\" refusesFirstResponder=\"YES\" alignment=\"left\" imageScaling=\"proportionallyDown\" image=\"PaypalLogo\" id=\"Ho9-ZJ-OXg\"/>\n                                    </imageView>\n                                    <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"EWm-8G-1in\">\n                                        <rect key=\"frame\" x=\"54\" y=\"143\" width=\"132\" height=\"24\"/>\n                                        <buttonCell key=\"cell\" type=\"push\" title=\"Donate via PayPal\" bezelStyle=\"rounded\" alignment=\"center\" state=\"on\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"aPi-cE-maK\">\n                                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                            <font key=\"font\" metaFont=\"system\"/>\n                                            <connections>\n                                                <action selector=\"donateByPaypalClick:\" target=\"HYX-CS-fYi\" id=\"hx5-ed-EI7\"/>\n                                            </connections>\n                                        </buttonCell>\n                                    </button>\n                                    <imageView horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Mhg-yQ-c8y\">\n                                        <rect key=\"frame\" x=\"50\" y=\"73\" width=\"140\" height=\"40\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"width\" constant=\"140\" id=\"j8T-vL-CpA\"/>\n                                            <constraint firstAttribute=\"height\" constant=\"40\" id=\"qkm-pT-zjz\"/>\n                                        </constraints>\n                                        <imageCell key=\"cell\" refusesFirstResponder=\"YES\" alignment=\"left\" animates=\"YES\" imageScaling=\"proportionallyDown\" image=\"BuyMeACoffee\" id=\"NJs-VC-Wfv\"/>\n                                    </imageView>\n                                    <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"YT3-5c-vQO\">\n                                        <rect key=\"frame\" x=\"59\" y=\"36\" width=\"122\" height=\"24\"/>\n                                        <buttonCell key=\"cell\" type=\"push\" title=\"Buy me a coffee\" bezelStyle=\"rounded\" alignment=\"center\" state=\"on\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"u2R-oy-a1c\">\n                                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                            <font key=\"font\" metaFont=\"system\"/>\n                                        </buttonCell>\n                                        <connections>\n                                            <action selector=\"donateByBuyMeACoffee:\" target=\"HYX-CS-fYi\" id=\"e5c-ad-DGA\"/>\n                                        </connections>\n                                    </button>\n                                </subviews>\n                                <constraints>\n                                    <constraint firstItem=\"cTQ-RR-Izk\" firstAttribute=\"top\" secondItem=\"3Gz-X2-Fwd\" secondAttribute=\"bottom\" constant=\"30\" id=\"73h-Sc-fgO\"/>\n                                    <constraint firstItem=\"EWm-8G-1in\" firstAttribute=\"centerX\" secondItem=\"QwK-sY-64R\" secondAttribute=\"centerX\" id=\"AV9-rz-pyP\"/>\n                                    <constraint firstItem=\"PxZ-JL-fgP\" firstAttribute=\"centerX\" secondItem=\"QwK-sY-64R\" secondAttribute=\"centerX\" id=\"C8m-tb-WdG\"/>\n                                    <constraint firstItem=\"tVv-UV-KC0\" firstAttribute=\"centerX\" secondItem=\"QwK-sY-64R\" secondAttribute=\"centerX\" id=\"F5m-ys-Oou\"/>\n                                    <constraint firstItem=\"YT3-5c-vQO\" firstAttribute=\"centerX\" secondItem=\"QwK-sY-64R\" secondAttribute=\"centerX\" id=\"GmA-2m-pnD\"/>\n                                    <constraint firstItem=\"cTQ-RR-Izk\" firstAttribute=\"centerX\" secondItem=\"QwK-sY-64R\" secondAttribute=\"centerX\" id=\"KAk-cD-yYQ\"/>\n                                    <constraint firstItem=\"3Gz-X2-Fwd\" firstAttribute=\"centerX\" secondItem=\"QwK-sY-64R\" secondAttribute=\"centerX\" id=\"TrG-7H-2VS\"/>\n                                    <constraint firstItem=\"Mhg-yQ-c8y\" firstAttribute=\"centerX\" secondItem=\"QwK-sY-64R\" secondAttribute=\"centerX\" id=\"UBT-QU-guo\"/>\n                                    <constraint firstItem=\"EWm-8G-1in\" firstAttribute=\"top\" secondItem=\"WhP-jP-gB6\" secondAttribute=\"bottom\" constant=\"13\" id=\"WpZ-IN-1ew\"/>\n                                    <constraint firstItem=\"YT3-5c-vQO\" firstAttribute=\"top\" secondItem=\"Mhg-yQ-c8y\" secondAttribute=\"bottom\" constant=\"13\" id=\"Zf9-4f-Zwx\"/>\n                                    <constraint firstAttribute=\"width\" constant=\"240\" id=\"ZjZ-1H-r8V\"/>\n                                    <constraint firstItem=\"3Gz-X2-Fwd\" firstAttribute=\"top\" secondItem=\"tVv-UV-KC0\" secondAttribute=\"bottom\" constant=\"10\" id=\"c6k-My-yWR\"/>\n                                    <constraint firstItem=\"WhP-jP-gB6\" firstAttribute=\"top\" secondItem=\"PxZ-JL-fgP\" secondAttribute=\"bottom\" constant=\"30\" id=\"fAm-mG-bga\"/>\n                                    <constraint firstItem=\"PxZ-JL-fgP\" firstAttribute=\"top\" secondItem=\"cTQ-RR-Izk\" secondAttribute=\"bottom\" constant=\"10\" id=\"kPv-LG-L0Z\"/>\n                                    <constraint firstItem=\"Mhg-yQ-c8y\" firstAttribute=\"top\" secondItem=\"EWm-8G-1in\" secondAttribute=\"bottom\" constant=\"30\" id=\"oOc-5Q-qqv\"/>\n                                    <constraint firstItem=\"tVv-UV-KC0\" firstAttribute=\"top\" secondItem=\"QwK-sY-64R\" secondAttribute=\"top\" constant=\"30\" id=\"qmn-Z5-n51\"/>\n                                    <constraint firstItem=\"WhP-jP-gB6\" firstAttribute=\"centerX\" secondItem=\"QwK-sY-64R\" secondAttribute=\"centerX\" id=\"rQ1-Sd-T09\"/>\n                                </constraints>\n                            </customView>\n                            <imageView horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"mcC-tE-xEK\">\n                                <rect key=\"frame\" x=\"241\" y=\"0.0\" width=\"464\" height=\"618\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" constant=\"464\" id=\"4HX-y0-5Yx\"/>\n                                    <constraint firstAttribute=\"height\" constant=\"618\" id=\"bJY-Dg-eeE\"/>\n                                </constraints>\n                                <imageCell key=\"cell\" refusesFirstResponder=\"YES\" alignment=\"left\" imageScaling=\"proportionallyUpOrDown\" image=\"MEOW\" id=\"ubJ-HX-ab4\"/>\n                            </imageView>\n                        </subviews>\n                        <constraints>\n                            <constraint firstItem=\"mcC-tE-xEK\" firstAttribute=\"top\" secondItem=\"qDd-Su-rN7\" secondAttribute=\"bottom\" id=\"3O4-RU-qVK\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"QwK-sY-64R\" secondAttribute=\"bottom\" id=\"BQN-D1-fgP\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"qDd-Su-rN7\" secondAttribute=\"trailing\" id=\"CbA-K5-oU2\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"mcC-tE-xEK\" secondAttribute=\"trailing\" id=\"D5G-QQ-1Yq\"/>\n                            <constraint firstItem=\"Xfu-49-XDZ\" firstAttribute=\"leading\" secondItem=\"QwK-sY-64R\" secondAttribute=\"trailing\" id=\"Dgs-xh-SiG\"/>\n                            <constraint firstItem=\"mcC-tE-xEK\" firstAttribute=\"leading\" secondItem=\"Xfu-49-XDZ\" secondAttribute=\"trailing\" id=\"NW9-46-Y90\"/>\n                            <constraint firstItem=\"qDd-Su-rN7\" firstAttribute=\"leading\" secondItem=\"NWm-eD-Q0k\" secondAttribute=\"leading\" id=\"Oem-ZB-d9Z\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"mcC-tE-xEK\" secondAttribute=\"bottom\" id=\"P5y-Hl-hnQ\"/>\n                            <constraint firstItem=\"QwK-sY-64R\" firstAttribute=\"top\" secondItem=\"qDd-Su-rN7\" secondAttribute=\"bottom\" id=\"Qq0-Y4-NDY\"/>\n                            <constraint firstItem=\"Xfu-49-XDZ\" firstAttribute=\"top\" secondItem=\"qDd-Su-rN7\" secondAttribute=\"bottom\" id=\"VZl-dT-7xh\"/>\n                            <constraint firstAttribute=\"trailing\" relation=\"lessThanOrEqual\" secondItem=\"Ky1-pk-TF3\" secondAttribute=\"trailing\" constant=\"24\" id=\"WeV-Wl-c1e\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"Xfu-49-XDZ\" secondAttribute=\"bottom\" id=\"ZM9-lU-kVj\"/>\n                            <constraint firstItem=\"Ky1-pk-TF3\" firstAttribute=\"top\" secondItem=\"NWm-eD-Q0k\" secondAttribute=\"top\" constant=\"20\" id=\"dYF-3s-FGF\"/>\n                            <constraint firstItem=\"QwK-sY-64R\" firstAttribute=\"leading\" secondItem=\"NWm-eD-Q0k\" secondAttribute=\"leading\" id=\"diK-g1-JTM\"/>\n                            <constraint firstItem=\"qDd-Su-rN7\" firstAttribute=\"top\" secondItem=\"Ky1-pk-TF3\" secondAttribute=\"bottom\" constant=\"20\" id=\"kag-bL-c3S\"/>\n                            <constraint firstItem=\"Ky1-pk-TF3\" firstAttribute=\"leading\" relation=\"lessThanOrEqual\" secondItem=\"NWm-eD-Q0k\" secondAttribute=\"leading\" constant=\"24\" id=\"w9S-qZ-fdW\"/>\n                        </constraints>\n                    </view>\n                </viewController>\n                <customObject id=\"HME-8h-VSk\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"3339\" y=\"1807\"/>\n        </scene>\n        <!--Monitor-->\n        <scene sceneID=\"hIz-AP-VOD\">\n            <objects>\n                <viewController id=\"XfG-lQ-9wD\" userLabel=\"Monitor\" customClass=\"MonitorViewController\" customModule=\"Mos\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" wantsLayer=\"YES\" id=\"m2S-Jp-Qdl\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"1100\" height=\"574\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <subviews>\n                            <visualEffectView blendingMode=\"behindWindow\" material=\"underWindowBackground\" state=\"followsWindowActiveState\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"mt4-oP-Qe0\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"1100\" height=\"574\"/>\n                                <subviews>\n                                    <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"5GB-25-6Oj\" customClass=\"LineChartView\" customModule=\"Charts\">\n                                        <rect key=\"frame\" x=\"20\" y=\"339\" width=\"1060\" height=\"200\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"height\" constant=\"200\" id=\"nhE-dy-pu3\"/>\n                                        </constraints>\n                                    </customView>\n                                    <textField wantsLayer=\"YES\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Was-VF-M63\">\n                                        <rect key=\"frame\" x=\"48\" y=\"26\" width=\"9\" height=\"13\"/>\n                                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"left\" title=\"*\" id=\"Luy-Tf-2zi\">\n                                            <font key=\"font\" metaFont=\"system\" size=\"10\"/>\n                                            <color key=\"textColor\" red=\"1\" green=\"0.30028534439999999\" blue=\"0.29052067500000001\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                            <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        </textFieldCell>\n                                    </textField>\n                                    <textField wantsLayer=\"YES\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"bb8-Rh-HpB\" userLabel=\"Rendering the data of this window is extremely bad for scroll performance, keep close if not necessary.\">\n                                        <rect key=\"frame\" x=\"57\" y=\"26\" width=\"433\" height=\"13\"/>\n                                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"left\" title=\"Rendering this chart will affect scrolling performance. Close the window when not in use.\" id=\"TUE-3v-CaJ\">\n                                            <font key=\"font\" metaFont=\"system\" size=\"10\"/>\n                                            <color key=\"textColor\" red=\"0.59999999999999998\" green=\"0.59999999999999998\" blue=\"0.59999999999999998\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                            <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        </textFieldCell>\n                                    </textField>\n                                    <button wantsLayer=\"YES\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"HFp-Td-Ujc\">\n                                        <rect key=\"frame\" x=\"1020\" y=\"20\" width=\"60\" height=\"24\"/>\n                                        <buttonCell key=\"cell\" type=\"push\" bezelStyle=\"rounded\" image=\"SF.arrow.clockwise\" imagePosition=\"only\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"pDT-FT-rU3\">\n                                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                            <font key=\"font\" metaFont=\"system\"/>\n                                        </buttonCell>\n                                        <constraints>\n                                            <constraint firstAttribute=\"width\" constant=\"60\" id=\"A2U-au-gNe\"/>\n                                        </constraints>\n                                        <connections>\n                                            <action selector=\"refreshChart:\" target=\"XfG-lQ-9wD\" id=\"feT-Ga-SeJ\"/>\n                                        </connections>\n                                    </button>\n                                    <scrollView borderType=\"none\" autohidesScrollers=\"YES\" horizontalLineScroll=\"10\" horizontalPageScroll=\"10\" verticalLineScroll=\"10\" verticalPageScroll=\"10\" hasVerticalScroller=\"NO\" usesPredominantAxisScrolling=\"NO\" horizontalScrollElasticity=\"none\" verticalScrollElasticity=\"none\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"GMF-Nl-CJZ\">\n                                        <rect key=\"frame\" x=\"50\" y=\"250\" width=\"287\" height=\"38\"/>\n                                        <clipView key=\"contentView\" drawsBackground=\"NO\" copiesOnScroll=\"NO\" id=\"s5y-xQ-xSw\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"287\" height=\"38\"/>\n                                            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                            <subviews>\n                                                <textView editable=\"NO\" drawsBackground=\"NO\" importsGraphics=\"NO\" verticallyResizable=\"NO\" usesFontPanel=\"YES\" findStyle=\"panel\" continuousSpellChecking=\"YES\" allowsUndo=\"YES\" allowsNonContiguousLayout=\"YES\" quoteSubstitution=\"YES\" dashSubstitution=\"YES\" smartInsertDelete=\"YES\" id=\"7QQ-Xe-ZO5\">\n                                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"287\" height=\"38\"/>\n                                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                                    <color key=\"textColor\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                    <size key=\"minSize\" width=\"287\" height=\"38\"/>\n                                                    <size key=\"maxSize\" width=\"1000\" height=\"10000000\"/>\n                                                    <attributedString key=\"textStorage\">\n                                                        <fragment>\n                                                            <string key=\"content\">Trackpad: -\nRemote: -\nPath: -</string>\n                                                            <attributes>\n                                                                <color key=\"NSColor\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                <font key=\"NSFont\" size=\"11\" name=\"HelveticaNeue\"/>\n                                                                <paragraphStyle key=\"NSParagraphStyle\" alignment=\"left\" lineBreakMode=\"wordWrapping\" baseWritingDirection=\"natural\" tighteningFactorForTruncation=\"0.0\" allowsDefaultTighteningForTruncation=\"NO\"/>\n                                                            </attributes>\n                                                        </fragment>\n                                                    </attributedString>\n                                                    <color key=\"insertionPointColor\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                </textView>\n                                            </subviews>\n                                            <color key=\"backgroundColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        </clipView>\n                                        <constraints>\n                                            <constraint firstAttribute=\"height\" constant=\"38\" id=\"PGl-rV-L9w\"/>\n                                            <constraint firstAttribute=\"width\" constant=\"287\" id=\"fAZ-Yo-yze\"/>\n                                        </constraints>\n                                        <scroller key=\"horizontalScroller\" hidden=\"YES\" wantsLayer=\"YES\" verticalHuggingPriority=\"750\" doubleValue=\"1\" horizontal=\"YES\" id=\"HRn-mO-WnS\">\n                                            <rect key=\"frame\" x=\"-100\" y=\"-100\" width=\"87\" height=\"18\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                        </scroller>\n                                        <scroller key=\"verticalScroller\" hidden=\"YES\" wantsLayer=\"YES\" verticalHuggingPriority=\"750\" doubleValue=\"1\" horizontal=\"NO\" id=\"wD4-LL-pMH\">\n                                            <rect key=\"frame\" x=\"-100\" y=\"-100\" width=\"16\" height=\"150\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                        </scroller>\n                                    </scrollView>\n                                    <scrollView borderType=\"none\" autohidesScrollers=\"YES\" horizontalLineScroll=\"10\" horizontalPageScroll=\"10\" verticalLineScroll=\"10\" verticalPageScroll=\"10\" hasHorizontalScroller=\"NO\" hasVerticalScroller=\"NO\" usesPredominantAxisScrolling=\"NO\" horizontalScrollElasticity=\"none\" verticalScrollElasticity=\"none\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"OpG-lX-zPs\">\n                                        <rect key=\"frame\" x=\"50\" y=\"141\" width=\"287\" height=\"99\"/>\n                                        <clipView key=\"contentView\" drawsBackground=\"NO\" copiesOnScroll=\"NO\" id=\"oRR-Pu-oOi\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"287\" height=\"99\"/>\n                                            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                            <subviews>\n                                                <textView editable=\"NO\" drawsBackground=\"NO\" importsGraphics=\"NO\" verticallyResizable=\"NO\" usesFontPanel=\"YES\" findStyle=\"panel\" continuousSpellChecking=\"YES\" allowsUndo=\"YES\" allowsNonContiguousLayout=\"YES\" quoteSubstitution=\"YES\" dashSubstitution=\"YES\" spellingCorrection=\"YES\" smartInsertDelete=\"YES\" id=\"nyM-dG-I4A\">\n                                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"287\" height=\"99\"/>\n                                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                                    <color key=\"textColor\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                    <size key=\"minSize\" width=\"287\" height=\"99\"/>\n                                                    <size key=\"maxSize\" width=\"1000\" height=\"10000000\"/>\n                                                    <attributedString key=\"textStorage\">\n                                                        <fragment>\n                                                            <string key=\"content\">scrollWheelEventDeltaAxis1 (FixY): 0.0\nscrollWheelEventDeltaAxis2 (FixX): 0.0\nscrollWheelEventPointDeltaAxis1 (PtY): 0.0\nscrollWheelEventPointDeltaAxis2 (PtX): 0.0\nscrollWheelEventFixedPtDeltaAxis1 (FixPtY): 0.0\nscrollWheelEventFixedPtDeltaAxis2 (FixPtX): 0.0\nunacceleratedPointerMovementY: 0.0\nunacceleratedPointerMovementX: 0.0</string>\n                                                            <attributes>\n                                                                <color key=\"NSColor\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                <font key=\"NSFont\" size=\"11\" name=\"HelveticaNeue\"/>\n                                                                <paragraphStyle key=\"NSParagraphStyle\" alignment=\"left\" lineBreakMode=\"wordWrapping\" baseWritingDirection=\"natural\" tighteningFactorForTruncation=\"0.0\" allowsDefaultTighteningForTruncation=\"NO\"/>\n                                                            </attributes>\n                                                        </fragment>\n                                                    </attributedString>\n                                                    <color key=\"insertionPointColor\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                </textView>\n                                            </subviews>\n                                            <color key=\"backgroundColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        </clipView>\n                                        <constraints>\n                                            <constraint firstAttribute=\"height\" constant=\"99\" id=\"gPN-QT-kZl\"/>\n                                        </constraints>\n                                        <scroller key=\"horizontalScroller\" hidden=\"YES\" wantsLayer=\"YES\" verticalHuggingPriority=\"750\" doubleValue=\"1\" horizontal=\"YES\" id=\"qr1-tR-LqC\">\n                                            <rect key=\"frame\" x=\"-100\" y=\"-100\" width=\"87\" height=\"18\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                        </scroller>\n                                        <scroller key=\"verticalScroller\" hidden=\"YES\" wantsLayer=\"YES\" verticalHuggingPriority=\"750\" doubleValue=\"1\" horizontal=\"NO\" id=\"9UD-j6-5gE\">\n                                            <rect key=\"frame\" x=\"-100\" y=\"-100\" width=\"16\" height=\"150\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                        </scroller>\n                                    </scrollView>\n                                    <scrollView borderType=\"none\" autohidesScrollers=\"YES\" horizontalLineScroll=\"10\" horizontalPageScroll=\"10\" verticalLineScroll=\"10\" verticalPageScroll=\"10\" hasHorizontalScroller=\"NO\" hasVerticalScroller=\"NO\" usesPredominantAxisScrolling=\"NO\" horizontalScrollElasticity=\"none\" verticalScrollElasticity=\"none\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"TZY-Nm-E2J\">\n                                        <rect key=\"frame\" x=\"50\" y=\"69\" width=\"287\" height=\"62\"/>\n                                        <clipView key=\"contentView\" drawsBackground=\"NO\" copiesOnScroll=\"NO\" id=\"Mod-Ee-KxM\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"287\" height=\"62\"/>\n                                            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                            <subviews>\n                                                <textView editable=\"NO\" drawsBackground=\"NO\" importsGraphics=\"NO\" verticallyResizable=\"NO\" usesFontPanel=\"YES\" findStyle=\"panel\" continuousSpellChecking=\"YES\" allowsUndo=\"YES\" allowsNonContiguousLayout=\"YES\" quoteSubstitution=\"YES\" dashSubstitution=\"YES\" spellingCorrection=\"YES\" smartInsertDelete=\"YES\" id=\"3Ss-fa-4gd\">\n                                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"287\" height=\"62\"/>\n                                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                                    <color key=\"textColor\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                    <size key=\"minSize\" width=\"287\" height=\"62\"/>\n                                                    <size key=\"maxSize\" width=\"1000\" height=\"10000000\"/>\n                                                    <attributedString key=\"textStorage\">\n                                                        <fragment>\n                                                            <string key=\"content\">scrollWheelEventIsContinuous: 0.0\nscrollWheelEventScrollCount: 0.0\nscrollWheelEventScrollPhase: 0.0\nscrollWheelEventMomentumPhase: 0.0</string>\n                                                            <attributes>\n                                                                <color key=\"NSColor\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                <font key=\"NSFont\" size=\"11\" name=\"HelveticaNeue\"/>\n                                                                <paragraphStyle key=\"NSParagraphStyle\" alignment=\"left\" lineBreakMode=\"wordWrapping\" baseWritingDirection=\"natural\" tighteningFactorForTruncation=\"0.0\" allowsDefaultTighteningForTruncation=\"NO\"/>\n                                                            </attributes>\n                                                        </fragment>\n                                                    </attributedString>\n                                                    <color key=\"insertionPointColor\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                </textView>\n                                            </subviews>\n                                            <color key=\"backgroundColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        </clipView>\n                                        <constraints>\n                                            <constraint firstAttribute=\"height\" constant=\"62\" id=\"f7H-eq-6hb\"/>\n                                        </constraints>\n                                        <scroller key=\"horizontalScroller\" hidden=\"YES\" wantsLayer=\"YES\" verticalHuggingPriority=\"750\" doubleValue=\"1\" horizontal=\"YES\" id=\"w9H-Vh-iNw\">\n                                            <rect key=\"frame\" x=\"-100\" y=\"-100\" width=\"87\" height=\"18\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                        </scroller>\n                                        <scroller key=\"verticalScroller\" hidden=\"YES\" wantsLayer=\"YES\" verticalHuggingPriority=\"750\" doubleValue=\"1\" horizontal=\"NO\" id=\"MGM-Jv-0v7\">\n                                            <rect key=\"frame\" x=\"-100\" y=\"-100\" width=\"16\" height=\"150\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                        </scroller>\n                                    </scrollView>\n                                    <scrollView borderType=\"none\" autohidesScrollers=\"YES\" horizontalLineScroll=\"10\" horizontalPageScroll=\"10\" verticalLineScroll=\"10\" verticalPageScroll=\"10\" hasHorizontalScroller=\"NO\" hasVerticalScroller=\"NO\" usesPredominantAxisScrolling=\"NO\" horizontalScrollElasticity=\"none\" verticalScrollElasticity=\"none\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"aCb-Q4-94n\">\n                                        <rect key=\"frame\" x=\"347\" y=\"202\" width=\"380\" height=\"86\"/>\n                                        <clipView key=\"contentView\" drawsBackground=\"NO\" copiesOnScroll=\"NO\" id=\"bAC-FE-O60\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"380\" height=\"86\"/>\n                                            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                            <subviews>\n                                                <textView editable=\"NO\" drawsBackground=\"NO\" importsGraphics=\"NO\" verticallyResizable=\"NO\" usesFontPanel=\"YES\" findStyle=\"panel\" continuousSpellChecking=\"YES\" allowsUndo=\"YES\" allowsNonContiguousLayout=\"YES\" quoteSubstitution=\"YES\" dashSubstitution=\"YES\" spellingCorrection=\"YES\" smartInsertDelete=\"YES\" id=\"jHZ-op-O4X\">\n                                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"380\" height=\"86\"/>\n                                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                                    <color key=\"textColor\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                    <size key=\"minSize\" width=\"380\" height=\"86\"/>\n                                                    <size key=\"maxSize\" width=\"1000\" height=\"10000000\"/>\n                                                    <attributedString key=\"textStorage\">\n                                                        <fragment>\n                                                            <string key=\"content\">eventTargetProcessSerialNumber: 0.0\neventTargetUnixProcessID: 0.0\neventSourceUnixProcessID: 0.0\neventSourceUserData: 0.0\neventSourceUserID: 0.0\neventSourceGroupID: 0.0\neventSourceStateID: 0.0</string>\n                                                            <attributes>\n                                                                <color key=\"NSColor\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                <font key=\"NSFont\" size=\"11\" name=\"HelveticaNeue\"/>\n                                                                <paragraphStyle key=\"NSParagraphStyle\" alignment=\"left\" lineBreakMode=\"wordWrapping\" baseWritingDirection=\"natural\" tighteningFactorForTruncation=\"0.0\" allowsDefaultTighteningForTruncation=\"NO\"/>\n                                                            </attributes>\n                                                        </fragment>\n                                                    </attributedString>\n                                                    <color key=\"insertionPointColor\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                </textView>\n                                            </subviews>\n                                            <color key=\"backgroundColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        </clipView>\n                                        <constraints>\n                                            <constraint firstAttribute=\"width\" constant=\"380\" id=\"Mby-t6-0en\"/>\n                                            <constraint firstAttribute=\"height\" constant=\"86\" id=\"YhF-Dd-eOK\"/>\n                                        </constraints>\n                                        <scroller key=\"horizontalScroller\" hidden=\"YES\" wantsLayer=\"YES\" verticalHuggingPriority=\"750\" doubleValue=\"1\" horizontal=\"YES\" id=\"5b3-BW-2Lq\">\n                                            <rect key=\"frame\" x=\"-100\" y=\"-100\" width=\"87\" height=\"18\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                        </scroller>\n                                        <scroller key=\"verticalScroller\" hidden=\"YES\" wantsLayer=\"YES\" verticalHuggingPriority=\"750\" doubleValue=\"1\" horizontal=\"NO\" id=\"15Q-rb-3io\">\n                                            <rect key=\"frame\" x=\"-100\" y=\"-100\" width=\"16\" height=\"150\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                        </scroller>\n                                    </scrollView>\n                                    <scrollView borderType=\"none\" autohidesScrollers=\"YES\" horizontalLineScroll=\"10\" horizontalPageScroll=\"10\" verticalLineScroll=\"10\" verticalPageScroll=\"10\" hasHorizontalScroller=\"NO\" hasVerticalScroller=\"NO\" usesPredominantAxisScrolling=\"NO\" horizontalScrollElasticity=\"none\" verticalScrollElasticity=\"none\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"2jT-qX-gdB\">\n                                        <rect key=\"frame\" x=\"347\" y=\"69\" width=\"380\" height=\"123\"/>\n                                        <clipView key=\"contentView\" drawsBackground=\"NO\" copiesOnScroll=\"NO\" id=\"jph-Lx-Im2\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"380\" height=\"123\"/>\n                                            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                            <subviews>\n                                                <textView editable=\"NO\" drawsBackground=\"NO\" importsGraphics=\"NO\" verticallyResizable=\"NO\" usesFontPanel=\"YES\" findStyle=\"panel\" continuousSpellChecking=\"YES\" allowsUndo=\"YES\" allowsNonContiguousLayout=\"YES\" quoteSubstitution=\"YES\" dashSubstitution=\"YES\" spellingCorrection=\"YES\" smartInsertDelete=\"YES\" id=\"As1-do-X5y\">\n                                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"380\" height=\"123\"/>\n                                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                                    <color key=\"textColor\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                    <size key=\"minSize\" width=\"380\" height=\"123\"/>\n                                                    <size key=\"maxSize\" width=\"1000\" height=\"10000000\"/>\n                                                    <attributedString key=\"textStorage\">\n                                                        <fragment>\n                                                            <string key=\"content\">mouseEventNumber: 0.0\nmouseEventClickState: 0.0\nmouseEventPressure: 0.0\nmouseEventButtonNumber: 0.0\nmouseEventDeltaX: 0.0\nmouseEventDeltaY: 0.0\nmouseEventInstantMouser: 0.0\nmouseEventSubtype: 0.0\nmouseEventWindowUnderMousePointer: 0.0\nmouseEventWindowUnderMousePointerThatCanHandleThisEvent: 0.0</string>\n                                                            <attributes>\n                                                                <color key=\"NSColor\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                <font key=\"NSFont\" size=\"11\" name=\"HelveticaNeue\"/>\n                                                                <paragraphStyle key=\"NSParagraphStyle\" alignment=\"left\" lineBreakMode=\"wordWrapping\" baseWritingDirection=\"natural\" tighteningFactorForTruncation=\"0.0\" allowsDefaultTighteningForTruncation=\"NO\"/>\n                                                            </attributes>\n                                                        </fragment>\n                                                    </attributedString>\n                                                    <color key=\"insertionPointColor\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                </textView>\n                                            </subviews>\n                                            <color key=\"backgroundColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        </clipView>\n                                        <constraints>\n                                            <constraint firstAttribute=\"height\" constant=\"123\" id=\"6vg-y1-mf7\"/>\n                                        </constraints>\n                                        <scroller key=\"horizontalScroller\" hidden=\"YES\" wantsLayer=\"YES\" verticalHuggingPriority=\"750\" doubleValue=\"1\" horizontal=\"YES\" id=\"4Bq-w9-66k\">\n                                            <rect key=\"frame\" x=\"-100\" y=\"-100\" width=\"87\" height=\"18\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                        </scroller>\n                                        <scroller key=\"verticalScroller\" hidden=\"YES\" wantsLayer=\"YES\" verticalHuggingPriority=\"750\" doubleValue=\"1\" horizontal=\"NO\" id=\"JsD-dl-hdC\">\n                                            <rect key=\"frame\" x=\"-100\" y=\"-100\" width=\"16\" height=\"130\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                        </scroller>\n                                    </scrollView>\n                                    <scrollView borderType=\"none\" autohidesScrollers=\"YES\" horizontalLineScroll=\"10\" horizontalPageScroll=\"10\" verticalLineScroll=\"4\" verticalPageScroll=\"4\" hasHorizontalScroller=\"NO\" usesPredominantAxisScrolling=\"NO\" horizontalScrollElasticity=\"none\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"haD-4r-ozY\">\n                                        <rect key=\"frame\" x=\"737\" y=\"64\" width=\"343\" height=\"190\"/>\n                                        <clipView key=\"contentView\" drawsBackground=\"NO\" copiesOnScroll=\"NO\" id=\"dg1-Pj-aJX\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"343\" height=\"190\"/>\n                                            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                            <subviews>\n                                                <textView editable=\"NO\" drawsBackground=\"NO\" importsGraphics=\"NO\" verticallyResizable=\"YES\" usesFontPanel=\"YES\" findStyle=\"panel\" continuousSpellChecking=\"YES\" allowsUndo=\"YES\" quoteSubstitution=\"YES\" dashSubstitution=\"YES\" spellingCorrection=\"YES\" smartInsertDelete=\"YES\" id=\"GG9-kH-lZp\">\n                                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"343\" height=\"190\"/>\n                                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                                    <color key=\"textColor\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                    <size key=\"minSize\" width=\"343\" height=\"190\"/>\n                                                    <size key=\"maxSize\" width=\"1000\" height=\"10000000\"/>\n                                                    <attributedString key=\"textStorage\">\n                                                        <fragment content=\"Wait for button press events ...\">\n                                                            <attributes>\n                                                                <color key=\"NSColor\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                <font key=\"NSFont\" size=\"11\" name=\"HelveticaNeue\"/>\n                                                                <paragraphStyle key=\"NSParagraphStyle\" alignment=\"left\" lineBreakMode=\"wordWrapping\" baseWritingDirection=\"natural\" tighteningFactorForTruncation=\"0.0\" allowsDefaultTighteningForTruncation=\"NO\"/>\n                                                            </attributes>\n                                                        </fragment>\n                                                    </attributedString>\n                                                </textView>\n                                            </subviews>\n                                            <color key=\"backgroundColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        </clipView>\n                                        <constraints>\n                                            <constraint firstAttribute=\"height\" relation=\"greaterThanOrEqual\" constant=\"180\" id=\"thi-ER-TQ8\"/>\n                                        </constraints>\n                                        <scroller key=\"horizontalScroller\" hidden=\"YES\" wantsLayer=\"YES\" verticalHuggingPriority=\"750\" doubleValue=\"1\" horizontal=\"YES\" id=\"RRJ-tA-hHo\">\n                                            <rect key=\"frame\" x=\"-100\" y=\"-100\" width=\"87\" height=\"18\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                        </scroller>\n                                        <scroller key=\"verticalScroller\" hidden=\"YES\" wantsLayer=\"YES\" verticalHuggingPriority=\"750\" doubleValue=\"1\" horizontal=\"NO\" id=\"PgZ-4s-wxB\">\n                                            <rect key=\"frame\" x=\"-100\" y=\"-100\" width=\"17\" height=\"180\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                        </scroller>\n                                    </scrollView>\n                                    <popUpButton verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"j3j-nq-VFW\">\n                                        <rect key=\"frame\" x=\"737\" y=\"264\" width=\"313\" height=\"24\"/>\n                                        <popUpButtonCell key=\"cell\" type=\"push\" title=\"Select an action\" bezelStyle=\"rounded\" alignment=\"left\" lineBreakMode=\"truncatingTail\" state=\"on\" borderStyle=\"borderAndBezel\" imageScaling=\"proportionallyDown\" inset=\"2\" selectedItem=\"HLn-aB-Grd\" id=\"P0r-qt-JZe\">\n                                            <behavior key=\"behavior\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                            <font key=\"font\" metaFont=\"message\"/>\n                                            <menu key=\"menu\" id=\"asr-Nl-BBq\">\n                                                <items>\n                                                    <menuItem title=\"Select an action\" state=\"on\" id=\"HLn-aB-Grd\"/>\n                                                </items>\n                                            </menu>\n                                        </popUpButtonCell>\n                                    </popUpButton>\n                                    <box verticalHuggingPriority=\"750\" boxType=\"separator\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"DLC-lJ-6Mf\">\n                                        <rect key=\"frame\" x=\"50\" y=\"316\" width=\"1000\" height=\"5\"/>\n                                    </box>\n                                </subviews>\n                                <constraints>\n                                    <constraint firstItem=\"j3j-nq-VFW\" firstAttribute=\"top\" secondItem=\"DLC-lJ-6Mf\" secondAttribute=\"bottom\" constant=\"30\" id=\"0cT-Ou-6bP\"/>\n                                    <constraint firstItem=\"GMF-Nl-CJZ\" firstAttribute=\"leading\" secondItem=\"mt4-oP-Qe0\" secondAttribute=\"leading\" constant=\"50\" id=\"0zN-fq-TX8\"/>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"j3j-nq-VFW\" secondAttribute=\"trailing\" constant=\"50\" id=\"1Ce-6y-QoD\"/>\n                                    <constraint firstItem=\"OpG-lX-zPs\" firstAttribute=\"leading\" secondItem=\"GMF-Nl-CJZ\" secondAttribute=\"leading\" id=\"1I2-nm-b9t\"/>\n                                    <constraint firstAttribute=\"height\" relation=\"greaterThanOrEqual\" constant=\"380\" id=\"2AG-cR-IqL\"/>\n                                    <constraint firstItem=\"OpG-lX-zPs\" firstAttribute=\"top\" secondItem=\"GMF-Nl-CJZ\" secondAttribute=\"bottom\" constant=\"10\" id=\"3cn-eg-cGh\"/>\n                                    <constraint firstItem=\"HFp-Td-Ujc\" firstAttribute=\"centerY\" secondItem=\"Was-VF-M63\" secondAttribute=\"centerY\" id=\"5YM-qA-ar8\"/>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"haD-4r-ozY\" secondAttribute=\"trailing\" constant=\"20\" symbolic=\"YES\" id=\"647-1A-97f\"/>\n                                    <constraint firstItem=\"bb8-Rh-HpB\" firstAttribute=\"leading\" secondItem=\"Was-VF-M63\" secondAttribute=\"trailing\" constant=\"4\" id=\"88Z-Aa-5pa\"/>\n                                    <constraint firstItem=\"TZY-Nm-E2J\" firstAttribute=\"trailing\" secondItem=\"GMF-Nl-CJZ\" secondAttribute=\"trailing\" id=\"CC6-cd-IlN\"/>\n                                    <constraint firstItem=\"aCb-Q4-94n\" firstAttribute=\"leading\" secondItem=\"OpG-lX-zPs\" secondAttribute=\"trailing\" constant=\"10\" id=\"DIS-gz-b35\"/>\n                                    <constraint firstItem=\"TZY-Nm-E2J\" firstAttribute=\"leading\" secondItem=\"GMF-Nl-CJZ\" secondAttribute=\"leading\" id=\"GeM-gr-rRp\"/>\n                                    <constraint firstItem=\"2jT-qX-gdB\" firstAttribute=\"trailing\" secondItem=\"aCb-Q4-94n\" secondAttribute=\"trailing\" id=\"Hdz-21-hgt\"/>\n                                    <constraint firstAttribute=\"bottom\" secondItem=\"HFp-Td-Ujc\" secondAttribute=\"bottom\" constant=\"20\" id=\"Jli-2U-mnk\"/>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"HFp-Td-Ujc\" secondAttribute=\"trailing\" constant=\"20\" id=\"LbF-kW-0jf\"/>\n                                    <constraint firstItem=\"TZY-Nm-E2J\" firstAttribute=\"top\" secondItem=\"OpG-lX-zPs\" secondAttribute=\"bottom\" constant=\"10\" id=\"LfU-Sr-8T1\"/>\n                                    <constraint firstItem=\"OpG-lX-zPs\" firstAttribute=\"trailing\" secondItem=\"GMF-Nl-CJZ\" secondAttribute=\"trailing\" id=\"Myb-ad-1sc\"/>\n                                    <constraint firstItem=\"HFp-Td-Ujc\" firstAttribute=\"leading\" relation=\"greaterThanOrEqual\" secondItem=\"bb8-Rh-HpB\" secondAttribute=\"trailing\" constant=\"8\" symbolic=\"YES\" id=\"RRx-ob-asY\"/>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"5GB-25-6Oj\" secondAttribute=\"trailing\" constant=\"20\" id=\"SVH-Rs-Oah\"/>\n                                    <constraint firstItem=\"2jT-qX-gdB\" firstAttribute=\"leading\" secondItem=\"aCb-Q4-94n\" secondAttribute=\"leading\" id=\"TiB-FG-Xlc\"/>\n                                    <constraint firstItem=\"haD-4r-ozY\" firstAttribute=\"leading\" secondItem=\"aCb-Q4-94n\" secondAttribute=\"trailing\" constant=\"10\" id=\"U8Q-Lb-1R0\"/>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"DLC-lJ-6Mf\" secondAttribute=\"trailing\" constant=\"50\" id=\"V5x-gE-ue4\"/>\n                                    <constraint firstItem=\"DLC-lJ-6Mf\" firstAttribute=\"leading\" secondItem=\"mt4-oP-Qe0\" secondAttribute=\"leading\" constant=\"50\" id=\"VEN-SK-5x5\"/>\n                                    <constraint firstItem=\"j3j-nq-VFW\" firstAttribute=\"leading\" secondItem=\"aCb-Q4-94n\" secondAttribute=\"trailing\" constant=\"10\" id=\"VQu-bn-HXi\"/>\n                                    <constraint firstItem=\"Was-VF-M63\" firstAttribute=\"leading\" secondItem=\"mt4-oP-Qe0\" secondAttribute=\"leading\" constant=\"50\" id=\"a5Q-l7-Yh4\"/>\n                                    <constraint firstItem=\"haD-4r-ozY\" firstAttribute=\"top\" secondItem=\"j3j-nq-VFW\" secondAttribute=\"bottom\" constant=\"10\" id=\"aOc-w6-UOI\"/>\n                                    <constraint firstItem=\"5GB-25-6Oj\" firstAttribute=\"top\" secondItem=\"mt4-oP-Qe0\" secondAttribute=\"top\" constant=\"35\" id=\"hsP-hi-y4I\"/>\n                                    <constraint firstItem=\"DLC-lJ-6Mf\" firstAttribute=\"top\" secondItem=\"5GB-25-6Oj\" secondAttribute=\"bottom\" constant=\"20\" id=\"jlk-Ux-TsS\"/>\n                                    <constraint firstItem=\"HFp-Td-Ujc\" firstAttribute=\"top\" secondItem=\"haD-4r-ozY\" secondAttribute=\"bottom\" constant=\"20\" id=\"ltV-Bs-Auh\"/>\n                                    <constraint firstItem=\"aCb-Q4-94n\" firstAttribute=\"top\" secondItem=\"DLC-lJ-6Mf\" secondAttribute=\"bottom\" constant=\"30\" id=\"mPm-yJ-FTc\"/>\n                                    <constraint firstItem=\"bb8-Rh-HpB\" firstAttribute=\"centerY\" secondItem=\"Was-VF-M63\" secondAttribute=\"centerY\" id=\"oeR-4w-ODw\"/>\n                                    <constraint firstItem=\"GMF-Nl-CJZ\" firstAttribute=\"top\" secondItem=\"DLC-lJ-6Mf\" secondAttribute=\"bottom\" constant=\"30\" id=\"ooh-Ho-MdD\"/>\n                                    <constraint firstItem=\"2jT-qX-gdB\" firstAttribute=\"top\" secondItem=\"aCb-Q4-94n\" secondAttribute=\"bottom\" constant=\"10\" id=\"rf0-N4-8Yx\"/>\n                                    <constraint firstItem=\"5GB-25-6Oj\" firstAttribute=\"leading\" secondItem=\"mt4-oP-Qe0\" secondAttribute=\"leading\" constant=\"20\" id=\"tug-1q-o4c\"/>\n                                    <constraint firstAttribute=\"width\" relation=\"greaterThanOrEqual\" constant=\"1100\" id=\"xXk-MC-kBL\"/>\n                                </constraints>\n                            </visualEffectView>\n                        </subviews>\n                        <constraints>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"mt4-oP-Qe0\" secondAttribute=\"trailing\" id=\"6Za-oZ-6UO\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"mt4-oP-Qe0\" secondAttribute=\"bottom\" id=\"R4U-28-T6q\"/>\n                            <constraint firstItem=\"mt4-oP-Qe0\" firstAttribute=\"leading\" secondItem=\"m2S-Jp-Qdl\" secondAttribute=\"leading\" id=\"eYj-Po-UQR\"/>\n                            <constraint firstItem=\"mt4-oP-Qe0\" firstAttribute=\"top\" secondItem=\"m2S-Jp-Qdl\" secondAttribute=\"top\" id=\"tqT-Y3-9Zi\"/>\n                        </constraints>\n                    </view>\n                    <connections>\n                        <outlet property=\"buttonEventLogTextField\" destination=\"GG9-kH-lZp\" id=\"Tsb-bk-BaD\"/>\n                        <outlet property=\"lineChart\" destination=\"5GB-25-6Oj\" id=\"UJ9-lq-YeQ\"/>\n                        <outlet property=\"mouseLogTextField\" destination=\"As1-do-X5y\" id=\"cUY-I3-MTu\"/>\n                        <outlet property=\"parsedLogTextField\" destination=\"7QQ-Xe-ZO5\" id=\"Pku-PT-q8i\"/>\n                        <outlet property=\"processLogTextField\" destination=\"jHZ-op-O4X\" id=\"IQh-kA-14o\"/>\n                        <outlet property=\"scrollDetailLogTextField\" destination=\"3Ss-fa-4gd\" id=\"8la-Zr-BBH\"/>\n                        <outlet property=\"scrollLogTextField\" destination=\"nyM-dG-I4A\" id=\"wPZ-Da-AoK\"/>\n                        <outlet property=\"shortcutMenu\" destination=\"asr-Nl-BBq\" id=\"1co-ma-Hvk\"/>\n                    </connections>\n                </viewController>\n                <customObject id=\"rPt-NT-nkU\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"-34\" y=\"482.5\"/>\n        </scene>\n        <!--Adaptive Popover-->\n        <scene sceneID=\"V22-gr-sOZ\">\n            <objects>\n                <viewController id=\"3aa-uW-Wet\" customClass=\"AdaptivePopover\" customModule=\"Mos\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" id=\"Yv2-eG-rK5\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"317\" height=\"34\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" horizontalCompressionResistancePriority=\"250\" textCompletion=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"lw5-DQ-yJl\">\n                                <rect key=\"frame\" x=\"10\" y=\"10\" width=\"297\" height=\"14\"/>\n                                <textFieldCell key=\"cell\" controlSize=\"mini\" sendsActionOnEndEditing=\"YES\" alignment=\"left\" title=\"You need to re-run Mos to change the settings\" id=\"cIk-j1-vYt\">\n                                    <font key=\"font\" metaFont=\"smallSystem\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                        </subviews>\n                        <constraints>\n                            <constraint firstItem=\"lw5-DQ-yJl\" firstAttribute=\"leading\" secondItem=\"Yv2-eG-rK5\" secondAttribute=\"leading\" constant=\"12\" id=\"8cl-zB-e6Q\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"lw5-DQ-yJl\" secondAttribute=\"trailing\" constant=\"12\" id=\"Zbi-c3-Jam\"/>\n                            <constraint firstItem=\"lw5-DQ-yJl\" firstAttribute=\"top\" secondItem=\"Yv2-eG-rK5\" secondAttribute=\"top\" constant=\"10\" id=\"lvD-vJ-0OD\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"lw5-DQ-yJl\" secondAttribute=\"bottom\" constant=\"10\" id=\"xp2-BJ-8gd\"/>\n                        </constraints>\n                    </view>\n                </viewController>\n                <customObject id=\"Vmr-ci-gbB\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"461\" y=\"1461\"/>\n        </scene>\n        <!--Window Controller-->\n        <scene sceneID=\"917-oY-KTN\">\n            <objects>\n                <windowController storyboardIdentifier=\"introductionWindowController\" id=\"JQz-eM-H89\" customClass=\"IntroductionWindowController\" customModule=\"Mos\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <window key=\"window\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" releasedWhenClosed=\"NO\" visibleAtLaunch=\"NO\" frameAutosaveName=\"\" animationBehavior=\"default\" titlebarAppearsTransparent=\"YES\" id=\"dPc-qH-r55\">\n                        <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\" miniaturizable=\"YES\" resizable=\"YES\" fullSizeContentView=\"YES\"/>\n                        <rect key=\"contentRect\" x=\"245\" y=\"310\" width=\"480\" height=\"270\"/>\n                        <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"1680\" height=\"1050\"/>\n                        <connections>\n                            <outlet property=\"delegate\" destination=\"JQz-eM-H89\" id=\"3vP-rP-0ni\"/>\n                        </connections>\n                    </window>\n                    <connections>\n                        <outlet property=\"introductionWindow\" destination=\"dPc-qH-r55\" id=\"tCa-ng-kHp\"/>\n                        <segue destination=\"B4s-BX-GO5\" kind=\"relationship\" relationship=\"window.shadowedContentViewController\" id=\"lnQ-xp-WmT\"/>\n                    </connections>\n                </windowController>\n                <customObject id=\"5Qp-UB-W8A\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"334\" y=\"2225\"/>\n        </scene>\n        <!--Introduction View Controller-->\n        <scene sceneID=\"iPx-7G-EjS\">\n            <objects>\n                <viewController showSeguePresentationStyle=\"single\" id=\"B4s-BX-GO5\" customClass=\"IntroductionViewController\" customModule=\"Mos\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <visualEffectView key=\"view\" appearanceType=\"inheritedVibrantLight\" blendingMode=\"behindWindow\" material=\"popover\" state=\"active\" id=\"IYZ-aS-pu3\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"340\" height=\"452\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <subviews>\n                            <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kMR-1O-tOH\">\n                                <rect key=\"frame\" x=\"70\" y=\"242\" width=\"200\" height=\"200\"/>\n                                <subviews>\n                                    <imageView hidden=\"YES\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Sjj-h0-3TO\">\n                                        <rect key=\"frame\" x=\"-60\" y=\"-25\" width=\"265\" height=\"250\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"height\" constant=\"250\" id=\"Em7-0K-uxD\"/>\n                                            <constraint firstAttribute=\"width\" constant=\"265\" id=\"ZUN-Qu-eQK\"/>\n                                        </constraints>\n                                        <imageCell key=\"cell\" refusesFirstResponder=\"YES\" alignment=\"left\" animates=\"YES\" imageScaling=\"proportionallyDown\" image=\"sparkle\" id=\"c8O-9Q-q6B\"/>\n                                    </imageView>\n                                    <imageView horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"yOZ-8X-9SU\" userLabel=\"AppIcon\" customClass=\"DraggingImageView\" customModule=\"Mos\" customModuleProvider=\"target\">\n                                        <rect key=\"frame\" x=\"38\" y=\"38\" width=\"125\" height=\"125\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"width\" constant=\"125\" id=\"Eed-v0-yYr\"/>\n                                            <constraint firstAttribute=\"height\" constant=\"125\" id=\"Z9F-fd-NDa\"/>\n                                        </constraints>\n                                        <imageCell key=\"cell\" refusesFirstResponder=\"YES\" alignment=\"left\" imageScaling=\"proportionallyUpOrDown\" image=\"NSApplicationIcon\" id=\"Tzb-zo-Iip\"/>\n                                    </imageView>\n                                    <imageView hidden=\"YES\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"xwj-nv-DGc\">\n                                        <rect key=\"frame\" x=\"120\" y=\"80\" width=\"120\" height=\"160\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"width\" constant=\"120\" id=\"Hn5-rz-omz\"/>\n                                            <constraint firstAttribute=\"height\" constant=\"160\" id=\"oYa-rG-14q\"/>\n                                        </constraints>\n                                        <imageCell key=\"cell\" refusesFirstResponder=\"YES\" alignment=\"left\" imageScaling=\"proportionallyDown\" image=\"drag-arrow\" id=\"oIL-2D-5XT\"/>\n                                    </imageView>\n                                </subviews>\n                                <constraints>\n                                    <constraint firstItem=\"Sjj-h0-3TO\" firstAttribute=\"centerY\" secondItem=\"kMR-1O-tOH\" secondAttribute=\"centerY\" id=\"90Q-TX-Ioq\"/>\n                                    <constraint firstAttribute=\"height\" constant=\"200\" id=\"Btd-eR-ptK\"/>\n                                    <constraint firstItem=\"Sjj-h0-3TO\" firstAttribute=\"centerX\" secondItem=\"kMR-1O-tOH\" secondAttribute=\"centerX\" constant=\"-28\" id=\"ILq-ST-5Cf\"/>\n                                    <constraint firstItem=\"xwj-nv-DGc\" firstAttribute=\"centerY\" secondItem=\"kMR-1O-tOH\" secondAttribute=\"centerY\" constant=\"-60\" id=\"IzA-aP-hLw\"/>\n                                    <constraint firstItem=\"yOZ-8X-9SU\" firstAttribute=\"centerX\" secondItem=\"kMR-1O-tOH\" secondAttribute=\"centerX\" id=\"KRR-gG-PAE\"/>\n                                    <constraint firstItem=\"xwj-nv-DGc\" firstAttribute=\"centerX\" secondItem=\"kMR-1O-tOH\" secondAttribute=\"centerX\" constant=\"80\" id=\"LOS-WJ-E4I\"/>\n                                    <constraint firstItem=\"yOZ-8X-9SU\" firstAttribute=\"centerY\" secondItem=\"kMR-1O-tOH\" secondAttribute=\"centerY\" id=\"gSL-bE-TcH\"/>\n                                    <constraint firstAttribute=\"width\" constant=\"200\" id=\"rdM-In-lwx\"/>\n                                </constraints>\n                            </customView>\n                            <textField wantsLayer=\"YES\" focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" verticalCompressionResistancePriority=\"751\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Lfz-Lg-BC5\">\n                                <rect key=\"frame\" x=\"134\" y=\"238\" width=\"72\" height=\"14\"/>\n                                <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" alignment=\"center\" title=\"Introducting\" id=\"11f-uB-gEM\">\n                                    <font key=\"font\" metaFont=\"smallSystem\"/>\n                                    <color key=\"textColor\" name=\"tertiaryLabelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <textField wantsLayer=\"YES\" focusRingType=\"none\" verticalHuggingPriority=\"751\" horizontalCompressionResistancePriority=\"250\" verticalCompressionResistancePriority=\"751\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"MEd-Ts-wNq\">\n                                <rect key=\"frame\" x=\"123\" y=\"179\" width=\"95\" height=\"59\"/>\n                                <textFieldCell key=\"cell\" sendsActionOnEndEditing=\"YES\" state=\"on\" alignment=\"center\" title=\"Mos\" id=\"YHn-dn-A4n\">\n                                    <font key=\"font\" metaFont=\"systemUltraLight\" size=\"50\"/>\n                                    <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <button wantsLayer=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"7q8-SL-otn\">\n                                <rect key=\"frame\" x=\"124\" y=\"20\" width=\"93\" height=\"15\"/>\n                                <buttonCell key=\"cell\" type=\"squareTextured\" title=\"Getting trouble ?\" bezelStyle=\"texturedSquare\" alignment=\"center\" state=\"on\" inset=\"2\" id=\"XMw-QE-lsq\">\n                                    <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"smallSystem\"/>\n                                </buttonCell>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"15\" id=\"bWl-x7-Qc4\"/>\n                                </constraints>\n                                <connections>\n                                    <action selector=\"handleHelpButtonClick:\" target=\"B4s-BX-GO5\" id=\"Laa-ph-2KQ\"/>\n                                    <segue destination=\"hco-oR-00e\" kind=\"popover\" popoverAnchorView=\"7q8-SL-otn\" popoverBehavior=\"t\" preferredEdge=\"maxY\" id=\"y2q-Re-QTW\"/>\n                                </connections>\n                            </button>\n                            <textField wantsLayer=\"YES\" focusRingType=\"none\" verticalHuggingPriority=\"749\" horizontalCompressionResistancePriority=\"250\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Nvh-y7-YSa\">\n                                <rect key=\"frame\" x=\"36\" y=\"113\" width=\"269\" height=\"56\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" constant=\"265\" id=\"9Dn-iA-gPf\"/>\n                                </constraints>\n                                <textFieldCell key=\"cell\" alignment=\"center\" id=\"yFl-4N-WcD\">\n                                    <font key=\"font\" metaFont=\"smallSystem\"/>\n                                    <string key=\"title\">Your mouse is about to get a smoothest scrolling experience.\nPick up your mouse, we just have a few thing that you need to check.</string>\n                                    <color key=\"textColor\" name=\"secondaryLabelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <button wantsLayer=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"YXM-7E-mQC\" userLabel=\"AllowToAccessButton\">\n                                <rect key=\"frame\" x=\"37\" y=\"41\" width=\"267\" height=\"48\"/>\n                                <buttonCell key=\"cell\" type=\"squareTextured\" title=\"Allow to access\" bezelStyle=\"texturedSquare\" alignment=\"center\" controlSize=\"large\" state=\"on\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"DYt-9m-sTf\">\n                                    <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                </buttonCell>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" constant=\"265\" id=\"5mc-hC-8AE\"/>\n                                    <constraint firstAttribute=\"height\" constant=\"45\" id=\"aYi-qy-RKz\"/>\n                                </constraints>\n                                <connections>\n                                    <action selector=\"authButtonClick:\" target=\"B4s-BX-GO5\" id=\"yr1-6a-7dl\"/>\n                                </connections>\n                            </button>\n                        </subviews>\n                        <constraints>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"7q8-SL-otn\" secondAttribute=\"bottom\" constant=\"20\" id=\"3Rt-26-7TD\"/>\n                            <constraint firstItem=\"MEd-Ts-wNq\" firstAttribute=\"top\" secondItem=\"Lfz-Lg-BC5\" secondAttribute=\"bottom\" id=\"4SA-ZG-ov3\"/>\n                            <constraint firstItem=\"kMR-1O-tOH\" firstAttribute=\"leading\" secondItem=\"IYZ-aS-pu3\" secondAttribute=\"leading\" constant=\"70\" id=\"5d1-zZ-w9t\"/>\n                            <constraint firstItem=\"MEd-Ts-wNq\" firstAttribute=\"centerX\" secondItem=\"IYZ-aS-pu3\" secondAttribute=\"centerX\" id=\"FOZ-zv-7pF\"/>\n                            <constraint firstItem=\"YXM-7E-mQC\" firstAttribute=\"top\" secondItem=\"Nvh-y7-YSa\" secondAttribute=\"bottom\" constant=\"25\" id=\"HWO-mh-wFY\"/>\n                            <constraint firstItem=\"Lfz-Lg-BC5\" firstAttribute=\"centerX\" secondItem=\"IYZ-aS-pu3\" secondAttribute=\"centerX\" id=\"Pau-O2-AZG\"/>\n                            <constraint firstItem=\"Nvh-y7-YSa\" firstAttribute=\"top\" secondItem=\"MEd-Ts-wNq\" secondAttribute=\"bottom\" constant=\"10\" id=\"QzG-zh-B5P\"/>\n                            <constraint firstItem=\"Lfz-Lg-BC5\" firstAttribute=\"top\" secondItem=\"kMR-1O-tOH\" secondAttribute=\"bottom\" constant=\"-10\" id=\"VtJ-wJ-iSl\"/>\n                            <constraint firstItem=\"Nvh-y7-YSa\" firstAttribute=\"centerX\" secondItem=\"IYZ-aS-pu3\" secondAttribute=\"centerX\" id=\"ZNV-9n-oyk\"/>\n                            <constraint firstItem=\"YXM-7E-mQC\" firstAttribute=\"centerX\" secondItem=\"IYZ-aS-pu3\" secondAttribute=\"centerX\" id=\"d0f-cp-4hG\"/>\n                            <constraint firstItem=\"kMR-1O-tOH\" firstAttribute=\"top\" secondItem=\"IYZ-aS-pu3\" secondAttribute=\"top\" constant=\"10\" id=\"fGI-zS-TS2\"/>\n                            <constraint firstItem=\"7q8-SL-otn\" firstAttribute=\"top\" secondItem=\"YXM-7E-mQC\" secondAttribute=\"bottom\" constant=\"8\" id=\"fjT-Bk-h7o\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"kMR-1O-tOH\" secondAttribute=\"trailing\" constant=\"70\" id=\"oSc-ze-bfC\"/>\n                            <constraint firstItem=\"7q8-SL-otn\" firstAttribute=\"centerX\" secondItem=\"IYZ-aS-pu3\" secondAttribute=\"centerX\" id=\"oww-8s-7zj\"/>\n                            <constraint firstItem=\"kMR-1O-tOH\" firstAttribute=\"centerX\" secondItem=\"IYZ-aS-pu3\" secondAttribute=\"centerX\" id=\"uNw-vm-b7r\"/>\n                        </constraints>\n                    </visualEffectView>\n                    <connections>\n                        <outlet property=\"authButton\" destination=\"YXM-7E-mQC\" id=\"cEh-SD-P9I\"/>\n                        <outlet property=\"helpButton\" destination=\"7q8-SL-otn\" id=\"kzI-Nw-SHf\"/>\n                        <outlet property=\"helpDragAppArrow\" destination=\"xwj-nv-DGc\" id=\"4QJ-El-0QT\"/>\n                        <outlet property=\"helpDragAppSparkle\" destination=\"Sjj-h0-3TO\" id=\"a7S-Yf-njd\"/>\n                    </connections>\n                </viewController>\n                <customObject id=\"zJQ-hQ-SwS\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"334\" y=\"2762\"/>\n        </scene>\n        <!--View Controller-->\n        <scene sceneID=\"zgt-iB-dTL\">\n            <objects>\n                <viewController id=\"hco-oR-00e\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" id=\"0jO-eS-QJ5\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"200\" height=\"394\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <subviews>\n                            <customView identifier=\"helpView\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"LcL-SF-BgB\" userLabel=\"HelpView\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"200\" height=\"394\"/>\n                                <subviews>\n                                    <textField wantsLayer=\"YES\" focusRingType=\"none\" verticalHuggingPriority=\"751\" horizontalCompressionResistancePriority=\"250\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"NtX-EO-KWB\">\n                                        <rect key=\"frame\" x=\"18\" y=\"348\" width=\"164\" height=\"26\"/>\n                                        <textFieldCell key=\"cell\" sendsActionOnEndEditing=\"YES\" state=\"on\" alignment=\"left\" title=\"Not effective?\" id=\"t00-ho-RN1\">\n                                            <font key=\"font\" textStyle=\"title1\" name=\".SFNS-Regular\"/>\n                                            <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        </textFieldCell>\n                                    </textField>\n                                    <textField wantsLayer=\"YES\" focusRingType=\"none\" verticalHuggingPriority=\"749\" horizontalCompressionResistancePriority=\"250\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"AKl-2Z-TEQ\">\n                                        <rect key=\"frame\" x=\"18\" y=\"210\" width=\"164\" height=\"128\"/>\n                                        <textFieldCell key=\"cell\" alignment=\"left\" id=\"1su-Cm-MUc\">\n                                            <font key=\"font\" metaFont=\"system\"/>\n                                            <string key=\"title\">After the update, macOS sometimes fails to authorize correctly.\nRemove Mos from the list first, and then re-add Mos to authorize. (You can also drag the icon above directly)</string>\n                                            <color key=\"textColor\" name=\"secondaryLabelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        </textFieldCell>\n                                    </textField>\n                                    <imageView horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"0Ag-6a-ucG\">\n                                        <rect key=\"frame\" x=\"10\" y=\"0.0\" width=\"180\" height=\"190\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"width\" constant=\"180\" id=\"YD2-xC-JYe\"/>\n                                            <constraint firstAttribute=\"height\" constant=\"190\" id=\"pkq-1d-vAD\"/>\n                                        </constraints>\n                                        <imageCell key=\"cell\" refusesFirstResponder=\"YES\" alignment=\"left\" imageScaling=\"proportionallyDown\" image=\"manual-remove\" id=\"lR9-Fa-uCN\"/>\n                                    </imageView>\n                                </subviews>\n                                <constraints>\n                                    <constraint firstItem=\"0Ag-6a-ucG\" firstAttribute=\"leading\" secondItem=\"LcL-SF-BgB\" secondAttribute=\"leading\" constant=\"10\" id=\"9Kv-RJ-5gy\"/>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"0Ag-6a-ucG\" secondAttribute=\"trailing\" constant=\"10\" id=\"9iQ-tw-ite\"/>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"NtX-EO-KWB\" secondAttribute=\"trailing\" constant=\"20\" id=\"GQI-Bf-CoW\"/>\n                                    <constraint firstItem=\"NtX-EO-KWB\" firstAttribute=\"top\" secondItem=\"LcL-SF-BgB\" secondAttribute=\"top\" constant=\"20\" id=\"K2y-5I-m8d\"/>\n                                    <constraint firstItem=\"0Ag-6a-ucG\" firstAttribute=\"top\" secondItem=\"AKl-2Z-TEQ\" secondAttribute=\"bottom\" constant=\"20\" id=\"RfS-re-Tf4\"/>\n                                    <constraint firstAttribute=\"bottom\" secondItem=\"0Ag-6a-ucG\" secondAttribute=\"bottom\" id=\"WaV-dR-qq1\"/>\n                                    <constraint firstItem=\"AKl-2Z-TEQ\" firstAttribute=\"top\" secondItem=\"NtX-EO-KWB\" secondAttribute=\"bottom\" constant=\"10\" id=\"d92-W5-Jkn\"/>\n                                    <constraint firstItem=\"NtX-EO-KWB\" firstAttribute=\"leading\" secondItem=\"LcL-SF-BgB\" secondAttribute=\"leading\" constant=\"20\" id=\"l3H-Mz-dav\"/>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"AKl-2Z-TEQ\" secondAttribute=\"trailing\" constant=\"20\" id=\"sTH-lt-I6P\"/>\n                                    <constraint firstItem=\"AKl-2Z-TEQ\" firstAttribute=\"leading\" secondItem=\"LcL-SF-BgB\" secondAttribute=\"leading\" constant=\"20\" id=\"yeZ-Mf-8O8\"/>\n                                </constraints>\n                            </customView>\n                        </subviews>\n                        <constraints>\n                            <constraint firstItem=\"LcL-SF-BgB\" firstAttribute=\"top\" secondItem=\"0jO-eS-QJ5\" secondAttribute=\"top\" id=\"Mdn-j3-miI\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"LcL-SF-BgB\" secondAttribute=\"trailing\" id=\"Z3i-0k-Hsc\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"LcL-SF-BgB\" secondAttribute=\"bottom\" id=\"h0u-OW-PFx\"/>\n                            <constraint firstItem=\"LcL-SF-BgB\" firstAttribute=\"leading\" secondItem=\"0jO-eS-QJ5\" secondAttribute=\"leading\" id=\"rYa-nR-vOQ\"/>\n                        </constraints>\n                    </view>\n                </viewController>\n                <customObject id=\"PRu-Fo-oUr\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"335\" y=\"3512\"/>\n        </scene>\n        <!--Scroll Reverse Detail Settings Popover View Controller-->\n        <scene sceneID=\"Bqh-wS-uAC\">\n            <objects>\n                <viewController id=\"LBo-ML-z89\" customClass=\"ScrollReverseDetailSettingsPopoverViewController\" customModule=\"Mos\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" id=\"WvQ-ub-c9c\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"215\" height=\"78\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <subviews>\n                            <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"TFF-pD-Z2q\">\n                                <rect key=\"frame\" x=\"20\" y=\"44\" width=\"175\" height=\"14\"/>\n                                <buttonCell key=\"cell\" type=\"check\" title=\"Vertical Reverse\" bezelStyle=\"regularSquare\" imagePosition=\"left\" controlSize=\"small\" state=\"on\" inset=\"2\" id=\"qjy-uD-jMy\">\n                                    <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"smallSystem\"/>\n                                </buttonCell>\n                                <connections>\n                                    <action selector=\"verticalReverseToggle:\" target=\"LBo-ML-z89\" id=\"ykH-L3-rcX\"/>\n                                </connections>\n                            </button>\n                            <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"8a7-bc-h9m\">\n                                <rect key=\"frame\" x=\"20\" y=\"20\" width=\"175\" height=\"14\"/>\n                                <buttonCell key=\"cell\" type=\"check\" title=\"Horizontal Reverse\" bezelStyle=\"regularSquare\" imagePosition=\"left\" controlSize=\"small\" state=\"on\" inset=\"2\" id=\"eVu-TE-yMr\">\n                                    <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"smallSystem\"/>\n                                </buttonCell>\n                                <connections>\n                                    <action selector=\"horizontalReverseToggle:\" target=\"LBo-ML-z89\" id=\"tKR-yj-4ci\"/>\n                                </connections>\n                            </button>\n                        </subviews>\n                        <constraints>\n                            <constraint firstItem=\"8a7-bc-h9m\" firstAttribute=\"top\" secondItem=\"TFF-pD-Z2q\" secondAttribute=\"bottom\" constant=\"10\" id=\"8Sa-Tm-9e7\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"8a7-bc-h9m\" secondAttribute=\"bottom\" constant=\"20\" symbolic=\"YES\" id=\"JYp-3Y-gsM\"/>\n                            <constraint firstItem=\"TFF-pD-Z2q\" firstAttribute=\"leading\" secondItem=\"WvQ-ub-c9c\" secondAttribute=\"leading\" constant=\"20\" id=\"SIf-SC-tDT\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"TFF-pD-Z2q\" secondAttribute=\"trailing\" constant=\"20\" id=\"Sq4-ET-ycg\"/>\n                            <constraint firstItem=\"8a7-bc-h9m\" firstAttribute=\"trailing\" secondItem=\"TFF-pD-Z2q\" secondAttribute=\"trailing\" id=\"fbv-wR-tVm\"/>\n                            <constraint firstItem=\"8a7-bc-h9m\" firstAttribute=\"leading\" secondItem=\"TFF-pD-Z2q\" secondAttribute=\"leading\" id=\"pFG-is-DeP\"/>\n                            <constraint firstItem=\"TFF-pD-Z2q\" firstAttribute=\"top\" secondItem=\"WvQ-ub-c9c\" secondAttribute=\"top\" constant=\"20\" symbolic=\"YES\" id=\"pwe-4v-3Qi\"/>\n                        </constraints>\n                    </view>\n                    <connections>\n                        <outlet property=\"horizontalReverseCheckBox\" destination=\"8a7-bc-h9m\" id=\"ZdF-VD-uUu\"/>\n                        <outlet property=\"verticalReverseCheckBox\" destination=\"TFF-pD-Z2q\" id=\"PdB-uz-mY2\"/>\n                    </connections>\n                </viewController>\n                <customObject id=\"bGO-iO-70m\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1311\" y=\"2169\"/>\n        </scene>\n    </scenes>\n    <inferredMetricsTieBreakers>\n        <segue reference=\"i8p-Ht-8EX\"/>\n    </inferredMetricsTieBreakers>\n    <resources>\n        <image name=\"AlipayLogo\" width=\"432\" height=\"150\"/>\n        <image name=\"AlipayQR\" width=\"256\" height=\"256\"/>\n        <image name=\"BuyMeACoffee\" width=\"195\" height=\"40\"/>\n        <image name=\"MEOW\" width=\"3024\" height=\"4032\"/>\n        <image name=\"NSAddTemplate\" width=\"18\" height=\"17\"/>\n        <image name=\"NSApplicationIcon\" width=\"32\" height=\"32\"/>\n        <image name=\"NSIconViewTemplate\" width=\"19\" height=\"18\"/>\n        <image name=\"NSRemoveTemplate\" width=\"18\" height=\"5\"/>\n        <image name=\"NSStopProgressFreestandingTemplate\" width=\"20\" height=\"20\"/>\n        <image name=\"NSTouchBarSearchTemplate\" width=\"20\" height=\"20\"/>\n        <image name=\"PaypalLogo\" width=\"200\" height=\"51\"/>\n        <image name=\"SF.app.background.dotted\" width=\"135\" height=\"135\"/>\n        <image name=\"SF.arrow.clockwise\" width=\"135\" height=\"135\"/>\n        <image name=\"SF.arrow.triangle.capsulepath\" width=\"135\" height=\"135\"/>\n        <image name=\"SF.button.horizontal.top.press\" width=\"135\" height=\"135\"/>\n        <image name=\"SF.circle.dotted.circle\" width=\"135\" height=\"135\"/>\n        <image name=\"SF.gearshape\" width=\"135\" height=\"135\"/>\n        <image name=\"SF.lasso.badge.sparkles\" width=\"135\" height=\"135\"/>\n        <image name=\"SF.person.crop.circle.dashed\" width=\"135\" height=\"135\"/>\n        <image name=\"SF.scribble\" width=\"100\" height=\"86\"/>\n        <image name=\"WechatpayLogo\" width=\"442\" height=\"150\"/>\n        <image name=\"WechatpayQR\" width=\"256\" height=\"256\"/>\n        <image name=\"drag-arrow\" width=\"240\" height=\"240\"/>\n        <image name=\"manual-remove\" width=\"167\" height=\"190\"/>\n        <image name=\"sparkle\" width=\"240\" height=\"240\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "Mos/ButtonCore/ButtonCore.swift",
    "content": "//\n//  ButtonCore.swift\n//  Mos\n//  鼠标按钮事件截取与处理核心类\n//  Created by Claude on 2025/8/10.\n//  Copyright © 2025年 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nclass ButtonCore {\n    \n    // 单例\n    static let shared = ButtonCore()\n    init() { NSLog(\"Module initialized: ButtonCore\") }\n    \n    // 执行状态\n    var isActive = false\n    \n    // 拦截层\n    var eventInterceptor: Interceptor?\n\n    // 组合的按钮事件掩码\n    let leftDown = CGEventMask(1 << CGEventType.leftMouseDown.rawValue)\n    let rightDown = CGEventMask(1 << CGEventType.rightMouseDown.rawValue)\n    let otherDown = CGEventMask(1 << CGEventType.otherMouseDown.rawValue)\n    let keyDown = CGEventMask(1 << CGEventType.keyDown.rawValue)\n    let flagsChanged = CGEventMask(1 << CGEventType.flagsChanged.rawValue)\n    var eventMask: CGEventMask {\n        return leftDown | rightDown | otherDown | keyDown\n    }\n\n    // MARK: - 按钮事件处理\n    let buttonEventCallBack: CGEventTapCallBack = { (proxy, type, event, refcon) in\n        let mosEvent = MosInputEvent(fromCGEvent: event)\n        let result = MosInputProcessor.shared.process(mosEvent)\n        switch result {\n        case .consumed:\n            return nil\n        case .passthrough:\n            return Unmanaged.passUnretained(event)\n        }\n    }\n    \n    // MARK: - 启用和禁用\n    \n    // 启用按钮监控\n    func enable() {\n        if !isActive {\n            NSLog(\"ButtonCore enabled\")\n            do {\n                eventInterceptor = try Interceptor(\n                    event: eventMask,\n                    handleBy: buttonEventCallBack,\n                    listenOn: .cgAnnotatedSessionEventTap,\n                    placeAt: .tailAppendEventTap,\n                    for: .defaultTap\n                )\n                isActive = true\n            } catch {\n                NSLog(\"ButtonCore: Failed to create interceptor: \\(error)\")\n            }\n        }\n    }\n    \n    // 禁用按钮监控\n    func disable() {\n        if isActive {\n            NSLog(\"ButtonCore disabled\")\n            eventInterceptor?.stop()\n            eventInterceptor = nil\n            isActive = false\n        }\n    }\n    \n    // 切换状态\n    func toggle() {\n        isActive ? disable() : enable()\n    }\n}\n"
  },
  {
    "path": "Mos/ButtonCore/ButtonFilter.swift",
    "content": "//\n//  ButtonFilter.swift\n//  Mos\n//  鼠标按钮事件过滤器\n//  Created by Claude on 2025/8/10.\n//  Copyright © 2025年 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nclass ButtonFilter {\n    \n    // 单例\n    static let shared = ButtonFilter()\n    init() { NSLog(\"Module initialized: ButtonFilter\") }\n    \n    // 过滤规则\n    private var blockedApplications: Set<String> = []\n    \n    // MARK: - 事件过滤\n    \n    /// 过滤按钮事件\n    /// - Parameter event: 输入的 CGEvent\n    /// - Returns: 处理后的 CGEvent，如果为 nil 则表示事件被过滤掉\n    func filterButtonEvent(_ event: CGEvent) -> CGEvent? {\n\n        // 检查应用程序黑名单\n        if isCurrentApplicationBlocked() {\n            return nil\n        }\n\n        // 返回原始事件(目前不做修改)\n        return event\n    }\n    \n    /// 添加阻止的应用程序\n    func addBlockedApplication(_ bundleIdentifier: String) {\n        blockedApplications.insert(bundleIdentifier)\n    }\n    \n    /// 移除阻止的应用程序\n    func removeBlockedApplication(_ bundleIdentifier: String) {\n        blockedApplications.remove(bundleIdentifier)\n    }\n\n    \n    // MARK: - 辅助方法\n    \n    /// 检查当前应用程序是否在黑名单中\n    private func isCurrentApplicationBlocked() -> Bool {\n        guard let frontmostApp = NSWorkspace.shared.frontmostApplication,\n              let bundleId = frontmostApp.bundleIdentifier else {\n            return false\n        }\n        \n        return blockedApplications.contains(bundleId)\n    }\n\n    /// 获取当前前台应用程序信息\n    func getCurrentApplicationInfo() -> (name: String, bundleId: String)? {\n        guard let frontmostApp = NSWorkspace.shared.frontmostApplication,\n              let bundleId = frontmostApp.bundleIdentifier else {\n            return nil\n        }\n        \n        let appName = frontmostApp.localizedName ?? \"Unknown\"\n        return (name: appName, bundleId: bundleId)\n    }\n}\n"
  },
  {
    "path": "Mos/ButtonCore/ButtonUtils.swift",
    "content": "//\n//  ButtonUtils.swift\n//  Mos\n//  按钮绑定工具类 - 获取配置和管理绑定\n//  Created by Claude on 2025/8/10.\n//  Copyright © 2025年 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nclass ButtonUtils {\n\n    // 单例\n    static let shared = ButtonUtils()\n    init() {}\n\n    // MARK: - 获取按钮绑定配置\n\n    /// 获取当前应用的按钮绑定配置\n    /// - Returns: 按钮绑定列表\n    func getButtonBindings() -> [ButtonBinding] {\n        // 预留: 未来支持分应用配置\n        // if let app = getTargetApplication(),\n        //    let appBindings = app.buttons?.binding {\n        //     return appBindings\n        // }\n\n        // 使用全局配置\n        return Options.shared.buttons.binding\n    }\n\n    // MARK: - 分应用支持 (预留接口)\n\n    /// 获取当前焦点应用的配置对象 (预留)\n    /// - Returns: Application 对象或 nil\n    private func getTargetApplication() -> Application? {\n        // 预留: 未来实现类似 ScrollUtils.getTargetApplication 的逻辑\n        // let runningApp = NSWorkspace.shared.frontmostApplication\n        // return Options.shared.application.applications.first { $0.bundleId == runningApp?.bundleIdentifier }\n        return nil\n    }\n}\n"
  },
  {
    "path": "Mos/Components/AdaptivePopover.swift",
    "content": "//\n//  AdaptivePopover.swift\n//  Mos\n//  Popover tip view that auto-sizes based on content\n//  Created by Caldis on 2025/10/03.\n//  Copyright © 2025年 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nclass AdaptivePopover: NSViewController {\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        updatePreferredContentSize()\n    }\n\n    override func viewDidLayout() {\n        super.viewDidLayout()\n        updatePreferredContentSize()\n    }\n\n    func updatePreferredContentSize() {\n        view.layout()\n\n        let subviews = view.subviews\n\n        let contentView = subviews.first!\n        var contentSize = contentView.intrinsicContentSize\n        if contentSize.equalTo(.zero) {\n            contentSize = contentView.fittingSize\n        }\n\n        // Add padding (12pt horizontal, 10pt vertical based on constraints)\n        let width = contentSize.width + 24\n        let height = contentSize.height + 20\n\n        preferredContentSize = NSSize(width: width, height: height)\n    }\n\n}\n"
  },
  {
    "path": "Mos/Components/BrandTag.swift",
    "content": "//\n//  BrandTag.swift\n//  Mos\n//  统一的品牌标签渲染工具 - 支持多厂商品牌标识\n//  Created by Mos on 2026/3/19.\n//  Copyright © 2026 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\n/// 品牌标签配置\nstruct BrandTagConfig {\n    let name: String           // 标签文字 (如 \"Logi\")\n    let bgColor: NSColor       // 背景色\n    let textColor: NSColor     // 文字色\n\n    // MARK: - 内置品牌\n\n    /// Logitech: 绿底黑字\n    static let logi = BrandTagConfig(\n        name: \"Logi\",\n        bgColor: NSColor(calibratedRed: 0.0, green: 0.992, blue: 0.812, alpha: 1.0),  // #00FDCF\n        textColor: NSColor(calibratedWhite: 0.15, alpha: 1.0)\n    )\n}\n\n/// 品牌标签渲染工具\nstruct BrandTag {\n\n    // MARK: - 判断\n\n    /// 按键码是否属于某个品牌\n    static func isLogiCode(_ code: UInt16) -> Bool {\n        return LogitechCIDMap.isLogitechCode(code)\n    }\n\n    /// 快捷键 ID 是否属于某个品牌\n    static func isLogiAction(_ identifier: String) -> Bool {\n        return identifier.hasPrefix(\"logi\")\n    }\n\n    /// 获取按键码对应的品牌配置 (nil = 非品牌按键)\n    static func brandForCode(_ code: UInt16) -> BrandTagConfig? {\n        if isLogiCode(code) { return .logi }\n        return nil\n    }\n\n    /// 获取快捷键 ID 对应的品牌配置 (nil = 非品牌动作)\n    static func brandForAction(_ identifier: String) -> BrandTagConfig? {\n        if isLogiAction(identifier) { return .logi }\n        return nil\n    }\n\n    // MARK: - 标签文字 (用于 NSButton.title 等纯文本场景)\n\n    /// 在名称前添加品牌前缀 (纯文本 fallback)\n    static func prefixedName(_ name: String, brand: BrandTagConfig) -> String {\n        return \"[\\(brand.name)] \\(name)\"\n    }\n\n    /// 创建带品牌 tag 的 NSAttributedString (用于 NSButton.attributedTitle)\n    /// 渲染为: [彩色tag] + 空格 + 按键名\n    static func attributedTitle(_ name: String, brand: BrandTagConfig, fontSize: CGFloat = 12) -> NSAttributedString {\n        let result = NSMutableAttributedString()\n\n        // Tag 部分: 品牌名 + 圆角背景\n        let tagAttrs: [NSAttributedString.Key: Any] = [\n            .font: NSFont.systemFont(ofSize: fontSize - 4, weight: .bold),\n            .foregroundColor: brand.textColor,\n            .backgroundColor: brand.bgColor,\n        ]\n        // 用空格包裹让背景色有 padding 效果\n        result.append(NSAttributedString(string: \" \\(brand.name) \", attributes: tagAttrs))\n\n        // 间距\n        result.append(NSAttributedString(string: \" \", attributes: [.font: NSFont.systemFont(ofSize: fontSize - 4)]))\n\n        // 按键名部分\n        let nameAttrs: [NSAttributedString.Key: Any] = [\n            .font: NSFont.systemFont(ofSize: fontSize),\n            .foregroundColor: NSColor.labelColor,\n        ]\n        result.append(NSAttributedString(string: name, attributes: nameAttrs))\n\n        return result\n    }\n\n    // MARK: - 标签 NSView (用于 KeyPreview 等自定义 View 场景)\n\n    /// 创建独立的品牌标签 View\n    static func createTagView(brand: BrandTagConfig, fontSize: CGFloat = 7, height: CGFloat = 12) -> NSView {\n        let container = NSView()\n        container.wantsLayer = true\n        container.layer?.cornerRadius = 2.5\n        container.layer?.backgroundColor = brand.bgColor.cgColor\n        container.translatesAutoresizingMaskIntoConstraints = false\n\n        let label = NSTextField(labelWithString: brand.name)\n        label.font = NSFont.systemFont(ofSize: fontSize, weight: .bold)\n        label.textColor = brand.textColor\n        label.alignment = .center\n        label.translatesAutoresizingMaskIntoConstraints = false\n        container.addSubview(label)\n\n        NSLayoutConstraint.activate([\n            label.centerXAnchor.constraint(equalTo: container.centerXAnchor),\n            label.centerYAnchor.constraint(equalTo: container.centerYAnchor, constant: -0.5),\n            container.widthAnchor.constraint(equalTo: label.widthAnchor, constant: 5),\n            container.heightAnchor.constraint(equalToConstant: height),\n        ])\n\n        return container\n    }\n\n    // MARK: - 标签 NSImage (用于 NSMenuItem / NSButton / NSPopUpButton 场景)\n\n    /// 创建品牌标签图片\n    static func createTagImage(brand: BrandTagConfig, fontSize: CGFloat = 7, height: CGFloat = 12, padH: CGFloat = 4, marginRight: CGFloat = 2) -> NSImage {\n        let font = NSFont.systemFont(ofSize: fontSize, weight: .bold)\n        let attrs: [NSAttributedString.Key: Any] = [.font: font, .foregroundColor: brand.textColor]\n        let textSize = (brand.name as NSString).size(withAttributes: attrs)\n        let tagWidth = textSize.width + padH * 2\n        let imageSize = NSSize(width: tagWidth + marginRight, height: height)\n\n        let image = NSImage(size: imageSize)\n        image.lockFocus()\n        let bgRect = NSRect(x: 0, y: 0, width: tagWidth, height: height)\n        let bgPath = NSBezierPath(roundedRect: bgRect, xRadius: 3, yRadius: 3)\n        brand.bgColor.setFill()\n        bgPath.fill()\n        let textRect = NSRect(x: padH, y: (height - textSize.height) / 2, width: textSize.width, height: textSize.height)\n        (brand.name as NSString).draw(in: textRect, withAttributes: attrs)\n        image.unlockFocus()\n        image.isTemplate = false\n        return image\n    }\n\n    /// 创建 [品牌标签] + [原图标] 的组合图片\n    static func createPrefixedImage(brand: BrandTagConfig, original: NSImage?, fontSize: CGFloat = 7, tagHeight: CGFloat = 12, gap: CGFloat = 5) -> NSImage {\n        let tagImage = createTagImage(brand: brand, fontSize: fontSize, height: tagHeight)\n        let tagSize = tagImage.size\n        let iconSize = original?.size ?? .zero\n        let totalHeight = max(tagSize.height, iconSize.height)\n        let totalWidth = tagSize.width + (original != nil ? gap + iconSize.width : 0) + 2\n\n        let image = NSImage(size: NSSize(width: totalWidth, height: totalHeight))\n        image.lockFocus()\n        // Tag\n        tagImage.draw(in: NSRect(x: 0, y: (totalHeight - tagSize.height) / 2, width: tagSize.width, height: tagSize.height),\n                      from: .zero, operation: .sourceOver, fraction: 1.0)\n        // Original icon\n        if let icon = original {\n            icon.draw(in: NSRect(x: tagSize.width + gap, y: (totalHeight - iconSize.height) / 2, width: iconSize.width, height: iconSize.height),\n                      from: .zero, operation: .sourceOver, fraction: 1.0)\n        }\n        image.unlockFocus()\n        image.isTemplate = false\n        return image\n    }\n}\n"
  },
  {
    "path": "Mos/Components/DraggingImageView.swift",
    "content": "//\n//  DraggingImageView.swift\n//  Mos\n//\n//  Copyright © 2025年 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nclass DraggingImageView: NSImageView {\n\n    override func awakeFromNib() {\n        super.awakeFromNib()\n        self.isEnabled = true\n    }\n\n    override var mouseDownCanMoveWindow: Bool {\n        return false\n    }\n\n    override func mouseDown(with event: NSEvent) {\n        guard let image = self.image else { return }\n\n        let bundleURL = Bundle.main.bundleURL as NSURL\n        let draggingItem = NSDraggingItem(pasteboardWriter: bundleURL)\n\n        let imageRect = NSRect(x: 0, y: 0, width: image.size.width, height: image.size.height)\n        draggingItem.setDraggingFrame(imageRect, contents: image)\n\n        beginDraggingSession(with: [draggingItem], event: event, source: self)\n    }\n}\n\nextension DraggingImageView: NSDraggingSource {\n    func draggingSession(_ session: NSDraggingSession, sourceOperationMaskFor context: NSDraggingContext) -> NSDragOperation {\n        return .copy\n    }\n}\n"
  },
  {
    "path": "Mos/Components/PrimaryButton.swift",
    "content": "//\n//  PrimaryButton.swift\n//  Mos\n//  带样式的按钮\n//  Created by 陈标 on 2025/9/10.\n//  Copyright © 2025 Caldis. All rights reserved.\n//\n\nimport AppKit\n\nclass PrimaryButton: NSControl {\n\n    private let cornerRadius: CGFloat = 12.0\n    private var isHovered: Bool = false\n    public var onMouseDown: ((PrimaryButton) -> Void)?\n\n    override init(frame frameRect: NSRect) {\n        super.init(frame: frameRect)\n        setupView()\n    }\n\n    required init?(coder: NSCoder) {\n        super.init(coder: coder)\n        setupView()\n    }\n\n    private func setupView() {\n        self.wantsLayer = true\n        self.addTrackingArea(NSTrackingArea(\n            rect: self.bounds,\n            options: [.activeInKeyWindow, .mouseEnteredAndExited, .inVisibleRect],\n            owner: self,\n            userInfo: nil\n        ))\n\n        // 监听外观变化 (兼容 macOS 10.13+)\n        NotificationCenter.default.addObserver(\n            self,\n            selector: #selector(appearanceChanged),\n            name: NSNotification.Name(\"AppleInterfaceThemeChangedNotification\"),\n            object: nil\n        )\n    }\n\n    @objc private func appearanceChanged() {\n        needsDisplay = true\n    }\n\n    deinit {\n        NotificationCenter.default.removeObserver(self)\n    }\n\n    override func draw(_ dirtyRect: NSRect) {\n        super.draw(dirtyRect)\n\n        // 根据 hover 状态选择背景色\n        let fillColor = isHovered\n            ? NSColor.getPrimaryButtonBackgroundHovered(for: self)\n            : NSColor.getPrimaryButtonBackground(for: self)\n\n        // 绘制圆角矩形背景\n        let path = NSBezierPath(roundedRect: bounds.insetBy(dx: 0.5, dy: 0.5), xRadius: cornerRadius, yRadius: cornerRadius)\n        fillColor.setFill()\n        path.fill()\n\n        // 绘制边框\n        NSColor.getPrimaryButtonBorder(for: self).setStroke()\n        path.lineWidth = 1.0\n        path.stroke()\n    }\n\n    override func mouseDown(with event: NSEvent) {\n        super.mouseDown(with: event)\n        onMouseDown?(self)\n    }\n\n    override func mouseEntered(with event: NSEvent) {\n        super.mouseEntered(with: event)\n        isHovered = true\n        needsDisplay = true\n    }\n\n    override func mouseExited(with event: NSEvent) {\n        super.mouseExited(with: event)\n        isHovered = false\n        needsDisplay = true\n    }\n}\n"
  },
  {
    "path": "Mos/Extension/CGEvent+Extensions.swift",
    "content": "//\n//  CGEvent+Extensions.swift\n//  Mos\n//  CGEvent 相关的扩展方法\n//  Created by Claude on 2025/9/13.\n//  Copyright © 2025年 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nextension CGEvent {\n\n    // MARK: - Properties\n\n    /// 格式化修饰键字符串\n    var modifierString: String {\n        var components: [String] = []\n        // SHIFT\n        if flags.contains(.maskShift) { components.append(\"⇧\") }\n        // FN\n        if flags.contains(.maskSecondaryFn) {\n            // 如果是Fn+F键或方向键组合，隐去Fn避免误导\n            if isFunctionKey || isArrowKey {\n                // Fn+F键组合不显示Fn\n            } else {\n                components.append(\"Fn\")\n            }\n        }\n        // CTRL\n        if flags.contains(.maskControl) { components.append(\"⌃\") }\n        // OPTION\n        if flags.contains(.maskAlternate) { components.append(\"⌥\") }\n        // COMMAND\n        if flags.contains(.maskCommand) { components.append(\"⌘\") }\n        // 使用空格拼接\n        return components.joined(separator: \" \")\n    }\n\n    /// 键盘键码 (如果没值就是0)\n    var keyCode: UInt16 {\n        return UInt16(getIntegerValueField(.keyboardEventKeycode))\n    }\n\n    /// 键盘键码名称\n    var keyCodeName: String {\n        return KeyCode.keyMap[keyCode] ?? \"Key(\\(keyCode))\"\n    }\n\n    /// 鼠标键码 (如果没值就是0, 会和鼠标主键冲突, 因此取值之前需要先判断 isMouseEvent)\n    var mouseCode: UInt16 {\n        return UInt16(getIntegerValueField(.mouseEventButtonNumber))\n    }\n\n    var mouseCodeName: String {\n        return KeyCode.mouseMap[mouseCode] ?? \"Mouse(\\(mouseCode))\"\n    }\n\n    /// 修饰键\n    var isModifiers: Bool {\n        KeyCode.modifierKeys.contains(keyCode)\n    }\n    var hasModifiers: Bool {\n        return flags.rawValue & KeyCode.modifiersMask != 0\n    }\n\n    /// 是否按下\n    var isKeyDown: Bool {\n        // 修饰键, 则比对按键是否匹配 mask\n        if type == CGEventType.flagsChanged {\n            return flags.contains(KeyCode.getKeyMask(keyCode))\n        }\n        // 常规情况\n        return type == CGEventType.keyDown\n    }\n    var isKeyUp: Bool {\n        return !isKeyDown\n    }\n\n    /// Command 键\n    var isCommandKey: Bool {\n        return KeyCode.commandKeys.contains(keyCode)\n    }\n    var hasCommandKey: Bool {\n        return flags.rawValue & CGEventFlags.maskCommand.rawValue  != 0\n    }\n\n    /// Option 键\n    var isOptionKey: Bool {\n        return KeyCode.optionKeys.contains(keyCode)\n    }\n    var hasOptionKey: Bool {\n        return flags.rawValue & CGEventFlags.maskAlternate.rawValue  != 0\n    }\n\n    /// Control 键\n    var isControlKey: Bool {\n        return KeyCode.controlKeys.contains(keyCode)\n    }\n    var hasControlKey: Bool {\n        return flags.rawValue & CGEventFlags.maskControl.rawValue  != 0\n    }\n\n    /// Shift 键\n    var isShiftKey: Bool {\n        return KeyCode.shiftKeys.contains(keyCode)\n    }\n    var hasShiftKey: Bool {\n        return flags.rawValue & CGEventFlags.maskShift.rawValue  != 0\n    }\n\n    /// fn 键\n    var isFnKey: Bool {\n        return KeyCode.fnKeys.contains(keyCode)\n    }\n    var hasFnKey: Bool {\n        return flags.rawValue & CGEventFlags.maskSecondaryFn.rawValue  != 0\n    }\n\n    /// 是否为 F* 键\n    var isFunctionKey: Bool {\n        return KeyCode.functionKeys.contains(keyCode)\n    }\n\n    /// 是否为方向键\n    var isArrowKey: Bool {\n        return KeyCode.arrowKeys.contains(keyCode)\n    }\n\n    /// 是否为键盘事件\n    var isKeyboardEvent: Bool {\n        switch type {\n            case .keyDown, .keyUp:\n                return true\n            default:\n                return false\n        }\n    }\n\n    /// 是否为鼠标事件\n    var isMouseEvent: Bool {\n        switch type {\n            case .leftMouseDown, .rightMouseDown, .otherMouseDown:\n                return true\n            default:\n                return false\n        }\n    }\n\n    /// 事件是否有效\n    var isRecordable: Bool {\n        // 键盘事件\n        if isKeyboardEvent {\n            // F键允许无修饰键录制\n            if KeyCode.functionKeys.contains(keyCode) {\n                return true\n            }\n            // 无修饰键不允许被记录\n            if !hasModifiers {\n                return false\n            }\n            // 注意: keyCode 0 是有效按键 \"A\"，不要误判为\"无按键\"\n            // 纯修饰键按下时事件类型是 flagsChanged，不会进入这里\n            return true\n        }\n        // 鼠标事件\n        if isMouseEvent {\n            // 左右键必须包含修饰键\n            if KeyCode.mouseMainKeys.contains(mouseCode) {\n                return hasModifiers\n            }\n            // 侧键等允许无修饰键录制\n            return true\n        }\n        // 其他不做处理\n        return false\n    }\n\n    /// 时间戳\n    var timestampFormatted: String {\n        let formatter = DateFormatter()\n        formatter.dateFormat = \"HH:mm:ss.SSS\"\n        formatter.timeZone = TimeZone.current\n        return formatter.string(from: Date(timeIntervalSince1970: (Double(self.timestamp)) / 1_000_000_000.0))\n    }\n\n    /// 显示名称 (原始分组)\n    var displayComponents: [String] {\n        var components: [String] = []\n        // 修饰键\n        if !modifierString.isEmpty {\n            components.append(modifierString)\n        }\n        // 键盘\n        if isKeyboardEvent {\n            components.append(keyCodeName)\n        }\n        // 鼠标\n        if isMouseEvent {\n            components.append(mouseCodeName)\n        }\n        return components\n    }\n\n    /// 显示名称\n    var displayName: String {\n        return displayComponents.joined(separator: \" + \") // 使用 \"+\" 拼接\n    }\n\n}\n\n"
  },
  {
    "path": "Mos/Extension/NSColor+Extensions.swift",
    "content": "//\n//  NSColor+Extensions.swift\n//  Mos\n//  NSColor 相关的扩展方法\n//  Created by Claude on 2025/10/05\n//  Copyright © 2025年 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nextension NSColor {\n    static let mainBlue = NSColor(calibratedRed: 41/255, green: 108/255, blue: 255/255, alpha: 1.0)\n    static let mainGreen = NSColor(calibratedRed: 0.15, green: 0.65, blue: 0.30, alpha: 1.0)\n    static func getMainLightBlack(for view: NSView?) -> NSColor {\n        return Utils.isDarkMode(for: view)\n            ? NSColor(calibratedWhite: 0.5, alpha: 0.2)\n            : NSColor(calibratedWhite: 0.0, alpha: 0.1)\n    }\n    static func getWarningColor(for view: NSView?) -> NSColor {\n        return Utils.isDarkMode(for: view)\n            ? NSColor(calibratedRed: 0.85, green: 0.25, blue: 0.20, alpha: 1.0)\n            : NSColor(calibratedRed: 0.95, green: 0.35, blue: 0.30, alpha: 1.0)\n    }\n\n    // MARK: - PrimaryButton Colors\n\n    /// PrimaryButton 背景色 (普通状态)\n    static func getPrimaryButtonBackground(for view: NSView?) -> NSColor {\n        return Utils.isDarkMode(for: view)\n            ? NSColor(red: 0.08, green: 0.26, blue: 0.52, alpha: 0.75)\n            : NSColor(red: 0.0, green: 0.478, blue: 1.0, alpha: 0.15)\n    }\n\n    /// PrimaryButton 背景色 (Hover 状态)\n    static func getPrimaryButtonBackgroundHovered(for view: NSView?) -> NSColor {\n        return Utils.isDarkMode(for: view)\n            ? NSColor(red: 0.08, green: 0.26, blue: 0.52, alpha: 0.95)\n            : NSColor(red: 0.0, green: 0.478, blue: 1.0, alpha: 0.25)\n    }\n\n    /// PrimaryButton 边框色\n    static func getPrimaryButtonBorder(for view: NSView?) -> NSColor {\n        return Utils.isDarkMode(for: view)\n            ? NSColor(red: 0.36, green: 0.64, blue: 1.0, alpha: 1.0)\n            : NSColor(red: 0.0, green: 0.478, blue: 1.0, alpha: 0.6)\n    }\n}\n\n"
  },
  {
    "path": "Mos/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIconFile</key>\n\t<string></string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>$(MARKETING_VERSION)</string>\n\t<key>CFBundleURLTypes</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CFBundleIdentifier</key>\n\t\t\t<string></string>\n\t\t\t<key>CFBundleTypeRole</key>\n\t\t\t<string>Editor</string>\n\t\t</dict>\n\t\t<dict/>\n\t</array>\n\t<key>CFBundleVersion</key>\n\t<string>$(CURRENT_PROJECT_VERSION)</string>\n\t<key>LSApplicationCategoryType</key>\n\t<string>public.app-category.utilities</string>\n\t<key>LSMinimumSystemVersion</key>\n\t<string>$(MACOSX_DEPLOYMENT_TARGET)</string>\n\t<key>LSMultipleInstancesProhibited</key>\n\t<false/>\n\t<key>LSUIElement</key>\n\t<true/>\n\t<key>NSAppleEventsUsageDescription</key>\n\t<string>Mos needs to access accessibility to enhance your scrolling.</string>\n\t<key>NSHumanReadableCopyright</key>\n\t<string>© 2017-2026 Caldis. All rights reserved.</string>\n\t<key>NSMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>NSPrincipalClass</key>\n\t<string>NSApplication</string>\n\t<key>SUFeedURL</key>\n\t<string>https://mos.caldis.me/appcast.xml</string>\n\t<key>SUPublicEDKey</key>\n\t<string>zskqekl7thqvIANuR8SLKrfQ4LpqsZckKiDWfcD86JQ=</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Mos/InputEvent/MosInputEvent.swift",
    "content": "//\n//  MosInputEvent.swift\n//  Mos\n//  统一输入事件 - 抽象 CGEventTap 和 HID++ 两种事件源\n//  Created by Mos on 2026/3/16.\n//  Copyright © 2026 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\n// MARK: - MosInputPhase\n/// 事件阶段\nenum MosInputPhase {\n    case down\n    case up\n}\n\n// MARK: - MosInputSource\n/// 事件来源 - 携带源头特有的数据\n/// 注意: 因为 cgEvent 关联值包含 CGEvent (非 Codable), MosInputEvent 整体不可序列化\n/// 只有从中提取的 RecordedEvent 走持久化路径\nenum MosInputSource {\n    /// 来自 CGEventTap, 携带原始 CGEvent 用于 pass-through/consume\n    case cgEvent(CGEvent)\n    /// 来自 Logitech HID++ 协议\n    case hidPlusPlus\n}\n\n// MARK: - MosInputDevice\n/// 设备信息 (可序列化, 用于 DeviceFilter 匹配和 UI 展示)\nstruct MosInputDevice: Codable, Equatable {\n    let vendorId: UInt16      // USB Vendor ID (Logitech = 0x046D)\n    let productId: UInt16     // USB Product ID\n    let name: String          // 人类可读名称 (如 \"MX Master 3S\")\n}\n\n// MARK: - DeviceFilter\n/// 设备过滤器 - 用于 ButtonBinding 中限制触发设备\nstruct DeviceFilter: Codable, Equatable {\n    let vendorId: UInt16?     // nil = 不限厂商\n    let productId: UInt16?    // nil = 不限型号\n\n    func matches(_ device: MosInputDevice?) -> Bool {\n        guard let device = device else { return false }\n        if let vid = vendorId, vid != device.vendorId { return false }\n        if let pid = productId, pid != device.productId { return false }\n        return true\n    }\n}\n\n// MARK: - LogitechCIDMap\n/// Logitech CID -> Mos 按钮码映射\n/// 标准 CGEvent 鼠标按钮: 0~31, Logitech HID++ 专有: 1000+\nstruct LogitechCIDMap {\n    private static let cidToCode: [UInt16: UInt16] = [\n        0x0050: 1003,  // Left Click (diverted)\n        0x0051: 1004,  // Right Click (diverted)\n        0x0052: 1005,  // Middle Click (diverted)\n        0x0053: 1006,  // Back (diverted)\n        0x0056: 1007,  // Forward (diverted)\n        0x00C3: 1000,  // Gesture Button\n        0x00C4: 1001,  // SmartShift\n        0x00D7: 1002,  // DPI Change Button\n    ]\n\n    static func toMosCode(_ cid: UInt16) -> UInt16 {\n        if let known = cidToCode[cid] { return known }\n        let mapped = UInt32(2000) + UInt32(cid)\n        return mapped <= UInt32(UInt16.max) ? UInt16(mapped) : UInt16(cid & 0x0FFF) + 2000\n    }\n\n    static func displayName(forCode code: UInt16) -> String {\n        switch code {\n        case 1000: return \"Gesture\"\n        case 1001: return \"SmartShift\"\n        case 1002: return \"DPI\"\n        case 1003: return \"Left Click\"\n        case 1004: return \"Right Click\"\n        case 1005: return \"Middle Click\"\n        case 1006: return \"Back\"\n        case 1007: return \"Forward\"\n        default:   return \"Logi(\\(code))\"\n        }\n    }\n\n    /// 判断按钮码是否属于 Logitech HID++ 专有范围\n    static func isLogitechCode(_ code: UInt16) -> Bool {\n        return code >= 1000\n    }\n\n    /// 反向映射: Mos code → CID\n    static func toCID(_ mosCode: UInt16) -> UInt16? {\n        if let entry = cidToCode.first(where: { $0.value == mosCode }) {\n            return entry.key\n        }\n        // 反向 fallback (2000 + cid)\n        if mosCode >= 2000 {\n            return mosCode - 2000\n        }\n        return nil\n    }\n}\n\n// MARK: - MosInputEvent\n/// 统一输入事件 (运行时对象, 不可序列化)\nstruct MosInputEvent {\n    let type: EventType           // .keyboard 或 .mouse (复用现有枚举)\n    let code: UInt16              // 按键码 / 按钮码\n    let modifiers: CGEventFlags   // 修饰键状态\n    let phase: MosInputPhase      // 按下 / 抬起\n    let source: MosInputSource    // 事件来源\n    let device: MosInputDevice?   // 设备信息 (CGEventTap 来源为 nil)\n\n    /// 从 CGEvent 构造\n    /// 注意: .flagsChanged 事件也属于键盘域 (修饰键按下/抬起), 必须和 keyDown/keyUp 同类处理\n    /// 这与 ScrollHotkey.init(from: CGEvent) 和 RecordedEvent.init(from: CGEvent) 中的判断一致\n    init(fromCGEvent event: CGEvent) {\n        if event.isKeyboardEvent || event.type == .flagsChanged {\n            self.type = .keyboard\n            self.code = event.keyCode\n        } else {\n            self.type = .mouse\n            self.code = event.mouseCode\n        }\n        self.modifiers = event.flags\n        self.phase = event.isKeyDown ? .down : .up\n        self.source = .cgEvent(event)\n        self.device = nil\n    }\n\n    /// 从 HID++ 数据构造\n    init(type: EventType, code: UInt16, modifiers: CGEventFlags,\n         phase: MosInputPhase, source: MosInputSource, device: MosInputDevice?) {\n        self.type = type\n        self.code = code\n        self.modifiers = modifiers\n        self.phase = phase\n        self.source = source\n        self.device = device\n    }\n\n    // MARK: - Display\n\n    /// 构造展示用名称组件\n    var displayComponents: [String] {\n        var components: [String] = []\n        // 修饰键 (排除自身: 按下 Shift 时 flags 含 .maskShift, 但 keyCode 也是 Shift, 避免重复)\n        let selfMask = KeyCode.getKeyMask(code).rawValue\n        if modifiers.rawValue & CGEventFlags.maskShift.rawValue != 0 && CGEventFlags.maskShift.rawValue & selfMask == 0 { components.append(\"⇧\") }\n        if modifiers.rawValue & CGEventFlags.maskControl.rawValue != 0 && CGEventFlags.maskControl.rawValue & selfMask == 0 { components.append(\"⌃\") }\n        if modifiers.rawValue & CGEventFlags.maskAlternate.rawValue != 0 && CGEventFlags.maskAlternate.rawValue & selfMask == 0 { components.append(\"⌥\") }\n        if modifiers.rawValue & CGEventFlags.maskCommand.rawValue != 0 && CGEventFlags.maskCommand.rawValue & selfMask == 0 { components.append(\"⌘\") }\n        // 按键名称\n        switch type {\n        case .keyboard:\n            components.append(KeyCode.keyMap[code] ?? \"Key(\\(code))\")\n        case .mouse:\n            if LogitechCIDMap.isLogitechCode(code) {\n                components.append(LogitechCIDMap.displayName(forCode: code))\n                components.append(\"[Logi]\")  // 特殊标记, KeyPreview 渲染为 tag\n            } else {\n                components.append(KeyCode.mouseMap[code] ?? \"Mouse(\\(code))\")\n            }\n        }\n        return components\n    }\n\n    /// 是否为键盘事件\n    var isKeyboardEvent: Bool { type == .keyboard }\n\n    /// 是否为鼠标事件\n    var isMouseEvent: Bool { type == .mouse }\n\n    /// 是否有修饰键\n    var hasModifiers: Bool {\n        return modifiers.rawValue & KeyCode.modifiersMask != 0\n    }\n\n    /// 事件是否可录制 (combination 模式)\n    var isRecordable: Bool {\n        switch type {\n        case .keyboard:\n            if KeyCode.functionKeys.contains(code) { return true }\n            if !hasModifiers { return false }\n            return true\n        case .mouse:\n            if LogitechCIDMap.isLogitechCode(code) { return true }\n            if KeyCode.mouseMainKeys.contains(code) { return hasModifiers }\n            return true\n        }\n    }\n\n    /// 事件是否可录制 (singleKey 模式)\n    /// 注意: 修饰键 (.flagsChanged) 只在 key-down 时录制, key-up 忽略\n    /// 这与原 KeyRecorder.isRecordableAsSingleKey 中 event.isKeyDown && event.isModifiers 逻辑一致\n    var isRecordableAsSingleKey: Bool {\n        switch type {\n        case .keyboard:\n            if KeyCode.modifierKeys.contains(code) {\n                return phase == .down\n            }\n            return true\n        case .mouse:\n            if KeyCode.mouseMainKeys.contains(code) { return false }\n            return true\n        }\n    }\n}\n"
  },
  {
    "path": "Mos/InputEvent/MosInputProcessor.swift",
    "content": "//\n//  MosInputProcessor.swift\n//  Mos\n//  统一事件处理器 - 接收 MosInputEvent, 匹配 ButtonBinding, 执行动作\n//  Created by Mos on 2026/3/16.\n//  Copyright © 2026 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\n// MARK: - MosInputResult\n/// 事件处理结果\nenum MosInputResult {\n    case consumed     // 事件已处理,不再传递\n    case passthrough  // 事件未匹配,继续传递\n}\n\n// MARK: - MosInputProcessor\n/// 统一事件处理器 (无状态单例)\n/// 从 ButtonUtils 获取绑定配置, 匹配 MosInputEvent, 执行 ShortcutExecutor\nclass MosInputProcessor {\n    static let shared = MosInputProcessor()\n    init() { NSLog(\"Module initialized: MosInputProcessor\") }\n\n    /// 处理输入事件\n    /// - Parameter event: 统一输入事件\n    /// - Returns: .consumed 表示事件已处理, .passthrough 表示未匹配\n    func process(_ event: MosInputEvent) -> MosInputResult {\n        // 只处理按下事件 (避免 down+up 触发两次)\n        guard event.phase == .down else { return .passthrough }\n\n        let bindings = ButtonUtils.shared.getButtonBindings()\n        guard let binding = bindings.first(where: {\n            $0.triggerEvent.matchesMosInput(event) && $0.isEnabled\n        }) else {\n            return .passthrough\n        }\n\n        ShortcutExecutor.shared.execute(named: binding.systemShortcutName)\n        return .consumed\n    }\n}\n"
  },
  {
    "path": "Mos/Keys/KeyCode.swift",
    "content": "//\n//  KeyCode.swift\n//  Mos\n//  键盘和事件相关的常量定义\n//  Created by Claude on 2025/9/13.\n//  Copyright © 2025年 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nstruct KeyCode {\n    /// 修饰键\n    static let commandL: UInt16 = 55\n    static let commandR: UInt16 = 54\n    static let shiftL: UInt16 = 56\n    static let shiftR: UInt16 = 60\n    static let optionL: UInt16 = 58\n    static let optionR: UInt16 = 61\n    static let controlL: UInt16 = 59\n    static let controlR: UInt16 = 62\n    static let fnL: UInt16 = 63\n    static let fnR: UInt16 = 179\n    static let commandKeys: Set<UInt16> = [KeyCode.commandL, KeyCode.commandR]\n    static let shiftKeys: Set<UInt16> = [KeyCode.shiftL, KeyCode.shiftR]\n    static let optionKeys: Set<UInt16> = [KeyCode.optionL, KeyCode.optionR]\n    static let controlKeys: Set<UInt16> = [KeyCode.controlL, KeyCode.controlR]\n    static let fnKeys: Set<UInt16> = [KeyCode.fnL, KeyCode.fnR]\n    static let modifierKeys: Set<UInt16> = [\n        KeyCode.controlL,\n        KeyCode.controlR,\n        KeyCode.optionL,\n        KeyCode.optionR,\n        KeyCode.commandL,\n        KeyCode.commandR,\n        KeyCode.shiftL,\n        KeyCode.shiftR,\n        KeyCode.fnL,\n        KeyCode.fnR\n    ]\n    static let modifierLKeys = [KeyCode.controlL, KeyCode.optionL, KeyCode.commandL, KeyCode.shiftL]\n    static let modifierRKeys = [KeyCode.controlL, KeyCode.optionL, KeyCode.commandL, KeyCode.shiftL]\n    // 掩码\n    static let modifiersMask: UInt64 =\n        CGEventFlags.maskControl.rawValue |\n        CGEventFlags.maskAlternate.rawValue |\n        CGEventFlags.maskCommand.rawValue |\n        CGEventFlags.maskShift.rawValue\n    static let keyCodeToMask: [UInt16: CGEventFlags] = [\n        KeyCode.controlL: .maskControl,\n        KeyCode.controlR: .maskControl,\n        KeyCode.optionL: .maskAlternate,\n        KeyCode.optionR: .maskAlternate,\n        KeyCode.commandL: .maskCommand,\n        KeyCode.commandR: .maskCommand,\n        KeyCode.shiftL: .maskShift,\n        KeyCode.shiftR: .maskShift,\n        KeyCode.fnL: .maskSecondaryFn,\n        KeyCode.fnR: .maskSecondaryFn,\n    ]\n    static func getKeyMask(_ keyCode: UInt16) -> CGEventFlags {\n        return keyCodeToMask[keyCode] ?? CGEventFlags(rawValue: 0)\n    }\n\n    /// F键系列\n    static let F1: UInt16 = 122\n    static let F2: UInt16 = 120\n    static let F3: UInt16 = 99\n    static let F4: UInt16 = 118\n    static let F5: UInt16 = 96\n    static let F6: UInt16 = 97\n    static let F7: UInt16 = 98\n    static let F8: UInt16 = 100\n    static let F9: UInt16 = 101\n    static let F10: UInt16 = 109\n    static let F11: UInt16 = 103\n    static let F12: UInt16 = 111\n    static let F13: UInt16 = 105\n    static let F14: UInt16 = 107\n    static let F15: UInt16 = 113\n    static let F16: UInt16 = 106\n    static let F17: UInt16 = 64\n    static let F18: UInt16 = 79\n    static let F19: UInt16 = 80\n    static let F20: UInt16 = 90\n    static let functionKeys: Set<UInt16> = [\n        KeyCode.F1,\n        KeyCode.F2,\n        KeyCode.F3,\n        KeyCode.F4,\n        KeyCode.F5,\n        KeyCode.F6,\n        KeyCode.F7,\n        KeyCode.F8,\n        KeyCode.F9,\n        KeyCode.F10,\n        KeyCode.F11,\n        KeyCode.F12,\n        KeyCode.F13,\n        KeyCode.F14,\n        KeyCode.F15,\n        KeyCode.F16,\n        KeyCode.F17,\n        KeyCode.F18,\n        KeyCode.F19,\n        KeyCode.F20\n    ]\n\n    /// 方向系列\n    static let arrowUp: UInt16 = 126\n    static let arrowDown: UInt16 = 125\n    static let arrowLeft: UInt16 = 123\n    static let arrowRight: UInt16 = 124\n    static let arrowKeys: Set<UInt16> = [\n        KeyCode.arrowUp,\n        KeyCode.arrowDown,\n        KeyCode.arrowLeft,\n        KeyCode.arrowRight\n    ]\n\n    /// 其他\n    static let escape: UInt16 = 53\n\n    /// 键盘字符映射\n    /// https://eastmanreference.com/complete-list-of-applescript-key-codes\n    static let keyMap: [UInt16: String] = [\n        // 字母键\n        0: \"A\", 1: \"S\", 2: \"D\", 3: \"F\", 4: \"H\", 5: \"G\", 6: \"Z\", 7: \"X\", 8: \"C\", 9: \"V\",\n        11: \"B\", 12: \"Q\", 13: \"W\", 14: \"E\", 15: \"R\", 16: \"Y\", 17: \"T\",\n        31: \"O\", 32: \"U\", 34: \"I\", 35: \"P\", 37: \"L\", 38: \"J\", 40: \"K\", 45: \"N\", 46: \"M\",\n        // 数字键\n        18: \"1\", 19: \"2\", 20: \"3\", 21: \"4\", 22: \"6\", 23: \"5\", 26: \"7\", 28: \"8\", 29: \"0\", 25: \"9\",\n        // 符号键\n        24: \"=\", 27: \"-\", 30: \"]\", 33: \"[\", 39: \"'\", 41: \";\", 42: \"\\\\\", 43: \",\", 44: \"/\", 47: \".\", 50: \"`\",\n        // 特殊键\n        49: \"⎵\", 51: \"⌫\", 53: \"⎋\", 76: \"↩\", 36: \"↩\", 48: \"↹\", 57: \"CapsLock\",\n        // F区\n        122: \"F1\", 120: \"F2\", 99: \"F3\", 118: \"F4\", 96: \"F5\", 97: \"F6\", 98: \"F7\", 100: \"F8\",\n        101: \"F9\", 109: \"F10\", 103: \"F11\", 111: \"F12\", 105: \"F13\", 107: \"F14\", 113: \"F15\",\n        106: \"F16\", 64: \"F17\", 79: \"F18\", 80: \"F19\", 90: \"F20\",\n        // F区: 不按 FN 时触发的键 (其他录制不到) 而且录制时会自带 FN 的 flag\n        160: \"F3 (MissionControl)\", // 调度中心\n        177: \"F4 (Spotlight)\", // 搜索\n        131: \"F4 (AppExposé)\", // 显示所有窗口 (新款的键盘这个位置都是 Spotlight 了\n        176: \"F5 (Dictating)\", // 听写\n        178: \"F6 (DND)\", // 勿扰\n        // Direction\n        126: \"↑\", 125: \"↓\", 123: \"←\", 124: \"→\",\n        // Navigation (FN + Direction)\n        116: \"PageUp\", 121: \"PageDown\", 115: \"Home\", 119: \"End\",\n        // Modifier keys\n        63: \"Fn\", 59: \"⌃\", 58: \"⌥\", 55: \"⌘\", 56: \"⇧\",\n        62: \"⌃ (R)\", 61: \"⌥ (R)\", 54: \"⌘ (R)\", 60: \"⇧ (R)\", // 键盘不会直接触发这些右侧修饰键, 但是系统预留了\n        179: \"Fn (179)\", // 179 可以通过双击 FN 触发\n    ]\n\n    /// 鼠标字符映射\n    static let mouseMap: [UInt16: String] = [\n        // 主要\n        0: \"🖱L\", 1: \"🖱R\", 2: \"🖱M\",\n        // 其他鼠标按键\n        3: \"🖱3\", 4: \"🖱4\", 5: \"🖱5\", 6: \"🖱6\", 7: \"🖱7\", 8: \"🖱8\",\n        9: \"🖱9\", 10: \"🖱10\", 11: \"🖱11\", 12: \"🖱12\", 13: \"🖱13\",\n        14: \"🖱14\", 15: \"🖱15\", 16: \"🖱16\", 17: \"🖱17\", 18: \"🖱18\",\n        19: \"🖱19\", 20: \"🖱20\",\n        // Logitech HID++ 专有按键\n        1000: \"Gesture\", 1001: \"SmartShift\", 1002: \"DPI\",\n        1003: \"Left Click\", 1004: \"Right Click\",\n        1005: \"Middle Click\", 1006: \"Back\", 1007: \"Forward\",\n    ]\n    static let mouseMainKeys: [UInt16] = [0,1]  // Only protect left/right clicks, allow middle button without modifiers\n}\n"
  },
  {
    "path": "Mos/Keys/KeyPopover.swift",
    "content": "//\n//  KeyPopover.swift\n//  Mos\n//  录制按键时显示的 Popover UI 组件\n//  Created by Claude on 2025/9/13.\n//  Copyright © 2025年 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nclass KeyPopover: NSObject {\n\n    // MARK: - Properties\n    private var popover: NSPopover?\n    var keyPreview: KeyPreview!\n    private var escHintLabel: NSTextField?\n    private var escHintHeightConstraint: NSLayoutConstraint?\n    private var contentView: NSView?\n\n    // MARK: - Constants\n    private let baseHeight: CGFloat = 45\n    private let hintHeight: CGFloat = 18\n\n    // MARK: - Visibility\n    /// 显示录制 popover\n    func show(at sourceView: NSView) {\n        hide() // 确保之前的 popover 被关闭\n        setupPopover()\n        popover?.show(relativeTo: sourceView.bounds, of: sourceView, preferredEdge: .maxY)\n    }\n\n    /// 隐藏 popover\n    func hide() {\n        popover?.close()\n        popover = nil\n    }\n\n    // MARK: - Public Methods\n    /// 显示 ESC 退出提示\n    func showEscHint() {\n        guard let label = escHintLabel,\n              let heightConstraint = escHintHeightConstraint,\n              heightConstraint.constant == 0 else { return }\n\n        // 动画展开提示\n        NSAnimationContext.runAnimationGroup({ context in\n            context.duration = ANIMATION.duration\n            context.allowsImplicitAnimation = true\n            label.animator().alphaValue = 1\n            heightConstraint.animator().constant = hintHeight\n        }, completionHandler: { [weak self] in\n            guard let self = self else { return }\n            // 更新 popover 尺寸\n            self.contentView?.layout()\n            if let size = self.contentView?.fittingSize {\n                self.popover?.contentSize = size\n            }\n        })\n    }\n\n    // MARK: - Private Methods\n    private func getContentView() -> NSView {\n        let view = NSView()\n        view.wantsLayer = true\n        contentView = view\n\n        // 创建按键显示组件\n        keyPreview = KeyPreview()\n        keyPreview.translatesAutoresizingMaskIntoConstraints = false\n\n        // 创建 ESC 提示标签\n        let hintLabel = NSTextField(labelWithString: NSLocalizedString(\"Press ESC to cancel recording\", comment: \"ESC hint in key recording popover\"))\n        hintLabel.font = NSFont.systemFont(ofSize: 10)\n        hintLabel.textColor = NSColor.secondaryLabelColor\n        hintLabel.alignment = .center\n        hintLabel.translatesAutoresizingMaskIntoConstraints = false\n        hintLabel.alphaValue = 0\n        hintLabel.setContentHuggingPriority(.required, for: .vertical)\n        escHintLabel = hintLabel\n\n        // 创建高度约束（初始为 0）\n        let heightConstraint = hintLabel.heightAnchor.constraint(equalToConstant: 0)\n        escHintHeightConstraint = heightConstraint\n\n        // 添加到内容视图\n        view.addSubview(keyPreview)\n        view.addSubview(hintLabel)\n\n        // 设置约束\n        NSLayoutConstraint.activate([\n            // 按键显示约束\n            keyPreview.centerXAnchor.constraint(equalTo: view.centerXAnchor),\n            keyPreview.topAnchor.constraint(equalTo: view.topAnchor, constant: 10),\n\n            // ESC 提示约束\n            hintLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor),\n            hintLabel.topAnchor.constraint(equalTo: keyPreview.bottomAnchor, constant: 4),\n            hintLabel.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -10),\n            heightConstraint,\n\n            // 内容视图宽度约束\n            view.widthAnchor.constraint(greaterThanOrEqualToConstant: 165),\n        ])\n\n        return view\n    }\n\n    private func setupPopover() {\n        let newPopover = NSPopover()\n        newPopover.contentViewController = NSViewController()\n        newPopover.contentViewController?.view = getContentView()\n        newPopover.behavior = .transient\n        popover = newPopover\n    }\n}\n"
  },
  {
    "path": "Mos/Keys/KeyPreview.swift",
    "content": "//\n//  KeyPreview.swift\n//  Mos\n//  可复用的按键显示组件\n//  Created by Claude on 2025/9/13.\n//  Copyright © 2025年 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nclass KeyPreview: NSStackView {\n\n    // MARK: - Constants\n    static let VIEW_SIZE = CGFloat(25)\n    static let FONT_SIZE = CGFloat(11)\n    static let WAITING_WORDING = \"?\"\n\n    // MARK: - Configuration\n    enum Status {\n        case normal        // 普通状态\n        case recorded      // 已录制状态（绿色背景）\n        case duplicate     // 重复录制状态（蓝色背景）\n        case recording     // 录制中状态（呼吸动画）\n    }\n\n    // MARK: - Private Properties\n    private var keyComponents: [String] = []\n    private var status: Status = .normal\n    private var keyViews: [NSView] = []\n    private var waitingView: KeyComponentContainer?\n\n    // MARK: - Initialization\n    override init(frame frameRect: NSRect) {\n        super.init(frame: frameRect)\n        setupView()\n    }\n    required init?(coder: NSCoder) {\n        super.init(coder: coder)\n        setupView()\n    }\n    private func setupView() {\n        wantsLayer = true\n\n        // 创建水平堆栈视图\n        orientation = .horizontal\n        alignment = .centerY\n        spacing = 4\n        translatesAutoresizingMaskIntoConstraints = false\n        wantsLayer = true\n\n        // 显示空状态\n        update(from: [KeyPreview.WAITING_WORDING], status: .recording)\n    }\n\n    // MARK: - Public Methods\n\n    /// 更新显示的按键组合\n    func update(from components: [String], status: Status = .normal) {\n        self.keyComponents = components\n        self.status = status\n\n        // 清除现有视图\n        clearKeyViews()\n\n        // 如果没有内容，不显示\n        guard !components.isEmpty else { return }\n\n        // 创建按键视图\n        createKeyViews()\n    }\n\n    /// 显示录制中状态\n    func updateForRecording(from event: CGEvent) {\n        if event.hasModifiers {\n            update(from: [event.modifierString, KeyPreview.WAITING_WORDING], status: .recording)\n        } else {\n            update(from: [KeyPreview.WAITING_WORDING], status: .recording)\n        }\n    }\n\n    /// 显示警告反馈(不可录制的按键)\n    /// 对WAITING_WORDING对应的keyView执行红色+晃动动画\n    func shakeWarning() {\n        waitingView?.shakeWarning()\n    }\n\n    // MARK: - View and anim control\n    private func clearKeyViews() {\n        // 移除所有子视图\n        arrangedSubviews.forEach { view in\n            removeArrangedSubview(view)\n            view.removeFromSuperview()\n        }\n        keyViews.removeAll()\n        waitingView = nil\n    }\n    private static let logiTagMarker = \"[Logi]\"\n\n    private func createKeyViews() {\n        var i = 0\n        var viewIndex = 0  // 用于决定是否加 \"+\" 分隔符\n        while i < keyComponents.count {\n            let component = keyComponents[i]\n\n            // 跳过 [Logi] 标记 (已在前一个 component 中处理)\n            if component == KeyPreview.logiTagMarker { i += 1; continue }\n\n            // 添加分隔符\n            if viewIndex > 0 {\n                let plusLabel = NSTextField(labelWithString: \"+\")\n                plusLabel.font = NSFont.systemFont(ofSize: KeyPreview.FONT_SIZE)\n                plusLabel.textColor = NSColor.secondaryLabelColor\n                addArrangedSubview(plusLabel)\n            }\n\n            // 检查下一个是否为 [Logi] 标记 → 嵌套渲染\n            let nextIsLogi = (i + 1 < keyComponents.count && keyComponents[i + 1] == KeyPreview.logiTagMarker)\n            let isWaiting = (component == KeyPreview.WAITING_WORDING)\n\n            if nextIsLogi && !isWaiting {\n                let keyView = createKeyViewWithBrandTag(for: component, brand: .logi)\n                addArrangedSubview(keyView)\n                keyViews.append(keyView)\n                i += 2  // 跳过 [Logi]\n            } else {\n                let keyView = createSingleKeyView(for: component, isWaiting: isWaiting)\n                addArrangedSubview(keyView)\n                keyViews.append(keyView)\n                if isWaiting, let container = keyView as? KeyComponentContainer {\n                    waitingView = container\n                }\n                i += 1\n            }\n            viewIndex += 1\n        }\n    }\n\n    /// 创建带嵌套品牌 tag 的按键视图 (按键名 + 小 tag 在同一个容器内)\n    private func createKeyViewWithBrandTag(for text: String, brand: BrandTagConfig) -> NSView {\n        let container = KeyComponentContainer(keyStatus: status, isWaiting: false)\n\n        // 按键名标签\n        let label = NSTextField(labelWithString: text)\n        label.font = NSFont.systemFont(ofSize: KeyPreview.FONT_SIZE, weight: .medium)\n        label.textColor = (status == .recorded || status == .duplicate) ? NSColor.white : NSColor.labelColor\n        label.alignment = .center\n        label.translatesAutoresizingMaskIntoConstraints = false\n        container.addSubview(label)\n\n        // 品牌 tag (使用 BrandTag 统一创建)\n        let tagView = BrandTag.createTagView(brand: brand)\n        container.addSubview(tagView)\n\n        NSLayoutConstraint.activate([\n            label.leadingAnchor.constraint(equalTo: container.leadingAnchor, constant: 6),\n            label.centerYAnchor.constraint(equalTo: container.centerYAnchor),\n            tagView.leadingAnchor.constraint(equalTo: label.trailingAnchor, constant: 4),\n            tagView.centerYAnchor.constraint(equalTo: container.centerYAnchor),\n            tagView.trailingAnchor.constraint(equalTo: container.trailingAnchor, constant: -4),\n            container.heightAnchor.constraint(equalToConstant: KeyPreview.VIEW_SIZE),\n        ])\n\n        return container\n    }\n    private func createSingleKeyView(for text: String, isWaiting: Bool) -> NSView {\n        // 创建一个能动态响应外观变化的容器\n        let container = KeyComponentContainer(keyStatus: status, isWaiting: isWaiting)\n\n        // 创建文本标签\n        let label = NSTextField(labelWithString: text)\n        label.font = NSFont.systemFont(ofSize: KeyPreview.FONT_SIZE, weight: .medium)\n        label.textColor = (status == .recorded || status == .duplicate) ? NSColor.white : NSColor.labelColor\n        label.alignment = .center\n        label.translatesAutoresizingMaskIntoConstraints = false\n        container.addSubview(label)\n\n        // 设置约束\n        NSLayoutConstraint.activate([\n            label.centerXAnchor.constraint(equalTo: container.centerXAnchor),\n            label.centerYAnchor.constraint(equalTo: container.centerYAnchor),\n            container.widthAnchor.constraint(greaterThanOrEqualTo: label.widthAnchor, constant: 12),\n            container.widthAnchor.constraint(greaterThanOrEqualToConstant: KeyPreview.VIEW_SIZE),\n            container.heightAnchor.constraint(equalToConstant: KeyPreview.VIEW_SIZE),\n        ])\n\n        return container\n    }\n}\n\n// MARK: - KeyComponentContainer\n/// 按键组件容器，通过 updateLayer 动态响应外观变化\nprivate final class KeyComponentContainer: NSView {\n    let keyStatus: KeyPreview.Status\n    let isWaitingPlaceholder: Bool\n\n    init(keyStatus: KeyPreview.Status, isWaiting: Bool = false) {\n        self.keyStatus = keyStatus\n        self.isWaitingPlaceholder = isWaiting\n        super.init(frame: .zero)\n        wantsLayer = true\n        layer?.cornerRadius = 4\n\n        // 如果是录制状态的等待占位符，启动呼吸动画\n        if keyStatus == .recording && isWaitingPlaceholder {\n            startBreathingAnimation()\n        }\n    }\n\n    required init?(coder: NSCoder) {\n        fatalError(\"init(coder:) not implemented\")\n    }\n\n    override func updateLayer() {\n        super.updateLayer()\n        layer?.backgroundColor = getBackgroundColor().cgColor\n    }\n\n    private func getBackgroundColor() -> NSColor {\n        switch keyStatus {\n        case .normal, .recording:\n            return NSColor.getMainLightBlack(for: self)\n        case .recorded:\n            return NSColor.mainGreen\n        case .duplicate:\n            return NSColor.mainBlue\n        }\n    }\n\n    // MARK: - Animation Management\n    private func startBreathingAnimation() {\n        let animation = CABasicAnimation(keyPath: \"opacity\")\n        animation.fromValue = 1.0\n        animation.toValue = 0.5\n        animation.duration = 0.5\n        animation.autoreverses = true\n        animation.repeatCount = .infinity\n        animation.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)\n        layer?.add(animation, forKey: \"breathingAnimation\")\n    }\n\n    func shakeWarning() {\n        guard let layer = layer else { return }\n\n        // 停止呼吸动画，避免冲突\n        layer.removeAnimation(forKey: \"breathingAnimation\")\n        layer.opacity = 1.0\n\n        // 1. 晃动动画\n        let shakeAnimation = CAKeyframeAnimation(keyPath: \"transform.translation.x\")\n        shakeAnimation.values = [0, -8, 8, -8, 8, -4, 4, 0]\n        shakeAnimation.duration = 0.4\n        shakeAnimation.timingFunction = CAMediaTimingFunction(name: .easeOut)\n\n        // 2. 背景色变化动画（立即变红，然后褪回原色）\n        let warningColor: CGColor = NSColor.getWarningColor(for: self).cgColor\n        let colorAnimation = CABasicAnimation(keyPath: \"backgroundColor\")\n        colorAnimation.fromValue = warningColor  // 从红色开始\n        colorAnimation.toValue = layer.backgroundColor  // 褪回原色\n        colorAnimation.duration = 0.8  // 和晃动动画同步\n        colorAnimation.timingFunction = CAMediaTimingFunction(name: .easeOut)\n\n        // 执行动画\n        layer.add(shakeAnimation, forKey: \"shakeWarning\")\n        layer.add(colorAnimation, forKey: \"colorWarning\")\n\n        // 动画结束后恢复呼吸动画\n        DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { [weak self] in\n            guard let self = self else { return }\n            if self.keyStatus == .recording {\n                self.startBreathingAnimation()\n            }\n        }\n    }\n}\n\n"
  },
  {
    "path": "Mos/Keys/KeyRecorder.swift",
    "content": "//\n//  KeyRecorder.swift\n//  Mos\n//  用于录制热键\n//\n//  Created by Claude on 2025/8/31.\n//  Copyright © 2025 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\n/// 录制模式\nenum KeyRecordingMode {\n    /// 组合键模式：需要修饰键+普通键的组合 (用于 ButtonsView)\n    case combination\n    /// 单键模式：支持单个按键，包括单独的修饰键 (用于 ScrollingView)\n    case singleKey\n}\n\nprotocol KeyRecorderDelegate: AnyObject {\n    /// 录制完成回调\n    func onEventRecorded(_ recorder: KeyRecorder, didRecordEvent event: MosInputEvent, isDuplicate: Bool)\n\n    /// 验证录制的事件是否为重复\n    func validateRecordedEvent(_ recorder: KeyRecorder, event: MosInputEvent) -> Bool\n}\n\n/// 默认实现 (替代 @objc optional 语义)\nextension KeyRecorderDelegate {\n    func validateRecordedEvent(_ recorder: KeyRecorder, event: MosInputEvent) -> Bool {\n        return true\n    }\n}\n\nclass KeyRecorder: NSObject {\n\n    // MARK: - Constants\n    static let TIMEOUT: TimeInterval = 10.0\n    static let FLAG_CHANGE_NOTI_NAME = NSNotification.Name(\"RECORD_FLAG_CHANGE_NOTI_NAME\")\n    static let FINISH_NOTI_NAME = NSNotification.Name(\"RECORD_FINISH_NOTI_NAME\")\n    static let CANCEL_NOTI_NAME = NSNotification.Name(\"RECORD_CANCEL_NOTI_NAME\")\n\n    // Delegate\n    weak var delegate: KeyRecorderDelegate?\n    // Recording\n    private var interceptor: Interceptor?\n    private var isRecording = false\n    private var isRecorded = false // 是否已经记录过 (每次启动只记录一个按键\n    private var recordTimeoutTimer: Timer? // 超时保护定时器\n    private var invalidKeyPressCount = 0 // 无效按键计数\n    private let invalidKeyThreshold = 5 // 显示 ESC 提示的阈值\n    private var recordingMode: KeyRecordingMode = .combination // 当前录制模式\n    private var hidEventObserver: NSObjectProtocol?  // HID++ 事件监听 (录制期间)\n    // UI 组件\n    private var keyPopover: KeyPopover?\n    \n    // MARK: - Life Cycle\n    deinit {\n        stopRecording()\n    }\n    \n    // MARK: - Event Masks\n    // 事件掩码 (支持鼠标和键盘事件，包括修饰键变化)\n    private var eventMask: CGEventMask {\n        let leftDown = CGEventMask(1 << CGEventType.leftMouseDown.rawValue)\n        let rightDown = CGEventMask(1 << CGEventType.rightMouseDown.rawValue)\n        let otherDown = CGEventMask(1 << CGEventType.otherMouseDown.rawValue)\n        let keyDown = CGEventMask(1 << CGEventType.keyDown.rawValue)\n        let flagsChanged = CGEventMask(1 << CGEventType.flagsChanged.rawValue)\n        return leftDown | rightDown | otherDown | keyDown | flagsChanged\n    }\n    \n    // MARK: - Recording Manager\n    // 开始记录事件\n    /// - Parameters:\n    ///   - sourceView: 触发录制的视图，用于显示 Popover\n    ///   - mode: 录制模式，默认为组合键模式\n    func startRecording(from sourceView: NSView, mode: KeyRecordingMode = .combination) {\n        // Guard: 防止重复执行\n        guard !isRecording else { return }\n        isRecording = true\n        recordingMode = mode\n        // Log\n        NSLog(\"[EventRecorder] Starting in \\(mode) mode\")\n        // 确保清理任何存在的录制界面\n        keyPopover?.hide()\n        keyPopover = nil\n        // 立即显示 Popover (不等待 HID++ divert)\n        keyPopover = KeyPopover()\n        keyPopover?.show(at: sourceView)\n        // 异步 divert 所有 Logitech 按键 (BLE 通信有延迟)\n        DispatchQueue.main.async {\n            LogitechHIDManager.shared.temporarilyDivertAll()\n        }\n        // 监听事件\n        do {\n            // 监听回调事件通知\n            NotificationCenter.default.addObserver(\n                self,\n                selector: #selector(handleRecordedEvent(_:)),\n                name: KeyRecorder.FINISH_NOTI_NAME,\n                object: nil\n            )\n            // 监听修饰键变化通知\n            NotificationCenter.default.addObserver(\n                self,\n                selector: #selector(handleModifierFlagsChanged(_:)),\n                name: KeyRecorder.FLAG_CHANGE_NOTI_NAME,\n                object: nil\n            )\n            // 监听录制取消通知\n            NotificationCenter.default.addObserver(\n                self,\n                selector: #selector(handleRecordingCancelled(_:)),\n                name: KeyRecorder.CANCEL_NOTI_NAME,\n                object: nil\n            )\n            // 启动拦截器\n            interceptor = try Interceptor(\n                event: eventMask,\n                handleBy: { (proxy, type, event, refcon) in\n                    let recordedEvent = event\n                    switch type {\n                    case .flagsChanged:\n                        // 修饰键变化，发送通知 (单键模式下也用于完成录制)\n                        DispatchQueue.main.async {\n                            NotificationCenter.default.post(\n                                name: KeyRecorder.FLAG_CHANGE_NOTI_NAME,\n                                object: recordedEvent\n                            )\n                        }\n                    case .leftMouseDown, .rightMouseDown, .otherMouseDown:\n                        // 鼠标按键\n                        DispatchQueue.main.async {\n                            NotificationCenter.default.post(\n                                name: KeyRecorder.FINISH_NOTI_NAME,\n                                object: recordedEvent\n                            )\n                        }\n                    case .keyDown:\n                        // ESC键特殊处理：取消录制\n                        if recordedEvent.keyCode == KeyCode.escape {\n                            DispatchQueue.main.async {\n                                NotificationCenter.default.post(\n                                    name: KeyRecorder.CANCEL_NOTI_NAME,\n                                    object: nil\n                                )\n                            }\n                        } else {\n                            // 普通按键录制\n                            DispatchQueue.main.async {\n                                NotificationCenter.default.post(\n                                    name: KeyRecorder.FINISH_NOTI_NAME,\n                                    object: recordedEvent\n                                )\n                            }\n                        }\n                    default:\n                        break\n                    }\n                    return nil\n                },\n                listenOn: CGEventTapLocation.cgSessionEventTap,\n                placeAt: CGEventTapPlacement.headInsertEventTap,\n                for: CGEventTapOptions.defaultTap\n            )\n            // 监听 HID++ 事件 (如果 LogitechHIDManager 已启动)\n            hidEventObserver = NotificationCenter.default.addObserver(\n                forName: NSNotification.Name(\"LogitechHIDButtonEvent\"),\n                object: nil,\n                queue: .main\n            ) { [weak self] notification in\n                guard let self = self, self.isRecording, !self.isRecorded else { return }\n                guard let mosEvent = notification.userInfo?[\"event\"] as? MosInputEvent else { return }\n                guard mosEvent.phase == .down else { return }\n                NotificationCenter.default.post(\n                    name: KeyRecorder.FINISH_NOTI_NAME,\n                    object: mosEvent\n                )\n            }\n            // 启动超时保护定时器\n            startTimeoutTimer()\n            // Log\n            NSLog(\"[EventRecorder] Started\")\n        } catch {\n            NSLog(\"[EventRecorder] Failed to start: \\(error)\")\n            // 如果创建失败，重置状态\n            isRecording = false\n        }\n    }\n    // 修饰键变化处理\n    @objc private func handleModifierFlagsChanged(_ notification: NSNotification) {\n        guard isRecording && !isRecorded else { return }\n        let event = notification.object as! CGEvent\n\n        // 单键模式：修饰键按下时直接完成录制\n        if recordingMode == .singleKey && event.isKeyDown && event.isModifiers {\n            NSLog(\"[EventRecorder] Single key mode: modifier key recorded\")\n            // 直接触发录制完成\n            NotificationCenter.default.post(\n                name: KeyRecorder.FINISH_NOTI_NAME,\n                object: event\n            )\n            return\n        }\n\n        // 组合键模式：如果有修饰键被按下，刷新超时定时器给用户更多时间\n        let hasActiveModifiers = event.hasModifiers\n        if hasActiveModifiers {\n            startTimeoutTimer() // 重新启动定时器\n            NSLog(\"[EventRecorder] Modifier key pressed, timeout timer refreshed\")\n        }\n        // 实时更新录制界面显示当前已按下的修饰键\n        keyPopover?.keyPreview\n            .updateForRecording(from: event)\n    }\n    // 录制取消处理\n    @objc private func handleRecordingCancelled(_ notification: NSNotification) {\n        guard isRecording && !isRecorded else { return }\n        NSLog(\"[EventRecorder] Recording cancelled by ESC key\")\n        stopRecording()\n    }\n    @objc private func handleRecordedEvent(_ notification: NSNotification) {\n        guard isRecording else { return }\n\n        // 统一转换为 MosInputEvent\n        // 注意: 先检查 MosInputEvent (value type), 再检查 CGEvent (CoreFoundation type)\n        // CGEvent 的 as? 对 Any 总是成功, 所以必须后检查\n        let mosEvent: MosInputEvent\n        if let hidEvent = notification.object as? MosInputEvent {\n            mosEvent = hidEvent\n        } else if let cgEvent = notification.object, CFGetTypeID(cgEvent as CFTypeRef) == CGEvent.typeID {\n            mosEvent = MosInputEvent(fromCGEvent: cgEvent as! CGEvent)\n        } else {\n            NSLog(\"[EventRecorder] Unknown event type in notification\")\n            return\n        }\n\n        // 检查事件有效性 (根据录制模式)\n        let isValid = recordingMode == .singleKey\n            ? mosEvent.isRecordableAsSingleKey\n            : mosEvent.isRecordable\n        guard isValid else {\n            NSLog(\"[EventRecorder] Invalid event ignored\")\n            keyPopover?.keyPreview.shakeWarning()\n            invalidKeyPressCount += 1\n            if invalidKeyPressCount >= invalidKeyThreshold {\n                keyPopover?.showEscHint()\n            }\n            return\n        }\n\n        guard !isRecorded else { return }\n        isRecorded = true\n\n        let isNew = self.delegate?.validateRecordedEvent(self, event: mosEvent) ?? true\n        let isDuplicate = !isNew\n        let status: KeyPreview.Status = isNew ? .recorded : .duplicate\n\n        keyPopover?.keyPreview\n            .update(from: mosEvent.displayComponents, status: status)\n        self.delegate?.onEventRecorded(self, didRecordEvent: mosEvent, isDuplicate: isDuplicate)\n\n        DispatchQueue.main.asyncAfter(deadline: .now() + 0.7) { [weak self] in\n            self?.stopRecording()\n        }\n    }\n\n    // 停止记录\n    func stopRecording() {\n        // Guard: 需要 Recording 才进行后续处理\n        guard isRecording else { return }\n        // Log\n        NSLog(\"[EventRecorder] Stopping\")\n        // 隐藏录制界面\n        keyPopover?.hide()\n        keyPopover = nil\n        // 取消超时定时器\n        cancelTimeoutTimer()\n        // 取消通知和监听\n        interceptor?.stop()\n        interceptor = nil\n        NotificationCenter.default.removeObserver(self, name: KeyRecorder.FINISH_NOTI_NAME, object: nil)\n        NotificationCenter.default.removeObserver(self, name: KeyRecorder.FLAG_CHANGE_NOTI_NAME, object: nil)\n        NotificationCenter.default.removeObserver(self, name: KeyRecorder.CANCEL_NOTI_NAME, object: nil)\n        if let observer = hidEventObserver {\n            NotificationCenter.default.removeObserver(observer)\n            hidEventObserver = nil\n        }\n        // 录制结束: 恢复到只 divert 有绑定的按键\n        LogitechHIDManager.shared.restoreDivertToBindings()\n        // 重置状态 (添加延迟确保 Popover 结束动画完成, 避免多个 popover 重复出现导致卡住)\n        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { [weak self] in\n            self?.isRecording = false\n            self?.isRecorded = false\n            self?.invalidKeyPressCount = 0\n            NSLog(\"[EventRecorder] Stopped\")\n        }\n    }\n    \n    // MARK: - Timeout Protection\n    private func startTimeoutTimer() {\n        cancelTimeoutTimer()\n        recordTimeoutTimer = Timer.scheduledTimer(withTimeInterval: KeyRecorder.TIMEOUT, repeats: false) { [weak self] _ in\n            NSLog(\"[EventRecorder] Recording timed out\")\n            self?.stopRecording()\n        }\n    }\n    private func cancelTimeoutTimer() {\n        recordTimeoutTimer?.invalidate()\n        recordTimeoutTimer = nil\n    }\n}\n\n"
  },
  {
    "path": "Mos/Localizable.xcstrings",
    "content": "{\n  \"sourceLanguage\": \"en\",\n  \"strings\": {\n    \"appExpose\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Launchpad\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Launchpad\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Launchpad\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Launchpad\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Launchpad\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Launchpad\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Launchpad\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Launchpad\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Launchpad\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Launchpad\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"启动台\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Launchpad\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Launchpad\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Launchpad\"\n          }\n        }\n      }\n    },\n    \"Auth\": {\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Autorizovat\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Autorisieren\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Παροχή πρόσβασης\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Auth\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Autoriser\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"アクセスを許可する\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"허가\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Разрешить\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Yetki\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Дозволити\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"授权访问\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"允許存取\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"允許存取\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"允許存取\"\n          }\n        }\n      }\n    },\n    \"Authorized\": {\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Autorizováno\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"erledigt\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Εξουσιοδοτημένο\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Authorized\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Autorisé\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"許可済み\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"허가됨\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Готово\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Yetkili\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Готово\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"权限已取得\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"已取得權限\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"已取得權限\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"已取得權限\"\n          }\n        }\n      }\n    },\n    \"bold\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Tučný\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Fett\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Έντονα\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Bold\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Gras\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"太字\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"볼드체\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Жирный\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Kalın\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Напівжирний\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"粗体\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"粗體\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"粗體\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"粗體\"\n          }\n        }\n      }\n    },\n    \"categoryAccessibility\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Přístupnost\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Bedienungshilfen\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Προσβασιμότητα\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Accessibility\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Accessibilité\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"アクセシビリティ\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"손쉬운 사용\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Универсальный доступ\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Erişilebilirlik\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Доступність\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"辅助功能\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"輔助使用\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"輔助使用\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"輔助使用\"\n          }\n        }\n      }\n    },\n    \"categoryAppsAndWindows\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Aplikace a Okna\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Apps & Fenster\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Εφαρμογές & Παράθυρα\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Apps & Windows\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Apps & fenêtres\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"アプリとウインドウ\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"앱 및 윈도우\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Приложения и окна\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Uygulamalar ve Pencereler\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Програми та вікна\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"应用与窗口\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"App 與視窗\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"App 與視窗\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"App 與視窗\"\n          }\n        }\n      }\n    },\n    \"categoryAppSwitching\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Přepínání Aplikací\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"App-Umschaltung\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Εναλλαγή Εφαρμογών\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"App Switching\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Bascule d’apps\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"アプリの切り替え\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"앱 전환\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Переключение приложений\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Uygulama Değiştirme\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Перемикання програм\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"应用切换\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"App 切換\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"App 切換\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"App 切換\"\n          }\n        }\n      }\n    },\n    \"categoryDocumentEditing\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Editace Dokumentů\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Dokumentbearbeitung\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Επεξεργασία Εγγράφων\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Document Editing\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Edition de document\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"テキスト編集\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"문서 편집\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Редактирование документов\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Belge Düzenleme\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Редагування документів\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"文档编辑\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"文件編輯\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"文件編輯\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"文件編輯\"\n          }\n        }\n      }\n    },\n    \"categoryFinderActions\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Rychlé Akce\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Finder-Aktionen\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Ενέργειες Finder\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Finder Actions\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Actions du finder\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Finder操作\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Finder 작업\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Действия Finder\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Finder İşlemleri\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Дії Finder\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"访达操作\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Finder 動作\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Finder 動作\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Finder 動作\"\n          }\n        }\n      }\n    },\n    \"categoryFunctionKeys\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Funkční Klávesy\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Funktionstasten\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Πλήκτρα Λειτουργιών\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Function Keys\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Touches de fonction\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"ファンクションキー\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"기능 키\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Функциональные клавиши\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Fonksiyon Tuşları\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Функціональні клавіші\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"功能键\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"功能鍵\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"功能鍵\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"功能鍵\"\n          }\n        }\n      }\n    },\n    \"categoryLogiActions\": {\n      \"extractionState\": \"stale\",\n      \"localizations\": {\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Device Functions\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"设备功能\"\n          }\n        }\n      }\n    },\n    \"categoryMouseButtons\": {\n      \"extractionState\": \"stale\",\n      \"localizations\": {\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Mouse Buttons\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"鼠标按键\"\n          }\n        }\n      }\n    },\n    \"categoryNavigation\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Navigace\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Navigation\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Πλοήγηση\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Navigation\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Navigation\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"ナビゲーション\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"탐색\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Навигация\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Gezinme\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Навігація\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"导航\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"導覽\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"導覽\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"導覽\"\n          }\n        }\n      }\n    },\n    \"categoryScreenshot\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Snímky Obrazovky\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Bildschirmfoto\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Στιγμιότυπο Οθόνης\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Screenshot\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Capture d’écran\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"スクリーンショット\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"스크린샷\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Снимок экрана\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Ekran Görüntüsü\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Знімок екрана\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"截图\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"螢幕截圖\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"螢幕截圖\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"螢幕截圖\"\n          }\n        }\n      }\n    },\n    \"categorySystem\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Systém\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"System\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Σύστημα\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"System\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Système\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"システム\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"시스템\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Система\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Sistem\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Система\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"系统功能\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"系統功能\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"系統功能\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"系統功能\"\n          }\n        }\n      }\n    },\n    \"categorySystemFunctions\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Systémové Funkce\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Systemfunktionen\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Λειτουργίες Συστήματος\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"System Functions\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Fonctions système\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"システム機能\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"시스템 기능\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Системные функции\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Sistem İşlevleri\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Системні функції\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"系统功能\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"系統功能\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"系統功能\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"系統功能\"\n          }\n        }\n      }\n    },\n    \"categoryWindowManagement\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Správa Oken\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Fensterverwaltung\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Διαχείριση Παραθύρων\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Window Management\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Gestion de fenêtre\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"ウインドウ管理\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"윈도우 관리\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Управление окнами\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Pencere Yönetimi\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Керування вікнами\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"窗口管理\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"視窗管理\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"視窗管理\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"視窗管理\"\n          }\n        }\n      }\n    },\n    \"characterViewer\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Emoji a Symboly\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Emoji & Symbole\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Emoji & Σύμβολα\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Emoji & Symbols\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Emoji & symboles\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"絵文字と記号\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"이모티콘 및 기호\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Эмодзи и символы\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Emoji ve Semboller\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Емодзі та символи\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"表情符号与符号\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"表情符號與符號\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"表情符號與符號\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"表情符號與符號\"\n          }\n        }\n      }\n    },\n    \"closeAllWindows\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Zavřít Všechna Okna\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Alle Fenster schließen\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Κλείσιμο Όλων των Παραθύρων\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Close All Windows\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Fermer toutes les fenêtres\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"すべてのウインドウを閉じる\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"모든 윈도우 닫기\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Закрыть все окна\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Tüm Pencereleri Kapat\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Закрити всі вікна\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"关闭所有窗口\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"關閉所有視窗\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"關閉所有視窗\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"關閉所有視窗\"\n          }\n        }\n      }\n    },\n    \"closeWindow\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Zavřít Okno\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Fenster schließen\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Κλείσιμο Παραθύρου\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Close Window\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Fermer la fenêtre\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"ウインドウを閉じる\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"윈도우 닫기\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Закрыть окно\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Pencereyi Kapat\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Закрити вікно\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"关闭窗口\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"關閉視窗\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"關閉視窗\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"關閉視窗\"\n          }\n        }\n      }\n    },\n    \"copy\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Kopírovat\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Kopieren\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Αντιγραφή\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Copy\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Copier\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"コピー\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"복사\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Скопировать\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Kopyala\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Скопіювати\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"拷贝\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"拷貝\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"拷貝\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"拷貝\"\n          }\n        }\n      }\n    },\n    \"Current Version\": {\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Aktuální Verze\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"aktuelle Version\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Τρέχουσα Έκδοση\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Version actuelle\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"現在のバージョン\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"현재 버전\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Текущая версия\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Güncel Sürüm\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Поточна версія\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"当前版本\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"目前版本\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"目前版本\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"目前版本\"\n          }\n        }\n      }\n    },\n    \"cut\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Vyjmout\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Ausschneiden\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Αποκοπή\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Cut\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Couper\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"カット\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"잘라내기\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Вырезать\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Kes\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Вирізати\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"剪切\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"剪下\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"剪下\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"剪下\"\n          }\n        }\n      }\n    },\n    \"dictation\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Diktování\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Diktierfunktion\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Υπαγόρευση\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Dictation\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Dictée\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"音声入力\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"받아쓰기\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Диктовка\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Dikte\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Диктування\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"听写\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"聽寫\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"聽寫\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"聽寫\"\n          }\n        }\n      }\n    },\n    \"Disabled\": {\n      \"comment\": \"Hotkey disabled state\",\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Deaktivováno\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Deaktiviert\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Απενεργοποιημένο\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Disabled\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Désactivé\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"無効\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"비활성화됨\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Отключено\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Devre dışı\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Вимкнено\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"未设置\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"未設定\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"未設定\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"未設定\"\n          }\n        }\n      }\n    },\n    \"doNotDisturb\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Nerušit\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Nicht stören\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Μην Ενοχλείτε\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Do Not Disturb\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Ne pas déranger\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"おやすみモード\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"방해 금지\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Не беспокоить\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Rahatsız Etmeyin\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Не турбувати\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"勿扰模式\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"勿擾模式\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"勿擾模式\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"勿擾模式\"\n          }\n        }\n      }\n    },\n    \"duplicateFile\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Duplikát\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Duplizieren\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Αντιγραφή\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Duplicate\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Dupliquer\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"複製\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"복제\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Дублировать\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Kopyala\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Дублювати\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"制作副本\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"製作副本\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"製作副本\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"製作副本\"\n          }\n        }\n      }\n    },\n    \"emptyTrash\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Vysypat Koš\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Papierkorb entleeren\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Άδειασμα Απορριμμάτων\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Empty Trash\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Vider la corbeille\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"ゴミ箱を空にする\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"휴지통 비우기\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Очистить корзину\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Çöp Kutusunu Boşalt\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Спорожнити кошик\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"清倒废纸篓\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"清空垃圾桶\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"清空垃圾桶\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"清空垃圾桶\"\n          }\n        }\n      }\n    },\n    \"Event Monitor\": {\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Monitor Událostí\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \" Ereignis Überwacher\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \" Παρακολούθηση Γεγονότων\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \" Event Monitor\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Gestionnaire d’évènements\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \" イベントモニター\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \" 이벤트 모니터\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \" Мониторинг событий\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \" Olay İzleyicisi\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \" Моніторинг подій\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \" 事件监控\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \" 事件監視\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \" 事件監視\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \" 事件監視\"\n          }\n        }\n      }\n    },\n    \"find\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Najít\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Suchen\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Εύρεση\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Find\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Trouver\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"検索\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"찾기\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Найти\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Bul\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Знайти\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"查找\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"尋找\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"尋找\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"尋找\"\n          }\n        }\n      }\n    },\n    \"forceQuit\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Vynutit Vypnutí\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Sofort beenden\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Εξαναγκασμένη Έξοδος\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Force Quit\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Forcer à quitter\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"強制終了\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"강제 종료\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Завершить принудительно\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Zorla Çık\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Примусове завершення\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"强制退出\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"強制結束\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"強制結束\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"強制結束\"\n          }\n        }\n      }\n    },\n    \"getInfo\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Získat Informace\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Informationen\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Εμφάνιση Πληροφοριών\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Get Info\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Voir les informations\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"情報を見る\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"정보 가져오기\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Свойства\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Bilgi Al\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Інформація\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"显示简介\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"取得資訊\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"取得資訊\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"取得資訊\"\n          }\n        }\n      }\n    },\n    \"goToFolder\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Přejít na složku\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Gehe zum Ordner\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Μετάβαση σε Φάκελο\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Go to Folder\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Aller au répertoire\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"フォルダへ移動\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"폴더로 이동\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Перейти к папке\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Klasöre Git\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Перейти до папки\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"前往文件夹\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"前往檔案夾\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"前往檔案夾\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"前往檔案夾\"\n          }\n        }\n      }\n    },\n    \"hideApplication\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Skrýt Aplikaci\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"App ausblenden\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Απόκρυψη Εφαρμογής\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Hide Application\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Masquer l’applicaton\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"アプリを隠す\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"앱 가리기\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Скрыть приложение\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Uygulamayı Gizle\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Приховати програму\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"隐藏应用\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"隱藏 App\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"隱藏 App\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"隱藏 App\"\n          }\n        }\n      }\n    },\n    \"hideOthers\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Skrýt Ostatní\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Andere ausblenden\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Απόκρυψη Άλλων\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Hide Others\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Masquer les autres\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"ほかを隠す\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"다른 항목 가리기\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Скрыть остальные\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Diğerlerini Gizle\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Приховати інші\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"隐藏其他\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"隱藏其他項目\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"隱藏其他項目\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"隱藏其他項目\"\n          }\n        }\n      }\n    },\n    \"invertColors\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Invertovat Barvy\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Farben umkehren\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Αντιστροφή Χρωμάτων\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Invert Colors\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Inverser les couleurs\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"カラーを反転\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"색상 반전\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Инвертировать цвета\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Renkleri Ters Çevir\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Інвертувати кольори\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"反转颜色\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"反轉顏色\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"反轉顏色\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"反轉顏色\"\n          }\n        }\n      }\n    },\n    \"italic\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Kurzíva\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Kursiv\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Πλάγια\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Italic\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Italique\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"斜体\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"이탤릭체\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Курсив\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"İtalik\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Курсив\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"斜体\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"斜體\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"斜體\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"斜體\"\n          }\n        }\n      }\n    },\n    \"lockScreen\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Zamknout Obrazovku\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Bildschirm sperren\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Κλείδωμα Οθόνης\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Lock Screen\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Verrouiller l’écran\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"ロック画面\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"화면 잠금\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Заблокировать экран\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Ekranı Kilitle\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Заблокувати екран\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"锁定屏幕\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"鎖定螢幕\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"鎖定螢幕\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"鎖定螢幕\"\n          }\n        }\n      }\n    },\n    \"logiDPICycleDown\": {\n      \"extractionState\": \"stale\",\n      \"localizations\": {\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"DPI -\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"DPI -\"\n          }\n        }\n      }\n    },\n    \"logiDPICycleUp\": {\n      \"extractionState\": \"stale\",\n      \"localizations\": {\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"DPI +\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"DPI +\"\n          }\n        }\n      }\n    },\n    \"logiHost1\": {\n      \"extractionState\": \"stale\",\n      \"localizations\": {\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Switch to Host 1\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"切换到主机 1\"\n          }\n        }\n      }\n    },\n    \"logiHost2\": {\n      \"extractionState\": \"stale\",\n      \"localizations\": {\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Switch to Host 2\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"切换到主机 2\"\n          }\n        }\n      }\n    },\n    \"logiHost3\": {\n      \"extractionState\": \"stale\",\n      \"localizations\": {\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Switch to Host 3\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"切换到主机 3\"\n          }\n        }\n      }\n    },\n    \"logiSmartShiftToggle\": {\n      \"extractionState\": \"stale\",\n      \"localizations\": {\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"SmartShift Toggle\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"SmartShift 切换\"\n          }\n        }\n      }\n    },\n    \"logout\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Odhlásit\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Abmelden\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Αποσύνδεση\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Log Out\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Se déconnecter\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"ログアウト\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"로그아웃\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Выйти\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Oturumu Kapat\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Вийти\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"登出\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"登出\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"登出\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"登出\"\n          }\n        }\n      }\n    },\n    \"minimizeWindow\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Minimalizovat Okno\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Fenster im Dock ablegen\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Ελαχιστοποίηση Παραθύρου\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Minimize Window\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Réduire la fenêtre\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"ウインドウをしまう\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"윈도우 최소화\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Свернуть окно\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Pencereyi Küçült\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Згорнути вікно\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"最小化窗口\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"縮小視窗\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"縮小視窗\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"縮小視窗\"\n          }\n        }\n      }\n    },\n    \"missionControl\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Mission Control\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Mission Control\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Mission Control\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Mission Control\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Mission Control\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Mission Control\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Mission Control\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Mission Control\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Mission Control\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Mission Control\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"调度中心\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Mission Control\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Mission Control\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Mission Control\"\n          }\n        }\n      }\n    },\n    \"mouseBackClick\": {\n      \"extractionState\": \"stale\",\n      \"localizations\": {\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Back\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"后退\"\n          }\n        }\n      }\n    },\n    \"mouseForwardClick\": {\n      \"extractionState\": \"stale\",\n      \"localizations\": {\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Forward\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"前进\"\n          }\n        }\n      }\n    },\n    \"mouseLeftClick\": {\n      \"extractionState\": \"stale\",\n      \"localizations\": {\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Left Click\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"左键点击\"\n          }\n        }\n      }\n    },\n    \"mouseMiddleClick\": {\n      \"extractionState\": \"stale\",\n      \"localizations\": {\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Middle Click\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"中键点击\"\n          }\n        }\n      }\n    },\n    \"mouseRightClick\": {\n      \"extractionState\": \"stale\",\n      \"localizations\": {\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Right Click\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"右键点击\"\n          }\n        }\n      }\n    },\n    \"moveSpaceLeft\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Posunout Mezeru Doleva\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Nach links wechseln\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Μετακίνηση Χώρου Αριστερά\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Move Space Left\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Déplacer l’espace à gauche\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"スペースを左に移動\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"왼쪽 스페이스로 이동\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Переместить пространство влево\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Alanı Sola Taşı\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Перемістити простір ліворуч\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"向左移动空间\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"向左移動空間\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"向左移動空間\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"向左移動空間\"\n          }\n        }\n      }\n    },\n    \"moveSpaceRight\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Posunout Mezeru Doprava\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Nach rechts wechseln\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Μετακίνηση Χώρου Δεξιά\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Move Space Right\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Déplacer l’espace à droite\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"スペースを右に移動\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"오른쪽 스페이스로 이동\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Переместить пространство вправо\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Alanı Sağa Taşı\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Перемістити простір праворуч\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"向右移动空间\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"向右移動空間\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"向右移動空間\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"向右移動空間\"\n          }\n        }\n      }\n    },\n    \"moveToTrash\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Přesunout Do Koše\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"In den Papierkorb legen\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Μετακίνηση στα Απορρίμματα\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Move to Trash\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Déplacer vers la corbeille\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"ゴミ箱に入れる\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"휴지통으로 이동\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Переместить в корзину\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Çöp Kutusuna Taşı\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Перемістити у кошик\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"移到废纸篓\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"丟到垃圾桶\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"丟到垃圾桶\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"丟到垃圾桶\"\n          }\n        }\n      }\n    },\n    \"navigateBack\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Zpět\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Zurück\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Πίσω\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Back\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Précédent\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"戻る\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"뒤로 이동\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Назад\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Geri git\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Назад\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"后退\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"返回\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"返回\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"返回\"\n          }\n        }\n      }\n    },\n    \"navigateForward\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Vpřed\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Vorwärts\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Εμπρός\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Forward\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Suivant\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"進む\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"앞으로 이동\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Вперед\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"İleri git\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Вперед\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"前进\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"前進\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"前進\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"前進\"\n          }\n        }\n      }\n    },\n    \"Needs access to Accessibility controls\": {\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Vyžaduje přístup k Zpřístupnění\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Benötigt Zugang zu Zugänglichkeitskontrollen\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Χρειάζεται πρόσβαση στον Έλεγχο Προσβασιμότητας\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Nécessite un accès aux contrôles d’accessibilité\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"アクセシビリティへのアクセスが必要です\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"손쉬운 사용 허가를 필요로 합니다\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Требуется универсальный доступ\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Erişebilirlik kontrollerine erişim izni gerekiyor\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Необхідно надати доступ до Доступності\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"需要先获得辅助功能的权限才可以工作\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"需授予「輔助使用」權限才能運作\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"需授予「輔助使用」權限才能運作\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"需授予「輔助使用」權限才能運作\"\n          }\n        }\n      }\n    },\n    \"newFinderWindow\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Nové Okno Finderu\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Neues Finder-Fenster\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Νέο Παράθυρο Finder\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"New Finder Window\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Nouvelle fenêtre du finder\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"新規Finderウインドウ\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"새로운 Finder 윈도우\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Новое окно Finder\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Yeni Finder Penceresi\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Нове вікно Finder\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"新建访达窗口\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"新增 Finder 視窗\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"新增 Finder 視窗\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"新增 Finder 視窗\"\n          }\n        }\n      }\n    },\n    \"newFolder\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Nová složka\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Neuer Ordner\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Νέος Φάκελος\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"New Folder\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Nouveau dossier\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"新規フォルダ\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"새로운 폴더\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Новая папка\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Yeni Klasör\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Нова папка\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"新建文件夹\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"新增檔案夾\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"新增檔案夾\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"新增檔案夾\"\n          }\n        }\n      }\n    },\n    \"nextTab\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Další Panel\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Nächster Tab\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Επόμενη Καρτέλα\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Next Tab\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Onglet suivant\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"次のタブ\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"다음 탭\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Следующая вкладка\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Sonraki sekme\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Наступна вкладка\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"下一个标签页\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"下一個分頁\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"下一個分頁\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"下一個分頁\"\n          }\n        }\n      }\n    },\n    \"nextWindow\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Další Okno\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Nächstes Fenster\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Επόμενο Παράθυρο\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Next Window\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Prochaine fenêtre\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"次のウインドウ\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"다음 윈도우\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Следующее окно\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Sonraki Pencere\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Наступне вікно\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"下一个窗口\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"下一個視窗\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"下一個視窗\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"下一個視窗\"\n          }\n        }\n      }\n    },\n    \"paste\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Vložit\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Einsetzen\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Επικόλληση\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Paste\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Coller\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"ペースト\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"붙여넣기\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Вставить\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Yapıştır\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Вставити\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"粘贴\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"貼上\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"貼上\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"貼上\"\n          }\n        }\n      }\n    },\n    \"Preferences\": {\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Preference\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \" Einstellungen\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \" Προτιμήσεις\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \" Preferences\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Préférences\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \" 設定\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \" 설정\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \" Настройки\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \" Tercihler\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \" Налаштування\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \" 偏好设置\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \" 偏好設定\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \" 偏好設定\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \" 偏好設定\"\n          }\n        }\n      }\n    },\n    \"Press ESC to cancel recording\": {\n      \"comment\": \"ESC hint in key recording popover\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Stiskněte ESC pro zrušení\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"ESC drücken zum Abbrechen\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Πατήστε ESC για ακύρωση\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Press ESC to cancel\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Appuyez sur ESC pour annuler\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"ESC を押してキャンセル\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"ESC를 눌러 취소\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Нажмите ESC для отмены\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"İptal için ESC'ye basın\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Натисніть ESC для скасування\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"按下 ESC 退出录制\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"按下 ESC 退出錄製\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"按下 ESC 退出錄製\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"按下 ESC 退出錄製\"\n          }\n        }\n      }\n    },\n    \"previousTab\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Předchozí Panel\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Vorheriger Tab\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Προηγούμενη Καρτέλα\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Previous Tab\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Onglet précédent\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"前のタブ\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"이전 탭\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Предыдущая вкладка\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Önceki sekme\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Попередня вкладка\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"上一个标签页\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"上一個分頁\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"上一個分頁\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"上一個分頁\"\n          }\n        }\n      }\n    },\n    \"Quit\": {\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Ukončit\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \" beenden\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \" Έξοδος\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \" Quit\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Quitter\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \" 終了\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \" 종료\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \" Закрыть\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \" Çıkış\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \" Вийти\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \" 退出\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \" 結束\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \" 結束\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \" 結束\"\n          }\n        }\n      }\n    },\n    \"quitApp\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Ukončit Aplikaci\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"App beenden\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Κλείσιμο Εφαρμογής\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Quit Application\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Quitter l’application\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"アプリを終了\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"앱 종료\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Завершить программу\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Uygulamayı Kapat\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Завершити програму\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"退出应用\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"結束 App\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"結束 App\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"結束 App\"\n          }\n        }\n      }\n    },\n    \"Record Custom Key...\": {\n      \"comment\": \"Menu item to record a custom hotkey\",\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Zaznamenat vlastní klávesu…\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Eigene Taste aufnehmen...\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Εγγραφή προσαρμοσμένου πλήκτρου...\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Record Custom Key...\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Enregistrer une touche personnalisée...\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"カスタムキーを録音...\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"사용자 정의 키 녹음...\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Записать свою клавишу...\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Özel tuş kaydet...\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Записати власну клавішу...\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"录入自定义按键...\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"錄入自訂按鍵...\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"錄入自訂按鍵...\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"錄入自訂按鍵...\"\n          }\n        }\n      }\n    },\n    \"redo\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Opakovat\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Wiederholen\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Επανάληψη\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Redo\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Refaire\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"やり直す\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"다시 실행\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Повторить\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Yinele\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Повторити\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"重做\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"重做\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"重做\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"重做\"\n          }\n        }\n      }\n    },\n    \"screenshot\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Snímek Obrazovky\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Bildschirmfoto\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Στιγμιότυπο Οθόνης\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Screenshot\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Capture d’écran\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"スクリーンショット\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"스크린샷\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Снимок экрана\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Ekran Görüntüsü\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Знімок екрана\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"截屏\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"螢幕截圖\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"螢幕截圖\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"螢幕截圖\"\n          }\n        }\n      }\n    },\n    \"screenshotAndRecording\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Možnosti snímků obrazovky a nahrávání\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Bildschirmfoto und Aufnahmeoptionen\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Στιγμιότυπο και Επιλογές Εγγραφής\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Screenshot and Recording Options\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Capture d’écran et options d’enregistrement\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"スクリーンショットと収録のオプション\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"스크린샷 및 녹화 옵션\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Параметры снимка и записи\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Ekran Görüntüsü ve Kayıt Seçenekleri\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Параметри знімка та запису\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"截屏和录制选项\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"螢幕截圖與錄製選項\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"螢幕截圖與錄製選項\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"螢幕截圖與錄製選項\"\n          }\n        }\n      }\n    },\n    \"screenshotSelection\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Výběr Snímku Obrazovky\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Bildschirmfoto Auswahl\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Στιγμιότυπο Επιλογής\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Screenshot Selection\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Sélection de capture d’écran\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"スクリーンショット（範囲選択）\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"스크린샷 선택\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Снимок выбранной области\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Ekran Görüntüsü Seçimi\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Знімок вибраної області\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"截取所选区域\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"截取所選區域\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"截取所選區域\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"截取所選區域\"\n          }\n        }\n      }\n    },\n    \"scrollDurationLockedMessage\": {\n      \"comment\": \"Message shown when simulate trackpad locks the duration setting\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Simulovat dobu trvání uzamčení trackpadu\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"needs_review\",\n            \"value\": \"Simulate Trackpad locks duration\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"needs_review\",\n            \"value\": \"Simulate Trackpad locks duration\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Simulate Trackpad locks duration\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Durée de verrouillage de la simulation de trackpad\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"トラックパッドシミュレーション中は無効\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"needs_review\",\n            \"value\": \"Simulate Trackpad locks duration\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"needs_review\",\n            \"value\": \"Simulate Trackpad locks duration\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"needs_review\",\n            \"value\": \"Simulate Trackpad locks duration\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"needs_review\",\n            \"value\": \"Simulate Trackpad locks duration\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"needs_review\",\n            \"value\": \"启用“模拟触控板”时持续时间已锁定\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"needs_review\",\n            \"value\": \"啟用「模擬觸控板」時持續時間已鎖定\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"needs_review\",\n            \"value\": \"啟用「模擬觸控板」時持續時間已鎖定\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"needs_review\",\n            \"value\": \"啟用「模擬觸控板」時持續時間已鎖定\"\n          }\n        }\n      }\n    },\n    \"selectAll\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Vybrat Vše\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Alle auswählen\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Επιλογή Όλων\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Select All\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Sélectionner tout\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"すべてを選択\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"모두 선택\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Выбрать все\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Tümünü Seç\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Вибрати все\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"全选\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"全選\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"全選\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"全選\"\n          }\n        }\n      }\n    },\n    \"selectAnAction\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Vybrat Akci\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Eine Aktion auswählen\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Επιλέξτε μια ενέργεια\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Select an action\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Sélectionner une action\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"アクションを選択\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"작업 선택\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Выберите действие\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Bir işlem seçin\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Виберіть дію\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"选择一个动作\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"選擇一個動作\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"選擇一個動作\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"選擇一個動作\"\n          }\n        }\n      }\n    },\n    \"showDesktop\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Zobrazit Plochu\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Schreibtisch anzeigen\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Εμφάνιση Επιφάνειας Εργασίας\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Show Desktop\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Afficher le bureau\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"デスクトップを表示\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"데스크탑 보기\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Показать рабочий стол\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Masaüstünü Göster\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Показати робочий стіл\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"显示桌面\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"顯示桌面\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"顯示桌面\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"顯示桌面\"\n          }\n        }\n      }\n    },\n    \"shutdownDialog\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Dialogové okno pro vypnutí\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Ausschalten-Dialog\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Διάλογος Τερματισμού\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Shutdown Dialog\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Boîte de dialogue Arrêt\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"システム終了ダイアログ\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"시스템 종료 대화상자\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Диалог выключения\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Kapatma Penceresi\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Діалог вимкнення\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"关机对话框\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"關機對話框\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"關機對話框\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"關機對話框\"\n          }\n        }\n      }\n    },\n    \"spotlight\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Spotlight\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Spotlight\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Spotlight\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Spotlight\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Spotlight\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Spotlight\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Spotlight\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Spotlight\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Spotlight\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Spotlight\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"聚焦搜索\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Spotlight\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Spotlight\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Spotlight\"\n          }\n        }\n      }\n    },\n    \"spotlightSys\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Spotlight (Systém)\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Spotlight (System)\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Spotlight (Σύστημα)\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Spotlight (System)\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Spotlight (Système)\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Spotlight（システム）\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Spotlight(시스템)\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Spotlight (Система)\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Spotlight (Sistem)\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Spotlight (Система)\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"聚焦搜索(系统)\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"聚焦搜尋(系統)\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"聚焦搜尋(系統)\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"聚焦搜尋(系統)\"\n          }\n        }\n      }\n    },\n    \"switchApp\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Přepnout Aplikaci\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"App wechseln\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Εναλλαγή Εφαρμογής\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Switch Application\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Basculer application\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"アプリを切り替える\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"앱 전환\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Переключить приложение\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Uygulamayı Değiştir\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Перемкнути програму\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"切换应用\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"切換 App\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"切換 App\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"切換 App\"\n          }\n        }\n      }\n    },\n    \"switchAppReverse\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Přepnout Aplikaci (Obráceně)\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"App wechseln (rückwärts)\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Εναλλαγή Εφαρμογής (Αντίστροφα)\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Switch Application (Reverse)\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Basculer application (inversé)\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"アプリを切り替える（逆方向）\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"앱 전환 (역방향)\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Переключить приложение (в обратном направлении)\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Uygulamayı Değiştir (Ters)\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Перемкнути програму (у зворотному напрямку)\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"切换应用(反向)\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"切換 App (反向)\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"切換 App (反向)\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"切換 App (反向)\"\n          }\n        }\n      }\n    },\n    \"switchTabLeft\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Přepnout Panel Vlevo\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Zum Tab links wechseln\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Μετάβαση στην καρτέλα αριστερά\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Switch Tab Left\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Bascule l’onglet de gauche\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"左のタブに移動\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"왼쪽 탭으로 전환\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Переключить вкладку влево\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Soldaki sekmeye geç\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Перемкнути вкладку ліворуч\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"切换到左侧标签页\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"切換到左側分頁\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"切換到左側分頁\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"切換到左側分頁\"\n          }\n        }\n      }\n    },\n    \"switchTabRight\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Přepnout Panel Vpravo\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Zum Tab rechts wechseln\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Μετάβαση στην καρτέλα δεξιά\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Switch Tab Right\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Bascule l’onglet de droite\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"右のタブに移動\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"오른쪽 탭으로 전환\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Переключить вкладку вправо\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Sağdaki sekmeye geç\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Перемкнути вкладку праворуч\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"切换到右侧标签页\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"切換到右側分頁\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"切換到右側分頁\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"切換到右側分頁\"\n          }\n        }\n      }\n    },\n    \"unbind\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Odebrat Přiřazení\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Zuweisung aufheben\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Αποσύνδεση\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Unbind\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Détacher\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"割り当て解除\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"할당 해제\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Отменить назначение\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Atamayı kaldır\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Скасувати призначення\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"取消绑定\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"取消綁定\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"取消綁定\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"取消綁定\"\n          }\n        }\n      }\n    },\n    \"unbound\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Nepřiřazený\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Nicht zugewiesen\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Αδέσμευτο\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Unbound\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Détaché\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"未割り当て\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"미할당\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Не назначено\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Atanmamış\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Не призначено\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"未绑定\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"未綁定\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"未綁定\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"未綁定\"\n          }\n        }\n      }\n    },\n    \"underline\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Podtržení\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Unterstreichen\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Υπογράμμιση\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Underline\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Souligné\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"下線\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"밑줄\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Подчеркнутый\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Altı Çizili\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Підкреслений\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"下划线\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"底線\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"底線\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"底線\"\n          }\n        }\n      }\n    },\n    \"undo\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Zpět\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Widerrufen\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Αναίρεση\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Undo\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Annuler\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"取り消す\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"실행 취소\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Отменить\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Geri Al\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Скасувати\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"撤销\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"還原\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"還原\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"還原\"\n          }\n        }\n      }\n    },\n    \"viewAsColumns\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Zobrazit jako Sloupce\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Als Spalten\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Προβολή ως Στήλες\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"View as Columns\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"par colonnes\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"カラム表示\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"열로 보기\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Вид «Колонки»\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Sütunlar Olarak Görüntüle\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Вигляд «Колонки»\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"以分栏显示\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"以直欄顯示\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"以直欄顯示\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"以直欄顯示\"\n          }\n        }\n      }\n    },\n    \"viewAsGallery\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Zobrazit jako Galerii\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Als Galerie\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Προβολή ως Συλλογή\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"View as Gallery\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Par galerie d’icônes\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"ギャラリー表示\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"갤러리로 보기\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Вид «Галерея»\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Galeri Olarak Görüntüle\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Вигляд «Галерея»\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"以画廊显示\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"以圖庫顯示\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"以圖庫顯示\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"以圖庫顯示\"\n          }\n        }\n      }\n    },\n    \"viewAsIcons\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Zobrazit jako Ikony\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Als Symbole\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Προβολή ως Εικονίδια\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"View as Icons\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Par icônes\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"アイコン表示\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"아이콘으로 보기\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Вид «Значки»\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Simge Olarak Görüntüle\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Вигляд «Піктограми»\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"以图标显示\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"以圖像顯示\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"以圖像顯示\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"以圖像顯示\"\n          }\n        }\n      }\n    },\n    \"viewAsList\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Zobrazit jako List\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Als Liste\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Προβολή ως Λίστα\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"View as List\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Par liste\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"リスト表示\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"목록으로 보기\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Вид «Список»\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Liste Olarak Görüntüle\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Вигляд «Список»\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"以列表显示\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"以列表顯示\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"以列表顯示\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"以列表顯示\"\n          }\n        }\n      }\n    },\n    \"zoomIn\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Přiblížit\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Vergrößern\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Μεγέθυνση\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Zoom In\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Zoomer\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"拡大\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"확대\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Увеличить\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Yakınlaştır\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Збільшити\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"放大\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"放大\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"放大\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"放大\"\n          }\n        }\n      }\n    },\n    \"zoomOut\": {\n      \"extractionState\": \"manual\",\n      \"localizations\": {\n        \"cs\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Oddálit\"\n          }\n        },\n        \"de\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Verkleinern\"\n          }\n        },\n        \"el\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Σμίκρυνση\"\n          }\n        },\n        \"en\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Zoom Out\"\n          }\n        },\n        \"fr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Dézoomer\"\n          }\n        },\n        \"ja\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"縮小\"\n          }\n        },\n        \"ko\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"축소\"\n          }\n        },\n        \"ru\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Уменьшить\"\n          }\n        },\n        \"tr\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Uzaklaştır\"\n          }\n        },\n        \"uk\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"Зменшити\"\n          }\n        },\n        \"zh-Hans\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"缩小\"\n          }\n        },\n        \"zh-Hant\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"縮小\"\n          }\n        },\n        \"zh-Hant-HK\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"縮小\"\n          }\n        },\n        \"zh-Hant-TW\": {\n          \"stringUnit\": {\n            \"state\": \"translated\",\n            \"value\": \"縮小\"\n          }\n        }\n      }\n    }\n  },\n  \"version\": \"1.1\"\n}"
  },
  {
    "path": "Mos/LogitechHID/LogitechDeviceSession.swift",
    "content": "//\n//  LogitechDeviceSession.swift\n//  Mos\n//  单个 Logitech 设备的 HID++ 2.0 通信会话\n//  实现 Feature Discovery, Button Divert, 事件解析\n//  Created by Mos on 2026/3/16.\n//  Copyright © 2026 Caldis. All rights reserved.\n//\n\nimport Cocoa\nimport IOKit\nimport IOKit.hid\n\nclass LogitechDeviceSession {\n\n    // MARK: - Public\n    let hidDevice: IOHIDDevice\n    let deviceInfo: MosInputDevice\n    let usagePage: Int\n    let usage: Int\n    let transport: String\n\n    // MARK: - Connection Mode\n    /// 连接模式: 决定传输格式、device index 策略、divert flags\n    enum ConnectionMode {\n        /// BLE 直连: long report + ID in payload, devIdx=0xFF, divert flags=0x03\n        case bleDirect\n        /// USB Receiver (Unifying/Bolt): vendor-specific interface, devIdx=slot(0x01~0x06)\n        /// TODO: 需要实现槽位发现 (HID++ 1.0 枚举配对设备)\n        case receiver\n        /// 未知/不支持\n        case unsupported\n    }\n\n    private(set) var connectionMode: ConnectionMode = .unsupported\n\n    // MARK: - HID++ State\n    private var featureIndex: [UInt16: UInt8] = [:]\n    private var divertedCIDs: Set<UInt16> = []\n    private var lastActiveCIDs: Set<UInt16> = []\n    private var deviceIndex: UInt8 = 0x01\n    private var isBLE: Bool = false\n    private var deviceOpened: Bool = false\n\n    // MARK: - Report Buffer\n    private var reportBufferPtr: UnsafeMutablePointer<UInt8>?\n    private static let reportBufferSize = 64\n\n    // MARK: - Async Discovery\n    private var pendingDiscovery: [UInt16: (UInt8?) -> Void] = [:]\n    private var discoveryTimer: Timer?\n    private static let discoveryTimeout: TimeInterval = 5.0\n    private var pendingCacheValidation: UInt8? = nil  // 等待 ping 响应验证缓存\n\n    // MARK: - Reprog Controls State\n    private var reprogControlCount: Int = 0\n    private var reprogQueryIndex: Int = 0\n    private var discoveredControls: [ControlInfo] = []\n    private var reprogInitComplete: Bool = false  // init 完成后, function 0 = button event 而非 GetControlCount\n\n    struct ControlInfo {\n        let cid: UInt16\n        let taskId: UInt16\n        let flags: UInt16\n        let isDivertable: Bool\n    }\n\n    // MARK: - Feature Index Cache (按 PID 缓存, 减少重连 discovery 延迟)\n    private static let featureCacheKey = \"logitechFeatureCache\"\n\n    private static func loadCachedFeatureIndex(for productId: UInt16) -> [UInt16: UInt8]? {\n        guard let data = UserDefaults.standard.data(forKey: featureCacheKey),\n              let cache = try? JSONDecoder().decode([UInt16: [UInt16: UInt8]].self, from: data) else { return nil }\n        return cache[productId]\n    }\n\n    private static func saveCachedFeatureIndex(for productId: UInt16, featureMap: [UInt16: UInt8]) {\n        var cache: [UInt16: [UInt16: UInt8]] = [:]\n        if let data = UserDefaults.standard.data(forKey: featureCacheKey),\n           let existing = try? JSONDecoder().decode([UInt16: [UInt16: UInt8]].self, from: data) {\n            cache = existing\n        }\n        cache[productId] = featureMap\n        if let data = try? JSONEncoder().encode(cache) {\n            UserDefaults.standard.set(data, forKey: featureCacheKey)\n        }\n    }\n\n    // MARK: - HID++ Constants\n    private static let featureIRoot: UInt16 = 0x0000\n    private static let featureReprogV4: UInt16 = 0x1B04\n    private static let hidppShortReportId: UInt8 = 0x10\n    private static let hidppLongReportId: UInt8 = 0x11\n    private static let hidppErrorFeatureIdx: UInt8 = 0xFF\n\n    // MARK: - Init\n\n    init(hidDevice: IOHIDDevice) {\n        self.hidDevice = hidDevice\n        self.usagePage = IOHIDDeviceGetProperty(hidDevice, kIOHIDPrimaryUsagePageKey as CFString) as? Int ?? 0\n        self.usage = IOHIDDeviceGetProperty(hidDevice, kIOHIDPrimaryUsageKey as CFString) as? Int ?? 0\n        self.transport = IOHIDDeviceGetProperty(hidDevice, kIOHIDTransportKey as CFString) as? String ?? \"\"\n        self.deviceInfo = MosInputDevice(\n            vendorId: UInt16(IOHIDDeviceGetProperty(hidDevice, kIOHIDVendorIDKey as CFString) as? Int ?? 0),\n            productId: UInt16(IOHIDDeviceGetProperty(hidDevice, kIOHIDProductIDKey as CFString) as? Int ?? 0),\n            name: IOHIDDeviceGetProperty(hidDevice, kIOHIDProductKey as CFString) as? String ?? \"Unknown\"\n        )\n    }\n\n    deinit {\n        if deviceOpened { IOHIDDeviceClose(hidDevice, IOOptionBits(kIOHIDOptionsTypeNone)) }\n        reportBufferPtr?.deallocate()\n    }\n\n    /// 是否为 HID++ 候选接口\n    var isHIDPPCandidate: Bool {\n        // USB: 只有 vendor-specific usage page 支持 HID++\n        if !isBLE {\n            return usagePage == 0xFF00 || usagePage == 0xFF43 || usagePage == 0xFFC0\n        }\n        // BLE: HID++ 复用标准 mouse interface\n        return usagePage == 0x0001 && usage == 0x0002\n    }\n\n    // MARK: - Debug Accessors (for HID++ debug panel)\n    var debugFeatureIndex: [UInt16: UInt8] { featureIndex }\n    var debugDiscoveredControls: [ControlInfo] { discoveredControls }\n    var debugDivertedCIDs: Set<UInt16> { divertedCIDs }\n    var debugReprogInitComplete: Bool { reprogInitComplete }\n    var debugDeviceIndex: UInt8 { deviceIndex }\n    var debugIsBLE: Bool { isBLE }\n    var debugDeviceOpened: Bool { deviceOpened }\n    var debugConnectionMode: String {\n        switch connectionMode {\n        case .bleDirect: return \"BLE Direct\"\n        case .receiver: return \"Receiver (Unifying/Bolt)\"\n        case .unsupported: return \"Unsupported\"\n        }\n    }\n\n    // MARK: - Setup / Teardown\n\n    func setup() {\n        isBLE = transport.lowercased().contains(\"bluetooth\")\n\n        // 确定连接模式\n        if isBLE {\n            connectionMode = .bleDirect\n            deviceIndex = 0xFF\n        } else if usagePage == 0xFF00 || usagePage == 0xFF43 || usagePage == 0xFFC0 {\n            connectionMode = .receiver\n            deviceIndex = 0x01  // TODO: 通过 HID++ 1.0 枚举槽位确定实际 index\n        } else {\n            connectionMode = .unsupported\n        }\n\n        let tag = \"[\\(deviceInfo.name):\\(String(format: \"0x%04X\", usagePage))/\\(String(format: \"0x%04X\", usage))]\"\n        LogitechHIDDebugPanel.log(\"\\(tag) Setup: transport=\\(transport), mode=\\(connectionMode), devIdx=\\(String(format: \"0x%02X\", deviceIndex)), isCandidate=\\(isHIDPPCandidate)\")\n\n        // 只对 HID++ 候选接口进行协议通信\n        guard isHIDPPCandidate else {\n            LogitechHIDDebugPanel.log(\"\\(tag) Skipping: not a HID++ candidate interface\")\n            // 仍然注册 input report 回调以捕获广播通知 (如 SmartShift)\n            setupInputReportCallback()\n            return\n        }\n\n        // 显式打开设备 (IOHIDManagerOpen 可能不够)\n        let openResult = IOHIDDeviceOpen(hidDevice, IOOptionBits(kIOHIDOptionsTypeNone))\n        if openResult == kIOReturnSuccess {\n            deviceOpened = true\n            LogitechHIDDebugPanel.log(\"\\(tag) IOHIDDeviceOpen: OK\")\n        } else {\n            LogitechHIDDebugPanel.log(\"\\(tag) IOHIDDeviceOpen: failed \\(String(format: \"0x%08x\", openResult)), proceeding anyway\")\n        }\n\n        setupInputReportCallback()\n\n        // Feature Discovery (尝试缓存, 失败则完整 discovery)\n        if let cached = Self.loadCachedFeatureIndex(for: deviceInfo.productId),\n           let reprogIdx = cached[Self.featureReprogV4] {\n            LogitechHIDDebugPanel.log(\"\\(tag) Using cached feature index: REPROG at 0x\\(String(format: \"%02X\", reprogIdx))\")\n            self.featureIndex = cached.reduce(into: [UInt16: UInt8]()) { $0[$1.key] = $1.value }\n            // 用 ping 验证缓存是否有效 (IRoot.GetProtocolVersion)\n            sendRequest(featureIndex: 0x00, functionId: 1)\n            pendingCacheValidation = reprogIdx\n        } else {\n            LogitechHIDDebugPanel.log(\"\\(tag) Starting feature discovery for REPROG_CONTROLS_V4 (0x1B04)\")\n            startFreshDiscovery(tag: tag)\n        }\n    }\n\n    private func setupInputReportCallback() {\n        reportBufferPtr = .allocate(capacity: Self.reportBufferSize)\n        reportBufferPtr!.initialize(repeating: 0, count: Self.reportBufferSize)\n        let context = Unmanaged.passUnretained(self).toOpaque()\n        IOHIDDeviceRegisterInputReportCallback(\n            hidDevice, reportBufferPtr!, Self.reportBufferSize, Self.inputReportCallback, context\n        )\n    }\n\n    func teardown() {\n        LogitechHIDDebugPanel.log(\"[\\(deviceInfo.name)] Teardown\")\n        discoveryTimer?.invalidate()\n        discoveryTimer = nil\n        pendingDiscovery.removeAll()\n        if let reprogIdx = featureIndex[Self.featureReprogV4] {\n            for cid in divertedCIDs {\n                setControlReporting(featureIndex: reprogIdx, cid: cid, divert: false)\n            }\n        }\n        divertedCIDs.removeAll()\n        lastActiveCIDs.removeAll()\n        discoveredControls.removeAll()\n    }\n\n    // MARK: - Input Report Callback\n\n    static let inputReportCallback: IOHIDReportCallback = { context, result, sender, type, reportID, report, reportLength in\n        guard let context = context else { return }\n        let session = Unmanaged<LogitechDeviceSession>.fromOpaque(context).takeUnretainedValue()\n        let data = Array(UnsafeBufferPointer(start: report, count: reportLength))\n        session.handleInputReport(data)\n    }\n\n    // MARK: - HID++ Send\n\n    /// 发送 HID++ 请求\n    /// BLE 直连: long report (20 bytes) + report ID in payload (hidapi 兼容)\n    /// Receiver: TODO - 可能需要不同格式, 待 Bolt/Unifying 测试后实现\n    private func sendRequest(featureIndex: UInt8, functionId: UInt8, params: [UInt8] = []) {\n        var report: [UInt8]\n        let result: IOReturn\n\n        switch connectionMode {\n        case .bleDirect:\n            // BLE: long report, hidapi 兼容 (report ID in payload)\n            report = [UInt8](repeating: 0, count: 20)\n            report[0] = Self.hidppLongReportId\n            report[1] = deviceIndex\n            report[2] = featureIndex\n            report[3] = (functionId << 4) | 0x01\n            for (i, p) in params.prefix(16).enumerated() { report[4 + i] = p }\n            result = IOHIDDeviceSetReport(\n                hidDevice, kIOHIDReportTypeOutput,\n                CFIndex(report[0]), report, report.count\n            )\n\n        case .receiver:\n            // TODO: Unifying/Bolt receiver 传输\n            // 可能需要: short report (7 bytes), 不同的 payload 格式\n            // 需要先实现 HID++ 1.0 槽位枚举\n            report = [UInt8](repeating: 0, count: 20)\n            report[0] = Self.hidppLongReportId\n            report[1] = deviceIndex\n            report[2] = featureIndex\n            report[3] = (functionId << 4) | 0x01\n            for (i, p) in params.prefix(16).enumerated() { report[4 + i] = p }\n            result = IOHIDDeviceSetReport(\n                hidDevice, kIOHIDReportTypeOutput,\n                CFIndex(report[0]), report, report.count\n            )\n\n        case .unsupported:\n            LogitechHIDDebugPanel.log(device: deviceInfo.name, type: .warning, message: \"Cannot send: unsupported connection mode\")\n            return\n        }\n\n        let hex = report.prefix(8).map { String(format: \"%02X\", $0) }.joined(separator: \" \")\n        let resultStr = result == kIOReturnSuccess ? \"OK\" : String(format: \"0x%08x\", result)\n        let decoded = decodeRequest(featureIndex: featureIndex, functionId: functionId, params: params)\n        LogitechHIDDebugPanel.log(device: deviceInfo.name, type: .tx, message: \"TX: \\(hex)... -> \\(resultStr)\", decoded: decoded)\n    }\n\n    // MARK: - Feature Discovery\n\n    private func startFreshDiscovery(tag: String) {\n        discoverFeature(featureId: Self.featureReprogV4) { [weak self] index in\n            guard let self = self, let index = index else {\n                LogitechHIDDebugPanel.log(\"\\(tag) REPROG_CONTROLS_V4 not available\")\n                return\n            }\n            self.featureIndex[Self.featureReprogV4] = index\n            LogitechHIDDebugPanel.log(\"\\(tag) REPROG_CONTROLS_V4 at index \\(String(format: \"0x%02X\", index))\")\n            // 缓存 feature index\n            Self.saveCachedFeatureIndex(for: self.deviceInfo.productId, featureMap: self.featureIndex)\n            self.sendGetControlCount(featureIndex: index)\n        }\n    }\n\n    private func discoverFeature(featureId: UInt16, completion: @escaping (UInt8?) -> Void) {\n        let params: [UInt8] = [UInt8(featureId >> 8), UInt8(featureId & 0xFF)]\n        sendRequest(featureIndex: 0x00, functionId: 0, params: params)\n        pendingDiscovery[featureId] = completion\n\n        discoveryTimer?.invalidate()\n        discoveryTimer = Timer.scheduledTimer(withTimeInterval: Self.discoveryTimeout, repeats: false) { [weak self] _ in\n            guard let self = self else { return }\n            if let pending = self.pendingDiscovery.removeValue(forKey: featureId) {\n                LogitechHIDDebugPanel.log(\"[\\(self.deviceInfo.name)] Feature discovery timed out for \\(String(format: \"0x%04X\", featureId))\")\n                pending(nil)\n            }\n        }\n    }\n\n    // MARK: - REPROG_CONTROLS_V4 Flow\n\n    private func sendGetControlCount(featureIndex: UInt8) {\n        LogitechHIDDebugPanel.log(\"[\\(deviceInfo.name)] Sending GetControlCount\")\n        sendRequest(featureIndex: featureIndex, functionId: 0)\n    }\n\n    private func sendGetControlInfo(featureIndex: UInt8, index: Int) {\n        LogitechHIDDebugPanel.log(\"[\\(deviceInfo.name)] Sending GetControlInfo(\\(index))\")\n        sendRequest(featureIndex: featureIndex, functionId: 1, params: [UInt8(index)])\n    }\n\n    private func setControlReporting(featureIndex: UInt8, cid: UInt16, divert: Bool) {\n        let cidH = UInt8(cid >> 8)\n        let cidL = UInt8(cid & 0xFF)\n\n        let flagsByte: UInt8\n        switch connectionMode {\n        case .bleDirect:\n            // BLE: bit1 是 \"commit\" 标志, 必须置位才能生效\n            // SET: bit0=1(divert ON) + bit1=1(commit) = 0x03\n            // CLEAR: bit0=0(divert OFF) + bit1=1(commit) = 0x02\n            flagsByte = divert ? 0x03 : 0x02\n        case .receiver:\n            // Receiver (Unifying/Bolt): TODO - 可能只需 tmpDiverted(bit0) = 0x01\n            flagsByte = divert ? 0x01 : 0x00\n        case .unsupported:\n            return\n        }\n\n        // params: CID(2) + flags(1) + targetCID(2) (自映射)\n        sendRequest(featureIndex: featureIndex, functionId: 3,\n                         params: [cidH, cidL, flagsByte, cidH, cidL])\n        if divert { divertedCIDs.insert(cid) } else { divertedCIDs.remove(cid) }\n        LogitechHIDDebugPanel.log(\"[\\(deviceInfo.name)] CID \\(String(format: \"0x%04X\", cid)) divert=\\(divert ? \"ON\" : \"OFF\")\")\n    }\n\n    // MARK: - Debug Operations (interactive divert control)\n\n    func rediscoverFeatures() {\n        featureIndex.removeAll()\n        discoveredControls.removeAll()\n        reprogInitComplete = false\n        reprogControlCount = 0\n        reprogQueryIndex = 0\n        divertedCIDs.removeAll()\n        lastActiveCIDs.removeAll()\n        LogitechHIDDebugPanel.log(\"[\\(deviceInfo.name)] Re-discovering features...\")\n        discoverFeature(featureId: Self.featureReprogV4) { [weak self] index in\n            guard let self = self, let index = index else {\n                LogitechHIDDebugPanel.log(\"[\\(self?.deviceInfo.name ?? \"?\")] REPROG_CONTROLS_V4 not available\")\n                return\n            }\n            self.featureIndex[Self.featureReprogV4] = index\n            LogitechHIDDebugPanel.log(\"[\\(self.deviceInfo.name)] REPROG_CONTROLS_V4 at index \\(String(format: \"0x%02X\", index))\")\n            self.sendGetControlCount(featureIndex: index)\n        }\n    }\n\n    func redivertAllControls() {\n        lastActiveCIDs.removeAll()\n        reprogInitComplete = true\n        syncDivertWithBindings()\n        LogitechHIDDebugPanel.log(\"[\\(deviceInfo.name)] Re-synced divert with bindings\")\n    }\n\n    func undivertAllControls() {\n        guard let idx = featureIndex[Self.featureReprogV4] else { return }\n        for cid in divertedCIDs {\n            setControlReporting(featureIndex: idx, cid: cid, divert: false)\n        }\n        reprogInitComplete = false\n        LogitechHIDDebugPanel.log(\"[\\(deviceInfo.name)] Undiverted all controls\")\n    }\n\n    func toggleDivert(cid: UInt16) {\n        guard let idx = featureIndex[Self.featureReprogV4] else { return }\n        let currentlyDiverted = divertedCIDs.contains(cid)\n        setControlReporting(featureIndex: idx, cid: cid, divert: !currentlyDiverted)\n    }\n\n    // MARK: - Report Decoding (for debug panel)\n\n    private func decodeRequest(featureIndex: UInt8, functionId: UInt8, params: [UInt8]) -> String {\n        if featureIndex == 0x00 && functionId == 0 && params.count >= 2 {\n            let featId = (UInt16(params[0]) << 8) | UInt16(params[1])\n            let name = HIDPPInfo.featureNames[featId]?.0 ?? \"0x\\(String(format: \"%04X\", featId))\"\n            return \"IRoot.GetFeature(\\(name))\"\n        }\n        if featureIndex == 0x00 && functionId == 1 {\n            return \"IRoot.Ping (GetProtocolVersion)\"\n        }\n        if let reprogIdx = self.featureIndex[Self.featureReprogV4], featureIndex == reprogIdx {\n            switch functionId {\n            case 0: return \"REPROG.GetControlCount()\"\n            case 1:\n                let idx = params.first.map { \"\\($0)\" } ?? \"?\"\n                return \"REPROG.GetControlInfo(index=\\(idx))\"\n            case 3:\n                if params.count >= 3 {\n                    let cid = (UInt16(params[0]) << 8) | UInt16(params[1])\n                    let cidName = HIDPPInfo.cidNames[cid] ?? \"?\"\n                    let divert = params[2] & 0x01 != 0\n                    return \"REPROG.SetControlReporting(CID=\\(String(format: \"0x%04X\", cid)) \\(cidName), divert=\\(divert ? \"ON\" : \"OFF\"))\"\n                }\n                return \"REPROG.SetControlReporting\"\n            default: return \"REPROG.func\\(functionId)\"\n            }\n        }\n        return \"Feature[0x\\(String(format: \"%02X\", featureIndex))].func\\(functionId)\"\n    }\n\n    private func decodeReport(_ report: [UInt8]) -> String {\n        guard report.count >= 7 else { return \"short report\" }\n        let featIdx = report[2]\n        let funcId = report[3] >> 4\n\n        if featIdx == Self.hidppErrorFeatureIdx {\n            let errCode = report.count > 6 ? report[6] : 0\n            let errName = HIDPPInfo.errorNames[errCode] ?? \"0x\\(String(format: \"%02X\", errCode))\"\n            return \"HID++ ERROR: \\(errName)\"\n        }\n        if featIdx == 0x00 {\n            if funcId == 0 {\n                let idx = report[4]\n                return idx == 0 ? \"IRoot: feature not found\" : \"IRoot: feature at index 0x\\(String(format: \"%02X\", idx))\"\n            }\n            if funcId == 1 {\n                return \"IRoot: protocol \\(report[4]).\\(report[5])\"\n            }\n        }\n        if let reprogIdx = featureIndex[Self.featureReprogV4], featIdx == reprogIdx {\n            if !reprogInitComplete && funcId == 0 {\n                return \"REPROG.ControlCount = \\(report[4])\"\n            }\n            if funcId == 1 {\n                let cid = (UInt16(report[4]) << 8) | UInt16(report[5])\n                let name = HIDPPInfo.cidNames[cid] ?? \"?\"\n                return \"REPROG.ControlInfo: CID=\\(String(format: \"0x%04X\", cid)) (\\(name))\"\n            }\n            if reprogInitComplete && funcId == 0 {\n                // divertedButtonsEvent\n                var cids: [String] = []\n                var offset = 4\n                while offset + 1 < report.count {\n                    let cid = (UInt16(report[offset]) << 8) | UInt16(report[offset + 1])\n                    if cid == 0 { break }\n                    let name = HIDPPInfo.cidNames[cid] ?? \"?\"\n                    cids.append(\"\\(String(format: \"0x%04X\", cid))(\\(name))\")\n                    offset += 2\n                }\n                return cids.isEmpty ? \"BUTTON EVENT: all released\" : \"BUTTON EVENT: \\(cids.joined(separator: \" + \"))\"\n            }\n            if funcId == 3 {\n                return \"REPROG.SetControlReporting ACK\"\n            }\n        }\n        // SmartShift or other feature notifications\n        if let name = findFeatureName(forIndex: featIdx) {\n            return \"\\(name) notification (func=\\(funcId))\"\n        }\n        return \"Feature[0x\\(String(format: \"%02X\", featIdx))].func\\(funcId)\"\n    }\n\n    private func findFeatureName(forIndex idx: UInt8) -> String? {\n        for (featId, featIdx) in featureIndex {\n            if featIdx == idx {\n                return HIDPPInfo.featureNames[featId]?.0\n            }\n        }\n        return nil\n    }\n\n    // MARK: - Logi Action Execution\n\n    private var pendingSmartShiftToggle: UInt8? = nil\n    private var pendingDPICycle: (featureIndex: UInt8, direction: LogitechHIDManager.DPICycleDirection)? = nil\n    private var pendingDPIListQuery: (featureIndex: UInt8, direction: LogitechHIDManager.DPICycleDirection)? = nil\n    private var currentDPI: UInt16 = 0\n    private var dpiSteps: [UInt16] = []  // 从设备查询, 不硬编码\n    private var dpiStepSize: UInt16 = 0  // 设备报告的 DPI 步进值\n\n    /// SmartShift 切换\n    func executeSmartShiftToggle() {\n        // SmartShift feature ID = 0x2110\n        let smartShiftFeatureId: UInt16 = 0x2110\n        if let idx = featureIndex[smartShiftFeatureId] {\n            // 已知 feature index, 直接切换\n            toggleSmartShift(featureIndex: idx)\n        } else {\n            // 先发现 feature\n            discoverFeature(featureId: smartShiftFeatureId) { [weak self] idx in\n                guard let self = self, let idx = idx else {\n                    LogitechHIDDebugPanel.log(\"[\\(self?.deviceInfo.name ?? \"?\")] SmartShift feature not supported\")\n                    return\n                }\n                self.featureIndex[smartShiftFeatureId] = idx\n                self.toggleSmartShift(featureIndex: idx)\n            }\n        }\n    }\n\n    private func toggleSmartShift(featureIndex: UInt8) {\n        // getRatchetControlMode: function 0\n        // 响应: byte[4] = wheelMode (1=freewheel, 2=ratchet)\n        sendRequest(featureIndex: featureIndex, functionId: 0)\n        // 响应在 handleInputReport 中处理 -> handleSmartShiftResponse\n        pendingSmartShiftToggle = featureIndex\n    }\n\n    /// DPI 循环\n    func executeDPICycle(direction: LogitechHIDManager.DPICycleDirection) {\n        // AdjustableDPI feature ID = 0x2201\n        let dpiFeatureId: UInt16 = 0x2201\n        if let idx = featureIndex[dpiFeatureId] {\n            cycleDPI(featureIndex: idx, direction: direction)\n        } else {\n            discoverFeature(featureId: dpiFeatureId) { [weak self] idx in\n                guard let self = self, let idx = idx else {\n                    LogitechHIDDebugPanel.log(\"[\\(self?.deviceInfo.name ?? \"?\")] AdjustableDPI feature not supported\")\n                    return\n                }\n                self.featureIndex[dpiFeatureId] = idx\n                self.cycleDPI(featureIndex: idx, direction: direction)\n            }\n        }\n    }\n\n    private func cycleDPI(featureIndex: UInt8, direction: LogitechHIDManager.DPICycleDirection) {\n        if dpiSteps.isEmpty {\n            // 先查询设备支持的 DPI 列表\n            // getSensorDpiList: function 1, param sensorIdx=0\n            // 响应: byte[4]=sensorIdx, byte[5-6]=dpiStep, byte[7-8]=dpi1, byte[9-10]=dpi2, ...\n            // 如果 dpiStep > 0: 范围模式 (min~max, 步进 dpiStep)\n            // 如果 dpiStep == 0: 列表中的每个值都是一个档位\n            sendRequest(featureIndex: featureIndex, functionId: 1, params: [0x00])\n            pendingDPIListQuery = (featureIndex, direction)\n        } else {\n            // 已有 DPI 列表, 直接查询当前值并切换\n            // getSensorDpi: function 2, param sensorIdx=0\n            sendRequest(featureIndex: featureIndex, functionId: 2, params: [0x00])\n            pendingDPICycle = (featureIndex, direction)\n        }\n    }\n\n    // MARK: - ChangeHost\n\n    private var pendingHostCycle: UInt8? = nil  // feature index, 等待 getHostInfo 响应后循环\n\n    /// 切换到指定主机 (0-based index)\n    func executeChangeHost(hostIndex: UInt8) {\n        let changeHostFeatureId: UInt16 = 0x1814\n        if let idx = featureIndex[changeHostFeatureId] {\n            switchToHost(featureIndex: idx, hostIndex: hostIndex)\n        } else {\n            discoverFeature(featureId: changeHostFeatureId) { [weak self] idx in\n                guard let self = self, let idx = idx else {\n                    LogitechHIDDebugPanel.log(\"[\\(self?.deviceInfo.name ?? \"?\")] ChangeHost feature not supported\")\n                    return\n                }\n                self.featureIndex[changeHostFeatureId] = idx\n                self.switchToHost(featureIndex: idx, hostIndex: hostIndex)\n            }\n        }\n    }\n\n    /// 循环切换主机\n    func executeHostCycle() {\n        let changeHostFeatureId: UInt16 = 0x1814\n        if let idx = featureIndex[changeHostFeatureId] {\n            // 先查询当前主机信息, 然后切换到下一个\n            sendRequest(featureIndex: idx, functionId: 0)\n            pendingHostCycle = idx\n        } else {\n            discoverFeature(featureId: changeHostFeatureId) { [weak self] idx in\n                guard let self = self, let idx = idx else {\n                    LogitechHIDDebugPanel.log(\"[\\(self?.deviceInfo.name ?? \"?\")] ChangeHost feature not supported\")\n                    return\n                }\n                self.featureIndex[changeHostFeatureId] = idx\n                self.sendRequest(featureIndex: idx, functionId: 0)\n                self.pendingHostCycle = idx\n            }\n        }\n    }\n\n    private func switchToHost(featureIndex: UInt8, hostIndex: UInt8) {\n        LogitechHIDDebugPanel.log(\"[\\(deviceInfo.name)] Switching to host \\(hostIndex + 1)\")\n        // setHost: function 1, param = target host index (0-based)\n        sendRequest(featureIndex: featureIndex, functionId: 1, params: [hostIndex])\n        // 注意: 切换后设备会断开连接, session 会被清理\n    }\n\n    // MARK: - Report Parsing\n\n    func handleInputReport(_ report: [UInt8]) {\n        guard report.count >= 7 else { return }\n        guard report[0] == Self.hidppShortReportId || report[0] == Self.hidppLongReportId else { return }\n\n        let hex = report.prefix(min(report.count, 20)).map { String(format: \"%02X\", $0) }.joined(separator: \" \")\n        let featureIdx = report[2]\n        let functionId = report[3] >> 4\n        let rxDecoded = decodeReport(report)\n        let rxType: LogEntryType = featureIdx == Self.hidppErrorFeatureIdx ? .error : .rx\n        LogitechHIDDebugPanel.log(device: deviceInfo.name, type: rxType, message: \"RX: \\(hex)\", decoded: rxDecoded)\n\n        // Error report\n        if featureIdx == Self.hidppErrorFeatureIdx {\n            let errorCode = report.count > 6 ? report[6] : 0\n            LogitechHIDDebugPanel.log(\"[\\(deviceInfo.name)] HID++ Error: feat=\\(String(format: \"0x%02X\", report[3])) err=\\(String(format: \"0x%02X\", errorCode))\")\n            for (featureId, callback) in pendingDiscovery {\n                callback(nil)\n                pendingDiscovery.removeValue(forKey: featureId)\n            }\n            return\n        }\n\n        // IRoot response\n        if featureIdx == 0x00 {\n            // 缓存验证: ping 响应 (function 1) 确认设备在线, 直接用缓存的 feature index\n            if let reprogIdx = pendingCacheValidation, functionId == 1 {\n                pendingCacheValidation = nil\n                LogitechHIDDebugPanel.log(\"[\\(deviceInfo.name)] Cache validated (protocol \\(report[4]).\\(report[5])), using cached index 0x\\(String(format: \"%02X\", reprogIdx))\")\n                sendGetControlCount(featureIndex: reprogIdx)\n                return\n            }\n            handleDiscoveryResponse(report)\n            return\n        }\n\n        // REPROG_CONTROLS_V4\n        if let reprogIdx = featureIndex[Self.featureReprogV4], featureIdx == reprogIdx {\n            if reprogInitComplete {\n                // init 完成后: 所有 REPROG 消息都是 button event (function 0 = divertedButtonsEvent)\n                if functionId == 0 {\n                    handleDivertedButtonEvent(report)\n                }\n                // function 3 = SetControlReporting ACK, 忽略\n                // function 1/2 等也忽略\n            } else {\n                // init 阶段: 按 function ID 路由\n                switch functionId {\n                case 0: handleGetControlCountResponse(report)\n                case 1: handleGetControlInfoResponse(report)\n                default: break  // ACK 等直接忽略, 不当作 button event\n                }\n            }\n            return\n        }\n\n        // SmartShift response (pending toggle)\n        if let smartShiftIdx = pendingSmartShiftToggle, featureIdx == smartShiftIdx && functionId == 0 {\n            pendingSmartShiftToggle = nil\n            let currentMode = report[4]  // 1=freewheel, 2=ratchet\n            let newMode: UInt8 = (currentMode == 2) ? 1 : 2\n            LogitechHIDDebugPanel.log(\"[\\(deviceInfo.name)] SmartShift: \\(currentMode == 2 ? \"ratchet\" : \"freewheel\") -> \\(newMode == 2 ? \"ratchet\" : \"freewheel\")\")\n            // setRatchetControlMode: function 1, params: wheelMode\n            sendRequest(featureIndex: smartShiftIdx, functionId: 1, params: [newMode])\n            return\n        }\n\n        // DPI list response (getSensorDpiList, function 1)\n        if let listQuery = pendingDPIListQuery, featureIdx == listQuery.featureIndex && functionId == 1 {\n            pendingDPIListQuery = nil\n            dpiSteps.removeAll()\n            dpiStepSize = 0\n\n            // 从 byte[5] 开始读取 UInt16 值序列 (byte[4]=sensorIdx)\n            // Solaar 规则: 值 > 0xE000 是步进标记 (step = value - 0xE000)\n            // 格式: [minDPI, 0xE000+step, maxDPI, 0x0000(end)]\n            // 或: [dpi1, dpi2, dpi3, ..., 0x0000] (离散列表)\n            var values: [UInt16] = []\n            var step: UInt16 = 0\n            var offset = 5\n            while offset + 1 < report.count {\n                let val = (UInt16(report[offset]) << 8) | UInt16(report[offset + 1])\n                if val == 0 { break }\n                if val > 0xE000 {\n                    step = val - 0xE000\n                } else {\n                    values.append(val)\n                }\n                offset += 2\n            }\n\n            if step > 0 && values.count >= 2 {\n                // 范围模式: values[0]=min, values[1]=max\n                let dpiMin = values[0]\n                let dpiMax = values[1]\n                dpiStepSize = step\n                var dpi = dpiMin\n                while dpi <= dpiMax {\n                    dpiSteps.append(dpi)\n                    dpi += step\n                }\n                LogitechHIDDebugPanel.log(\"[\\(deviceInfo.name)] DPI range: \\(dpiMin)-\\(dpiMax) step \\(step) (\\(dpiSteps.count) levels)\")\n            } else {\n                // 离散列表模式\n                dpiSteps = values\n                LogitechHIDDebugPanel.log(\"[\\(deviceInfo.name)] DPI list: \\(dpiSteps)\")\n            }\n\n            // 继续: 查询当前 DPI 并执行切换\n            sendRequest(featureIndex: listQuery.featureIndex, functionId: 2, params: [0x00])\n            pendingDPICycle = (listQuery.featureIndex, listQuery.direction)\n            return\n        }\n\n        // DPI response (pending cycle)\n        if let dpiInfo = pendingDPICycle, featureIdx == dpiInfo.featureIndex && functionId == 2 {\n            pendingDPICycle = nil\n            // byte[4]=sensorIdx, byte[5-6]=currentDPI (big-endian)\n            let curDPI = (UInt16(report[5]) << 8) | UInt16(report[6])\n            currentDPI = curDPI\n\n            // Find next/prev DPI step\n            let sortedSteps = dpiSteps.sorted()\n            let newDPI: UInt16\n            if dpiInfo.direction == .up {\n                newDPI = sortedSteps.first(where: { $0 > curDPI }) ?? sortedSteps.last ?? curDPI\n            } else {\n                newDPI = sortedSteps.last(where: { $0 < curDPI }) ?? sortedSteps.first ?? curDPI\n            }\n\n            if newDPI != curDPI {\n                LogitechHIDDebugPanel.log(\"[\\(deviceInfo.name)] DPI: \\(curDPI) -> \\(newDPI)\")\n                // setSensorDpi: function 3, params: sensorIdx(1) + dpi(2)\n                sendRequest(featureIndex: dpiInfo.featureIndex, functionId: 3, params: [0x00, UInt8(newDPI >> 8), UInt8(newDPI & 0xFF)])\n            } else {\n                LogitechHIDDebugPanel.log(\"[\\(deviceInfo.name)] DPI: \\(curDPI) (already at limit)\")\n            }\n            return\n        }\n\n        // ChangeHost response (getHostInfo, function 0) - 用于 cycle\n        if let hostIdx = pendingHostCycle, featureIdx == hostIdx && functionId == 0 {\n            pendingHostCycle = nil\n            let hostCount = report[4]\n            let currentHost = report[5]\n            let nextHost = (currentHost + 1) % hostCount\n            LogitechHIDDebugPanel.log(\"[\\(deviceInfo.name)] Host: \\(currentHost + 1)/\\(hostCount) -> \\(nextHost + 1)\")\n            switchToHost(featureIndex: hostIdx, hostIndex: nextHost)\n            return\n        }\n    }\n\n    private func handleDiscoveryResponse(_ report: [UInt8]) {\n        let discoveredIndex = report[4]\n        LogitechHIDDebugPanel.log(\"[\\(deviceInfo.name)] IRoot response: discoveredIndex=\\(String(format: \"0x%02X\", discoveredIndex))\")\n        if let (featureId, callback) = pendingDiscovery.first {\n            discoveryTimer?.invalidate()\n            pendingDiscovery.removeValue(forKey: featureId)\n            callback(discoveredIndex == 0 ? nil : discoveredIndex)\n        }\n    }\n\n    private func handleGetControlCountResponse(_ report: [UInt8]) {\n        reprogControlCount = Int(report[4])\n        reprogQueryIndex = 0\n        discoveredControls.removeAll()\n        LogitechHIDDebugPanel.log(\"[\\(deviceInfo.name)] GetControlCount = \\(reprogControlCount)\")\n        if reprogControlCount > 0, let idx = featureIndex[Self.featureReprogV4] {\n            sendGetControlInfo(featureIndex: idx, index: 0)\n        }\n    }\n\n    private func handleGetControlInfoResponse(_ report: [UInt8]) {\n        guard report.count >= 11 else { return }\n        let cid = (UInt16(report[4]) << 8) | UInt16(report[5])\n        let taskId = (UInt16(report[6]) << 8) | UInt16(report[7])\n        let flags1 = report[8]\n        let flags2: UInt8 = report.count > 12 ? report[12] : 0\n        let flags = UInt16(flags1) | (UInt16(flags2) << 8)\n        // Solaar: bit 4 = reprogrammable (0x10), bit 5 = divertable (0x20)\n        let isDivertable = (flags & 0x20) != 0\n\n        discoveredControls.append(ControlInfo(cid: cid, taskId: taskId, flags: flags, isDivertable: isDivertable))\n        LogitechHIDDebugPanel.log(\"[\\(deviceInfo.name)] Control[\\(reprogQueryIndex)]: CID=\\(String(format: \"0x%04X\", cid)) flags=\\(String(format: \"0x%04X\", flags)) divertable=\\(isDivertable)\")\n\n        reprogQueryIndex += 1\n        if reprogQueryIndex < reprogControlCount, let idx = featureIndex[Self.featureReprogV4] {\n            sendGetControlInfo(featureIndex: idx, index: reprogQueryIndex)\n        } else {\n            divertBoundControls()\n        }\n    }\n\n    /// 初始化完成后: 清理 persistDivert 残留, 然后按 binding 重新 divert\n    private func divertBoundControls() {\n        guard let idx = featureIndex[Self.featureReprogV4] else { return }\n\n        // 先 undivert 所有 divertable 控件 (清理 app 崩溃/强杀后的 persistDivert 残留)\n        let divertable = discoveredControls.filter { $0.isDivertable }\n        for c in divertable {\n            setControlReporting(featureIndex: idx, cid: c.cid, divert: false)\n        }\n        divertedCIDs.removeAll()\n        LogitechHIDDebugPanel.log(\"[\\(deviceInfo.name)] Cleared persistDivert residue (\\(divertable.count) controls)\")\n\n        // 再按 binding 状态重新 divert\n        reprogInitComplete = true\n        lastActiveCIDs.removeAll()\n        syncDivertWithBindings()\n        LogitechHIDDebugPanel.log(\"[\\(deviceInfo.name)] Init complete, listening for button events\")\n    }\n\n    /// 同步 divert 状态: 只 divert 有绑定的按键, un-divert 没有绑定的\n    func syncDivertWithBindings() {\n        guard let idx = featureIndex[Self.featureReprogV4] else { return }\n\n        // 获取所有已启用绑定的 Mos codes\n        let boundCodes = Set(\n            ButtonUtils.shared.getButtonBindings()\n                .filter { $0.isEnabled && $0.triggerEvent.type == .mouse }\n                .map { $0.triggerEvent.code }\n        )\n\n        let divertable = discoveredControls.filter { $0.isDivertable }\n        var divertCount = 0\n\n        for c in divertable {\n            let mosCode = LogitechCIDMap.toMosCode(c.cid)\n            let shouldDivert = boundCodes.contains(mosCode)\n            let currentlyDiverted = divertedCIDs.contains(c.cid)\n\n            if shouldDivert && !currentlyDiverted {\n                setControlReporting(featureIndex: idx, cid: c.cid, divert: true)\n                divertCount += 1\n            } else if !shouldDivert && currentlyDiverted {\n                setControlReporting(featureIndex: idx, cid: c.cid, divert: false)\n            } else if shouldDivert {\n                divertCount += 1\n            }\n        }\n\n        LogitechHIDDebugPanel.log(\"[\\(deviceInfo.name)] Sync divert: \\(divertCount)/\\(divertable.count) controls diverted (based on bindings)\")\n    }\n\n    /// 录制模式: 临时 divert 所有 divertable 按键\n    func temporarilyDivertAll() {\n        guard let idx = featureIndex[Self.featureReprogV4] else { return }\n        let divertable = discoveredControls.filter { $0.isDivertable }\n        for c in divertable where !divertedCIDs.contains(c.cid) {\n            setControlReporting(featureIndex: idx, cid: c.cid, divert: true)\n        }\n        LogitechHIDDebugPanel.log(\"[\\(deviceInfo.name)] Temporarily diverted all \\(divertable.count) controls (recording mode)\")\n    }\n\n    /// 录制结束: 恢复到只 divert 有绑定的状态\n    func restoreDivertToBindings() {\n        syncDivertWithBindings()\n    }\n\n    private func handleDivertedButtonEvent(_ report: [UInt8]) {\n        var activeCIDs: Set<UInt16> = []\n        var offset = 4\n        while offset + 1 < report.count {\n            let cid = (UInt16(report[offset]) << 8) | UInt16(report[offset + 1])\n            if cid == 0 { break }\n            activeCIDs.insert(cid)\n            offset += 2\n        }\n        let newlyPressed = activeCIDs.subtracting(lastActiveCIDs)\n        let newlyReleased = lastActiveCIDs.subtracting(activeCIDs)\n        lastActiveCIDs = activeCIDs\n        for cid in newlyPressed {\n            let cidName = HIDPPInfo.cidNames[cid] ?? \"Unknown\"\n            LogitechHIDDebugPanel.log(device: deviceInfo.name, type: .buttonEvent, message: \"Button DOWN: CID \\(String(format: \"0x%04X\", cid)) (\\(cidName))\")\n            dispatchButtonEvent(cid: cid, isDown: true)\n        }\n        for cid in newlyReleased {\n            let cidName = HIDPPInfo.cidNames[cid] ?? \"Unknown\"\n            LogitechHIDDebugPanel.log(device: deviceInfo.name, type: .buttonEvent, message: \"Button UP: CID \\(String(format: \"0x%04X\", cid)) (\\(cidName))\")\n            dispatchButtonEvent(cid: cid, isDown: false)\n        }\n    }\n\n    // MARK: - Event Dispatch\n\n    private func dispatchButtonEvent(cid: UInt16, isDown: Bool) {\n        let currentFlags = CGEventSource.flagsState(.combinedSessionState)\n        let mosEvent = MosInputEvent(\n            type: .mouse,\n            code: LogitechCIDMap.toMosCode(cid),\n            modifiers: currentFlags,\n            phase: isDown ? .down : .up,\n            source: .hidPlusPlus,\n            device: deviceInfo\n        )\n\n        // 录制模式: 不执行动作, 只转发给 KeyRecorder\n        if LogitechHIDManager.shared.isRecording {\n            NotificationCenter.default.post(\n                name: LogitechHIDManager.buttonEventNotification,\n                object: nil,\n                userInfo: [\"event\": mosEvent]\n            )\n            return\n        }\n\n        // 匹配 binding, 如果是 logi* 动作则在当前 session 执行 (设备隔离)\n        if isDown {\n            let bindings = ButtonUtils.shared.getButtonBindings()\n            if let binding = bindings.first(where: { $0.triggerEvent.matchesMosInput(mosEvent) && $0.isEnabled }) {\n                if binding.systemShortcutName.hasPrefix(\"logi\") {\n                    executeLogiAction(binding.systemShortcutName)\n                } else {\n                    ShortcutExecutor.shared.execute(named: binding.systemShortcutName)\n                }\n                return\n            }\n        }\n\n        // 未匹配的事件走 MosInputProcessor\n        let _ = MosInputProcessor.shared.process(mosEvent)\n\n        // 通知 KeyRecorder\n        NotificationCenter.default.post(\n            name: LogitechHIDManager.buttonEventNotification,\n            object: nil,\n            userInfo: [\"event\": mosEvent]\n        )\n    }\n\n    /// 在当前 session 上执行 Logi 动作\n    private func executeLogiAction(_ name: String) {\n        switch name {\n        case \"logiSmartShiftToggle\":\n            executeSmartShiftToggle()\n        case \"logiDPICycleUp\":\n            executeDPICycle(direction: .up)\n        case \"logiDPICycleDown\":\n            executeDPICycle(direction: .down)\n        case \"logiHost1\":\n            executeChangeHost(hostIndex: 0)\n        case \"logiHost2\":\n            executeChangeHost(hostIndex: 1)\n        case \"logiHost3\":\n            executeChangeHost(hostIndex: 2)\n        default:\n            LogitechHIDDebugPanel.log(\"[\\(deviceInfo.name)] Unknown Logi action: \\(name)\")\n        }\n    }\n}\n"
  },
  {
    "path": "Mos/LogitechHID/LogitechHIDDebugPanel.swift",
    "content": "//\n//  LogitechHIDDebugPanel.swift\n//  Mos\n//  Logitech HID++ 综合调试面板\n//  Created by Mos on 2026/3/16.\n//  Copyright © 2026 Caldis. All rights reserved.\n//\n\nimport Cocoa\nimport IOKit\nimport IOKit.hid\n\n// MARK: - Log Entry\n\nenum LogEntryType: String, CaseIterable {\n    case info = \"Info\"\n    case tx = \"TX\"\n    case rx = \"RX\"\n    case error = \"Error\"\n    case buttonEvent = \"Button\"\n    case warning = \"Warning\"\n}\n\nstruct LogEntry {\n    let timestamp: String\n    let deviceName: String\n    let type: LogEntryType\n    let message: String\n    let decoded: String?\n}\n\n// MARK: - HID++ Protocol Dictionaries\n\nstruct HIDPPInfo {\n    static let featureNames: [UInt16: (String, String)] = [\n        0x0000: (\"IRoot\", \"Feature discovery root\"),\n        0x0001: (\"IFeatureSet\", \"Enumerate all features\"),\n        0x0003: (\"DeviceFWVersion\", \"Firmware version info\"),\n        0x0005: (\"DeviceNameType\", \"Device name and type\"),\n        0x0020: (\"ConfigChange\", \"Config change notification\"),\n        0x1000: (\"BatteryStatus\", \"Battery level and status\"),\n        0x1001: (\"BatteryVoltage\", \"Battery voltage reading\"),\n        0x1004: (\"UnifiedBattery\", \"Unified battery reporting\"),\n        0x1814: (\"ChangeHost\", \"Multi-host switching\"),\n        0x1815: (\"HostsInfo\", \"Connected host info\"),\n        0x1B04: (\"ReprogControlsV4\", \"Button reprog and divert\"),\n        0x1D4B: (\"WirelessStatus\", \"Wireless connection status\"),\n        0x2110: (\"SmartShift\", \"Scroll wheel mode\"),\n        0x2111: (\"SmartShiftV2\", \"SmartShift v2\"),\n        0x2200: (\"MouseButtonSpy\", \"Mouse button spy\"),\n        0x2201: (\"AdjustableDPI\", \"DPI adjustment\"),\n        0x4521: (\"HiResWheel\", \"Hi-res scroll wheel\"),\n    ]\n\n    static let cidNames: [UInt16: String] = [\n        0x0050: \"Left Click\", 0x0051: \"Right Click\", 0x0052: \"Middle Click\",\n        0x0053: \"Back\", 0x0056: \"Forward\",\n        0x00C3: \"Gesture Button\", 0x00C4: \"SmartShift\", 0x00D7: \"DPI Change\",\n        0x00D0: \"Top Button\", 0x00E8: \"Thumb Wheel Up\", 0x00E9: \"Thumb Wheel Down\",\n        0x00FD: \"Battery LED\",\n    ]\n\n    static let controlFlagBits: [(bit: Int, short: String, desc: String)] = [\n        (0, \"Mouse\", \"Mouse button group\"),\n        (1, \"FKey\", \"F-key group\"),\n        (2, \"HotKey\", \"Hotkey\"),\n        (3, \"FnToggle\", \"Fn toggle affected\"),\n        (4, \"Reprog\", \"Reprogrammable\"),\n        (5, \"Divert\", \"Divertable to SW\"),\n        (6, \"Persist\", \"Persistent divert\"),\n        (7, \"Virtual\", \"Virtual button\"),\n        (8, \"RawXY\", \"Raw XY capable\"),\n        (9, \"ForceXY\", \"Force raw XY\"),\n    ]\n\n    static func flagsDescription(_ flags: UInt16) -> String {\n        return controlFlagBits\n            .filter { (flags >> $0.bit) & 1 != 0 }\n            .map { $0.short }\n            .joined(separator: \",\")\n    }\n\n    static let errorNames: [UInt8: String] = [\n        0x00: \"NoError\", 0x01: \"Unknown\", 0x02: \"InvalidArgument\",\n        0x03: \"OutOfRange\", 0x04: \"HWError\", 0x05: \"LogitechInternal\",\n        0x06: \"InvalidFeatureIndex\", 0x07: \"InvalidFunctionID\",\n        0x08: \"Busy\", 0x09: \"Unsupported\",\n    ]\n}\n\n// MARK: - Debug Panel\n\nclass LogitechHIDDebugPanel: NSObject {\n    static let shared = LogitechHIDDebugPanel()\n    static let logNotification = NSNotification.Name(\"LogitechHIDDebugLog\")\n\n    private var window: NSWindow?\n\n    // Tables\n    private var deviceInfoTable: NSTableView?\n    private var featureTable: NSTableView?\n    private var controlsTable: NSTableView?\n    private var logTextView: NSTextView?\n    private var deviceSelector: NSPopUpButton?\n\n    // Data\n    private var deviceInfoRows: [(String, String, String)] = []   // (property, value, annotation)\n    private var featureRows: [(String, String, String, String)] = [] // (index, featID, name, purpose)\n    private var controlRows: [(Int, String, String, String, String, Bool, Bool)] = []\n    // (idx, cid, name, taskId, flagsDesc, isDivertable, isDiverted)\n\n    private var currentSession: LogitechDeviceSession?\n\n    // Log\n    private static var logBuffer: [LogEntry] = []\n    private static let maxLogLines = 500\n    private var logTypeFilter: Set<LogEntryType> = Set(LogEntryType.allCases)\n\n    // Observers\n    private var logObserver: NSObjectProtocol?\n    private var sessionObserver: NSObjectProtocol?\n\n    // MARK: - Logging API\n\n    class func log(_ message: String) {\n        let entry = LogEntry(\n            timestamp: timestamp(),\n            deviceName: \"\",\n            type: .info,\n            message: message,\n            decoded: nil\n        )\n        appendToBuffer(entry)\n    }\n\n    class func log(device: String, type: LogEntryType, message: String, decoded: String? = nil) {\n        let entry = LogEntry(\n            timestamp: timestamp(),\n            deviceName: device,\n            type: type,\n            message: message,\n            decoded: decoded\n        )\n        appendToBuffer(entry)\n    }\n\n    private class func appendToBuffer(_ entry: LogEntry) {\n        // 仅输出到 HID++ debug 面板, 不污染系统 console\n        logBuffer.append(entry)\n        if logBuffer.count > maxLogLines { logBuffer.removeFirst(logBuffer.count - maxLogLines) }\n        NotificationCenter.default.post(name: logNotification, object: nil, userInfo: [\"entry\": entry])\n    }\n\n    private static func timestamp() -> String {\n        let f = DateFormatter()\n        f.dateFormat = \"HH:mm:ss.SSS\"\n        return f.string(from: Date())\n    }\n\n    // MARK: - Show / Hide\n\n    func show() {\n        if let w = window { w.makeKeyAndOrderFront(nil); NSApp.activate(ignoringOtherApps: true); return }\n        createWindow()\n        refreshAll()\n        for entry in LogitechHIDDebugPanel.logBuffer { appendLogEntry(entry) }\n        startObserving()\n        window?.makeKeyAndOrderFront(nil)\n        NSApp.activate(ignoringOtherApps: true)\n    }\n\n    // MARK: - Window Creation\n\n    private func createWindow() {\n        let w = NSWindow(\n            contentRect: NSRect(x: 0, y: 0, width: 900, height: 680),\n            styleMask: [.titled, .closable, .resizable, .miniaturizable],\n            backing: .buffered, defer: false\n        )\n        w.title = \"Logitech HID++ Debug\"\n        w.center()\n        w.isReleasedWhenClosed = false\n        w.minSize = NSSize(width: 700, height: 400)\n\n        let content = w.contentView!\n        let cw = content.bounds.width\n        let ch = content.bounds.height\n\n        // Toolbar (top 36px)\n        let toolbar = NSView(frame: NSRect(x: 0, y: ch - 36, width: cw, height: 36))\n        toolbar.autoresizingMask = [.width, .minYMargin]\n\n        var bx: CGFloat = 8\n        let buttonDefs: [(String, Selector)] = [\n            (\"Refresh\", #selector(refreshClicked)),\n            (\"Re-Discover\", #selector(rediscoverClicked)),\n            (\"Re-Divert\", #selector(redivertClicked)),\n            (\"Undivert\", #selector(undivertClicked)),\n            (\"Clear Log\", #selector(clearLogClicked)),\n        ]\n        for (title, action) in buttonDefs {\n            let btn = NSButton(title: title, target: self, action: action)\n            btn.bezelStyle = .rounded\n            btn.frame = NSRect(x: bx, y: 6, width: CGFloat(title.count * 9 + 20), height: 24)\n            toolbar.addSubview(btn)\n            bx += btn.frame.width + 4\n        }\n        // 分隔线\n        bx += 8\n        let sep = NSBox(frame: NSRect(x: bx, y: 8, width: 1, height: 20))\n        sep.boxType = .separator\n        toolbar.addSubview(sep)\n        bx += 8\n        // Logi 动作测试按钮\n        let testDefs: [(String, Selector)] = [\n            (\"SmartShift\", #selector(testSmartShiftClicked)),\n            (\"DPI+\", #selector(testDPIUpClicked)),\n            (\"DPI-\", #selector(testDPIDownClicked)),\n        ]\n        for (title, action) in testDefs {\n            let btn = NSButton(title: title, target: self, action: action)\n            btn.bezelStyle = .rounded\n            btn.frame = NSRect(x: bx, y: 6, width: CGFloat(title.count * 9 + 20), height: 24)\n            toolbar.addSubview(btn)\n            bx += btn.frame.width + 4\n        }\n        // Device selector\n        let selector = NSPopUpButton(frame: NSRect(x: bx + 20, y: 6, width: 200, height: 24), pullsDown: false)\n        selector.target = self\n        selector.action = #selector(deviceSelectorChanged)\n        toolbar.addSubview(selector)\n        self.deviceSelector = selector\n\n        content.addSubview(toolbar)\n\n        // NSSplitView: 可拖动分隔条\n        let bodyH = ch - 36\n        let split = NSSplitView(frame: NSRect(x: 0, y: 0, width: cw, height: bodyH))\n        split.isVertical = false\n        split.dividerStyle = .thin\n        split.autoresizingMask = [.width, .height]\n\n        // Section 1: Device Info\n        let s1 = makeTableSection(\n            columns: [(\"Property\", 140), (\"Value\", 280), (\"Annotation\", 400)],\n            tag: 1\n        )\n        s1.frame = NSRect(x: 0, y: 0, width: cw, height: 140)\n        split.addSubview(s1)\n\n        // Section 2: Feature Table\n        let s2 = makeTableSection(\n            columns: [(\"Index\", 60), (\"Feature ID\", 90), (\"Name\", 180), (\"Purpose\", 400)],\n            tag: 2\n        )\n        s2.frame = NSRect(x: 0, y: 0, width: cw, height: 50)\n        split.addSubview(s2)\n\n        // Section 3: Controls\n        let s3 = makeTableSection(\n            columns: [(\"Idx\", 35), (\"CID\", 65), (\"Name\", 120), (\"TaskID\", 65), (\"Flags\", 200), (\"Dvrt?\", 45), (\"Status\", 55)],\n            tag: 3\n        )\n        s3.frame = NSRect(x: 0, y: 0, width: cw, height: 120)\n        split.addSubview(s3)\n\n        // Section 4: Protocol Log\n        let logScroll = NSScrollView()\n        logScroll.hasVerticalScroller = true\n        logScroll.frame = NSRect(x: 0, y: 0, width: cw, height: bodyH - 310)\n        let tv = NSTextView()\n        tv.isEditable = false\n        tv.isSelectable = true\n        tv.font = NSFont.userFixedPitchFont(ofSize: 11)!\n        tv.backgroundColor = NSColor(calibratedWhite: 0.1, alpha: 1.0)\n        tv.textColor = NSColor.white\n        tv.autoresizingMask = [.width]\n        tv.isVerticallyResizable = true\n        tv.isHorizontallyResizable = false\n        tv.textContainer?.widthTracksTextView = true\n        tv.textContainer?.containerSize = NSSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude)\n        logScroll.documentView = tv\n        self.logTextView = tv\n        split.addSubview(logScroll)\n\n        content.addSubview(split)\n        split.adjustSubviews()\n\n        self.window = w\n    }\n\n    private static let sectionTitles: [Int: String] = [\n        1: \"Device Info\",\n        2: \"Feature Table (HID++ Features)\",\n        3: \"Controls (REPROG_CONTROLS_V4 Buttons)\",\n    ]\n\n    private func makeTableSection(columns: [(String, CGFloat)], tag: Int) -> NSView {\n        let container = NSView()\n        container.autoresizingMask = [.width, .height]\n\n        // Section 标题\n        let titleLabel = NSTextField(labelWithString: LogitechHIDDebugPanel.sectionTitles[tag] ?? \"\")\n        titleLabel.font = NSFont.boldSystemFont(ofSize: 11)\n        titleLabel.textColor = NSColor.secondaryLabelColor\n        titleLabel.frame = NSRect(x: 6, y: 0, width: 400, height: 16)\n        titleLabel.autoresizingMask = [.width, .maxYMargin]\n\n        // 表格\n        let scroll = NSScrollView()\n        scroll.hasVerticalScroller = true\n        scroll.autoresizingMask = [.width, .height]\n\n        let table = NSTableView()\n        table.headerView = NSTableHeaderView()\n        table.usesAlternatingRowBackgroundColors = true\n        table.rowHeight = 18\n        table.tag = tag\n        table.delegate = self\n        table.dataSource = self\n\n        for (title, width) in columns {\n            let col = NSTableColumn(identifier: NSUserInterfaceItemIdentifier(\"\\(tag)_\\(title)\"))\n            col.title = title\n            col.width = width\n            table.addTableColumn(col)\n        }\n\n        scroll.documentView = table\n\n        switch tag {\n        case 1: deviceInfoTable = table\n        case 2: featureTable = table\n        case 3: controlsTable = table\n        default: break\n        }\n\n        container.addSubview(scroll)\n        container.addSubview(titleLabel)\n\n        // macOS 坐标系: y=0 在底部. 标题在顶部, 表格在下方\n        // 使用 autoresizingMask 回调来动态布局\n        container.postsFrameChangedNotifications = true\n        NotificationCenter.default.addObserver(forName: NSView.frameDidChangeNotification, object: container, queue: .main) { _ in\n            let h = container.bounds.height\n            titleLabel.frame = NSRect(x: 6, y: h - 16, width: container.bounds.width - 12, height: 16)\n            scroll.frame = NSRect(x: 0, y: 0, width: container.bounds.width, height: h - 16)\n        }\n        // 初始布局\n        let h = container.bounds.height > 0 ? container.bounds.height : 100\n        titleLabel.frame = NSRect(x: 6, y: h - 16, width: 900, height: 16)\n        scroll.frame = NSRect(x: 0, y: 0, width: 900, height: h - 16)\n\n        return container\n    }\n\n    // MARK: - Data Refresh\n\n    @objc private func refreshClicked() { refreshAll() }\n\n    @objc private func rediscoverClicked() {\n        currentSession?.rediscoverFeatures()\n        DispatchQueue.main.asyncAfter(deadline: .now() + 6) { [weak self] in self?.refreshAll() }\n    }\n\n    @objc private func redivertClicked() {\n        currentSession?.redivertAllControls()\n        DispatchQueue.main.asyncAfter(deadline: .now() + 1) { [weak self] in self?.refreshAll() }\n    }\n\n    @objc private func undivertClicked() {\n        currentSession?.undivertAllControls()\n        DispatchQueue.main.asyncAfter(deadline: .now() + 1) { [weak self] in self?.refreshAll() }\n    }\n\n    @objc private func clearLogClicked() {\n        logTextView?.string = \"\"\n    }\n\n    // MARK: - Logi Action Tests\n\n    @objc private func testSmartShiftClicked() {\n        guard let session = currentSession else { return }\n        LogitechHIDDebugPanel.log(device: session.deviceInfo.name, type: .info, message: \">>> TEST: SmartShift Toggle\")\n        session.executeSmartShiftToggle()\n    }\n\n    @objc private func testDPIUpClicked() {\n        guard let session = currentSession else { return }\n        LogitechHIDDebugPanel.log(device: session.deviceInfo.name, type: .info, message: \">>> TEST: DPI Cycle Up\")\n        session.executeDPICycle(direction: .up)\n    }\n\n    @objc private func testDPIDownClicked() {\n        guard let session = currentSession else { return }\n        LogitechHIDDebugPanel.log(device: session.deviceInfo.name, type: .info, message: \">>> TEST: DPI Cycle Down\")\n        session.executeDPICycle(direction: .down)\n    }\n\n    @objc private func deviceSelectorChanged() {\n        let sessions = LogitechHIDManager.shared.activeSessions\n        let idx = deviceSelector?.indexOfSelectedItem ?? 0\n        if idx < sessions.count {\n            currentSession = sessions[idx]\n        }\n        refreshDeviceInfo()\n        refreshFeatureTable()\n        refreshControls()\n    }\n\n    private func refreshAll() {\n        let sessions = LogitechHIDManager.shared.activeSessions\n\n        // 更新设备选择器\n        deviceSelector?.removeAllItems()\n        for s in sessions {\n            let label = \"\\(s.deviceInfo.name) (\\(s.transport) \\(String(format: \"0x%04X/0x%04X\", s.usagePage, s.usage)))\"\n            deviceSelector?.addItem(withTitle: label)\n        }\n\n        // 选择第一个 HID++ candidate, 或保持当前选择\n        if currentSession == nil || !sessions.contains(where: { $0 === currentSession }) {\n            currentSession = sessions.first(where: { $0.isHIDPPCandidate }) ?? sessions.first\n            if let cs = currentSession, let idx = sessions.firstIndex(where: { $0 === cs }) {\n                deviceSelector?.selectItem(at: idx)\n            }\n        }\n\n        refreshDeviceInfo()\n        refreshFeatureTable()\n        refreshControls()\n    }\n\n    private func refreshDeviceInfo() {\n        deviceInfoRows.removeAll()\n        guard let s = currentSession else {\n            deviceInfoRows.append((\"Status\", \"No HID++ device found\", \"Connect a Logitech BLE mouse\"))\n            deviceInfoTable?.reloadData()\n            return\n        }\n\n        let usagePageName: String\n        switch s.usagePage {\n        case 0x0001: usagePageName = \"Generic Desktop\"\n        case 0xFF00: usagePageName = \"Vendor-Specific (Logitech)\"\n        case 0xFF43: usagePageName = \"Vendor-Specific (Logitech Alt)\"\n        default: usagePageName = \"Unknown\"\n        }\n\n        let usageName: String\n        switch s.usage {\n        case 0x0001: usageName = \"Pointer\"\n        case 0x0002: usageName = \"Mouse\"\n        case 0x0006: usageName = \"Keyboard\"\n        default: usageName = \"0x\\(String(format: \"%04X\", s.usage))\"\n        }\n\n        deviceInfoRows = [\n            (\"Product\", s.deviceInfo.name, \"IOKit kIOHIDProductKey\"),\n            (\"Vendor ID\", String(format: \"0x%04X (%d)\", s.deviceInfo.vendorId, s.deviceInfo.vendorId), \"Logitech = 0x046D\"),\n            (\"Product ID\", String(format: \"0x%04X (%d)\", s.deviceInfo.productId, s.deviceInfo.productId), \"Device model identifier\"),\n            (\"Usage Page\", String(format: \"0x%04X\", s.usagePage), usagePageName),\n            (\"Usage\", String(format: \"0x%04X\", s.usage), usageName),\n            (\"Transport\", s.transport, s.debugIsBLE ? \"Bluetooth Low Energy\" : \"USB\"),\n            (\"Connection Mode\", s.debugConnectionMode, \"BLE Direct / Receiver (Unifying-Bolt) / Unsupported\"),\n            (\"Device Index\", String(format: \"0x%02X\", s.debugDeviceIndex), s.debugIsBLE ? \"0xFF = BLE direct\" : \"0x01-0x06 = Receiver slot\"),\n            (\"Device Opened\", s.debugDeviceOpened ? \"YES\" : \"NO\", \"IOHIDDeviceOpen result\"),\n            (\"HID++ Candidate\", s.isHIDPPCandidate ? \"YES\" : \"NO\", \"Eligible for HID++ protocol\"),\n            (\"Init Complete\", s.debugReprogInitComplete ? \"YES\" : \"NO\", \"Feature discovery + divert done\"),\n            (\"Diverted CIDs\", s.debugDivertedCIDs.map { String(format: \"0x%04X\", $0) }.joined(separator: \", \"),\n             s.debugDivertedCIDs.isEmpty ? \"No buttons diverted\" : \"\\(s.debugDivertedCIDs.count) buttons diverted\"),\n        ]\n        deviceInfoTable?.reloadData()\n    }\n\n    private func refreshFeatureTable() {\n        featureRows.removeAll()\n        guard let s = currentSession else { featureTable?.reloadData(); return }\n\n        for (featId, idx) in s.debugFeatureIndex.sorted(by: { $0.value < $1.value }) {\n            let (name, purpose) = HIDPPInfo.featureNames[featId] ?? (\"Unknown\", \"Feature ID \\(String(format: \"0x%04X\", featId))\")\n            featureRows.append((\n                String(format: \"0x%02X\", idx),\n                String(format: \"0x%04X\", featId),\n                name,\n                purpose\n            ))\n        }\n        if featureRows.isEmpty {\n            featureRows.append((\"--\", \"--\", \"No features discovered\", \"Feature discovery may have failed\"))\n        }\n        featureTable?.reloadData()\n    }\n\n    private func refreshControls() {\n        controlRows.removeAll()\n        guard let s = currentSession else { controlsTable?.reloadData(); return }\n\n        for (i, c) in s.debugDiscoveredControls.enumerated() {\n            let name = HIDPPInfo.cidNames[c.cid] ?? \"Unknown\"\n            let isDiverted = s.debugDivertedCIDs.contains(c.cid)\n            controlRows.append((\n                i,\n                String(format: \"0x%04X\", c.cid),\n                name,\n                String(format: \"0x%04X\", c.taskId),\n                HIDPPInfo.flagsDescription(c.flags),\n                c.isDivertable,\n                isDiverted\n            ))\n        }\n        if controlRows.isEmpty {\n            controlRows.append((0, \"--\", \"No controls discovered\", \"--\", \"--\", false, false))\n        }\n        controlsTable?.reloadData()\n    }\n\n    // MARK: - Log\n\n    private func appendLogEntry(_ entry: LogEntry) {\n        guard logTypeFilter.contains(entry.type) else { return }\n        guard let tv = logTextView else { return }\n\n        let color: NSColor\n        switch entry.type {\n        case .tx:          color = NSColor(calibratedRed: 0.4, green: 0.6, blue: 1.0, alpha: 1.0)\n        case .rx:          color = NSColor(calibratedRed: 0.3, green: 0.8, blue: 0.4, alpha: 1.0)\n        case .error:       color = NSColor(calibratedRed: 1.0, green: 0.3, blue: 0.3, alpha: 1.0)\n        case .buttonEvent: color = NSColor(calibratedRed: 1.0, green: 0.8, blue: 0.2, alpha: 1.0)\n        case .warning:     color = NSColor(calibratedRed: 1.0, green: 0.6, blue: 0.2, alpha: 1.0)\n        case .info:        color = NSColor(calibratedWhite: 0.75, alpha: 1.0)\n        }\n\n        let font = NSFont.userFixedPitchFont(ofSize: 11)!\n        let line = \"[\\(entry.timestamp)] \\(entry.message)\\n\"\n        tv.textStorage?.append(NSAttributedString(string: line, attributes: [.font: font, .foregroundColor: color]))\n\n        if let decoded = entry.decoded {\n            let decodedColor = color.withAlphaComponent(0.7)\n            tv.textStorage?.append(NSAttributedString(string: \"  -> \\(decoded)\\n\", attributes: [.font: font, .foregroundColor: decodedColor]))\n        }\n\n        tv.scrollToEndOfDocument(nil)\n    }\n\n    // MARK: - Observers\n\n    private func startObserving() {\n        logObserver = NotificationCenter.default.addObserver(\n            forName: LogitechHIDDebugPanel.logNotification, object: nil, queue: .main\n        ) { [weak self] n in\n            if let entry = n.userInfo?[\"entry\"] as? LogEntry { self?.appendLogEntry(entry) }\n            // Auto-refresh controls when button events or divert changes happen\n            if let entry = n.userInfo?[\"entry\"] as? LogEntry,\n               entry.type == .buttonEvent || entry.message.contains(\"divert=\") {\n                self?.refreshControls()\n            }\n        }\n        sessionObserver = NotificationCenter.default.addObserver(\n            forName: LogitechHIDManager.sessionChangedNotification, object: nil, queue: .main\n        ) { [weak self] _ in\n            self?.refreshAll()\n        }\n    }\n\n    private func stopObserving() {\n        if let o = logObserver { NotificationCenter.default.removeObserver(o) }\n        if let o = sessionObserver { NotificationCenter.default.removeObserver(o) }\n        logObserver = nil; sessionObserver = nil\n    }\n}\n\n// MARK: - NSTableViewDelegate & DataSource\n\nextension LogitechHIDDebugPanel: NSTableViewDelegate, NSTableViewDataSource {\n    func numberOfRows(in tableView: NSTableView) -> Int {\n        switch tableView.tag {\n        case 1: return deviceInfoRows.count\n        case 2: return featureRows.count\n        case 3: return controlRows.count\n        default: return 0\n        }\n    }\n\n    func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {\n        guard let colId = tableColumn?.identifier.rawValue else { return nil }\n        let cellId = NSUserInterfaceItemIdentifier(\"Cell_\\(colId)\")\n\n        let cell: NSTextField\n        if let existing = tableView.makeView(withIdentifier: cellId, owner: nil) as? NSTextField {\n            cell = existing\n        } else {\n            cell = NSTextField(labelWithString: \"\")\n            cell.identifier = cellId\n            cell.font = NSFont.userFixedPitchFont(ofSize: 11)!\n            cell.lineBreakMode = .byTruncatingTail\n        }\n\n        switch tableView.tag {\n        case 1: // Device Info\n            let r = deviceInfoRows[row]\n            switch colId {\n            case \"1_Property\": cell.stringValue = r.0\n            case \"1_Value\": cell.stringValue = r.1\n            case \"1_Annotation\":\n                cell.stringValue = r.2\n                cell.textColor = NSColor.secondaryLabelColor\n            default: break\n            }\n        case 2: // Feature Table\n            let r = featureRows[row]\n            switch colId {\n            case \"2_Index\": cell.stringValue = r.0\n            case \"2_Feature ID\": cell.stringValue = r.1\n            case \"2_Name\": cell.stringValue = r.2\n            case \"2_Purpose\":\n                cell.stringValue = r.3\n                cell.textColor = NSColor.secondaryLabelColor\n            default: break\n            }\n        case 3: // Controls\n            let r = controlRows[row]\n            switch colId {\n            case \"3_Idx\": cell.stringValue = \"\\(r.0)\"\n            case \"3_CID\": cell.stringValue = r.1\n            case \"3_Name\": cell.stringValue = r.2\n            case \"3_TaskID\": cell.stringValue = r.3\n            case \"3_Flags\": cell.stringValue = r.4\n            case \"3_Dvrt?\": cell.stringValue = r.5 ? \"YES\" : \"NO\"\n                cell.textColor = r.5 ? NSColor(calibratedRed: 0.3, green: 0.8, blue: 0.4, alpha: 1.0) : NSColor.secondaryLabelColor\n            case \"3_Status\":\n                if r.5 {\n                    cell.stringValue = r.6 ? \"ON\" : \"OFF\"\n                    cell.textColor = r.6 ? NSColor(calibratedRed: 0.3, green: 0.8, blue: 0.4, alpha: 1.0) : NSColor(calibratedRed: 1.0, green: 0.3, blue: 0.3, alpha: 1.0)\n                } else {\n                    cell.stringValue = \"--\"\n                    cell.textColor = NSColor.secondaryLabelColor\n                }\n            default: break\n            }\n        default: break\n        }\n\n        if !colId.contains(\"Annotation\") && !colId.contains(\"Purpose\") && !colId.contains(\"Dvrt\") && !colId.contains(\"Status\") {\n            cell.textColor = NSColor.labelColor\n        }\n        cell.font = NSFont.userFixedPitchFont(ofSize: 11)!\n        return cell\n    }\n}\n"
  },
  {
    "path": "Mos/LogitechHID/LogitechHIDManager.swift",
    "content": "//\n//  LogitechHIDManager.swift\n//  Mos\n//  Logitech HID 设备管理器 - 通过 IOKit 枚举和监控 Logitech 设备\n//  Created by Mos on 2026/3/16.\n//  Copyright © 2026 Caldis. All rights reserved.\n//\n\nimport Foundation\nimport IOKit\nimport IOKit.hid\n\nclass LogitechHIDManager {\n    static let shared = LogitechHIDManager()\n    init() { NSLog(\"Module initialized: LogitechHIDManager\") }\n\n    // MARK: - Constants\n    static let logitechVendorId: Int = 0x046D\n    static let buttonEventNotification = NSNotification.Name(\"LogitechHIDButtonEvent\")\n\n    // MARK: - State\n    private var hidManager: IOHIDManager?\n    private var sessions: [IOHIDDevice: LogitechDeviceSession] = [:]\n    private(set) var isActive = false\n\n    // MARK: - Lifecycle\n\n    func start() {\n        guard !isActive else { return }\n        LogitechHIDDebugPanel.log(\"[LogitechHID] Starting\")\n\n        hidManager = IOHIDManagerCreate(kCFAllocatorDefault, IOOptionBits(kIOHIDOptionsTypeNone))\n        guard let manager = hidManager else {\n            LogitechHIDDebugPanel.log(\"[LogitechHID] Failed to create IOHIDManager\")\n            return\n        }\n\n        // 只匹配 Logitech 设备\n        let matchDict: [String: Any] = [\n            kIOHIDVendorIDKey as String: LogitechHIDManager.logitechVendorId\n        ]\n        IOHIDManagerSetDeviceMatching(manager, matchDict as CFDictionary)\n\n        // 注册回调 (使用 C 函数指针 + context)\n        let context = Unmanaged.passUnretained(self).toOpaque()\n        IOHIDManagerRegisterDeviceMatchingCallback(manager, Self.deviceMatchedCallback, context)\n        IOHIDManagerRegisterDeviceRemovalCallback(manager, Self.deviceRemovedCallback, context)\n\n        // Schedule 到 main RunLoop (HID++ 事件低频, 避免线程同步)\n        IOHIDManagerScheduleWithRunLoop(manager, CFRunLoopGetMain(), CFRunLoopMode.commonModes.rawValue)\n\n        let result = IOHIDManagerOpen(manager, IOOptionBits(kIOHIDOptionsTypeNone))\n        if result != kIOReturnSuccess {\n            LogitechHIDDebugPanel.log(\"[LogitechHID] Failed to open IOHIDManager: \\(String(format: \"0x%08x\", result))\")\n            return\n        }\n\n        isActive = true\n        LogitechHIDDebugPanel.log(\"[LogitechHID] Started\")\n    }\n\n    func stop() {\n        guard isActive else { return }\n        LogitechHIDDebugPanel.log(\"[LogitechHID] Stopping\")\n\n        // 清理所有设备会话\n        for (_, session) in sessions {\n            session.teardown()\n        }\n        sessions.removeAll()\n\n        if let manager = hidManager {\n            IOHIDManagerClose(manager, IOOptionBits(kIOHIDOptionsTypeNone))\n            IOHIDManagerUnscheduleFromRunLoop(manager, CFRunLoopGetMain(), CFRunLoopMode.commonModes.rawValue)\n        }\n        hidManager = nil\n        isActive = false\n        LogitechHIDDebugPanel.log(\"[LogitechHID] Stopped\")\n    }\n\n    // MARK: - Device Callbacks (C function pointers)\n\n    private static let deviceMatchedCallback: IOHIDDeviceCallback = { context, result, sender, device in\n        guard let context = context else { return }\n        let manager = Unmanaged<LogitechHIDManager>.fromOpaque(context).takeUnretainedValue()\n        manager.deviceConnected(device)\n    }\n\n    private static let deviceRemovedCallback: IOHIDDeviceCallback = { context, result, sender, device in\n        guard let context = context else { return }\n        let manager = Unmanaged<LogitechHIDManager>.fromOpaque(context).takeUnretainedValue()\n        manager.deviceDisconnected(device)\n    }\n\n    // MARK: - Device Management\n\n    private func deviceConnected(_ device: IOHIDDevice) {\n        // 读取设备信息\n        let vendorId = IOHIDDeviceGetProperty(device, kIOHIDVendorIDKey as CFString) as? Int ?? 0\n        let productId = IOHIDDeviceGetProperty(device, kIOHIDProductIDKey as CFString) as? Int ?? 0\n        let productName = IOHIDDeviceGetProperty(device, kIOHIDProductKey as CFString) as? String ?? \"Unknown\"\n\n        LogitechHIDDebugPanel.log(\"[LogitechHID] Device connected: \\(productName) (VID: \\(String(format: \"0x%04X\", vendorId)), PID: \\(String(format: \"0x%04X\", productId)))\")\n\n        // 避免重复会话\n        guard sessions[device] == nil else { return }\n\n        // 创建会话\n        let session = LogitechDeviceSession(hidDevice: device)\n        sessions[device] = session\n        session.setup()\n        NotificationCenter.default.post(name: Self.sessionChangedNotification, object: nil)\n    }\n\n    private func deviceDisconnected(_ device: IOHIDDevice) {\n        guard let session = sessions.removeValue(forKey: device) else { return }\n        LogitechHIDDebugPanel.log(\"[LogitechHID] Device disconnected: \\(session.deviceInfo.name)\")\n        session.teardown()\n        NotificationCenter.default.post(name: Self.sessionChangedNotification, object: nil)\n    }\n\n    // MARK: - Query\n\n    /// 获取当前已连接的 Logitech 设备列表\n    var connectedDevices: [MosInputDevice] {\n        return sessions.values.map { $0.deviceInfo }\n    }\n\n    /// Debug: 暴露活跃的设备会话\n    var activeSessions: [LogitechDeviceSession] {\n        return Array(sessions.values)\n    }\n\n    static let sessionChangedNotification = NSNotification.Name(\"LogitechHIDSessionChanged\")\n\n    // MARK: - Divert Control\n\n    /// 绑定变更后调用: 同步所有会话的 divert 状态\n    func syncDivertWithBindings() {\n        for (_, session) in sessions where session.isHIDPPCandidate {\n            session.syncDivertWithBindings()\n        }\n    }\n\n    /// 录制模式标志: 录制期间跳过动作执行, 只转发事件给 KeyRecorder\n    private(set) var isRecording = false\n\n    /// 录制模式: 临时 divert 所有按键\n    func temporarilyDivertAll() {\n        isRecording = true\n        for (_, session) in sessions where session.isHIDPPCandidate {\n            session.temporarilyDivertAll()\n        }\n    }\n\n    /// 录制结束: 恢复到只 divert 有绑定的按键\n    func restoreDivertToBindings() {\n        isRecording = false\n        for (_, session) in sessions where session.isHIDPPCandidate {\n            session.restoreDivertToBindings()\n        }\n    }\n\n    // MARK: - Logi Action Execution\n\n    enum DPICycleDirection { case up, down }\n\n    /// 获取最佳活跃 session (优先已完成 init 的, 其次 BLE)\n    private var primarySession: LogitechDeviceSession? {\n        // 优先: 已完成 init 的 session\n        if let ready = sessions.values.first(where: { $0.isHIDPPCandidate && $0.debugReprogInitComplete }) {\n            return ready\n        }\n        // 其次: BLE 候选\n        if let ble = sessions.values.first(where: { $0.isHIDPPCandidate && $0.debugIsBLE }) {\n            return ble\n        }\n        // 最后: 任意候选\n        return sessions.values.first(where: { $0.isHIDPPCandidate })\n    }\n\n    /// SmartShift 切换: 读取当前模式, 取反\n    func executeSmartShiftToggle() {\n        guard let session = primarySession else { return }\n        session.executeSmartShiftToggle()\n    }\n\n    /// DPI 循环\n    func executeDPICycle(direction: DPICycleDirection) {\n        guard let session = primarySession else { return }\n        session.executeDPICycle(direction: direction)\n    }\n}\n"
  },
  {
    "path": "Mos/Managers/StatusItemManager.swift",
    "content": "//\n//  StatusItemManager.swift\n//  Mos\n//  管理状态栏图标以及初始化\n//  Created by Caldis on 2018/3/7.\n//  Copyright © 2018年 Caldis. All rights reserved.\n//\nimport Cocoa\n\nclass StatusItemManager: NSMenu, NSMenuDelegate {\n    \n    // 状态栏引用\n    static let statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)\n    let item = StatusItemManager.statusItem\n    \n    // 初始化\n    override func awakeFromNib() {\n        NSLog(\"Module initialized: StatusItemManager\")\n        // 设置图标/行为\n        item.button?.image = #imageLiteral(resourceName: \"AppStatusBarIcon\")\n        // 设置事件响应\n        item.menu = self\n        item.menu?.delegate = self\n    }\n    \n}\n\n/**\n * 菜单响应\n **/\nextension StatusItemManager {\n    // 打开菜单\n    func menuWillOpen(_ menu: NSMenu) {\n        onMenuClick()\n    }\n    @objc func onMenuClick()  {\n        if let event = NSApp.currentEvent {\n            // 无辅助功能选项显示要求权限菜单\n            guard AXIsProcessTrusted() else {\n                buildRequireAccessibilityMenu()\n                return\n            }\n            // DEBUG: 直接弹出设置窗口\n            #if DEBUG\n            buildOptionMenu()\n            #else\n            // 当按下 option 键显示特殊菜单\n            guard !event.modifierFlags.contains(.option) else {\n                buildOptionMenu()\n                return\n            }\n            // 弹出菜单\n            buildNormalMenu()\n            #endif\n        }\n    }\n}\n\n/**\n * 菜单构建\n **/\nextension StatusItemManager {\n    // 无辅助功能访问权限菜单\n    @objc func buildRequireAccessibilityMenu() {\n        if let menu = item.menu {\n            menu.removeAllItems()\n            menu.addItem(withTitle: NSLocalizedString(\"Needs access to Accessibility controls\", comment: \"\"), action: #selector(accessibilityRequire), keyEquivalent: \"\").target = self\n            // Quit\n            Utils.addMenuItemWithSeparator(to: menu, title: NSLocalizedString(\"Quit\", comment: \"\"), icon: #imageLiteral(resourceName: \"SF.escape\"), action: #selector(quitClick))\n        }\n    }\n    @objc func accessibilityRequire() {\n        Utils.requireAccessibilityPermissions()\n    }\n    // 按下 Option 按钮的菜单\n    @objc func buildOptionMenu() {\n        if let menu = item.menu {\n            // Reset\n            menu.removeAllItems()\n            // Monitor\n            Utils.addMenuItem(to: menu, title: NSLocalizedString(\"Event Monitor\", comment: \"\"), icon: #imageLiteral(resourceName: \"SF.square.stack.3d.down.right\"), action: #selector(monitorClick))\n            // HID++ Debug\n            Utils.addMenuItem(to: menu, title: \" HID++\", icon: #imageLiteral(resourceName: \"SF.hidpp\"), action: #selector(hidDebugClick))\n            // Preferences\n            Utils.addMenuItem(to: menu, title: NSLocalizedString(\"Preferences\", comment: \"\"), icon: #imageLiteral(resourceName: \"SF.gauge\"), action: #selector(preferencesClick))\n            // Quit\n            Utils.addMenuItemWithSeparator(to: menu, title: NSLocalizedString(\"Quit\", comment: \"\"), icon: #imageLiteral(resourceName: \"SF.escape\"), action: #selector(quitClick))\n        }\n    }\n    // 常规菜单\n    @objc func buildNormalMenu() {\n        if let menu = item.menu {\n            // Reset\n            menu.removeAllItems()\n            // Preferences\n            Utils.addMenuItem(to: menu, title: NSLocalizedString(\"Preferences\", comment: \"\"), icon: #imageLiteral(resourceName: \"SF.gauge\"), action: #selector(preferencesClick))\n            // Quit\n            Utils.addMenuItemWithSeparator(to: menu, title: NSLocalizedString(\"Quit\", comment: \"\"), icon: #imageLiteral(resourceName: \"SF.escape\"), action: #selector(quitClick))\n        }\n    }\n    @objc func monitorClick() {\n        WindowManager.shared.showWindow(withIdentifier: WINDOW_IDENTIFIER.monitorWindowController)\n    }\n    @objc func hidDebugClick() {\n        LogitechHIDDebugPanel.shared.show()\n    }\n    @objc func preferencesClick() {\n        WindowManager.shared.showWindow(withIdentifier: WINDOW_IDENTIFIER.preferencesWindowController)\n    }\n    @objc func quitClick() {\n        NSApplication.shared.terminate(self)\n    }\n}\n\n/**\n * 图标显示\n **/\nextension StatusItemManager {\n    // 显示状态栏图标\n    class func showStatusItem() {\n        if #available(OSX 10.12, *) {\n            self.statusItem.isVisible = true\n        } else {\n            self.statusItem.length = NSStatusItem.variableLength\n        }\n    }\n    // 隐藏状态栏图标\n    class func hideStatusItem() {\n        if #available(OSX 10.12, *) {\n            self.statusItem.isVisible = false\n        } else {\n            self.statusItem.length = 0.0\n        }\n    }\n}\n"
  },
  {
    "path": "Mos/Managers/UpdateManager.swift",
    "content": "//\n//  UpdateManager.swift\n//  Mos\n//  Updates management via Sparkle\n//\n\nimport Cocoa\nimport Sparkle\n\nfinal class UpdateManager: NSObject {\n\n    static let shared = UpdateManager()\n\n    private lazy var updaterController = SPUStandardUpdaterController(\n        startingUpdater: true,\n        updaterDelegate: self,\n        userDriverDelegate: nil\n    )\n\n    private override init() {\n        super.init()\n        NSLog(\"Module initialized: UpdateManager\")\n    }\n}\n\nextension UpdateManager {\n\n    func scheduleCheckOnAppStartIfNeeded() {\n        guard Options.shared.update.checkOnAppStart else { return }\n\n        DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { [weak self] in\n            self?.checkForUpdatesInBackground()\n        }\n    }\n\n    func checkForUpdates() {\n        updaterController.checkForUpdates(nil)\n    }\n\n    func checkForUpdatesInBackground() {\n        updaterController.updater.checkForUpdatesInBackground()\n    }\n}\n\nextension UpdateManager: SPUUpdaterDelegate {\n\n    func allowedChannels(for updater: SPUUpdater) -> Set<String> {\n        Options.shared.update.includingBetaVersion ? [\"beta\"] : []\n    }\n}\n\n"
  },
  {
    "path": "Mos/Managers/WindowManager.swift",
    "content": "//\n//  WindowManager.swift\n//  Mos\n//  管理窗口创建及初始化\n//  Created by Caldis on 2018/2/24.\n//  Copyright © 2018年 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nclass WindowManager {\n    \n    // 单例\n    static let shared = WindowManager()\n    init() { NSLog(\"Module initialized: WindowManager\") }\n    \n    // 引用列表\n    var refs = [String: NSWindowController]()\n    \n}\n\n/**\n * 窗口控制\n **/\nextension WindowManager {\n    // 显示对应 Identifier 的窗口\n    func showWindow(withIdentifier identifier: String, withTitle title: String? = nil) {\n        // 检查是否在引用列表中\n        guard let windowController = refs[identifier] else {\n            // 如果不存在, 则从 Storyboard 获取一个实例并保存到引用列表中\n            let windowController = Utils.instantiateControllerFromStoryboard(withIdentifier: identifier) as NSWindowController\n            if let windowTitle = title {\n                windowController.window?.title = windowTitle\n            }\n            refs[identifier] = windowController\n            // 重试\n            showWindow(withIdentifier: identifier, withTitle: title)\n            return\n        }\n        // 显示\n        windowController.showWindow(self)\n        // 前置并激活（已打开窗口也要置顶）\n        if let window = windowController.window {\n            if window.isMiniaturized {\n                window.deminiaturize(self)\n            }\n            window.makeKeyAndOrderFront(self)\n            window.orderFrontRegardless()\n        }\n        NSApp.activate(ignoringOtherApps: true)\n        // 显示 Dock 图标\n        Utils.showDockIcon()\n    }\n    // 关闭对应 Identifier 的窗口\n    func hideWindow(withIdentifier identifier: String, destroy: Bool = false) {\n        // 隐藏 Dock 图标\n        Utils.hideDockIcon()\n        // 销毁实例\n        if destroy {\n            refs.removeValue(forKey: identifier)\n        }\n    }\n}\n"
  },
  {
    "path": "Mos/MosRelease.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict/>\n</plist>\n"
  },
  {
    "path": "Mos/Options/Options.swift",
    "content": "//\n//  Options.swift\n//  Mos\n//  配置参数\n//  Created by Caldis on 2018/2/19.\n//  Copyright © 2018年 Caldis. All rights reserved.\n//\n\nimport Cocoa\nimport LoginServiceKit\nimport ServiceManagement\n\nstruct OptionItem {\n    struct General {\n        static let OptionsExist = \"optionsExist\"\n        static let HideStatusItem = \"hideStatusItem\"\n    }\n\n    struct Update {\n        static let CheckOnAppStart = \"updateCheckOnAppStart\"\n        static let IncludingBetaVersion = \"updateIncludingBetaVersion\"\n    }\n\n    struct Scroll {\n        static let Smooth = \"smooth\"\n        static let Reverse = \"reverse\"\n        static let ReverseVertical = \"reverseVertical\"\n        static let ReverseHorizontal = \"reverseHorizontal\"\n        static let Dash = \"dash\"\n        static let Toggle = \"toggle\"\n        static let Block = \"block\"\n        static let Step = \"step\"\n        static let Speed = \"speed\"\n        static let Duration = \"duration\"\n        static let DeadZone = \"deadZone\"\n        static let SmoothSimTrackpad = \"smoothSimTrackpad\"\n        static let SmoothVertical = \"smoothVertical\"\n        static let SmoothHorizontal = \"smoothHorizontal\"\n    }\n\n    struct Button {\n        static let Bindings = \"buttonBindings\"\n    }\n\n    struct Application {\n        static let Allowlist = \"allowlist\"\n        static let Applications = \"applications\"\n    }\n}\n\nclass Options {\n    \n    // 单例\n    static let shared = Options()\n    init() { NSLog(\"Module initialized: Options\") }\n    \n    // 读取锁, 防止冲突\n    private var readingOptionsLock = false\n    // JSON 编解码工具\n    private let encoder = JSONEncoder()\n    private let decoder = JSONDecoder()\n    \n    // 常规\n    var general = OPTIONS_GENERAL_DEFAULT()\n    // 更新\n    var update = OPTIONS_UPDATE_DEFAULT()\n    // 滚动\n    var scroll = OPTIONS_SCROLL_DEFAULT() {\n        didSet { Options.shared.saveOptions() }\n    }\n    // 按钮绑定\n    var buttons = OPTIONS_BUTTONS_DEFAULT() {\n        didSet { Options.shared.saveOptions() }\n    }\n    // 应用\n    var application = OPTIONS_APPLICATION_DEFAULT() {\n        didSet { Options.shared.saveOptions() }\n    }\n}\n\n/**\n * 读取和写入\n **/\nextension Options {\n    \n    // 从 UserDefaults 中读取到 currentOptions\n    func readOptions() {\n        // 配置项如果不存在则尝试用当前设置(默认设置)保存一次\n        if UserDefaults.standard.object(forKey: OptionItem.General.OptionsExist) == nil { saveOptions() }\n        // 锁定\n        readingOptionsLock = true\n        // 常规\n        general.autoLaunch = LoginServiceKit.isExistLoginItems(at: Bundle.main.bundlePath)\n        general.hideStatusItem = UserDefaults.standard.bool(forKey: OptionItem.General.HideStatusItem)\n        // 更新\n        update.checkOnAppStart = UserDefaults.standard.bool(forKey: OptionItem.Update.CheckOnAppStart)\n        update.includingBetaVersion = UserDefaults.standard.bool(forKey: OptionItem.Update.IncludingBetaVersion)\n        // 滚动\n        scroll.smooth = UserDefaults.standard.bool(forKey: OptionItem.Scroll.Smooth)\n        scroll.reverse = UserDefaults.standard.bool(forKey: OptionItem.Scroll.Reverse)\n        if UserDefaults.standard.object(forKey: OptionItem.Scroll.ReverseVertical) == nil {\n            scroll.reverseVertical = true\n        } else {\n            scroll.reverseVertical = UserDefaults.standard.bool(forKey: OptionItem.Scroll.ReverseVertical)\n        }\n        if UserDefaults.standard.object(forKey: OptionItem.Scroll.ReverseHorizontal) == nil {\n            scroll.reverseHorizontal = true\n        } else {\n            scroll.reverseHorizontal = UserDefaults.standard.bool(forKey: OptionItem.Scroll.ReverseHorizontal)\n        }\n        scroll.dash = loadScrollHotkey(forKey: OptionItem.Scroll.Dash, default: OPTIONS_SCROLL_DEFAULT().dash)\n        scroll.toggle = loadScrollHotkey(forKey: OptionItem.Scroll.Toggle, default: OPTIONS_SCROLL_DEFAULT().toggle)\n        scroll.block = loadScrollHotkey(forKey: OptionItem.Scroll.Block, default: OPTIONS_SCROLL_DEFAULT().block)\n        scroll.step = UserDefaults.standard.double(forKey: OptionItem.Scroll.Step)\n        scroll.speed = UserDefaults.standard.double(forKey: OptionItem.Scroll.Speed)\n        scroll.duration = UserDefaults.standard.double(forKey: OptionItem.Scroll.Duration)\n        if let storedDeadZone = UserDefaults.standard.object(forKey: OptionItem.Scroll.DeadZone) as? Double {\n            scroll.deadZone = storedDeadZone\n        } else {\n            scroll.deadZone = OPTIONS_SCROLL_DEFAULT().deadZone\n        }\n        scroll.smoothSimTrackpad = UserDefaults.standard.bool(forKey: OptionItem.Scroll.SmoothSimTrackpad)\n        if UserDefaults.standard.object(forKey: OptionItem.Scroll.SmoothVertical) == nil {\n            scroll.smoothVertical = true\n        } else {\n            scroll.smoothVertical = UserDefaults.standard.bool(forKey: OptionItem.Scroll.SmoothVertical)\n        }\n        if UserDefaults.standard.object(forKey: OptionItem.Scroll.SmoothHorizontal) == nil {\n            scroll.smoothHorizontal = true\n        } else {\n            scroll.smoothHorizontal = UserDefaults.standard.bool(forKey: OptionItem.Scroll.SmoothHorizontal)\n        }\n        // 按钮绑定\n        buttons.binding = loadButtonsData()\n        // 应用\n        application.allowlist = UserDefaults.standard.bool(forKey: OptionItem.Application.Allowlist)\n        application.applications = loadApplicationsData()\n        // 解锁\n        readingOptionsLock = false\n    }\n    \n    // 写入到 UserDefaults\n    func saveOptions() {\n        if !readingOptionsLock {\n            // 标识配置项存在\n            UserDefaults.standard.set(\"optionsExist\", forKey: OptionItem.General.OptionsExist)\n            // 常规\n            UserDefaults.standard.set(general.hideStatusItem, forKey: OptionItem.General.HideStatusItem)\n            // 更新\n            UserDefaults.standard.set(update.checkOnAppStart, forKey: OptionItem.Update.CheckOnAppStart)\n            UserDefaults.standard.set(update.includingBetaVersion, forKey: OptionItem.Update.IncludingBetaVersion)\n            // 滚动\n            UserDefaults.standard.set(scroll.smooth, forKey: OptionItem.Scroll.Smooth)\n            UserDefaults.standard.set(scroll.reverse, forKey: OptionItem.Scroll.Reverse)\n            UserDefaults.standard.set(scroll.reverseVertical, forKey: OptionItem.Scroll.ReverseVertical)\n            UserDefaults.standard.set(scroll.reverseHorizontal, forKey: OptionItem.Scroll.ReverseHorizontal)\n            saveScrollHotkey(scroll.dash, forKey: OptionItem.Scroll.Dash)\n            saveScrollHotkey(scroll.toggle, forKey: OptionItem.Scroll.Toggle)\n            saveScrollHotkey(scroll.block, forKey: OptionItem.Scroll.Block)\n            UserDefaults.standard.set(scroll.step, forKey: OptionItem.Scroll.Step)\n            UserDefaults.standard.set(scroll.speed, forKey: OptionItem.Scroll.Speed)\n            UserDefaults.standard.set(scroll.duration, forKey: OptionItem.Scroll.Duration)\n            UserDefaults.standard.set(scroll.deadZone, forKey: OptionItem.Scroll.DeadZone)\n            UserDefaults.standard.set(scroll.smoothSimTrackpad, forKey: OptionItem.Scroll.SmoothSimTrackpad)\n            UserDefaults.standard.set(scroll.smoothVertical, forKey: OptionItem.Scroll.SmoothVertical)\n            UserDefaults.standard.set(scroll.smoothHorizontal, forKey: OptionItem.Scroll.SmoothHorizontal)\n            // 应用\n            UserDefaults.standard.set(application.allowlist, forKey: OptionItem.Application.Allowlist)\n            if let applicationsData = application.applications.json() {\n                UserDefaults.standard.set(applicationsData, forKey: OptionItem.Application.Applications)\n            } else {\n                NSLog(\"Failed to serialize applications data, skipping save\")\n            }\n            // 按钮绑定\n            saveButtonBindingsData()\n        }\n    }\n\n    // 安全加载按钮绑定数据\n    private func loadButtonsData() -> [ButtonBinding] {\n        let rawValue = UserDefaults.standard.object(forKey: OptionItem.Button.Bindings)\n        guard let data = rawValue as? Data else {\n            if rawValue != nil {\n                NSLog(\"Button bindings data has wrong type: \\(type(of: rawValue)), clearing corrupted data\")\n                UserDefaults.standard.removeObject(forKey: OptionItem.Button.Bindings)\n            }\n            return []\n        }\n\n        do {\n            return try decoder.decode([ButtonBinding].self, from: data)\n        } catch {\n            NSLog(\"Failed to decode button bindings data: \\(error), resetting to defaults\")\n            UserDefaults.standard.removeObject(forKey: OptionItem.Button.Bindings)\n            return []\n        }\n    }\n\n    // 保存按钮绑定数据\n    private func saveButtonBindingsData() {\n        do {\n            let data = try encoder.encode(buttons.binding)\n            UserDefaults.standard.set(data, forKey: OptionItem.Button.Bindings)\n        } catch {\n            NSLog(\"Failed to encode button bindings data: \\(error), skipping save\")\n        }\n    }\n\n    // 加载滚动热键 (支持从旧版 Int 格式迁移)\n    private func loadScrollHotkey(forKey key: String, default defaultValue: ScrollHotkey?) -> ScrollHotkey? {\n        let rawValue = UserDefaults.standard.object(forKey: key)\n\n        // 新格式: Data (JSON encoded ScrollHotkey)\n        if let data = rawValue as? Data {\n            do {\n                return try decoder.decode(ScrollHotkey.self, from: data)\n            } catch {\n                NSLog(\"Failed to decode ScrollHotkey for \\(key): \\(error), using default\")\n                return defaultValue\n            }\n        }\n\n        // 旧格式迁移: Int (keyboard keyCode only)\n        if let intValue = rawValue as? Int {\n            // 迁移为新格式\n            let hotkey = ScrollHotkey(type: .keyboard, code: UInt16(intValue))\n            saveScrollHotkey(hotkey, forKey: key)\n            return hotkey\n        }\n\n        // 无值时: 检查配置是否已存在\n        // 如果配置已存在但该键无值，说明用户主动删除了它，返回 nil\n        // 如果配置不存在（首次启动），返回默认值\n        let optionsExist = UserDefaults.standard.object(forKey: OptionItem.General.OptionsExist) != nil\n        return optionsExist ? nil : defaultValue\n    }\n\n    // 保存滚动热键\n    private func saveScrollHotkey(_ hotkey: ScrollHotkey?, forKey key: String) {\n        guard let hotkey = hotkey else {\n            UserDefaults.standard.removeObject(forKey: key)\n            return\n        }\n        do {\n            let data = try encoder.encode(hotkey)\n            UserDefaults.standard.set(data, forKey: key)\n        } catch {\n            NSLog(\"Failed to encode ScrollHotkey for \\(key): \\(error), skipping save\")\n        }\n    }\n\n    // 安全加载应用列表数据\n    private func loadApplicationsData() -> EnhanceArray<Application> {\n        let defaultArray = EnhanceArray<Application>(\n            matchKey: \"path\",\n            forObserver: Options.shared.saveOptions\n        )\n\n        // 检查 UserDefaults 中的值类型\n        let rawValue = UserDefaults.standard.object(forKey: OptionItem.Application.Applications)\n        guard let data = rawValue as? Data else {\n            if rawValue != nil {\n                NSLog(\"Applications data has wrong type: \\(type(of: rawValue)), clearing corrupted data\")\n                UserDefaults.standard.removeObject(forKey: OptionItem.Application.Applications)\n            }\n            return defaultArray\n        }\n\n        // 尝试解析\n        do {\n            return try EnhanceArray<Application>(\n                withData: data,\n                matchKey: \"path\",\n                forObserver: Options.shared.saveOptions\n            )\n        } catch {\n            NSLog(\"Failed to decode applications data: \\(error), resetting to defaults\")\n            UserDefaults.standard.removeObject(forKey: OptionItem.Application.Applications)\n            return defaultArray\n        }\n    }\n}\n"
  },
  {
    "path": "Mos/ScrollCore/Interpolator.swift",
    "content": "//\n//  Interpolator.swift\n//  Mos\n//  插值函数集\n//  Created by Caldis on 2018/2/19.\n//  Copyright © 2018年 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nclass Interpolator: NSObject {\n    \n    // Liner Interpolation\n    class func lerp(src: Double, dest: Double, trans: Double) -> Double {\n        let x = dest - src\n        return x * trans\n    }\n    \n    // SmoothStep (Need clamp 0-1) (2rd-order equation)\n    class func smoothStep2(src: Double, dest: Double) -> Double {\n        let x = (dest - src) / dest\n        return x * x * (3 - 2 * x)\n    }\n    \n    // SmoothStep (Need clamp 0-1) (3rd-order equation)\n    class func smoothStep3(src: Double, dest: Double) -> Double {\n        let x = (dest - src) / dest\n        return x * x * x * (x * (x * 6 - 15) + 10)\n    }\n    \n}\n"
  },
  {
    "path": "Mos/ScrollCore/ScrollCore.swift",
    "content": "//\n//  ScrollCore.swift\n//  Mos\n//  滚动事件截取与插值计算核心类\n//  Created by Caldis on 2017/1/14.\n//  Copyright © 2017年 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nclass ScrollCore {\n    \n    // 单例\n    static let shared = ScrollCore()\n    init() { NSLog(\"Module initialized: ScrollCore\") }\n    \n    // 执行状态\n    var isActive = false\n    // 热键数据\n    var dashScroll = false\n    var dashAmplification = 1.0\n    var toggleScroll = false {\n        didSet { ScrollPoster.shared.updateShifting(enable: toggleScroll) }\n    }\n    var blockSmooth = false\n    // 非修饰键热键的按下状态跟踪\n    var dashKeyHeld = false\n    var toggleKeyHeld = false\n    var blockKeyHeld = false\n    // 例外应用数据\n    var application: Application?\n    var currentApplication: Application? // 用于区分按下热键及抬起时的作用目标\n    // 拦截层\n    var scrollEventInterceptor: Interceptor?\n    var hotkeyEventInterceptor: Interceptor?\n    var mouseEventInterceptor: Interceptor?\n    // 拦截掩码\n    let scrollEventMask = CGEventMask(1 << CGEventType.scrollWheel.rawValue)\n    let hotkeyEventMask: CGEventMask = {\n        let flagsChanged = CGEventMask(1 << CGEventType.flagsChanged.rawValue)\n        let keyDown = CGEventMask(1 << CGEventType.keyDown.rawValue)\n        let keyUp = CGEventMask(1 << CGEventType.keyUp.rawValue)\n        let otherMouseDown = CGEventMask(1 << CGEventType.otherMouseDown.rawValue)\n        let otherMouseUp = CGEventMask(1 << CGEventType.otherMouseUp.rawValue)\n        return flagsChanged | keyDown | keyUp | otherMouseDown | otherMouseUp\n    }()\n    let mouseLeftEventMask = CGEventMask(1 << CGEventType.leftMouseDown.rawValue)\n    \n    // MARK: - 滚动事件处理\n    let scrollEventCallBack: CGEventTapCallBack = { (proxy, type, event, refcon) in\n        _ = refcon\n        // Tap 被系统禁用或重启边界时，强制清理 poster 上下文并失效历史异步帧\n        if type == .tapDisabledByTimeout || type == .tapDisabledByUserInput {\n            ScrollPoster.shared.stop(.TrackingEnd)\n            return Unmanaged.passUnretained(event)\n        }\n        if type != .scrollWheel {\n            return Unmanaged.passUnretained(event)\n        }\n        // 跳过 Mos 自己合成的平滑事件，避免重复进入平滑管线\n        if ScrollUtils.shared.isSyntheticSmoothEvent(event) {\n#if DEBUG\n            ScrollPoster.shared.recordSkippedSyntheticEvent()\n#endif\n            return Unmanaged.passUnretained(event)\n        }\n        // 不处理触控板\n        // 无法区分黑苹果, 因为黑苹果的触控板驱动直接模拟鼠标输入\n        // 无法区分 Magic Mouse, 因为其滚动特征与内置的 Trackpad 一致\n        if ScrollEvent.isTrackpad(with: event) {\n            return Unmanaged.passUnretained(event)\n        }\n        // 当事件来自远程桌面，且其发送的事件 isContinuous=1.0，此时跳过本地平滑\n        if ScrollUtils.shared.isRemoteSmoothedEvent(event) {\n            return Unmanaged.passUnretained(event)\n        }\n        // 当鼠标输入, 根据需要执行翻转方向/平滑滚动\n        // 获取事件目标\n        let targetRunningApplication = ScrollUtils.shared.getRunningApplication(from: event)\n        // 获取列表中应用程序的列外设置信息\n        ScrollCore.shared.application = ScrollUtils.shared.getTargetApplication(from: targetRunningApplication)\n        // 平滑/翻转\n        var enableSmooth = false,\n            enableSmoothVertical = false,\n            enableSmoothHorizontal = false,\n            enableReverseVertical = false,\n            enableReverseHorizontal = false\n        var step = Options.shared.scroll.step,\n            speed = Options.shared.scroll.speed,\n            duration = Options.shared.scroll.durationTransition\n        if let targetApplication = ScrollCore.shared.application {\n            enableSmooth = targetApplication.isSmooth(ScrollCore.shared.blockSmooth)\n            enableSmoothVertical = targetApplication.isSmoothVertical(ScrollCore.shared.blockSmooth)\n            enableSmoothHorizontal = targetApplication.isSmoothHorizontal(ScrollCore.shared.blockSmooth)\n            enableReverseVertical = targetApplication.isReverseVertical()\n            enableReverseHorizontal = targetApplication.isReverseHorizontal()\n            step = targetApplication.getStep()\n            speed = targetApplication.getSpeed()\n            duration = targetApplication.getDuration()\n        } else if !Options.shared.application.allowlist {\n            enableSmooth = Options.shared.scroll.smooth && !ScrollCore.shared.blockSmooth\n            enableSmoothVertical = enableSmooth && Options.shared.scroll.smoothVertical\n            enableSmoothHorizontal = enableSmooth && Options.shared.scroll.smoothHorizontal\n            let allowReverse = Options.shared.scroll.reverse\n            enableReverseVertical = allowReverse && Options.shared.scroll.reverseVertical\n            enableReverseHorizontal = allowReverse && Options.shared.scroll.reverseHorizontal\n        }\n        // Launchpad 激活则强制屏蔽平滑\n        if ScrollUtils.shared.getLaunchpadActivity(withRunningApplication: targetRunningApplication) {\n            enableSmooth = false\n            enableSmoothVertical = false\n            enableSmoothHorizontal = false\n        }\n        // 滚动事件\n        let scrollEvent = ScrollEvent(with: event)\n        let hasVerticalDelta = scrollEvent.Y.valid && scrollEvent.Y.usableValue != 0.0\n        let hasHorizontalDelta = scrollEvent.X.valid && scrollEvent.X.usableValue != 0.0\n        let willShiftVerticalToHorizontal = ScrollCore.shared.toggleScroll && hasVerticalDelta && !hasHorizontalDelta\n        let verticalReversePreference = willShiftVerticalToHorizontal ? enableReverseHorizontal : enableReverseVertical\n        if hasVerticalDelta && verticalReversePreference {\n            ScrollEvent.reverseY(scrollEvent)\n        }\n        if hasHorizontalDelta && enableReverseHorizontal {\n            ScrollEvent.reverseX(scrollEvent)\n        }\n\n        let verticalPreference = willShiftVerticalToHorizontal ? enableSmoothHorizontal : enableSmoothVertical\n        var shouldSmoothVertical = hasVerticalDelta && verticalPreference\n        var shouldSmoothHorizontal = hasHorizontalDelta && enableSmoothHorizontal\n\n        if !enableSmooth {\n            shouldSmoothVertical = false\n            shouldSmoothHorizontal = false\n        }\n\n        var smoothedY = 0.0\n        var smoothedX = 0.0\n\n        if shouldSmoothVertical {\n            if scrollEvent.Y.usableValue.magnitude < step {\n                ScrollEvent.normalizeY(scrollEvent, step)\n            }\n            smoothedY = scrollEvent.Y.usableValue\n        }\n        if shouldSmoothHorizontal {\n            if scrollEvent.X.usableValue.magnitude < step {\n                ScrollEvent.normalizeX(scrollEvent, step)\n            }\n            smoothedX = scrollEvent.X.usableValue\n        }\n\n        let needVerticalPassthrough = hasVerticalDelta && !shouldSmoothVertical\n        let needHorizontalPassthrough = hasHorizontalDelta && !shouldSmoothHorizontal\n        let needsPassthrough = needVerticalPassthrough || needHorizontalPassthrough\n        let shouldSmoothAny = (smoothedY != 0.0) || (smoothedX != 0.0)\n\n        if shouldSmoothAny {\n            ScrollPoster.shared.update(\n                event: event,\n                duration: duration,\n                y: smoothedY,\n                x: smoothedX,\n                speed: speed,\n                amplification: ScrollCore.shared.dashAmplification\n            ).tryStart()\n        }\n\n        if needsPassthrough {\n            if shouldSmoothVertical {\n                ScrollEvent.clearY(scrollEvent)\n            }\n            if shouldSmoothHorizontal {\n                ScrollEvent.clearX(scrollEvent)\n            }\n            return Unmanaged.passUnretained(event)\n        }\n\n        if shouldSmoothAny {\n            return nil\n        } else {\n            return Unmanaged.passUnretained(event)\n        }\n    }\n    \n    // MARK: - 热键事件处理\n    let hotkeyEventCallBack: CGEventTapCallBack = { (proxy, type, event, refcon) in\n        let keyCode = event.keyCode\n        let mouseButton = UInt16(event.getIntegerValueField(.mouseEventButtonNumber))\n\n        // 判断事件类型\n        let isMouseEvent = (type == .otherMouseDown || type == .otherMouseUp)\n        let isKeyDown = (type == .keyDown || type == .otherMouseDown)\n        let isKeyUp = (type == .keyUp || type == .otherMouseUp)\n        let isFlagsChanged = (type == .flagsChanged)\n\n        // 记录按键时的目标应用\n        if (event.isKeyDown || isKeyDown) && ScrollCore.shared.currentApplication == nil {\n            ScrollCore.shared.currentApplication = ScrollCore.shared.application\n        }\n\n        // 获取配置的热键\n        let dashHotkey = ScrollUtils.shared.optionsDashKey(application: ScrollCore.shared.application)\n        let toggleHotkey = ScrollUtils.shared.optionsToggleKey(application: ScrollCore.shared.application)\n        let blockHotkey = ScrollUtils.shared.optionsBlockKey(application: ScrollCore.shared.application)\n\n        // 检测热键是否匹配并更新状态\n        func checkAndUpdateHotkey(_ hotkey: ScrollHotkey?, keyHeld: inout Bool) -> Bool? {\n            guard let hotkey = hotkey else { return nil }\n\n            if hotkey.isModifierKey {\n                // 修饰键：通过 flagsChanged 事件检测\n                if isFlagsChanged && keyCode == hotkey.code {\n                    return event.flags.contains(hotkey.modifierMask)\n                }\n            } else if hotkey.matches(event, keyCode: keyCode, mouseButton: mouseButton, isMouseEvent: isMouseEvent) {\n                // 普通按键或鼠标按键\n                if isKeyDown { keyHeld = true }\n                if isKeyUp { keyHeld = false }\n                return keyHeld\n            }\n            return nil\n        }\n\n        // Dash\n        if let isPressed = checkAndUpdateHotkey(dashHotkey, keyHeld: &ScrollCore.shared.dashKeyHeld) {\n            ScrollCore.shared.dashScroll = isPressed\n            ScrollCore.shared.dashAmplification = isPressed ? 5.0 : 1.0\n        }\n        // Toggle\n        if let isPressed = checkAndUpdateHotkey(toggleHotkey, keyHeld: &ScrollCore.shared.toggleKeyHeld) {\n            ScrollCore.shared.toggleScroll = isPressed\n        }\n        // Block\n        if let isPressed = checkAndUpdateHotkey(blockHotkey, keyHeld: &ScrollCore.shared.blockKeyHeld) {\n            ScrollCore.shared.blockSmooth = isPressed\n        }\n\n        // 处理抬起时焦点 App 变化\n        let isAppTargetChanged = ScrollCore.shared.currentApplication != ScrollCore.shared.application\n        let isAnyKeyUp = event.isKeyUp || isKeyUp\n        if isAppTargetChanged && isAnyKeyUp {\n            // 关闭全部\n            ScrollCore.shared.dashScroll = false\n            ScrollCore.shared.dashAmplification = 1.0\n            ScrollCore.shared.toggleScroll = false\n            ScrollCore.shared.blockSmooth = false\n            // 重置按键状态\n            ScrollCore.shared.dashKeyHeld = false\n            ScrollCore.shared.toggleKeyHeld = false\n            ScrollCore.shared.blockKeyHeld = false\n            // 并更新记录器\n            ScrollCore.shared.currentApplication = nil\n        }\n        // 不返回原始事件\n        return nil\n    }\n    \n    // MARK: - 鼠标事件处理\n    let mouseLeftEventCallBack: CGEventTapCallBack = { (proxy, type, event, refcon) in\n        // 如果点击左键则停止滚动\n        ScrollPoster.shared.stop()\n        return nil\n    }\n    \n    // MARK: - 事件运行管理\n    // 启动\n    func enable() {\n        // Guard\n        if isActive { return }\n        isActive = true\n        // 启动事件拦截层\n        do {\n            scrollEventInterceptor = try Interceptor(\n                event: scrollEventMask,\n                handleBy: scrollEventCallBack,\n                listenOn: .cgAnnotatedSessionEventTap,\n                placeAt: .tailAppendEventTap,\n                for: .defaultTap\n            )\n            hotkeyEventInterceptor = try Interceptor(\n                event: hotkeyEventMask,\n                handleBy: hotkeyEventCallBack,\n                listenOn: .cgAnnotatedSessionEventTap,\n                placeAt: .tailAppendEventTap,\n                for: .listenOnly\n            )\n            mouseEventInterceptor = try Interceptor(\n                event: mouseLeftEventMask,\n                handleBy: mouseLeftEventCallBack,\n                listenOn: .cgAnnotatedSessionEventTap,\n                placeAt: .tailAppendEventTap,\n                for: .listenOnly\n            )\n            // 初始化滚动事件发送器\n            ScrollPoster.shared.create()\n        } catch {\n            print(\"[ScrollCore] Create Interceptor failure: \\(error)\")\n        }\n    }\n    // 停止\n    func disable() {\n        // Guard\n        if !isActive {return}\n        isActive = false\n        // 停止滚动事件发送器\n        ScrollPoster.shared.stop()\n        // 停止截取事件\n        scrollEventInterceptor?.stop()\n        hotkeyEventInterceptor?.stop()\n        mouseEventInterceptor?.stop()\n    }\n}\n"
  },
  {
    "path": "Mos/ScrollCore/ScrollDispatchContext.swift",
    "content": "//\n//  ScrollDispatchContext.swift\n//  Mos\n//\n//  Created by Codex on 2026/3/5.\n//\n\nimport Cocoa\nimport os\n\nfinal class ScrollDispatchContext {\n\n    static let shared = ScrollDispatchContext()\n\n    struct PostingSnapshot {\n        let event: CGEvent\n        let targetPID: pid_t\n        let generation: UInt64\n        let capturedAt: CFTimeInterval\n    }\n\n    private struct SnapshotState {\n        var eventTemplate: CGEvent?\n        var targetPID: pid_t = 0\n        var generation: UInt64 = 0\n        var updatedAt: CFTimeInterval = 0.0\n    }\n\n    private var state = SnapshotState()\n    private var lock = os_unfair_lock_s()\n    private let postQueue = DispatchQueue(label: \"me.caldis.mos.scrollposter.post\", qos: .userInteractive)\n    // TTL 仅作为 enqueue 投递时的兜底安全网, 不用于快照创建门控\n    // 需覆盖最长惯性减速阶段 (通常 1-3s, 极端 ~5s)\n    private let eventTTL: CFTimeInterval = 5.0\n\n#if DEBUG\n    private var postedFrames: UInt64 = 0\n    private var droppedFramesByGeneration: UInt64 = 0\n    private var droppedFramesByTTL: UInt64 = 0\n    private var skippedSyntheticEvents: UInt64 = 0\n    private var updateSnapshotFailures: UInt64 = 0\n#endif\n\n    private init() {}\n\n    @discardableResult\n    func capture(event: CGEvent) -> Bool {\n        guard let template = event.copy() else {\n#if DEBUG\n            os_unfair_lock_lock(&lock)\n            updateSnapshotFailures &+= 1\n            os_unfair_lock_unlock(&lock)\n#endif\n            return false\n        }\n        let pid = pid_t(event.getIntegerValueField(.eventTargetUnixProcessID))\n        os_unfair_lock_lock(&lock)\n        state.eventTemplate = template\n        state.targetPID = pid\n        state.updatedAt = CFAbsoluteTimeGetCurrent()\n        os_unfair_lock_unlock(&lock)\n        return true\n    }\n\n    func advanceGeneration() {\n        os_unfair_lock_lock(&lock)\n        state.generation &+= 1\n        os_unfair_lock_unlock(&lock)\n    }\n\n    func clearContext() {\n        os_unfair_lock_lock(&lock)\n        state.eventTemplate = nil\n        state.targetPID = 0\n        state.updatedAt = 0.0\n        os_unfair_lock_unlock(&lock)\n    }\n\n    func invalidateAll() {\n        os_unfair_lock_lock(&lock)\n        state.generation &+= 1\n        state.eventTemplate = nil\n        state.targetPID = 0\n        state.updatedAt = 0.0\n        os_unfair_lock_unlock(&lock)\n    }\n\n    func preparePostingSnapshot() -> PostingSnapshot? {\n        os_unfair_lock_lock(&lock)\n        guard state.targetPID != 0,\n              let eventClone = state.eventTemplate?.copy() else {\n            os_unfair_lock_unlock(&lock)\n            return nil\n        }\n        let snapshot = PostingSnapshot(event: eventClone, targetPID: state.targetPID, generation: state.generation, capturedAt: state.updatedAt)\n        os_unfair_lock_unlock(&lock)\n        return snapshot\n    }\n\n    func enqueue(_ snapshot: PostingSnapshot) {\n        postQueue.async { [self] in\n            os_unfair_lock_lock(&self.lock)\n            let now = CFAbsoluteTimeGetCurrent()\n            let validGeneration = snapshot.generation == self.state.generation\n            let validTTL = now - snapshot.capturedAt <= self.eventTTL\n            if !validGeneration {\n#if DEBUG\n                self.droppedFramesByGeneration &+= 1\n#endif\n            } else if !validTTL {\n#if DEBUG\n                self.droppedFramesByTTL &+= 1\n#endif\n            }\n            os_unfair_lock_unlock(&self.lock)\n            guard validGeneration && validTTL else { return }\n            // 使用 CGEventPostToPid 直接投递到目标进程:\n            // 1. 不依赖 proxy → 无生命周期崩溃 (issue #868)\n            // 2. 不经过 session event tap 链路重新路由 → 动量阶段光标移动不会\n            //    将滚动事件\"带到\"其他应用, 始终送达原始滚动目标进程\n            // 3. 进程内通过 event.location 做窗口级 hit-testing, 路由到正确窗口\n            // 合成事件标记 (eventSourceUserData) 作为防御性旁路保留\n            snapshot.event.postToPid(snapshot.targetPID)\n#if DEBUG\n            os_unfair_lock_lock(&self.lock)\n            self.postedFrames &+= 1\n            os_unfair_lock_unlock(&self.lock)\n#endif\n        }\n    }\n\n#if DEBUG\n    func recordSkippedSyntheticEvent() {\n        os_unfair_lock_lock(&lock)\n        skippedSyntheticEvents &+= 1\n        os_unfair_lock_unlock(&lock)\n    }\n\n    func diagnosticsSnapshot() -> (postedFrames: UInt64, droppedFramesByGeneration: UInt64, droppedFramesByTTL: UInt64, skippedSyntheticEvents: UInt64, updateSnapshotFailures: UInt64) {\n        os_unfair_lock_lock(&lock)\n        let snapshot = (\n            postedFrames: postedFrames,\n            droppedFramesByGeneration: droppedFramesByGeneration,\n            droppedFramesByTTL: droppedFramesByTTL,\n            skippedSyntheticEvents: skippedSyntheticEvents,\n            updateSnapshotFailures: updateSnapshotFailures\n        )\n        os_unfair_lock_unlock(&lock)\n        return snapshot\n    }\n#endif\n}\n"
  },
  {
    "path": "Mos/ScrollCore/ScrollEvent.swift",
    "content": "//\n//  ScrollEvent.swift\n//  Mos\n//  滚动事件基类\n//  Created by Caldis on 2018/2/24.\n//  Copyright © 2018年 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nenum axisType {\n    case Y\n    case X\n}\n\nstruct axisData {\n    // 基本参数\n    var scrollFix = Int64(0)\n    var scrollPt = 0.0\n    var scrollFixPt = 0.0\n    // 滚动数据是否为 Fix 类型 (非 Fix 类型在可用数据过小时需要归一化处理)\n    var fixed = false\n    // 滚动数据数据是否可用\n    var valid = false\n    // 可用的滚动数据\n    var usableValue = 0.0\n}\n\nclass ScrollEvent {\n    \n    // 滚动事件\n    let event: CGEvent\n    // 轴数据\n    var Y: axisData\n    var X: axisData\n    \n    // 初始化\n    required init(with cgEvent: CGEvent) {\n        // 保存事件引用\n        event = cgEvent\n        // 获取对应轴的数据\n        Y = ScrollEvent.initEvent(event: cgEvent, axis: axisType.Y)\n        X = ScrollEvent.initEvent(event: cgEvent, axis: axisType.X)\n    }\n    \n    // 触控板/鼠标判断\n    func isTrackpad() -> Bool {\n        return ScrollEvent.isTrackpad(with: event)\n    }\n    func isMouse() -> Bool {\n        return !ScrollEvent.isTrackpad(with: event)\n    }\n}\n\n// MARK: - 工具方法\nextension ScrollEvent {\n    // 类型判断\n    static var isTrackpadCallSamplingRate = 3\n    static var isTrackpadCallCount = 2\n    static var isTrackpadCallCache = true\n    class func isTrackpad(with event: CGEvent) -> Bool {\n        ScrollEvent.isTrackpadCallCount += 1\n        if isTrackpadCallCount % isTrackpadCallSamplingRate == 0 {\n            ScrollEvent.isTrackpadCallCache = false\n            // 根据滚动特征值判定\n            if (event.getDoubleValueField(.scrollWheelEventMomentumPhase) != 0.0) || (event.getDoubleValueField(.scrollWheelEventScrollPhase) != 0.0) {\n                // MomentumPhase 或 ScrollPhase 任一不为零, 则为触控板\n                ScrollEvent.isTrackpadCallCache = true\n            } else if event.getDoubleValueField(.scrollWheelEventScrollCount) != 0.0 {\n                // 累计加速度不为零, 则为触控板\n                ScrollEvent.isTrackpadCallCache = true\n            }\n            // 根据输入事件源增强判断\n            if ScrollEvent.isTrackpadCallCache {\n                if let specialProcessID = Utils.getRunningApplicationProcessIdentifier(withBundleIdentifier: SPECIAL_EVENT_SOURCE_APPLICATION.logitechOptions)?.processIdentifier {\n                    let sourceProcessID = event.getIntegerValueField(.eventSourceUnixProcessID)\n                    if sourceProcessID == specialProcessID {\n                        ScrollEvent.isTrackpadCallCache = false\n                    }\n                }\n            }\n            ScrollEvent.isTrackpadCallCount = isTrackpadCallSamplingRate - 1 \n        }\n        return ScrollEvent.isTrackpadCallCache\n    }\n    \n    // 初始化轴数据\n    class func initEvent(event: CGEvent, axis: axisType) -> axisData {\n        var data = axisData()\n        // 获取对应轴的数据\n        if axis == axisType.Y {\n            data.scrollFix = Int64(event.getIntegerValueField(.scrollWheelEventDeltaAxis1))\n            data.scrollPt = event.getDoubleValueField(.scrollWheelEventPointDeltaAxis1)\n            data.scrollFixPt = event.getDoubleValueField(.scrollWheelEventFixedPtDeltaAxis1)\n        } else {\n            data.scrollFix = Int64(event.getIntegerValueField(.scrollWheelEventDeltaAxis2))\n            data.scrollPt = event.getDoubleValueField(.scrollWheelEventPointDeltaAxis2)\n            data.scrollFixPt = event.getDoubleValueField(.scrollWheelEventFixedPtDeltaAxis2)\n        }\n        // 生成可用的滚动数据\n        if data.scrollPt != 0.0 {\n            data.fixed = false\n            data.valid = true\n            data.usableValue = data.scrollPt\n        } else if data.scrollFixPt != 0.0 {\n            data.fixed = true\n            data.valid = true\n            data.usableValue = data.scrollFixPt\n        } else if data.scrollFix != 0 {\n            data.fixed = true\n            data.valid = true\n            data.usableValue = Double(data.scrollFix)\n        }\n        return data\n    }\n    \n    // 翻转数据方向\n    class func reverse(axis: axisType) -> (ScrollEvent) -> () {\n        if axis == axisType.Y {\n            return {\n                (scrollEvent: ScrollEvent) in\n                    scrollEvent.event.setIntegerValueField(.scrollWheelEventDeltaAxis1, value: -scrollEvent.Y.scrollFix)\n                    scrollEvent.event.setDoubleValueField(.scrollWheelEventPointDeltaAxis1, value: -scrollEvent.Y.scrollPt)\n                    scrollEvent.event.setDoubleValueField(.scrollWheelEventFixedPtDeltaAxis1, value: -scrollEvent.Y.scrollFixPt)\n                    scrollEvent.Y.usableValue = -scrollEvent.Y.usableValue\n            }\n        } else {\n            return {\n                (scrollEvent: ScrollEvent) in\n                    scrollEvent.event.setIntegerValueField(.scrollWheelEventDeltaAxis2, value: -scrollEvent.X.scrollFix)\n                    scrollEvent.event.setDoubleValueField(.scrollWheelEventPointDeltaAxis2, value: -scrollEvent.X.scrollPt)\n                    scrollEvent.event.setDoubleValueField(.scrollWheelEventFixedPtDeltaAxis2, value: -scrollEvent.X.scrollFixPt)\n                    scrollEvent.X.usableValue = -scrollEvent.X.usableValue\n            }\n        }\n        \n    }\n    static let reverseX = reverse(axis: axisType.X)\n    static let reverseY = reverse(axis: axisType.Y)\n    \n    // 归一化数据\n    class func normalize(axis: axisType) -> (ScrollEvent, Double) -> () {\n        if axis == axisType.Y {\n            return {\n                (scrollEvent: ScrollEvent, threshold: Double) in\n                    let usableValue = scrollEvent.Y.usableValue\n                    scrollEvent.Y.usableValue = usableValue>0.0 ? max(usableValue.magnitude, threshold) : -max(usableValue.magnitude, threshold)\n            }\n        } else {\n            return {\n                (scrollEvent: ScrollEvent, threshold: Double) in\n                    let usableValue = scrollEvent.X.usableValue\n                    scrollEvent.X.usableValue = usableValue>0.0 ? max(usableValue.magnitude, threshold) : -max(usableValue.magnitude, threshold)\n            }\n        }\n    }\n    static let normalizeX = normalize(axis: axisType.X)\n    static let normalizeY = normalize(axis: axisType.Y)\n\n    // 清除指定轴的数据 (用于返回原始事件时禁用某轴)\n    class func clear(axis: axisType) -> (ScrollEvent) -> () {\n        if axis == axisType.Y {\n            return { scrollEvent in\n                scrollEvent.event.setIntegerValueField(.scrollWheelEventDeltaAxis1, value: 0)\n                scrollEvent.event.setDoubleValueField(.scrollWheelEventPointDeltaAxis1, value: 0.0)\n                scrollEvent.event.setDoubleValueField(.scrollWheelEventFixedPtDeltaAxis1, value: 0.0)\n                scrollEvent.Y.scrollFix = 0\n                scrollEvent.Y.scrollPt = 0.0\n                scrollEvent.Y.scrollFixPt = 0.0\n                scrollEvent.Y.usableValue = 0.0\n            }\n        } else {\n            return { scrollEvent in\n                scrollEvent.event.setIntegerValueField(.scrollWheelEventDeltaAxis2, value: 0)\n                scrollEvent.event.setDoubleValueField(.scrollWheelEventPointDeltaAxis2, value: 0.0)\n                scrollEvent.event.setDoubleValueField(.scrollWheelEventFixedPtDeltaAxis2, value: 0.0)\n                scrollEvent.X.scrollFix = 0\n                scrollEvent.X.scrollPt = 0.0\n                scrollEvent.X.scrollFixPt = 0.0\n                scrollEvent.X.usableValue = 0.0\n            }\n        }\n    }\n    static let clearX = clear(axis: axisType.X)\n    static let clearY = clear(axis: axisType.Y)\n}\n"
  },
  {
    "path": "Mos/ScrollCore/ScrollFilter.swift",
    "content": "//\n//  Filter.swift\n//  Mos\n//  曲线峰值滤波, 用于去除滚动的起始抖动\n//  Created by Caldis on 2018/3/21.\n//  Copyright © 2018年 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nclass ScrollFilter {\n    \n    var curveWindowY = [0.0, 0.0]\n    var curveWindowX = [0.0, 0.0]\n    \n    // 填充值\n    public func fill(with nextValue: ( y: Double, x: Double )) -> ( y: Double, x: Double ) {\n        curveWindowY = polish(curveWindowY, with: nextValue.y)\n        curveWindowX = polish(curveWindowX, with: nextValue.x)\n        return value()\n    }\n    // 获取值\n    public func value() -> ( y: Double, x: Double ) {\n        return ( y: curveWindowY[0], x: curveWindowX[0] )\n    }\n    // 清空\n    public func reset() {\n        curveWindowY = [0.0, 0.0]\n        curveWindowX = [0.0, 0.0]\n    }\n\n}\n\nextension ScrollFilter {\n    // 曲线平滑\n    // 计算曲线窗口数组首位与 nextValue 的距离, 用定长的非线性数列填充以平滑曲线\n    // 例如: 数组首位为 1, nextValue 为 2, 则生成数列 [1.00, 1.23, 1.50, 1.77, 2.00]\n    private func polish(_ array: [Double], with nextValue: Double) -> [Double] {\n        let first = array[1]\n        let diff = nextValue - first\n        return [first, first+0.23*diff, first+0.5*diff, first+0.77*diff, nextValue]\n    }\n}\n"
  },
  {
    "path": "Mos/ScrollCore/ScrollPhase.swift",
    "content": "//\n//  ScrollPhase.swift\n//  Mos\n//\n//  Created by Caldis on 2020/12/19.\n//  Copyright © 2020 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\n/**\n * Phase 状态机说明 - 基于触控板事件序列\n *\n * 惯性滚动 (快速滑动一次, 离开):\n *  - Hold (Optional, 如果开始移动较慢)\n *  - TrackingBegin\n *  - TrackingOngoing (持续追踪滚动\n *  - TrackingEnd\n *  - MomentumBegin\n *  - MomentumOngoing\n *  - MomentumEnd\n *\n * 惯性连续滚动 (快速滑动连续多次):\n *  - Hold (Optional, 如果开始移动较慢)\n *  - TrackingBegin\n *  - TrackingOngoing (持续追踪滚动\n *  - TrackingEnd\n *  - MomentumBegin\n *  - MomentumOngoing\n *  - MomentumEnd  (第二次滑动开始就会无视惯量立即触发一帧, 然后继续下面\n *  - TrackingBegin\n *  - TrackingOngoing (持续追踪滚动\n *  - TrackingEnd\n *  - MomentumBegin\n *  - MomentumOngoing\n *  - MomentumEnd\n *\n * 惯性滚动煞停 (手指离开后, 在惯性未结束前再次点按):\n *  - Hold (Optional, 如果开始移动较慢)\n *  - TrackingBegin\n *  - TrackingOngoing (持续追踪滚动\n *  - TrackingEnd\n *  - MomentumBegin\n *  - MomentumOngoing\n *  - MomentumEnd (会无视已有的惯量, 在 Hold 前立即触发一帧)\n *  - Hold\n *  - Leave\n *\n * 非惯性滚动 (手指持续移动, 但是离开前不带速度):\n *  - Hold (Optional, 如果开始移动较慢)\n *  - TrackingBegin\n *  - TrackingOngoing (持续追踪滚动\n *  - TrackingEnd\n *\n * 非滚动流程 (手指放下 -> 离开)\n *  - Hold\n *  - Leave\n */\n\nenum Phase {\n    case Idle\n    case Hold\n    case TrackingBegin\n    case TrackingOngoing\n    case TrackingEnd\n    case MomentumBegin\n    case MomentumOngoing\n    case MomentumEnd\n    case Leave\n}\nenum PhaseItem {\n    case Scroll\n    case Momentum\n}\n\nlet PhaseValueMapping: [Phase: [PhaseItem: Double]] = [\n    // 空\n    Phase.Idle: [PhaseItem.Scroll: 0.0, PhaseItem.Momentum: 0.0],\n    // 手指保持: 双指放下不滚动 / 缓动中点按停止\n    Phase.Hold: [PhaseItem.Scroll: 128.0, PhaseItem.Momentum: 0.0],\n    // 跟随: 首帧\n    Phase.TrackingBegin: [PhaseItem.Scroll: 1.0, PhaseItem.Momentum: 0.0],\n    // 跟随: 移动过程\n    Phase.TrackingOngoing: [PhaseItem.Scroll: 2.0, PhaseItem.Momentum: 0.0],\n    // 跟随: 末帧 (这一帧似乎不会带任何 Scroll X/Y 数据\n    Phase.TrackingEnd: [PhaseItem.Scroll: 4.0, PhaseItem.Momentum: 0.0],\n    // 缓动: 首帧\n    Phase.MomentumBegin: [PhaseItem.Scroll: 0.0, PhaseItem.Momentum: 1.0],\n    // 缓动: 移动过程\n    Phase.MomentumOngoing: [PhaseItem.Scroll: 0.0, PhaseItem.Momentum: 2.0],\n    // 缓动: 末帧\n    Phase.MomentumEnd: [PhaseItem.Scroll: 0.0, PhaseItem.Momentum: 3.0],\n    // 手指离开: 末帧\n    Phase.Leave: [PhaseItem.Scroll: 8.0, PhaseItem.Momentum: 0.0],\n]\n\nclass ScrollPhase {\n    \n    // 单例\n    static let shared = ScrollPhase()\n    init() { NSLog(\"Module initialized: ScrollPhase\") }\n    \n    private(set) var phase: Phase = .Idle\n    \n    // 下一帧发送完毕后自动切换到的阶段\n    private var pendingPhaseAfterDelivery: Phase? = nil\n    \n    // 记录在开始新的 Tracking 前是否需要补发额外阶段 (比如在惯性中断时时补发 MomentumEnd)\n    struct TransitionPlan {\n        let queue: [(Phase, Phase?)]\n        let target: (Phase, Phase?)?\n    }\n    \n    // MARK: - 工具方法\n    private func transition(to next: Phase, autoAdvance: Phase? = nil) {\n        phase = next\n        pendingPhaseAfterDelivery = autoAdvance\n    }\n    \n    private func plan(extra queue: [(Phase, Phase?)] = [], target: (Phase, Phase?)? = nil) -> TransitionPlan {\n        return TransitionPlan(queue: queue, target: target)\n    }\n    \n    // MARK: - 对外接口\n    func reset() {\n        phase = .Idle\n        pendingPhaseAfterDelivery = nil\n    }\n    \n    /// 每次检测到鼠标滚轮输入时调用, 根据是否被视为独立滚动返回阶段序列\n    func onManualInputDetected(isSeparated: Bool) -> TransitionPlan {\n        if phase == .MomentumBegin || phase == .MomentumOngoing {\n            if isSeparated {\n                return plan(extra: [(Phase.MomentumEnd, Phase.Idle), (Phase.TrackingBegin, Phase.TrackingOngoing)])\n            } else {\n                return plan(\n                    extra: [(Phase.MomentumEnd, Phase.Idle)],\n                    target: (.TrackingBegin, .TrackingOngoing)\n                )\n            }\n        }\n        if isSeparated {\n            return plan(extra: [(Phase.TrackingBegin, Phase.TrackingOngoing)])\n        }\n        if phase == .TrackingBegin || phase == .TrackingOngoing {\n            return plan(target: (.TrackingOngoing, nil))\n        }\n        return plan(target: (.TrackingBegin, .TrackingOngoing))\n    }\n    \n    /// 在滚轮输入停止后调用, 将阶段切到 TrackingEnd\n    func onManualInputEnded() -> TransitionPlan {\n        switch phase {\n        case .TrackingBegin, .TrackingOngoing:\n            return plan(target: (.TrackingEnd, nil))\n        default:\n            return plan()\n        }\n    }\n    \n    /// 在检测到需要进入惯性滚动时调用\n    func onMomentumStart() -> TransitionPlan {\n        switch phase {\n        case .TrackingEnd, .MomentumEnd:\n            return plan(target: (.MomentumBegin, .MomentumOngoing))\n        case .MomentumBegin:\n            return plan(target: (.MomentumOngoing, nil))\n        default:\n            return plan()\n        }\n    }\n    \n    /// 惯性滚动中持续调用, 保持阶段为 MomentumOngoing\n    func onMomentumOngoing() -> TransitionPlan {\n        switch phase {\n        case .MomentumBegin:\n            return plan(target: (.MomentumOngoing, nil))\n        default:\n            return plan()\n        }\n    }\n    \n    /// 惯性或滚动停止时调用\n    func onMomentumFinish() -> TransitionPlan {\n        switch phase {\n        case .MomentumBegin, .MomentumOngoing:\n            return plan(target: (.MomentumEnd, .Idle))\n        case .TrackingBegin, .TrackingOngoing, .TrackingEnd:\n            return plan(target: (.TrackingEnd, .Idle))\n        default:\n            return plan()\n        }\n    }\n    \n    /// 在滚动帧发送后调用, 处理自动阶段切换\n    func didDeliverFrame() {\n        if let nextPhase = pendingPhaseAfterDelivery {\n            phase = nextPhase\n            pendingPhaseAfterDelivery = nil\n        }\n    }\n    \n    /// 直接设置阶段 (用于补发额外帧)\n    func apply(phase next: Phase, autoAdvance: Phase? = nil) {\n        transition(to: next, autoAdvance: autoAdvance)\n    }\n}\n"
  },
  {
    "path": "Mos/ScrollCore/ScrollPoster.swift",
    "content": "//\n//  ScrollPoster.swift\n//  Mos\n//\n//  Created by Caldis on 2020/12/3.\n//  Copyright © 2020 Caldis. All rights reserved.\n//\n\nimport Cocoa\nimport os\n\nclass ScrollPoster {\n\n    // 单例\n    static let shared = ScrollPoster()\n    init() { NSLog(\"Module initialized: ScrollPoster\") }\n\n    // 插值器\n    private let filter = ScrollFilter()\n    // 发送器\n    private var poster: CVDisplayLink?\n    // 滚动数据\n    private var current = (y: 0.0, x: 0.0)  // 当前滚动距离\n    private var delta = (y: 0.0, x: 0.0)  // 滚动方向记录\n    private var buffer = (y: 0.0, x: 0.0)  // 滚动缓冲距离\n    // 滚动配置\n    private var shifting = false\n    private var duration = Options.shared.scroll.durationTransition\n    // 输入节奏追踪\n    private var lastManualEventTime: CFTimeInterval = 0.0\n    private var manualInputEnded = true\n    private var momentumActive = false\n    private var momentumEndScheduledTime: CFTimeInterval? = nil\n    private var trackingEndScheduledTime: CFTimeInterval? = nil\n    // 阈值: 鼠标滚轮事件间隔低于 continuationThreshold 视为持续跟随\n    //      介于 continuationThreshold 与 separationThreshold 之间模拟惯性衔接\n    private let manualContinuationThreshold: CFTimeInterval = 0.18\n    private let manualSeparationThreshold: CFTimeInterval = 0.45\n    private let trackingEndAdvance: CFTimeInterval = 0.04\n    private let momentumEndDelay: CFTimeInterval = 0.13\n    // 状态锁和投递上下文\n    private var stateLock = os_unfair_lock_s()\n    private let dispatchContext = ScrollDispatchContext.shared\n}\n\n// MARK: - 滚动数据更新控制\nextension ScrollPoster {\n    func update(event: CGEvent, duration: Double, y: Double, x: Double, speed: Double, amplification: Double = 1) -> Self {\n        guard dispatchContext.capture(event: event) else {\n            return self\n        }\n        os_unfair_lock_lock(&stateLock)\n        defer { os_unfair_lock_unlock(&stateLock) }\n        // 更新滚动配置\n        self.duration = duration\n        // 更新滚动数据\n        if y*delta.y > 0 {\n            buffer.y += y * speed * amplification\n        } else {\n            buffer.y = y * speed * amplification\n            current.y = 0.0\n        }\n        if x*delta.x > 0 {\n            buffer.x += x * speed * amplification\n        } else {\n            buffer.x = x * speed * amplification\n            current.x = 0.0\n        }\n        delta = (y: y, x: x)\n        let now = CFAbsoluteTimeGetCurrent()\n        let interval = lastManualEventTime > 0.0 ? now - lastManualEventTime : nil\n        let separatedByTime = interval == nil ? true : interval! >= manualSeparationThreshold\n        let phase = ScrollPhase.shared.phase\n        let separatedPhase = (phase == .Idle || phase == .Leave || phase == .MomentumEnd || phase == .TrackingEnd)\n        let separated = manualInputEnded || separatedByTime || separatedPhase\n        let plan = ScrollPhase.shared.onManualInputDetected(isSeparated: separated)\n        perform(plan, emitTargetImmediately: false)\n        lastManualEventTime = now\n        manualInputEnded = false\n        momentumActive = false\n        momentumEndScheduledTime = nil\n        trackingEndScheduledTime = nil\n        return self\n    }\n    func updateShifting(enable: Bool) {\n        os_unfair_lock_lock(&stateLock)\n        shifting = enable\n        os_unfair_lock_unlock(&stateLock)\n    }\n    func shift(with nextValue: ( y: Double, x: Double )) -> (y: Double, x: Double) {\n        // 如果按下 Shift, 则始终将滚动转为横向\n        if shifting {\n            // 判断哪个轴有值, 有值则赋给 X\n            // 某些鼠标 (MXMaster/MXAnywhere), 按下 Shift 后会显式转换方向为横向, 此处针对这类转换进行归一化处理\n            if nextValue.y != 0.0 && nextValue.x == 0.0 {\n                return (y: nextValue.x, x: nextValue.y)\n            } else {\n                return (y: nextValue.y, x: nextValue.x)\n            }\n        } else {\n            return (y: nextValue.y, x: nextValue.x)\n        }\n    }\n    func brake() {\n        os_unfair_lock_lock(&stateLock)\n        buffer = current\n        perform(ScrollPhase.shared.onMomentumFinish(), emitTargetImmediately: true)\n        manualInputEnded = true\n        momentumActive = false\n        momentumEndScheduledTime = nil\n        os_unfair_lock_unlock(&stateLock)\n    }\n    func reset() {\n        dispatchContext.invalidateAll()\n        os_unfair_lock_lock(&stateLock)\n        resetUnlocked()\n        os_unfair_lock_unlock(&stateLock)\n    }\n\n#if DEBUG\n    func recordSkippedSyntheticEvent() {\n        dispatchContext.recordSkippedSyntheticEvent()\n    }\n\n    func diagnosticsSnapshot() -> (postedFrames: UInt64, droppedFramesByGeneration: UInt64, droppedFramesByTTL: UInt64, skippedSyntheticEvents: UInt64, updateSnapshotFailures: UInt64) {\n        dispatchContext.diagnosticsSnapshot()\n    }\n#endif\n\n    private func resetUnlocked() {\n        // 重置数值\n        dispatchContext.clearContext()\n        current = ( y: 0.0, x: 0.0 )\n        delta = ( y: 0.0, x: 0.0 )\n        buffer = ( y: 0.0, x: 0.0 )\n        // 重置插值器\n        filter.reset()\n        ScrollPhase.shared.reset()\n        manualInputEnded = true\n        momentumActive = false\n        lastManualEventTime = 0.0\n        momentumEndScheduledTime = nil\n        trackingEndScheduledTime = nil\n    }\n}\n\n// MARK: - 插值数据发送控制\nextension ScrollPoster {\n    // 初始化 CVDisplayLink\n    func create() {\n        // 新建一个 CVDisplayLinkSetOutputCallback 来执行循环\n        CVDisplayLinkCreateWithActiveCGDisplays(&poster)\n        if let validPoster = poster {\n            CVDisplayLinkSetOutputCallback(validPoster, { (displayLink, inNow, inOutputTime, flagsIn, flagsOut, displayLinkContext) -> CVReturn in\n                ScrollPoster.shared.processing()\n                return kCVReturnSuccess\n            }, nil)\n        }\n    }\n    // 启动事件发送器\n    func tryStart() {\n        if let validPoster = poster {\n            if !CVDisplayLinkIsRunning(validPoster) {\n                CVDisplayLinkStart(validPoster)\n            }\n        }\n    }\n    // 停止事件发送器\n    func stop(_ requestedPhase: Phase = Phase.MomentumEnd) {\n        // 停止循环, 然后准备发送最后一次事件\n        if let validPoster = poster {\n            CVDisplayLinkStop(validPoster)\n        }\n        // 失效旧会话异步帧，收尾帧使用新代次\n        dispatchContext.advanceGeneration()\n        os_unfair_lock_lock(&stateLock)\n\n        // 判断是否启用触控板模拟\n        var enableSimTrackpad = Options.shared.scroll.smoothSimTrackpad\n        if let application = ScrollCore.shared.application {\n            enableSimTrackpad = application.inherit\n                ? Options.shared.scroll.smoothSimTrackpad\n                : application.scroll.smoothSimTrackpad\n        }\n        let plan: ScrollPhase.TransitionPlan\n        if requestedPhase == Phase.MomentumEnd {\n            plan = ScrollPhase.shared.onMomentumFinish()\n        } else {\n            plan = ScrollPhase.shared.onManualInputEnded()\n        }\n\n        // 发送结束事件\n        if enableSimTrackpad {\n            perform(plan, emitTargetImmediately: true)\n        } else {\n            if let snapshot = dispatchContext.preparePostingSnapshot(),\n               ScrollUtils.shared.isEventTargetingChrome(snapshot.event),\n               let phaseValues = phaseValues(for: .TrackingEnd) {\n                _ = post(\n                    snapshot,\n                    (y: 0.0, x: 0.0),\n                    phaseOverride: phaseValues,\n                    fallbackToCurrentPhase: false\n                )\n            }\n        }\n        manualInputEnded = true\n        momentumActive = false\n        // 重置参数 (不递增 generation, 保留本次收尾帧有效性)\n        resetUnlocked()\n        os_unfair_lock_unlock(&stateLock)\n#if DEBUG\n        let diag = diagnosticsSnapshot()\n        if diag.droppedFramesByGeneration > 0 || diag.droppedFramesByTTL > 0 || diag.updateSnapshotFailures > 0 {\n            NSLog(\"[ScrollPoster] diag: posted=%llu dropGen=%llu dropTTL=%llu skipSynth=%llu snapFail=%llu\",\n                  diag.postedFrames, diag.droppedFramesByGeneration, diag.droppedFramesByTTL,\n                  diag.skippedSyntheticEvents, diag.updateSnapshotFailures)\n        }\n#endif\n    }\n}\n\n// MARK: - 数据处理及发送\nprivate extension ScrollPoster {\n    func perform(_ plan: ScrollPhase.TransitionPlan, emitTargetImmediately: Bool, delta: (y: Double, x: Double) = (0.0, 0.0)) {\n        if plan.queue.isEmpty && plan.target == nil {\n            return\n        }\n        for item in plan.queue {\n            emitPhase(item, delta: delta)\n        }\n        if let target = plan.target {\n            if emitTargetImmediately {\n                emitPhase(target, delta: delta)\n            } else {\n                ScrollPhase.shared.apply(phase: target.0, autoAdvance: target.1)\n            }\n        }\n    }\n\n    func emitPhase(_ item: (Phase, Phase?), delta: (y: Double, x: Double)) {\n        ScrollPhase.shared.apply(phase: item.0, autoAdvance: item.1)\n        guard let snapshot = dispatchContext.preparePostingSnapshot() else {\n            ScrollPhase.shared.didDeliverFrame()\n            return\n        }\n        let phaseOverride = resolveSimTrackpadEnabled() ? phaseValues(for: item.0) : nil\n        _ = post(snapshot, delta, phaseOverride: phaseOverride, fallbackToCurrentPhase: false)\n    }\n\n    // 处理滚动事件\n    func processing() {\n        var pendingStopPhase: Phase?\n        os_unfair_lock_lock(&stateLock)\n        // 计算插值\n        let frame = (\n            y: Interpolator.lerp(src: current.y, dest: buffer.y, trans: duration),\n            x: Interpolator.lerp(src: current.x, dest: buffer.x, trans: duration)\n        )\n        // 更新滚动位置\n        current = (\n            y: current.y + frame.y,\n            x: current.x + frame.x\n        )\n        // 平滑滚动结果\n        let filledValue = filter.fill(with: frame)\n        // 变换滚动结果，将滤波后的插值映射到当前姿态（考虑灵敏度、方向等因素）\n        let shiftedValue = shift(with: filledValue)\n        let now = CFAbsoluteTimeGetCurrent()\n        // 检测是否已经超过手动输入的持续时间阈值，准备结束手动阶段\n        if !manualInputEnded && lastManualEventTime > 0.0 && now - lastManualEventTime > manualContinuationThreshold {\n            let endPlan = ScrollPhase.shared.onManualInputEnded()\n            if !(endPlan.queue.isEmpty && endPlan.target == nil) {\n                perform(endPlan, emitTargetImmediately: true)\n            }\n            manualInputEnded = true\n            if trackingEndScheduledTime == nil {\n                trackingEndScheduledTime = now + trackingEndAdvance\n            }\n        }\n        // 计算缓冲值与当前位置的剩余距离，用于判断滚动是否已收敛\n        let residualY = buffer.y - current.y\n        let residualX = buffer.x - current.x\n        let residualMagnitude = max(residualY.magnitude, residualX.magnitude)\n        let deadZone = Options.shared.scroll.deadZone\n        if manualInputEnded && residualMagnitude > deadZone {\n            if !momentumActive {\n                perform(ScrollPhase.shared.onMomentumStart(), emitTargetImmediately: false)\n                momentumActive = true\n            } else {\n                perform(ScrollPhase.shared.onMomentumOngoing(), emitTargetImmediately: false)\n            }\n            momentumEndScheduledTime = nil\n            trackingEndScheduledTime = nil\n        } else if momentumActive && residualMagnitude <= deadZone {\n            if momentumEndScheduledTime == nil {\n                momentumEndScheduledTime = now + momentumEndDelay\n            }\n        } else {\n            momentumEndScheduledTime = nil\n            if momentumActive {\n                momentumActive = false\n            }\n        }\n        // 发送滚动结果 - 只有当输出值超过死区阈值时才发送\n        let outputMagnitude = max(abs(shiftedValue.y), abs(shiftedValue.x))\n        if outputMagnitude > deadZone {\n            _ = post(shiftedValue)\n        }\n\n        if let scheduled = momentumEndScheduledTime, momentumActive {\n            if now >= scheduled {\n                momentumEndScheduledTime = nil\n                momentumActive = false\n                pendingStopPhase = .MomentumEnd\n            }\n        }\n        if pendingStopPhase == nil && manualInputEnded && !momentumActive && residualMagnitude <= deadZone {\n            let pendingStop = trackingEndScheduledTime != nil && now >= trackingEndScheduledTime!\n            let outputSettled = outputMagnitude <= deadZone\n            if pendingStop && outputSettled {\n                trackingEndScheduledTime = nil\n                pendingStopPhase = .TrackingEnd\n            }\n        } else {\n            trackingEndScheduledTime = nil\n        }\n        os_unfair_lock_unlock(&stateLock)\n        if let phase = pendingStopPhase {\n            stop(phase)\n            return\n        }\n    }\n\n    func resolveSimTrackpadEnabled() -> Bool {\n        if let application = ScrollCore.shared.application, !application.inherit {\n            return application.scroll.smoothSimTrackpad\n        }\n        return Options.shared.scroll.smoothSimTrackpad\n    }\n\n    func phaseValues(for phase: Phase) -> (scroll: Double, momentum: Double)? {\n        guard let scrollValue = PhaseValueMapping[phase]?[.Scroll],\n              let momentumValue = PhaseValueMapping[phase]?[.Momentum] else {\n            return nil\n        }\n        return (scroll: scrollValue, momentum: momentumValue)\n    }\n\n    @discardableResult\n    func post(_ snapshot: ScrollDispatchContext.PostingSnapshot, _ v: (y: Double, x: Double), phaseOverride: (scroll: Double, momentum: Double)? = nil, fallbackToCurrentPhase: Bool = true) -> Bool {\n        if let override = phaseOverride {\n            snapshot.event.setDoubleValueField(.scrollWheelEventScrollPhase, value: override.scroll)\n            snapshot.event.setDoubleValueField(.scrollWheelEventMomentumPhase, value: override.momentum)\n        } else if fallbackToCurrentPhase,\n                  resolveSimTrackpadEnabled(),\n                  let currentPhaseValues = phaseValues(for: ScrollPhase.shared.phase) {\n            snapshot.event.setDoubleValueField(.scrollWheelEventScrollPhase, value: currentPhaseValues.scroll)\n            snapshot.event.setDoubleValueField(.scrollWheelEventMomentumPhase, value: currentPhaseValues.momentum)\n        }\n        snapshot.event.setDoubleValueField(.scrollWheelEventPointDeltaAxis1, value: v.y)\n        snapshot.event.setDoubleValueField(.scrollWheelEventPointDeltaAxis2, value: v.x)\n        // 是否连续滚动: 始终为 1.0\n        snapshot.event.setDoubleValueField(.scrollWheelEventIsContinuous, value: 1.0)\n        ScrollUtils.shared.markSyntheticSmoothEvent(snapshot.event)\n        // 通过 CGEventPostToPid 直投目标进程:\n        // 不依赖 proxy (消除崩溃), 不经过 tap 链重新路由 (动量不跟随光标)\n        // ref: @shichangone MR: https://github.com/Caldis/Mos/pull/523, issue #868\n        dispatchContext.enqueue(snapshot)\n        ScrollPhase.shared.didDeliverFrame()\n        return true\n    }\n\n    @discardableResult\n    func post(_ v: (y: Double, x: Double), phaseOverride: (scroll: Double, momentum: Double)? = nil, fallbackToCurrentPhase: Bool = true) -> Bool {\n        guard let snapshot = dispatchContext.preparePostingSnapshot() else {\n            return false\n        }\n        return post(\n            snapshot,\n            v,\n            phaseOverride: phaseOverride,\n            fallbackToCurrentPhase: fallbackToCurrentPhase\n        )\n    }\n}\n"
  },
  {
    "path": "Mos/ScrollCore/ScrollUtils.swift",
    "content": "//\n//  ScrollUtils.swift\n//  Mos\n//  滚动事件截取与判断核心工具方法\n//  Created by Caldis on 2018/2/19.\n//  Copyright © 2018年 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nclass ScrollUtils {\n    \n    // 单例\n    static let shared = ScrollUtils()\n    init() { NSLog(\"Module initialized: ScrollUtils\") }\n    private let syntheticSmoothEventMarker: Int64 = 0x4D4F53534D4F4F54\n    \n    // 判断事件目标是否变化\n    var previousScrollTargetProcessID = 0.0 // 用于在鼠标移动到不同窗口时停止滚动\n    var currentScrollTargetProcessID = 0.0\n    func isTargetChanged(_ event: CGEvent) -> Bool {\n        // 更新当前 ProcessID\n        previousScrollTargetProcessID = currentScrollTargetProcessID\n        currentScrollTargetProcessID = event.getDoubleValueField(.eventTargetUnixProcessID)\n        // 判断是否变化\n        return previousScrollTargetProcessID != currentScrollTargetProcessID && previousScrollTargetProcessID != 0.0\n    }\n    \n    func markSyntheticSmoothEvent(_ event: CGEvent) {\n        event.setIntegerValueField(.eventSourceUserData, value: syntheticSmoothEventMarker)\n    }\n\n    func isSyntheticSmoothEvent(_ event: CGEvent) -> Bool {\n        return event.getIntegerValueField(.eventSourceUserData) == syntheticSmoothEventMarker\n    }\n    \n    // 从 CGEvent 中携带的 PID 获取应用信息\n    private var lastEventTargetPID: pid_t = 1  // 事件的目标进程 PID (先前)\n    private var currEventTargetPID: pid_t = 1  // 事件的目标进程 PID (当前)\n    private var cachedRunningApplication: NSRunningApplication?\n    func getRunningApplication(from event: CGEvent) -> NSRunningApplication? {\n        // Guard\n        let pid = pid_t(event.getIntegerValueField(.eventTargetUnixProcessID))\n        if pid == pid_t(1) { return nil }\n        // 保存上次 PID\n        lastEventTargetPID = currEventTargetPID\n        // 更新当前 PID\n        currEventTargetPID = pid\n        // 使用 PID 获取 BID\n        // 如果目标 PID 变化, 则重新获取一次窗口 BID\n        if lastEventTargetPID != currEventTargetPID {\n            cachedRunningApplication = NSRunningApplication.init(processIdentifier: pid)\n        }\n        return cachedRunningApplication\n    }\n    \n    // 判断目标是否为 Chrome\n    func isEventTargetingChrome(_ event: CGEvent?) -> Bool {\n        guard let validEvent = event else {\n            return false\n        }\n        guard let targetRunningApplication = getRunningApplication(from: validEvent) else {\n            return false\n        }\n        if let targetBundleIdentifier = targetRunningApplication.bundleIdentifier, targetBundleIdentifier == \"com.google.Chrome\" {\n            return true\n        }\n        return false\n    }\n    \n    // 判断 LaunchPad 是否激活\n    var launchpadActiveCache = false\n    var launchpadLastDetectTime = 0.0\n    func getLaunchpadActivity(withRunningApplication runningApplication: NSRunningApplication?) -> Bool {\n        guard let validRunningApplication = runningApplication else {\n            return false\n        }\n        // macOS 26+ LaunchPad 已无分页功能, 平滑滚动是预期行为, 无需特殊处理\n        if #available(macOS 26.0, *) {\n            return false\n        }\n        // 10.15 - 26 以下判断是否为 Dock (LaunchPad 依附于 Dock 进程)\n        // FIXME: 当 Dock 的目录设置为 \"叠放\" 时, 应用对 Dock 的目录预览无法平滑, 且发送平滑后的滚动事件无法被识别, 需要找别的方式\n        if #available(OSX 10.15, *) {\n            if validRunningApplication.executableURL?.path == \"/System/Library/CoreServices/Dock.app/Contents/MacOS/Dock\" {\n                launchpadActiveCache = true\n                return launchpadActiveCache\n            }\n        }\n        // 如果距离上次检测时间大于 1s, 则重新检测一遍, 否则直接返回上次的结果\n        let nowTime = NSDate().timeIntervalSince1970\n        if nowTime - launchpadLastDetectTime > 1.0 {\n            // 10.15以下需要根据 windowList 判断\n            let windowInfoList = CGWindowListCopyWindowInfo(CGWindowListOption.optionOnScreenOnly, CGWindowID(0)) as [AnyObject]?\n            for windowInfo in windowInfoList! {\n                let windowName = windowInfo[kCGWindowName]!\n                if windowName != nil && windowName as! String == \"LPSpringboard\" {\n                    launchpadActiveCache = true\n                    return true\n                }\n            }\n            launchpadActiveCache = false\n            launchpadLastDetectTime = nowTime\n        }\n        return launchpadActiveCache\n    }\n\n    // 从 Applications 中取回符合传入的 key 的 Application 对象\n    // Key 在 applications 初始化时指定于 Application 中\n    func getTargetApplication(from runningApplication: NSRunningApplication?) -> Application? {\n        if let applicationByBundlePath = Options.shared.application.applications.get(by: runningApplication?.bundleURL?.path) {\n            return applicationByBundlePath\n        }\n        if let applicationByExecutablePath = Options.shared.application.applications.get(by: runningApplication?.executableURL?.path) {\n            return applicationByExecutablePath\n        }\n        return nil\n    }\n\n    // MARK: - 远程桌面事件检测\n    // 远程桌面事件检测缓存\n    private var lastSourcePID: pid_t = 0\n    private var lastSourceIsRemoteControl: Bool = false\n\n    /// 检测事件来源是否为远程桌面应用\n    func isFromRemoteApplication(_ event: CGEvent) -> Bool {\n        let sourcePID = pid_t(event.getIntegerValueField(.eventSourceUnixProcessID))\n        if sourcePID == 0 { return false }\n\n        if sourcePID != lastSourcePID {\n            lastSourcePID = sourcePID\n            lastSourceIsRemoteControl = false\n\n            if let app = NSRunningApplication(processIdentifier: sourcePID) {\n                // 检查可执行文件路径（系统守护进程）\n                if let path = app.executableURL?.path {\n                    for keyword in REMOTE_CONTROL_APPLICATION.executableKeywords {\n                        if path.contains(keyword) {\n                            lastSourceIsRemoteControl = true\n                            break\n                        }\n                    }\n                }\n                // 检查 Bundle Identifier（第三方应用）\n                if !lastSourceIsRemoteControl, let bundleId = app.bundleIdentifier {\n                    lastSourceIsRemoteControl = REMOTE_CONTROL_APPLICATION.bundleIdentifiers.contains(bundleId)\n                }\n            }\n        }\n        return lastSourceIsRemoteControl\n    }\n\n    /// 检测事件是否来自已被平滑的远程源\n    /// 返回 true 表示应跳过平滑处理\n    func isRemoteSmoothedEvent(_ event: CGEvent) -> Bool {\n        if !isFromRemoteApplication(event) { return false }\n        // 检查 isContinuous 字段判断是否为连续的\n        let isContinuous = event.getDoubleValueField(.scrollWheelEventIsContinuous)\n        return isContinuous == 1.0  // 1.0 表示主控端已平滑\n    }\n\n    // MARK: - 滚动参数: 热键\n    // 返回 ScrollHotkey? 供 ScrollCore 使用\n    func optionsDashKey(application: Application?) -> ScrollHotkey? {\n        if let targetApplication = application {\n            return targetApplication.inherit ? Options.shared.scroll.dash : targetApplication.scroll.dash\n        } else {\n            return Options.shared.scroll.dash\n        }\n    }\n    func optionsToggleKey(application: Application?) -> ScrollHotkey? {\n        if let targetApplication = application {\n            return targetApplication.inherit ? Options.shared.scroll.toggle : targetApplication.scroll.toggle\n        } else {\n            return Options.shared.scroll.toggle\n        }\n    }\n    func optionsBlockKey(application: Application?) -> ScrollHotkey? {\n        if let targetApplication = application {\n            return targetApplication.inherit ? Options.shared.scroll.block : targetApplication.scroll.block\n        } else {\n            return Options.shared.scroll.block\n        }\n    }\n}\n"
  },
  {
    "path": "Mos/Shortcut/ShortcutExecutor.swift",
    "content": "//\n//  ShortcutExecutor.swift\n//  Mos\n//  系统快捷键执行器 - 发送快捷键事件\n//  Created by Claude on 2025/8/10.\n//  Copyright © 2025年 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nclass ShortcutExecutor {\n\n    // 单例\n    static let shared = ShortcutExecutor()\n    init() {\n        NSLog(\"Module initialized: ShortcutExecutor\")\n    }\n\n    // MARK: - 执行快捷键 (统一接口)\n\n    /// 执行快捷键 (底层接口, 使用原始flags)\n    /// - Parameters:\n    ///   - code: 虚拟键码\n    ///   - flags: 修饰键flags (UInt64原始值)\n    ///   - preserveFlagsOnKeyUp: KeyUp 时是否保留修饰键 flags (默认 false)\n    func execute(code: CGKeyCode, flags: UInt64, preserveFlagsOnKeyUp: Bool = false) {\n        // 创建事件源\n        guard let source = CGEventSource(stateID: .hidSystemState) else {\n            // NSLog(\"ShortcutExecutor: Failed to create event source\")\n            return\n        }\n\n        // 发送按键按下事件\n        if let keyDown = CGEvent(keyboardEventSource: source, virtualKey: code, keyDown: true) {\n            keyDown.flags = CGEventFlags(rawValue: flags)\n            keyDown.post(tap: .cghidEventTap)\n        }\n\n        // 发送按键抬起事件\n        if let keyUp = CGEvent(keyboardEventSource: source, virtualKey: code, keyDown: false) {\n            if preserveFlagsOnKeyUp {\n                keyUp.flags = CGEventFlags(rawValue: flags)\n            }\n            keyUp.post(tap: .cghidEventTap)\n        }\n    }\n\n    /// 执行系统快捷键 (从SystemShortcut.Shortcut对象)\n    /// - Parameter shortcut: SystemShortcut.Shortcut对象\n    func execute(_ shortcut: SystemShortcut.Shortcut) {\n        // NSLog(\"ShortcutExecutor: Executing '\\(shortcut.identifier)' (code: \\(shortcut.code), modifiers: \\(shortcut.modifiers))\")\n        execute(code: shortcut.code, flags: UInt64(shortcut.modifiers.rawValue), preserveFlagsOnKeyUp: shortcut.preserveFlagsOnKeyUp)\n    }\n\n    /// 执行系统快捷键 (从名称解析, 支持动态读取系统配置)\n    /// - Parameter shortcutName: 快捷键名称 (如 \"minimizeWindow\", \"mouseLeftClick\", \"logiSmartShiftToggle\")\n    func execute(named shortcutName: String) {\n        // 鼠标按键动作\n        if shortcutName.hasPrefix(\"mouse\") {\n            executeMouseAction(shortcutName)\n            return\n        }\n\n        // Logi HID++ 动作\n        if shortcutName.hasPrefix(\"logi\") {\n            executeLogiAction(shortcutName)\n            return\n        }\n\n        // 优先使用系统实际配置 (对于Mission Control相关快捷键)\n        if let resolved = SystemShortcut.resolveSystemShortcut(shortcutName) {\n            execute(code: resolved.code, flags: resolved.modifiers)\n            return\n        }\n\n        // Fallback到内置快捷键定义\n        guard let shortcut = SystemShortcut.getShortcut(named: shortcutName) else {\n            return\n        }\n\n        execute(shortcut)\n    }\n\n    // MARK: - Mouse Actions\n\n    /// 执行鼠标按键动作\n    private func executeMouseAction(_ name: String) {\n        guard let source = CGEventSource(stateID: .hidSystemState) else { return }\n        let location = NSEvent.mouseLocation\n        // 转换坐标: NSEvent 用左下角原点, CGEvent 用左上角原点\n        let screenHeight = NSScreen.main?.frame.height ?? 0\n        let cgPoint = CGPoint(x: location.x, y: screenHeight - location.y)\n\n        switch name {\n        case \"mouseLeftClick\":\n            postMouseClick(source: source, at: cgPoint, button: .left,\n                          downType: .leftMouseDown, upType: .leftMouseUp)\n        case \"mouseRightClick\":\n            postMouseClick(source: source, at: cgPoint, button: .right,\n                          downType: .rightMouseDown, upType: .rightMouseUp)\n        case \"mouseMiddleClick\":\n            postMouseClick(source: source, at: cgPoint, button: .center,\n                          downType: .otherMouseDown, upType: .otherMouseUp, buttonNumber: 2)\n        case \"mouseBackClick\":\n            postMouseClick(source: source, at: cgPoint, button: .center,\n                          downType: .otherMouseDown, upType: .otherMouseUp, buttonNumber: 3)\n        case \"mouseForwardClick\":\n            postMouseClick(source: source, at: cgPoint, button: .center,\n                          downType: .otherMouseDown, upType: .otherMouseUp, buttonNumber: 4)\n        default:\n            break\n        }\n    }\n\n    /// 发送鼠标点击事件 (down + up)\n    private func postMouseClick(source: CGEventSource, at point: CGPoint,\n                                button: CGMouseButton, downType: CGEventType, upType: CGEventType,\n                                buttonNumber: Int64? = nil) {\n        if let down = CGEvent(mouseEventSource: source, mouseType: downType, mouseCursorPosition: point, mouseButton: button) {\n            if let bn = buttonNumber { down.setIntegerValueField(.mouseEventButtonNumber, value: bn) }\n            down.post(tap: .cghidEventTap)\n        }\n        if let up = CGEvent(mouseEventSource: source, mouseType: upType, mouseCursorPosition: point, mouseButton: button) {\n            if let bn = buttonNumber { up.setIntegerValueField(.mouseEventButtonNumber, value: bn) }\n            up.post(tap: .cghidEventTap)\n        }\n    }\n\n    // MARK: - Logi HID++ Actions\n\n    /// 执行 Logitech HID++ 动作\n    private func executeLogiAction(_ name: String) {\n        switch name {\n        case \"logiSmartShiftToggle\":\n            LogitechHIDManager.shared.executeSmartShiftToggle()\n        case \"logiDPICycleUp\":\n            LogitechHIDManager.shared.executeDPICycle(direction: .up)\n        case \"logiDPICycleDown\":\n            LogitechHIDManager.shared.executeDPICycle(direction: .down)\n        default:\n            break\n        }\n    }\n}\n"
  },
  {
    "path": "Mos/Shortcut/ShortcutManager.swift",
    "content": "//\n//  ShortcutManager.swift\n//  Mos\n//  快捷键管理器 - 菜单构建和快捷键触发\n//  Created by Claude on 2025/9/27.\n//  Copyright © 2025年 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\n/// 快捷键管理器\n/// 职责: 构建分级快捷键菜单 (PopUpButton 使用)\nclass ShortcutManager {\n\n    // MARK: - 版本检测\n\n    /// 检测当前系统是否支持 SF Symbols (macOS 11.0+)\n    private static var supportsSFSymbols: Bool {\n        if #available(macOS 11.0, *) {\n            return true\n        }\n        return false\n    }\n\n    /// 创建带图标的 NSImage (macOS 11.0+)\n    @available(macOS 11.0, *)\n    private static func createSymbolImage(_ symbolName: String) -> NSImage? {\n        return NSImage(systemSymbolName: symbolName, accessibilityDescription: nil)\n    }\n\n    // MARK: - 菜单构建\n    /// 构建分级快捷键菜单 (按分类组织系统快捷键)\n    ///\n    /// 菜单结构设计:\n    /// - 索引0: 占位符 PopUpButton 显示此项,动态更新标题和图标\n    /// - 索引1: 分割线 #1 - 根据绑定状态动态隐藏/显示\n    /// - 索引2: \"未绑定\"/\"取消绑定\" - 可选菜单项,representedObject 为 nil\n    /// - 索引3: 分割线 #2 - 分隔操作区和分类菜单\n    /// - 索引4+: 分类子菜单 (功能键,应用与窗口等)\n    ///\n    /// - Parameter menu: 目标菜单对象\n    /// - Parameter target: 菜单项点击事件的目标对象\n    /// - Parameter action: 菜单项点击事件的选择器\n    static func buildShortcutMenu(into menu: NSMenu, target: AnyObject, action: Selector, showLogiActions: Bool = false) {\n        // 清空现有菜单项\n        menu.removeAllItems()\n\n        // 添加占位符 (用于显示当前选中的快捷键)\n        // NSPopUpButton 不会自动显示子菜单项标题,必须用占位符模式\n        let placeholderItem = NSMenuItem(title: \"\", action: nil, keyEquivalent: \"\")\n        menu.addItem(placeholderItem)\n\n        // 添加第一条分割线 (未绑定时会被隐藏)\n        menu.addItem(NSMenuItem.separator())\n\n        // 添加\"未绑定\"选项 (可选菜单项, representedObject 为 nil)\n        // 标题会在 menuWillOpen 时根据当前状态动态更新为\"未绑定\"或\"取消绑定\"\n        let unboundItem = NSMenuItem(title: NSLocalizedString(\"unbound\", comment: \"\"), action: action, keyEquivalent: \"\")\n        unboundItem.target = target\n        unboundItem.representedObject = nil  // nil 表示清除绑定\n        menu.addItem(unboundItem)\n\n        // 添加第二条分割线 (分隔\"未绑定\"操作和分类菜单)\n        menu.addItem(NSMenuItem.separator())\n\n        var totalShortcuts = 0\n\n        // 按分类构建分级菜单（顺序由 shortcutsByCategory 数组定义）\n        for (categoryIdentifier, shortcuts) in SystemShortcut.shortcutsByCategory {\n            // 创建分类主菜单项 (使用本地化名称)\n            let categoryName = SystemShortcut.localizedCategoryName(categoryIdentifier)\n            let categoryMenuItem = NSMenuItem(title: categoryName, action: nil, keyEquivalent: \"\")\n\n            // 为分类添加图标 (macOS 11.0+)\n            if supportsSFSymbols {\n                if #available(macOS 11.0, *) {\n                    let symbolName = SystemShortcut.categorySymbolName(categoryIdentifier)\n                    categoryMenuItem.image = createSymbolImage(symbolName)\n                }\n            }\n\n            // 创建子菜单\n            let subMenu = NSMenu(title: categoryName)\n\n            // 添加该分类下的所有快捷键到子菜单(过滤掉当前系统不支持的,保持原始顺序)\n            let availableShortcuts = shortcuts.filter { $0.isAvailable }\n            for shortcut in availableShortcuts {\n                let menuKeyEquivalent = shortcut.keyEquivalent\n\n                let shortcutMenuItem = NSMenuItem(\n                    title: shortcut.localizedName,\n                    action: action,\n                    keyEquivalent: menuKeyEquivalent.keyEquivalent\n                )\n                shortcutMenuItem.keyEquivalentModifierMask = menuKeyEquivalent.modifierMask\n                shortcutMenuItem.target = target\n                shortcutMenuItem.representedObject = shortcut\n                shortcutMenuItem.toolTip = shortcut.localizedName\n\n                // 为快捷键添加图标 (macOS 11.0+)\n                if supportsSFSymbols {\n                    if #available(macOS 11.0, *) {\n                        shortcutMenuItem.image = createSymbolImage(shortcut.symbolName)\n                    }\n                }\n\n                subMenu.addItem(shortcutMenuItem)\n                totalShortcuts += 1\n            }\n\n            // 将子菜单关联到分类菜单项\n            categoryMenuItem.submenu = subMenu\n\n            // 将分类菜单项添加到主菜单\n            menu.addItem(categoryMenuItem)\n        }\n\n        // 鼠标按键分类 (始终显示)\n        addCategoryToMenu(\n            menu: menu,\n            category: SystemShortcut.mouseButtonsCategory,\n            target: target,\n            action: action,\n            totalShortcuts: &totalShortcuts\n        )\n\n        // Logi 专有动作分类 (仅当触发键为 Logi 按键时显示, 使用 Logitech 品牌 tag 样式)\n        if showLogiActions {\n            addCategoryToMenu(\n                menu: menu,\n                category: SystemShortcut.logiActionsCategory,\n                target: target,\n                action: action,\n                totalShortcuts: &totalShortcuts,\n                customImage: BrandTag.createTagImage(brand: .logi, fontSize: 7, height: 14)\n            )\n        }\n    }\n\n    /// 将一个分类添加到菜单\n    private static func addCategoryToMenu(\n        menu: NSMenu,\n        category: (category: String, shortcuts: [SystemShortcut.Shortcut]),\n        target: AnyObject,\n        action: Selector,\n        totalShortcuts: inout Int,\n        customImage: NSImage? = nil\n    ) {\n        let categoryName = SystemShortcut.localizedCategoryName(category.category)\n        let categoryMenuItem = NSMenuItem(title: categoryName, action: nil, keyEquivalent: \"\")\n\n        if let custom = customImage {\n            categoryMenuItem.image = custom\n        } else if supportsSFSymbols {\n            if #available(macOS 11.0, *) {\n                let symbolName = SystemShortcut.categorySymbolName(category.category)\n                categoryMenuItem.image = createSymbolImage(symbolName)\n            }\n        }\n\n        let subMenu = NSMenu(title: categoryName)\n        let availableShortcuts = category.shortcuts.filter { $0.isAvailable }\n        for shortcut in availableShortcuts {\n            let menuKeyEquivalent = shortcut.keyEquivalent\n\n            let shortcutMenuItem = NSMenuItem(\n                title: shortcut.localizedName,\n                action: action,\n                keyEquivalent: menuKeyEquivalent.keyEquivalent\n            )\n            shortcutMenuItem.keyEquivalentModifierMask = menuKeyEquivalent.modifierMask\n            shortcutMenuItem.target = target\n            shortcutMenuItem.representedObject = shortcut\n            shortcutMenuItem.toolTip = shortcut.localizedName\n\n            if supportsSFSymbols {\n                if #available(macOS 11.0, *) {\n                    shortcutMenuItem.image = createSymbolImage(shortcut.symbolName)\n                }\n            }\n\n            subMenu.addItem(shortcutMenuItem)\n            totalShortcuts += 1\n        }\n\n        categoryMenuItem.submenu = subMenu\n        menu.addItem(categoryMenuItem)\n    }\n\n}\n\n"
  },
  {
    "path": "Mos/Shortcut/SystemShortcut.swift",
    "content": "//\n//  SystemShortcut.swift\n//  Mos\n//  系统快捷键组合常量定义\n//  Created by 陈标 on 2025/8/28.\n//  Copyright © 2025 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\n/// 系统快捷键组合存储结构\n/// 使用 快捷键名称 = (修饰键, 主键) 的方式组织\nstruct SystemShortcut {\n\n    // MARK: - 快捷键数据结构\n\n    /// 快捷键组合结构\n    struct Shortcut: Equatable, Hashable {\n        let identifier: String  // 本地化键名(如 \"minimizeWindow\")\n        let code: UInt16\n        let modifiers: NSEvent.ModifierFlags\n        let minimumVersion: OperatingSystemVersion?  // 最低系统版本要求(可选)\n        let preserveFlagsOnKeyUp: Bool  // KeyUp 时是否保留修饰键 flags (用于 Command+Tab 等需要保持修饰键的快捷键)\n\n        init(_ identifier: String, _ code: UInt16, _ modifiers: NSEvent.ModifierFlags, minimumVersion: OperatingSystemVersion? = nil, preserveFlagsOnKeyUp: Bool = false) {\n            self.identifier = identifier\n            self.code = code\n            self.modifiers = modifiers\n            self.minimumVersion = minimumVersion\n            self.preserveFlagsOnKeyUp = preserveFlagsOnKeyUp\n        }\n\n        /// 检查当前系统是否支持此快捷键\n        var isAvailable: Bool {\n            guard let minVersion = minimumVersion else { return true }\n            return ProcessInfo.processInfo.isOperatingSystemAtLeast(minVersion)\n        }\n\n        /// 获取本地化显示名称\n        var localizedName: String {\n            return NSLocalizedString(identifier, comment: \"\")\n        }\n\n        /// 获取 SF Symbol 图标名称 (macOS 11.0+)\n        var symbolName: String {\n            switch identifier {\n                // 功能键\n                case \"missionControl\": return \"square.grid.3x2\"\n                case \"appExpose\": return \"square.grid.3x3\"\n                case \"spotlightSys\": return \"magnifyingglass.circle\"\n                case \"dictation\": return \"mic\"\n                case \"doNotDisturb\": return \"moon\"\n                case \"showDesktop\": return \"rectangle.on.rectangle\"\n                // 应用切换\n                case \"switchApp\": return \"arrow.right.circle\"\n                case \"switchAppReverse\": return \"arrow.left.circle\"\n                // 文档编辑\n                case \"copy\": return \"doc.on.doc\"\n                case \"paste\": return \"doc.on.clipboard\"\n                case \"cut\": return \"scissors\"\n                case \"undo\": return \"arrow.uturn.backward\"\n                case \"redo\": return \"arrow.uturn.forward\"\n                case \"selectAll\": return \"selection.pin.in.out\"\n                case \"find\": return \"magnifyingglass\"\n                case \"bold\": return \"bold\"\n                case \"italic\": return \"italic\"\n                case \"underline\": return \"underline\"\n                // Finder 操作\n                case \"newFinderWindow\": return \"macwindow.badge.plus\"\n                case \"moveToTrash\": return \"trash\"\n                case \"emptyTrash\": return \"trash.slash\"\n                case \"duplicateFile\": return \"plus.square.on.square\"\n                case \"getInfo\": return \"info.circle\"\n                case \"newFolder\": return \"folder.badge.plus\"\n                case \"goToFolder\": return \"folder.badge.gearshape\"\n                case \"viewAsIcons\": return \"square.grid.2x2\"\n                case \"viewAsList\": return \"list.bullet\"\n                case \"viewAsColumns\": return \"rectangle.split.3x1\"\n                case \"viewAsGallery\": return \"square.grid.3x3.fill.square\"\n                // 系统控制\n                case \"spotlight\": return \"magnifyingglass\"\n                case \"characterViewer\": return \"face.smiling\"\n                case \"forceQuit\": return \"exclamationmark.triangle\"\n                case \"lockScreen\": return \"lock.shield\"\n                case \"logout\": return \"rectangle.portrait.and.arrow.right\"\n                case \"shutdownDialog\": return \"power\"\n                case \"screenshot\": return \"camera.viewfinder\"\n                case \"screenshotSelection\": return \"viewfinder.rectangular\"\n                case \"screenshotAndRecording\": return \"camera.metering.center.weighted\"\n                case \"moveSpaceLeft\": return \"arrow.left.to.line\"\n                case \"moveSpaceRight\": return \"arrow.right.to.line\"\n                // 窗口管理\n                case \"minimizeWindow\": return \"minus.rectangle\"\n                case \"hideApplication\": return \"eye.slash\"\n                case \"hideOthers\": return \"eye.slash.circle\"\n                case \"nextWindow\": return \"arrow.right.square\"\n                case \"closeWindow\": return \"xmark.rectangle\"\n                case \"closeAllWindows\": return \"xmark.circle.fill\"\n                case \"quitApp\": return \"power.circle\"\n                // 标签与导航\n                case \"navigateBack\": return \"chevron.backward\"\n                case \"navigateForward\": return \"chevron.forward\"\n                case \"nextTab\": return \"rectangle.on.rectangle\"\n                case \"previousTab\": return \"rectangle.fill.on.rectangle.fill\"\n                case \"switchTabRight\": return \"arrow.right.circle\"\n                case \"switchTabLeft\": return \"arrow.left.circle\"\n                // 辅助功能\n                case \"invertColors\": return \"circle.lefthalf.filled.inverse\"\n                case \"zoomIn\": return \"plus.magnifyingglass\"\n                case \"zoomOut\": return \"minus.magnifyingglass\"\n                // 鼠标按键\n                case \"mouseLeftClick\": return \"cursorarrow.click\"\n                case \"mouseRightClick\": return \"cursorarrow.click.2\"\n                case \"mouseMiddleClick\": return \"computermouse\"\n                case \"mouseBackClick\": return \"chevron.backward\"\n                case \"mouseForwardClick\": return \"chevron.forward\"\n                // Logi\n                case \"logiSmartShiftToggle\": return \"gearshape.2\"\n                case \"logiDPICycleUp\": return \"arrow.up.circle\"\n                case \"logiDPICycleDown\": return \"arrow.down.circle\"\n                case \"logiHost1\": return \"1.circle\"\n                case \"logiHost2\": return \"2.circle\"\n                case \"logiHost3\": return \"3.circle\"\n                // 其他\n                default: return \"questionmark.circle\"\n            }\n        }\n\n        /// Equatable 协议实现\n        static func == (lhs: Shortcut, rhs: Shortcut) -> Bool {\n            return lhs.code == rhs.code && lhs.modifiers == rhs.modifiers\n        }\n\n        /// Hashable 协议实现\n        func hash(into hasher: inout Hasher) {\n            hasher.combine(modifiers.rawValue)\n            hasher.combine(code)\n        }\n\n        /// 获取 NSMenuItem 的 keyEquivalent 和 modifierMask\n        var keyEquivalent: (keyEquivalent: String, modifierMask: NSEvent.ModifierFlags) {\n            // 对于 Function 键，不设置 keyEquivalent，避免显示问题\n            if modifiers.contains(.function) {\n                return (\"\", [])\n            }\n\n            // 获取主键字符\n            var keyEquivalent = \"\"\n            if let keyName = KeyCode.keyMap[code] {\n                // 对于字母键使用小写\n                if keyName.count == 1 && keyName.rangeOfCharacter(from: .letters) != nil {\n                    keyEquivalent = keyName.lowercased()\n                } else {\n                    // 对于特殊键（如空格、回车等）保持原样\n                    keyEquivalent = keyName\n                }\n            }\n\n            // 转换修饰键\n            var modifierMask: NSEvent.ModifierFlags = []\n            if modifiers.contains(.command) {\n                modifierMask.insert(.command)\n            }\n            if modifiers.contains(.shift) {\n                modifierMask.insert(.shift)\n            }\n            if modifiers.contains(.option) {\n                modifierMask.insert(.option)\n            }\n            if modifiers.contains(.control) {\n                modifierMask.insert(.control)\n            }\n\n            return (keyEquivalent, modifierMask)\n        }\n    }\n\n    // MARK: - 快捷键\n    // 功能键\n    static let missionControl = Shortcut(\"missionControl\", 160, .function)\n    static let appExpose = Shortcut(\"appExpose\", 131, .function)\n    static let spotlightSys = Shortcut(\"spotlightSys\", 177, .function)\n    static let dictation = Shortcut(\"dictation\", 176, .function)\n    static let doNotDisturb = Shortcut(\"doNotDisturb\", 178, .function)\n    static let showDesktop = Shortcut(\"showDesktop\", 103, .function)\n\n    // 应用切换\n    // preserveFlagsOnKeyUp: 用于确保 KeyUp 时携带 flag, 才能触发 App Switcher\n    // @see https://stackoverflow.com/questions/36375080/cocoa-simulating-commandtab-in-cgevent\n    static let switchApp = Shortcut(\"switchApp\", 48, .command, preserveFlagsOnKeyUp: true)\n    static let switchAppReverse = Shortcut(\"switchAppReverse\", 48, [.command, .shift], preserveFlagsOnKeyUp: true)\n\n    // 文档编辑\n    static let copy = Shortcut(\"copy\", 8, .command)  // Command-C\n    static let paste = Shortcut(\"paste\", 9, .command)  // Command-V\n    static let cut = Shortcut(\"cut\", 7, .command)  // Command-X\n    static let undo = Shortcut(\"undo\", 6, .command)  // Command-Z\n    static let redo = Shortcut(\"redo\", 6, [.command, .shift])  // Command-Shift-Z\n    static let selectAll = Shortcut(\"selectAll\", 0, .command)  // Command-A\n    static let find = Shortcut(\"find\", 3, .command)  // Command-F\n    static let bold = Shortcut(\"bold\", 11, .command)  // Command-B\n    static let italic = Shortcut(\"italic\", 34, .command)  // Command-I\n    static let underline = Shortcut(\"underline\", 32, .command)  // Command-U\n\n    // Finder 操作\n    static let newFinderWindow = Shortcut(\"newFinderWindow\", 45, .command)  // Command-N\n    static let moveToTrash = Shortcut(\"moveToTrash\", 51, .command)  // Command-Delete\n    static let emptyTrash = Shortcut(\"emptyTrash\", 51, [.command, .shift])  // Command-Shift-Delete\n    static let duplicateFile = Shortcut(\"duplicateFile\", 2, .command)  // Command-D\n    static let getInfo = Shortcut(\"getInfo\", 34, [.command])  // Command-I (Finder only, conflicts with italic)\n    static let newFolder = Shortcut(\"newFolder\", 45, [.command, .shift])  // Command-Shift-N\n    static let goToFolder = Shortcut(\"goToFolder\", 5, [.command, .shift])  // Command-Shift-G\n    static let viewAsIcons = Shortcut(\"viewAsIcons\", 18, .command)  // Command-1\n    static let viewAsList = Shortcut(\"viewAsList\", 19, .command)  // Command-2\n    static let viewAsColumns = Shortcut(\"viewAsColumns\", 20, .command)  // Command-3\n    static let viewAsGallery = Shortcut(\"viewAsGallery\", 21, .command)  // Command-4\n\n    // 系统控制\n    static let spotlight = Shortcut(\"spotlight\", 49, .command)  // Command-Space\n    static let characterViewer = Shortcut(\"characterViewer\", 49, [.control, .command])  // Control-Command-Space (macOS 10.9+)\n    static let forceQuit = Shortcut(\"forceQuit\", 53, [.command, .option])  // Command-Option-Esc\n    static let lockScreen = Shortcut(\"lockScreen\", 12, [.command, .control])  // Command-Control-Q\n    static let logout = Shortcut(\"logout\", 12, [.command, .shift])  // Command-Shift-Q\n    static let shutdownDialog = Shortcut(\"shutdownDialog\", 6, .control)  // Control-Power (mapped to Control-Z as placeholder)\n    static let screenshot = Shortcut(\"screenshot\", 20, [.command, .shift])  // Command-Shift-3\n    static let screenshotSelection = Shortcut(\"screenshotSelection\", 21, [.command, .shift])  // Command-Shift-4\n    static let screenshotAndRecording = Shortcut(\"screenshotAndRecording\", 23, [.command, .shift], minimumVersion: OperatingSystemVersion(majorVersion: 10, minorVersion: 14, patchVersion: 0))  // Command-Shift-5 (macOS 10.14+)\n    static let moveSpaceLeft = Shortcut(\"moveSpaceLeft\", 123, [.control, .function])  // Fn-Control-Left\n    static let moveSpaceRight = Shortcut(\"moveSpaceRight\", 124, [.control, .function])  // Fn-Control-Right\n\n    // 窗口管理\n    static let minimizeWindow = Shortcut(\"minimizeWindow\", 46, .command)  // Command-M\n    static let hideApplication = Shortcut(\"hideApplication\", 4, .command)  // Command-H\n    static let hideOthers = Shortcut(\"hideOthers\", 4, [.command, .option])  // Command-Option-H\n    static let nextWindow = Shortcut(\"nextWindow\", 50, .command)  // Command-`\n    static let closeWindow = Shortcut(\"closeWindow\", 13, .command)  // Command-W\n    static let closeAllWindows = Shortcut(\"closeAllWindows\", 13, [.command, .option])  // Command-Option-W\n    static let quitApp = Shortcut(\"quitApp\", 12, .command)  // Command-Q\n\n    // FIX: Back/Forward - Use Command + Arrow Keys\n    // Replaces Brackets (33/30) which are broken on German keyboards.\n    static let navigateBack = Shortcut(\"navigateBack\", 123, .command)  // Command-LeftArrow\n    static let navigateForward = Shortcut(\"navigateForward\", 124, .command)  // Command-RightArrow\n    // FIX: Next/Prev Tab - Use Command + Shift + Arrow Keys\n    // Replaces Command+Shift+Brackets.\n    static let nextTab = Shortcut(\"nextTab\", 124, [.command, .shift])  // Command-Shift-RightArrow\n    static let previousTab = Shortcut(\"previousTab\", 123, [.command, .shift])  // Command-Shift-LeftArrow\n    static let switchTabRight = Shortcut(\"switchTabRight\", 124, [.command, .option])  // Command-Option-Right\n    static let switchTabLeft = Shortcut(\"switchTabLeft\", 123, [.command, .option])  // Command-Option-Left\n\n    // 辅助功能\n    static let invertColors = Shortcut(\"invertColors\", 28, [.command, .option, .control])  // Command-Option-Control-8\n    static let zoomIn = Shortcut(\"zoomIn\", 24, [.command, .option])  // Command-Option-=\n    static let zoomOut = Shortcut(\"zoomOut\", 27, [.command, .option])  // Command-Option--\n\n    // MARK: - 辅助方法\n\n    /// 所有系统快捷键的集合\n    static let allShortcuts: [String: Shortcut] = [\n        // 功能键\n        \"missionControl\": missionControl, \"appExpose\": appExpose,\n        \"spotlightSys\": spotlightSys, \"dictation\": dictation, \"doNotDisturb\": doNotDisturb,\n        \"showDesktop\": showDesktop,\n        // 应用切换\n        \"switchApp\": switchApp, \"switchAppReverse\": switchAppReverse,\n        // 文档编辑\n        \"copy\": copy, \"paste\": paste, \"cut\": cut, \"undo\": undo, \"redo\": redo,\n        \"selectAll\": selectAll, \"find\": find, \"bold\": bold, \"italic\": italic, \"underline\": underline,\n        // Finder 操作\n        \"newFinderWindow\": newFinderWindow, \"moveToTrash\": moveToTrash, \"emptyTrash\": emptyTrash,\n        \"duplicateFile\": duplicateFile, \"getInfo\": getInfo, \"newFolder\": newFolder, \"goToFolder\": goToFolder,\n        \"viewAsIcons\": viewAsIcons, \"viewAsList\": viewAsList, \"viewAsColumns\": viewAsColumns, \"viewAsGallery\": viewAsGallery,\n        // 系统控制\n        \"spotlight\": spotlight, \"characterViewer\": characterViewer,\n        \"forceQuit\": forceQuit, \"lockScreen\": lockScreen, \"logout\": logout,\n        \"shutdownDialog\": shutdownDialog, \"screenshot\": screenshot, \"screenshotSelection\": screenshotSelection,\n        \"screenshotAndRecording\": screenshotAndRecording,\n        \"moveSpaceLeft\": moveSpaceLeft, \"moveSpaceRight\": moveSpaceRight,\n        // 窗口管理\n        \"minimizeWindow\": minimizeWindow, \"hideApplication\": hideApplication,\n        \"hideOthers\": hideOthers, \"nextWindow\": nextWindow, \"closeWindow\": closeWindow,\n        \"closeAllWindows\": closeAllWindows, \"quitApp\": quitApp,\n        // 标签导航\n        \"navigateBack\": navigateBack, \"navigateForward\": navigateForward,\n        \"nextTab\": nextTab, \"previousTab\": previousTab,\n        \"switchTabLeft\": switchTabLeft, \"switchTabRight\": switchTabRight,\n        // 辅助功能\n        \"invertColors\": invertColors, \"zoomIn\": zoomIn, \"zoomOut\": zoomOut,\n        // 鼠标按键\n        \"mouseLeftClick\": mouseLeftClick, \"mouseRightClick\": mouseRightClick,\n        \"mouseMiddleClick\": mouseMiddleClick, \"mouseBackClick\": mouseBackClick,\n        \"mouseForwardClick\": mouseForwardClick,\n        // Logi\n        \"logiSmartShiftToggle\": logiSmartShiftToggle,\n        \"logiDPICycleUp\": logiDPICycleUp, \"logiDPICycleDown\": logiDPICycleDown,\n        \"logiHost1\": logiHost1, \"logiHost2\": logiHost2, \"logiHost3\": logiHost3,\n    ]\n\n    /// 根据修饰键和按键代码查找快捷键名称\n    static func findShortcut(modifiers: NSEvent.ModifierFlags, keyCode: UInt16) -> String? {\n        for (name, shortcut) in allShortcuts {\n            if shortcut.modifiers == modifiers && shortcut.code == keyCode {\n                return name\n            }\n        }\n        return nil\n    }\n\n    /// 根据名称获取快捷键\n    static func getShortcut(named: String) -> Shortcut? {\n        return allShortcuts[named]\n    }\n\n    /// 检查给定的快捷键是否与系统快捷键冲突\n    static func isSystemShortcut(modifiers: NSEvent.ModifierFlags, keyCode: UInt16) -> Bool {\n        return findShortcut(modifiers: modifiers, keyCode: keyCode) != nil\n    }\n\n    /// 获取所有快捷键名称列表\n    static var allShortcutNames: [String] {\n        return Array(allShortcuts.keys).sorted()\n    }\n\n    /// 按类别分组的快捷键 (有序数组,顺序即菜单显示顺序)\n    static let shortcutsByCategory: [(category: String, shortcuts: [Shortcut])] = [\n        (\"categoryFunctionKeys\", [\n            missionControl, appExpose, spotlightSys, dictation, doNotDisturb, showDesktop,\n            moveSpaceLeft, moveSpaceRight\n        ]),\n        (\"categoryAppsAndWindows\", [\n            switchApp, switchAppReverse,\n            minimizeWindow, hideApplication, hideOthers, nextWindow, closeWindow, closeAllWindows, quitApp\n        ]),\n        (\"categoryDocumentEditing\", [\n            copy, paste, cut, undo, redo, selectAll, find, bold, italic, underline\n        ]),\n        (\"categoryFinderActions\", [\n            newFinderWindow, moveToTrash, emptyTrash, duplicateFile, getInfo, newFolder, goToFolder,\n            viewAsIcons, viewAsList, viewAsColumns, viewAsGallery\n        ]),\n        (\"categorySystem\", [\n            spotlight, characterViewer, forceQuit, lockScreen, logout, shutdownDialog\n        ]),\n        (\"categoryScreenshot\", [\n            screenshot, screenshotSelection, screenshotAndRecording\n        ]),\n        (\"categoryNavigation\", [\n            navigateBack, navigateForward, previousTab, nextTab, switchTabLeft, switchTabRight\n        ]),\n        // (\"categoryAccessibility\", [  // 暂时不提供, 有问题\n        //     invertColors, zoomIn, zoomOut\n        // ]),\n    ]\n\n    // MARK: - Mouse Button Actions\n    // 鼠标按键动作 (不是键盘快捷键, 由 ShortcutExecutor 特殊处理)\n    // 使用 code=0xFFFF 和空修饰键作为占位, 实际执行逻辑在 ShortcutExecutor 中\n\n    static let mouseLeftClick = Shortcut(\"mouseLeftClick\", 0xFFFF, NSEvent.ModifierFlags(rawValue: 0))\n    static let mouseRightClick = Shortcut(\"mouseRightClick\", 0xFFFF, NSEvent.ModifierFlags(rawValue: 1))\n    static let mouseMiddleClick = Shortcut(\"mouseMiddleClick\", 0xFFFF, NSEvent.ModifierFlags(rawValue: 2))\n    static let mouseBackClick = Shortcut(\"mouseBackClick\", 0xFFFF, NSEvent.ModifierFlags(rawValue: 3))\n    static let mouseForwardClick = Shortcut(\"mouseForwardClick\", 0xFFFF, NSEvent.ModifierFlags(rawValue: 4))\n\n    // MARK: - Logi HID++ Actions\n    // Logitech 专有动作 (由 ShortcutExecutor 通过 HID++ 协议执行)\n\n    static let logiSmartShiftToggle = Shortcut(\"logiSmartShiftToggle\", 0xFFFE, NSEvent.ModifierFlags(rawValue: 0))\n    static let logiDPICycleUp = Shortcut(\"logiDPICycleUp\", 0xFFFE, NSEvent.ModifierFlags(rawValue: 1))\n    static let logiDPICycleDown = Shortcut(\"logiDPICycleDown\", 0xFFFE, NSEvent.ModifierFlags(rawValue: 2))\n    static let logiHost1 = Shortcut(\"logiHost1\", 0xFFFE, NSEvent.ModifierFlags(rawValue: 4))\n    static let logiHost2 = Shortcut(\"logiHost2\", 0xFFFE, NSEvent.ModifierFlags(rawValue: 5))\n    static let logiHost3 = Shortcut(\"logiHost3\", 0xFFFE, NSEvent.ModifierFlags(rawValue: 6))\n\n    /// 鼠标按键动作分类\n    static let mouseButtonsCategory: (category: String, shortcuts: [Shortcut]) = (\n        \"categoryMouseButtons\", [\n            mouseLeftClick, mouseRightClick, mouseMiddleClick, mouseBackClick, mouseForwardClick\n        ]\n    )\n\n    /// Logi 专有动作分类\n    static let logiActionsCategory: (category: String, shortcuts: [Shortcut]) = (\n        \"categoryLogiActions\", [\n            logiSmartShiftToggle, logiDPICycleUp, logiDPICycleDown,\n            logiHost1, logiHost2, logiHost3\n        ]\n    )\n\n    /// 获取分类的本地化名称\n    static func localizedCategoryName(_ categoryIdentifier: String) -> String {\n        return NSLocalizedString(categoryIdentifier, comment: \"\")\n    }\n\n    /// 获取分类的 SF Symbol 图标名称 (macOS 11.0+)\n    static func categorySymbolName(_ categoryIdentifier: String) -> String {\n        switch categoryIdentifier {\n        case \"categoryFunctionKeys\": return \"keyboard\"\n        case \"categoryAppsAndWindows\": return \"macwindow.on.rectangle\"\n        case \"categoryDocumentEditing\": return \"doc.text\"\n        case \"categoryFinderActions\": return \"folder\"\n        case \"categorySystem\": return \"gearshape\"\n        case \"categoryScreenshot\": return \"camera.viewfinder\"\n        case \"categoryNavigation\": return \"arrow.left.and.right\"\n        case \"categoryAccessibility\": return \"eye\"\n        case \"categoryMouseButtons\": return \"computermouse\"\n        case \"categoryLogiActions\": return \"gear.badge\"\n        default: return \"questionmark.folder\"\n        }\n    }\n}\n\n// MARK: - System Configuration Resolver\n\n/// 从symbolichotkeys动态解析系统快捷键配置\nextension SystemShortcut {\n\n    /// 系统快捷键ID映射表 (symbolichotkeys -> 快捷键名称)\n    private static let symbolicHotkeyMapping: [Int: String] = [\n        79: \"moveSpaceLeft\",   // Move left a space (default: Control-Left)\n        80: \"moveSpaceLeft\",   // Move left a space with shift modifier\n        81: \"moveSpaceRight\",  // Move right a space (default: Control-Right)\n        82: \"moveSpaceRight\",  // Move right a space with shift modifier\n    ]\n\n    /// 缓存的已解析快捷键配置\n    private static var resolvedCache: [String: (code: CGKeyCode, modifiers: UInt64)] = {\n        loadSystemShortcuts()\n    }()\n\n    /// 获取解析后的系统快捷键配置\n    /// - Parameter name: 快捷键名称 (如 \"moveSpaceLeft\")\n    /// - Returns: (keyCode, modifiers) 或 nil\n    static func resolveSystemShortcut(_ name: String) -> (code: CGKeyCode, modifiers: UInt64)? {\n        return resolvedCache[name]\n    }\n\n    /// 重新加载系统快捷键配置\n    static func reloadSystemShortcuts() {\n        resolvedCache = loadSystemShortcuts()\n        NSLog(\"SystemShortcut: Reloaded system config, \\(resolvedCache.count) shortcuts resolved\")\n    }\n\n    /// 从系统配置加载快捷键\n    private static func loadSystemShortcuts() -> [String: (code: CGKeyCode, modifiers: UInt64)] {\n        var resolved: [String: (code: CGKeyCode, modifiers: UInt64)] = [:]\n\n        // 读取系统快捷键配置\n        guard let symbolicHotkeys = UserDefaults.standard.persistentDomain(forName: \"com.apple.symbolichotkeys\"),\n              let hotkeys = symbolicHotkeys[\"AppleSymbolicHotKeys\"] as? [String: Any] else {\n            NSLog(\"SystemShortcut: Failed to read com.apple.symbolichotkeys\")\n            return resolved\n        }\n\n        // 解析每个感兴趣的快捷键\n        for (hotkeyID, shortcutName) in symbolicHotkeyMapping {\n            guard let hotkeyConfig = hotkeys[String(hotkeyID)] as? [String: Any],\n                  let enabled = hotkeyConfig[\"enabled\"] as? Bool,\n                  enabled,\n                  let value = hotkeyConfig[\"value\"] as? [String: Any],\n                  let parameters = value[\"parameters\"] as? [Any],\n                  parameters.count >= 3 else {\n                continue\n            }\n\n            // 提取参数\n            // parameters[0]: Unicode character (65535 for non-printable)\n            // parameters[1]: Virtual key code\n            // parameters[2]: Modifier flags\n            guard let keyCode = parameters[1] as? Int,\n                  let modifiers = parameters[2] as? Int else {\n                continue\n            }\n\n            // 只保存主快捷键(ID较小的),避免重复\n            // Hotkey 79/81 是主快捷键, 80/82 是带额外修饰键的变体\n            if hotkeyID == 79 || hotkeyID == 81 {\n                if resolved[shortcutName] == nil {\n                    resolved[shortcutName] = (CGKeyCode(keyCode), UInt64(modifiers))\n                    NSLog(\"SystemShortcut: Loaded \\(shortcutName) = keyCode:\\(keyCode), modifiers:0x\\(String(modifiers, radix: 16))\")\n                }\n            }\n        }\n\n        return resolved\n    }\n}\n"
  },
  {
    "path": "Mos/Utils/Archieve.swift",
    "content": "//\n//  Archieve.swift\n//  Mos\n//\n//  Created by Caldis on 2020/11/21.\n//  Copyright © 2020 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nclass Archieve {\n    /*\n     * 通知\n     */\n    class func sendNotificationMessage(_ title:String, _ subTitle:String) {\n        // 定义通知\n        let notification = NSUserNotification()\n        notification.title = title\n        notification.subtitle = subTitle\n        // 发送通知\n        NSUserNotificationCenter.default.deliver(notification)\n    }\n    \n    /*\n     * 坐标获取\n     */\n    // 从指针悬停坐标获取窗口 BundleId, 如果失败则从 CGEvent 获取, 但此情况下仅匹配当前激活窗口\n    // 原理: 获取指针坐标下的 AXUIElement 信息, 从而获取 BundleID\n    // 来自: https://stackoverflow.com/questions/27584963/get-window-values-under-mouse\n    // 从坐标获取的已知问题:\n    // 1.外置屏幕获取到的 PID 有大约 30PX 在垂直方向上的偏移, 但内置屏幕无此问题\n    // 2.Adobe Acrobat Reader 的画布区域对 AXUIElementCopyElementAtPosition 无响应, 仅能使用 event 获取\n    // 3.效率较低，影响首次滚动性能\n    let systemWideElement = AXUIElementCreateSystemWide()\n    var bundleIdCache:String? = nil\n    var bundleIdDetectTime = 0.0\n    var mouseLocationCache = NSPoint(x: 0.0, y: 0.0)\n    func getBundleIdFromMouseLocation(and event: CGEvent) -> String? {\n        let location = NSEvent.mouseLocation\n        // 如果距离上次检测时间大于 1s, 且鼠标移动大于阈值, 或缓存值为空, 则重新检测一遍, 否则直接返回上次的结果\n        let timeCurr = NSDate().timeIntervalSince1970\n        let timeDiffOverThreshold = (timeCurr - self.bundleIdDetectTime) > 1.0\n        let mouseMoveOverThreshold = !mouseStayStill(location, mouseLocationCache)\n        if ((timeDiffOverThreshold && mouseMoveOverThreshold) || bundleIdCache==nil) {\n            // 获取光标坐标下的元素信息\n            // event.getDoubleValueField(.eventTargetUnixProcessID) 获取到的 PID 始终为当前激活窗口的 PID\n            // 除非事件在 cgAnnotatedSessionEventTap 层监听\n            var element: AXUIElement?\n            let pointAsCGPoint = carbonScreenPointFromCocoaScreenPoint(mouseLocation: location)\n            let copyElementRes = AXUIElementCopyElementAtPosition(systemWideElement, Float(pointAsCGPoint.x), Float(pointAsCGPoint.y), &element )\n            // 更新缓存值\n            mouseLocationCache = location\n            bundleIdDetectTime = timeCurr\n            // 先尝试从鼠标坐标查找, 如果无法找到, 则使用事件携带的信息查找\n            if copyElementRes == .success {\n                let pid = getPidFrom(element: element!)\n                bundleIdCache = Archieve.getApplicationBundleIdFrom(pid: pid)\n            } else {\n                // TODO\n            }\n        }\n        return bundleIdCache\n    }\n    // 格式化指针坐标\n    private func carbonScreenPointFromCocoaScreenPoint(mouseLocation point: NSPoint) -> CGPoint {\n        var foundScreen: NSScreen?\n        var targetPoint: CGPoint?\n        for screen in NSScreen.screens {\n            if NSPointInRect(point, screen.frame) {\n                foundScreen = screen\n            }\n        }\n        if let screen = foundScreen {\n            let screenHeight = screen.frame.size.height\n            targetPoint = CGPoint(x: point.x, y: screenHeight - point.y - 1)\n        }\n        return targetPoint ?? CGPoint(x: 0.0, y: 0.0)\n    }\n    // 从 AXUIElement 获取 PID\n    private func getPidFrom(element: AXUIElement) -> pid_t {\n        var pid: pid_t = 0\n        AXUIElementGetPid(element, &pid)\n        return pid\n    }\n    // 确定鼠标在一定范围内 (20PX)\n    let limit:CGFloat = 20\n    private func mouseStayStill(_ a: CGPoint, _ b: CGPoint) -> Bool {\n        return sqrt(pow(a.x - b.x, 2) + pow(a.y - b.y, 2)) < limit\n    }\n\n    /*\n     * 从 PID 获取对应数据\n     */\n    class func getApplicationBundleIdFrom(pid: pid_t) -> String? {\n        if let runningApps = NSRunningApplication.init(processIdentifier: pid) {\n            return runningApps.bundleIdentifier\n        } else {\n            return nil\n        }\n    }\n    \n    /*\n     * 判断 MissionControl 是否激活\n     */\n    var missioncontrolActiveCache = false\n    var missioncontrolLastDetectTime = 0.0\n    private func getMissioncontrolActivity() -> Bool {\n        // 如果距离上次检测时间大于 1s, 则重新检测一遍, 否则直接返回上次的结果\n        let nowTime = NSDate().timeIntervalSince1970\n        if nowTime - missioncontrolLastDetectTime > 1.0 {\n            let windowInfoList = CGWindowListCopyWindowInfo(CGWindowListOption.optionOnScreenOnly, CGWindowID(0)) as [AnyObject]?\n            for windowInfo in windowInfoList! {\n                let windowOwnerName = windowInfo[kCGWindowOwnerName]!\n                if windowOwnerName != nil && windowOwnerName as! String == \"Dock\" {\n                    if windowInfo[kCGWindowName]! == nil {\n                        missioncontrolActiveCache = true\n                        return true\n                    }\n                }\n            }\n            missioncontrolActiveCache = false\n            missioncontrolLastDetectTime = nowTime\n        }\n        return missioncontrolActiveCache\n    }\n}\n"
  },
  {
    "path": "Mos/Utils/Constants.swift",
    "content": "//\n//  Constants.swift\n//  Mos\n//  常量\n//  Created by Caldis on 2019/3/4.\n//  Copyright © 2019 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\n// 动画\nstruct ANIMATION {\n    static let duration = 0.3\n}\n\n// 窗口\nstruct WINDOW_IDENTIFIER {\n    static let introductionWindowController = \"introductionWindowController\"\n    static let welcomeWindowController = \"welcomeWindowController\"\n    static let monitorWindowController = \"monitorWindowController\"\n    static let preferencesWindowController = \"preferencesWindowController\"\n}\nstruct VIEW_IDENTIFIER {\n    static let introductionStepOneViewController = \"introductionStepOneViewController\"\n    static let introductionStepTwoViewController = \"introductionStepTwoViewController\"\n    static let introductionStepThreeViewController = \"introductionStepThreeViewController\"\n}\n\n// 视图\nstruct PANEL_IDENTIFIER {\n    static let general = \"general\"\n    static let scrolling = \"scrolling\"\n    static let scrollingWithApplication = \"scrollingWithApplication\"\n    static let buttons = \"buttons\"\n    static let application = \"application\"\n    static let list = [general, scrolling, buttons, application]\n}\nlet PANEL_PADDING = CGFloat(42.0) // 顶部导航栏高度\nlet TOOLBAR_HEIGHT = CGFloat(80.0) // 偏好的 Toolbar 高度\n// macOS 版本补偿高度 - 只在特定版本生效\nvar MACOS_TAHOE_COMPENSATE: CGFloat {\n    if #available(macOS 26.0, *) {\n        return CGFloat(8) // 26 版本的额外高度, 否则底部会被吃掉一部分\n    } else {\n        return CGFloat(0) // 其他版本不需要补偿\n    }\n}\n\n// 气泡弹窗\nstruct POPOVER_IDENTIFIER {\n    static let statusItemPopoverViewController = \"statusItemPopoverViewController\"\n    static let statusItemMainPanelViewController = \"statusItemMainPanelViewController\"\n}\n\n// 事件处理应用\nstruct SPECIAL_EVENT_SOURCE_APPLICATION {\n    static let logitechOptions = \"com.logitech.manager.daemon\"\n}\n\n// 远程桌面应用标识列表（用于检测 VNC 等远程滚动事件）\nstruct REMOTE_CONTROL_APPLICATION {\n    // 可执行文件路径关键字（用于系统守护进程）\n    static let executableKeywords = [\n        \"screensharingd\",          // macOS 屏幕共享守护进程\n        \"ScreensharingAgent\",     // macOS 屏幕共享用户会话代理\n        \"ARDAgent\",                // Apple Remote Desktop\n    ]\n    // Bundle Identifier（用于第三方应用）\n    static let bundleIdentifiers = [\n        \"com.teamviewer.TeamViewer\",\n        \"com.teamviewer.TeamViewerHost\",\n        \"com.anydesk.anydesk\",\n        \"com.parsec.www\",\n        \"com.rustdesk.RustDesk\",\n        \"com.microsoft.rdc.macos\",  // Microsoft Remote Desktop\n        \"com.realvnc.vncviewer\",\n        \"com.tigervnc.vncviewer\",\n        \"com.netease.uuremote\",  // UU 远程桌面\n    ]\n}\n\nenum ScrollDurationLimits {\n    static let simulateTrackpadDefault: Double = 4.75\n}\n\n/// 默认设置项\n// 常规\nclass OPTIONS_GENERAL_DEFAULT {\n    // 自启\n    var autoLaunch = false {\n        willSet {Utils.launchAtStartup(on: newValue)}\n        didSet {Options.shared.saveOptions()}\n    }\n    // 隐藏\n    var hideStatusItem = false {\n        willSet {newValue ? StatusItemManager.hideStatusItem() : StatusItemManager.showStatusItem()}\n        didSet {Options.shared.saveOptions()}\n    }\n}\n\n// 更新\nclass OPTIONS_UPDATE_DEFAULT {\n    // 启动时自动检查更新\n    var checkOnAppStart = false {\n        didSet { Options.shared.saveOptions() }\n    }\n\n    // 包含 beta 版本\n    var includingBetaVersion = false {\n        didSet { Options.shared.saveOptions() }\n    }\n}\n\n// 按键\nclass OPTIONS_BUTTONS_DEFAULT: Codable {\n    var binding:[ButtonBinding] = [] {\n        didSet { Options.shared.saveOptions() }\n    }\n}\n\n// 滚动\nclass OPTIONS_SCROLL_DEFAULT: Codable {\n    var smooth = true {\n        didSet {Options.shared.saveOptions()}\n    }\n    var reverse = true {\n        didSet {Options.shared.saveOptions()}\n    }\n    var reverseVertical = true {\n        didSet {Options.shared.saveOptions()}\n    }\n    var reverseHorizontal = true {\n        didSet {Options.shared.saveOptions()}\n    }\n    var dash: ScrollHotkey? = ScrollHotkey(type: .keyboard, code: KeyCode.optionL) {\n        didSet {Options.shared.saveOptions()}\n    }\n    var toggle: ScrollHotkey? = ScrollHotkey(type: .keyboard, code: KeyCode.shiftL) {\n        didSet {Options.shared.saveOptions()}\n    }\n    var block: ScrollHotkey? = ScrollHotkey(type: .keyboard, code: KeyCode.commandL) {\n        didSet {Options.shared.saveOptions()}\n    }\n    var step = 33.6 {\n        didSet {Options.shared.saveOptions()}\n    }\n    var speed = 2.70 {\n        didSet {Options.shared.saveOptions()}\n    }\n    var duration = 4.35 {\n        didSet {Options.shared.saveOptions()}\n    }\n    var durationTransition: Double {\n        OPTIONS_SCROLL_DEFAULT.generateDurationTransition(with: duration)\n    }\n    var deadZone = 1.00 {\n        didSet {Options.shared.saveOptions()}\n    }\n    var smoothSimTrackpad = false {\n        didSet {Options.shared.saveOptions()}\n    }\n    var smoothVertical = true {\n        didSet {Options.shared.saveOptions()}\n    }\n    var smoothHorizontal = true {\n        didSet {Options.shared.saveOptions()}\n    }\n    var durationBeforeSimTrackpadLock: Double? {\n        didSet {Options.shared.saveOptions()}\n    }\n    // 工具\n    static func generateDurationTransition(with duration: Double) -> Double {\n        // 上界, 此处需要与界面的 Slider 上界保持同步, 并添加 0.2 的偏移令结果不为 0\n        let upperLimit = 5.0 + 0.2\n        // 生成数据 (https://www.wolframalpha.com/input/?i=1+-+(sqrt+x%2F5)+%3D+y)\n        let val = 1-(duration/upperLimit).squareRoot()\n        // 三位小数\n        return Double(round(1000 * val)/1000)\n    }\n}\nextension OPTIONS_SCROLL_DEFAULT: Equatable {\n    static func == (l: OPTIONS_SCROLL_DEFAULT, r: OPTIONS_SCROLL_DEFAULT) -> Bool {\n        return (\n            l.smooth == r.smooth &&\n            l.reverse == r.smooth &&\n            l.reverseVertical == r.reverseVertical &&\n            l.reverseHorizontal == r.reverseHorizontal &&\n            l.dash == r.dash &&\n            l.toggle == r.toggle &&\n            l.block == r.block &&\n            l.step == r.step &&\n            l.speed == r.speed &&\n            l.duration == r.duration &&\n            l.deadZone == r.deadZone &&\n            l.smoothSimTrackpad == r.smoothSimTrackpad &&\n            l.smoothVertical == r.smoothVertical &&\n            l.smoothHorizontal == r.smoothHorizontal &&\n            l.durationBeforeSimTrackpadLock == r.durationBeforeSimTrackpadLock\n        )\n    }\n}\n\n// 例外应用\nclass OPTIONS_APPLICATION_DEFAULT {\n    var allowlist = false {\n        didSet {Options.shared.saveOptions()}\n    }\n    var applications = EnhanceArray<Application>(\n        matchKey: \"path\",\n        forObserver: {() in Options.shared.saveOptions()}\n    )\n}\n"
  },
  {
    "path": "Mos/Utils/EnhanceArray.swift",
    "content": "//\n//  EnhanceArray.swift\n//  Mos\n//  增强数组, 使用内置字典便于快速查找\n//  Created by Caldis on 2019/3/27.\n//  Copyright © 2019 Caldis. All rights reserved.\n//\n\nimport Foundation\n\nclass EnhanceArray<T:Codable> {\n\n    private var array: [T]! {\n        didSet {\n            updateDictionary()\n            observer()\n        }\n    }\n    private var dictionary = [String: Int]()\n    private var dictionaryKey: String!\n    private var observer = {()}\n\n    public init(withArray targetArray: [T] = [], matchKey targetDictionaryKey: String = \"identity\", forObserver observerHandler: @escaping ()->Void = {()}) {\n        setInitData(targetDictionaryKey, targetArray)\n        observer = observerHandler\n    }\n    public init(withData targetData: Data, matchKey targetDictionaryKey: String = \"identity\", forObserver observerHandler: @escaping ()->Void = {()}) throws {\n        let decoder = JSONDecoder()\n        let targetArray = try decoder.decode([T].self, from: targetData)\n        setInitData(targetDictionaryKey, targetArray)\n        observer = observerHandler\n    }\n}\n\n/**\n * 接口\n **/\nextension EnhanceArray {\n    // 属性\n    var count: Int {\n        get {\n            return array.count\n        }\n    }\n    // 获取值\n    public func get(by key: String?) -> T? {\n        guard let validKey = key, let index = dictionary[validKey] else { return nil }\n        return array[index]\n    }\n    public func get(by index: Int?) -> T? {\n        guard let validIndex = index else { return nil }\n        return array[validIndex]\n    }\n    // 更新值\n    public func set(by key: String, of item: T) -> EnhanceArray {\n        if let index = dictionary[key] {\n            array[index] = item\n        }\n        return self\n    }\n    public func set(by index: Int, of item: T) -> EnhanceArray {\n        array[index] = item\n        return self\n    }\n    public func append(_ item: T) {\n        array.append(item)\n    }\n    // 删除值\n    public func remove(from key: String) {\n        if let index = dictionary[key] {\n            array.remove(at: index)\n        }\n    }\n    public func remove(at index: Int) {\n        array.remove(at: index)\n    }\n    // 获取 JSON 数据\n    public func json() -> Data? {\n        let encoder = JSONEncoder()\n        do {\n            return try encoder.encode(array)\n        } catch {\n            NSLog(\"Failed to encode array to JSON: \\(error)\")\n            return nil\n        }\n    }\n    // 更新内部数据\n    public func update() {\n        updateDictionary()\n    }\n}\n\n/**\n * 工具\n **/\nextension EnhanceArray {\n    // 为了触发 didSet\n    // 直接在 init 处初始化不会调用 didSet\n    private func setInitData(_ targetDictionaryKey: String, _ targetArray: [T]) {\n        dictionaryKey = targetDictionaryKey\n        array = targetArray\n    }\n    // 更新\n    private func updateDictionary() {\n        var nextDic = [String: Int]()\n        for (index, item) in array.enumerated() {\n            let mirror = Mirror(reflecting: item)\n            for property in mirror.children {\n                if let targetPropertyKey = property.label, targetPropertyKey == dictionaryKey {\n                    guard let targetPropertyValue = property.value as? String else {\n                        fatalError(\"Property of \\(String(describing: dictionaryKey)) in EnhanceArray must be String Type\")\n                    }\n                    nextDic[targetPropertyValue] = index\n                    break\n                }\n            }\n        }\n        dictionary = nextDic\n    }\n}\n"
  },
  {
    "path": "Mos/Utils/Interceptor.swift",
    "content": "//\n//  Interceptor.swift\n//  Mos\n//  事件截取工具函数\n//  Created by Caldis on 2018/3/18.\n//  Copyright © 2018年 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nclass Interceptor {\n    \n    private var keeper: Timer?\n    private var _eventTapRef: CFMachPort?\n    private var _runLoopSourceRef: CFRunLoopSource?\n    \n    // 可访问对象只读\n    public var eventTapRef: CFMachPort? { _eventTapRef }\n    public var runLoopSourceRef: CFRunLoopSource? { _runLoopSourceRef }\n    \n    public init(event mask: CGEventMask, handleBy eventHandler: @escaping CGEventTapCallBack, listenOn eventTap: CGEventTapLocation, placeAt eventPlace: CGEventTapPlacement, for behaver: CGEventTapOptions) throws {\n        // 创建拦截层\n        guard let tap = CGEvent.tapCreate(tap: eventTap, place: eventPlace, options: behaver, eventsOfInterest: mask, callback: eventHandler, userInfo: nil) else {\n            throw InterceptorError.eventTapCreationFailed\n        }\n        _eventTapRef = tap\n        _runLoopSourceRef = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, tap, 0)\n        // 启动\n        try start()\n    }\n    \n    deinit {\n        // 先停止所有操作\n        stop()\n        // 清理 event tap\n        if let tap = _eventTapRef {\n            CGEvent.tapEnable(tap: tap, enable: false)\n            _eventTapRef = nil\n        }\n        // 清理 run loop source\n        if let source = _runLoopSourceRef {\n            if CFRunLoopContainsSource(CFRunLoopGetCurrent(), source, .commonModes) {\n                CFRunLoopRemoveSource(CFRunLoopGetCurrent(), source, .commonModes)\n            }\n            _runLoopSourceRef = nil\n        }\n    }\n}\n\n// MARK: - Error Type\nextension Interceptor {\n    enum InterceptorError: Error {\n        case eventTapCreationFailed\n        case eventTapEnableFailed\n    }\n}\n\n// MARK: - 开关\nextension Interceptor {\n    @objc public func start() throws {\n        // 创建拦截层\n        guard let tap = _eventTapRef, let source = _runLoopSourceRef else {\n            throw InterceptorError.eventTapEnableFailed\n        }\n        // 确保 source 没有被重复添加\n        if !CFRunLoopContainsSource(CFRunLoopGetCurrent(), source, .commonModes) {\n            CFRunLoopAddSource(CFRunLoopGetCurrent(), source, .commonModes)\n        }\n        // 启动拦截层\n        CGEvent.tapEnable(tap: tap, enable: true)\n        // 启动守护\n        keeper = Timer.scheduledTimer(withTimeInterval: 5.0, repeats: true) { [weak self] _ in\n            if let self = self, !self.isRunning() {\n                self.restart()\n            }\n        }\n    }\n    \n    public func stop() {\n        // 停止守护\n        keeper?.invalidate()\n        keeper = nil\n        // 关闭拦截层\n        if let tap = _eventTapRef, let source = _runLoopSourceRef {\n            CGEvent.tapEnable(tap: tap, enable: false)\n            if CFRunLoopContainsSource(CFRunLoopGetCurrent(), source, .commonModes) {\n                CFRunLoopRemoveSource(CFRunLoopGetCurrent(), source, .commonModes)\n            }\n        }\n    }\n}\n\n// MARK: - 状态\nextension Interceptor {\n    public func isRunning() -> Bool {\n        if let tap = _eventTapRef {\n            return CGEvent.tapIsEnabled(tap: tap)\n        } else {\n            return false\n        }\n    }\n    \n    public func restart() {\n        stop()\n        ScrollPoster.shared.stop(.TrackingEnd)\n        // 保存 timer 的引用以防止提前释放\n        keeper = Timer.scheduledTimer(\n            timeInterval: 0.5,\n            target: self,\n            selector: #selector(start),\n            userInfo: nil,\n            repeats: false\n        )\n    }\n    \n    @objc private func check() {\n        if !isRunning() {\n            restart()\n        }\n    }\n}\n"
  },
  {
    "path": "Mos/Utils/Utils.swift",
    "content": "//\n//  Utils.swift\n//  Mos\n//  实用方法\n//  Created by Caldis on 2017/3/24.\n//  Copyright © 2017年 Caldis. All rights reserved.\n//\n\nimport Cocoa\nimport LoginServiceKit\n\n// 实用方法\npublic class Utils {\n\n    /// Determines whether the app is currently in Dark Mode.\n    /// - Parameter view: An optional view to help infer appearance on macOS 10.13 and earlier.\n    /// - Returns: `true` if the effective appearance is dark-like, otherwise `false`.\n    class func isDarkMode(for view: NSView?) -> Bool {\n        if #available(macOS 10.14, *) {\n            // 10.14+ Use effectiveAppearance to determine dark mode\n            let appearance = NSApp.effectiveAppearance\n            return appearance\n                .bestMatch(\n                    from: [\n                        .darkAqua,\n                        .vibrantDark,\n                        .accessibilityHighContrastDarkAqua,\n                        .accessibilityHighContrastVibrantDark\n                    ]\n                ) != nil\n        } else {\n            // 10.13 and earlier: approximate using window or view appearance name\n            let appearance = view?.window?.appearance ?? view?.appearance\n            let name = appearance?.name.rawValue.lowercased() ?? \"\"\n            return name.contains(\"vibrantdark\") || name.contains(\"dark\")\n        }\n    }\n\n\n    // 切换自启\n    class func launchAtStartup(on: Bool) {\n        let bundlePath = Bundle.main.bundlePath\n        if on {\n            if !LoginServiceKit.isExistLoginItems(at: bundlePath) {\n                LoginServiceKit.addLoginItems(at: bundlePath)\n            }\n        } else {\n            LoginServiceKit.removeLoginItems(at: bundlePath)\n        }\n    }\n    \n    // 菜单\n    class func attachImage(to menuItem:NSMenuItem, withImage image: NSImage) {\n        menuItem.image = image\n        menuItem.image?.size = NSSize(width: 13, height: 13)\n    }\n    @discardableResult class func addMenuItem(to menuControl:NSMenu, title: String, icon: NSImage, action: Selector?, target: AnyObject? = nil, represent: Any? = nil) -> NSMenuItem {\n        let menuItem = menuControl.addItem(withTitle: title, action: action, keyEquivalent: \"\")\n        menuItem.target = target ?? menuControl\n        menuItem.representedObject = represent\n        attachImage(to: menuItem, withImage: icon)\n        return menuItem\n    }\n    @discardableResult class func addMenuItemWithSeparator(to menuControl:NSMenu, title: String, icon: NSImage, action: Selector?, target: Any? = nil, represent: Any? = nil) -> NSMenuItem {\n        menuControl.addItem(NSMenuItem.separator())\n        return addMenuItem(to: menuControl, title: title, icon: icon, action: action)\n    }\n    \n    // 动画\n    // 需要设置 allowsImplicitAnimation = true 才能让 contentSize 有动画, https://stackoverflow.com/a/46946957/6727040\n    class func groupAnimatorContainer(_ group: (NSAnimationContext?)->Void, completionHandler: @escaping ()->Void = {()}) {\n        if #available(OSX 10.12, *) {\n            NSAnimationContext.runAnimationGroup({ (context) -> Void in\n                context.duration = ANIMATION.duration\n                context.allowsImplicitAnimation = true\n                group(context)\n            }, completionHandler: completionHandler)\n        } else {\n            group(nil)\n            completionHandler()\n        }\n    }\n    class func groupAnimatorContainer(_ group: (NSAnimationContext?)->Void, headHandler: @escaping ()->Void = {()}, completionHandler: @escaping ()->Void = {()}) {\n        headHandler()\n        groupAnimatorContainer(group, completionHandler: completionHandler)\n    }\n    // https://nyrra33.com/2017/12/21/rotating-a-view-is-not-easy/\n    class func groupAnimatorRotate(with view: NSView, angle: CGFloat) {\n        if let layer = view.layer, let animatorLayer = view.animator().layer {\n            // 设定中心点\n            layer.position = CGPoint(x: layer.frame.midX, y: layer.frame.midY)\n            layer.anchorPoint = CGPoint(x: 0.5, y: 0.5)\n            // 用 CATransform3DMakeRotation 才能保证按中心旋转\n            animatorLayer.transform = CATransform3DMakeRotation(angle, 0, 0, 1)\n        }\n    }\n    \n    // 禁止重复运行\n    // killExist = true 则杀掉已有进程, 否则自杀\n    class func preventMultiRunning(killExist kill: Bool = false) {\n        // 自己的 BundleId\n        let mainBundleID = Bundle.main.bundleIdentifier!\n        // 如果检测到在运行\n        if NSRunningApplication.runningApplications(withBundleIdentifier: mainBundleID).count > 1 {\n            if kill {\n                let runningInst = NSRunningApplication.runningApplications(withBundleIdentifier: mainBundleID)[0]\n                runningInst.terminate()\n                NSLog(\"Terminate: Other instance\", runningInst.processIdentifier)\n            } else {\n                NSApp.terminate(nil)\n                NSLog(\"Terminate: Suicide\")\n            }\n        }\n    }\n    \n    // 从 StoryBroad 获取一个特定 Controller 的实例\n    private static let storyboard = NSStoryboard(name: \"Main\", bundle: nil)\n    class func instantiateControllerFromStoryboard<Controller>(withIdentifier identifier: String) -> Controller {\n        let id = identifier\n        guard let controller = storyboard.instantiateController(withIdentifier: id) as? Controller else {\n            fatalError(\"Can't find Controller: \\(id)\")\n        }\n        return controller\n    }\n    \n    // 辅助功能权限相关\n    // 来源: http://see.sl088.com/wiki/Mac%E5%BC%80%E5%8F%91_%E8%BE%85%E5%8A%A9%E5%8A%9F%E8%83%BD%E6%9D%83%E9%99%90\n    // 查询是否有辅助功能权限\n    class func isHadAccessibilityPermissions() -> Bool{\n        return AXIsProcessTrusted()\n    }\n    // 申请辅助功能权限\n    class func requireAccessibilityPermissions() {\n        let trusted = kAXTrustedCheckOptionPrompt.takeUnretainedValue()\n        let privOptions = [trusted: true] as CFDictionary\n        AXIsProcessTrustedWithOptions(privOptions)\n    }\n    \n    // Dock 图标控制\n    static var isDockIconVisible = false\n    class func showDockIcon() {\n        if !Utils.isDockIconVisible {\n            NSApp.setActivationPolicy(NSApplication.ActivationPolicy.regular)\n            isDockIconVisible = true\n        }\n    }\n    class func hideDockIcon() {\n        if WindowManager.shared.refs.count == 1 {\n            NSApp.setActivationPolicy(NSApplication.ActivationPolicy.accessory)\n            isDockIconVisible = false\n        }\n    }\n    class func toggleDockIcon() {\n        if isDockIconVisible {\n            hideDockIcon()\n        } else {\n            showDockIcon()\n        }\n    }\n    \n    // 匹配字符\n    class func extractRegexMatches(target: String = \"\", pattern: String) -> String {\n        do {\n            let pattern = #\"\\/?.*\\.app\"#\n            let regex = try NSRegularExpression(pattern: pattern, options: .caseInsensitive)\n            let range = NSRange(location: 0, length: target.count)\n            let result = regex.firstMatch(in: target, options: [], range: range)\n            if let validResult = result {\n                return NSString(string: target).substring(with: validResult.range) as String\n            } else {\n                return target\n            }\n        } catch {\n            return target\n        }\n    }\n    // 移除字符\n    class func removingRegexMatches(target: String = \"\", pattern: String, replaceWith: String = \"\") -> String {\n        do {\n            let regex = try NSRegularExpression(pattern: pattern, options: .caseInsensitive)\n            let range = NSRange(location: 0, length: target.count)\n            return regex.stringByReplacingMatches(in: target, options: [], range: range, withTemplate: replaceWith)\n        } catch {\n            return target\n        }\n    }\n    \n    // 从路径获取应用图标\n    class func getApplicationIcon(fromPath path: String?) -> NSImage {\n        guard let validPath = path else {\n            return NSWorkspace.shared.icon(forFile: \"\")\n        }\n        // 尝试完整路径对应的 Bundle 获取\n        if let validBundle = Bundle.init(url: URL.init(fileURLWithPath: validPath)) {\n            return NSWorkspace.shared.icon(forFile: validBundle.bundlePath)\n        }\n        // 尝试从子路径对应的 Bundle 获取\n        let subPath = extractRegexMatches(target: validPath, pattern: #\"\\/?.*\\.app\"#)\n        if let validBundle = Bundle.init(url: URL.init(fileURLWithPath: subPath)) {\n            return NSWorkspace.shared.icon(forFile: validBundle.bundlePath)\n        }\n        // 从 Path 关联的 Bundle 获取\n        return NSWorkspace.shared.icon(forFile: validPath)\n    }\n    // 从路径获取应用名称\n    class func getApplicationName(fromPath path: String?) -> String {\n        guard let validPath = path else {\n            return \"Invalid Name\"\n        }\n        // 尝试完整路径对应的 Bundle 获取\n        if let validBundle = Bundle.init(url: URL.init(fileURLWithPath: validPath)) {\n            return (\n                validBundle.object(forInfoDictionaryKey: \"CFBundleDisplayName\") as? String ??\n                validBundle.object(forInfoDictionaryKey: \"CFBundleName\") as? String ??\n                parseName(fromPath: validPath)\n            )\n        }\n        // 尝试从子路径对应的 Bundle 获取\n        let subPath = extractRegexMatches(target: validPath, pattern: #\"\\/?.*\\.app\"#)\n        if let validBundle = Bundle.init(url: URL.init(fileURLWithPath: subPath)) {\n            return (\n                validBundle.object(forInfoDictionaryKey: \"CFBundleDisplayName\") as? String ??\n                validBundle.object(forInfoDictionaryKey: \"CFBundleName\") as? String ??\n                parseName(fromPath: validPath)\n            )\n        }\n        return parseName(fromPath: validPath)\n    }\n    class func parseName(fromPath path: String) -> String {\n        let applicationRawName = FileManager().displayName(atPath: path).removingPercentEncoding!\n        return Utils.removingRegexMatches(target: applicationRawName, pattern: \".app\")\n    }\n    \n    static var runningApplicationThreshold = 60.0\n    static var runningApplicationCache = [String: NSRunningApplication]()\n    static var runningApplicationDetectTime = [String: Double]()\n    class func getRunningApplicationProcessIdentifier(withBundleIdentifier bundleIdentifier: String) -> NSRunningApplication? {\n        let now = NSDate().timeIntervalSince1970\n        if now - (runningApplicationDetectTime[bundleIdentifier] ?? 0.0) > runningApplicationThreshold {\n            let runningApplications = NSRunningApplication.runningApplications(withBundleIdentifier: bundleIdentifier)\n            runningApplicationCache[bundleIdentifier] = runningApplications.count > 0 ? runningApplications[0] : nil\n            runningApplicationDetectTime[bundleIdentifier] = now\n        }\n        return runningApplicationCache[bundleIdentifier] ?? nil\n    }\n    \n    class func debounce(delay: Int, action: @escaping (() -> Void)) -> () -> Void {\n        var lastFireTime = DispatchTime.now()\n        let dispatchDelay = DispatchTimeInterval.milliseconds(delay)\n\n        return {\n            lastFireTime = DispatchTime.now()\n            let dispatchTime: DispatchTime = DispatchTime.now() + dispatchDelay\n            DispatchQueue.main.asyncAfter(deadline: dispatchTime) {\n                let when: DispatchTime = lastFireTime + dispatchDelay\n                let now = DispatchTime.now()\n                if now.rawValue >= when.rawValue {\n                    action()\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Mos/Windows/IntroductionWindow/IntroductionViewController.swift",
    "content": "//\n//  IntroductionViewController.swift\n//  Mos\n//\n//  Created by Caldis on 15/11/2019.\n//  Copyright © 2019 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nclass IntroductionViewController: NSViewController {\n\n    // 辅助功能权限检查器\n    var accessibilityPermissionsCheckerTimer: Timer?\n    // 帮助弹窗\n    var isViewFirstActive = true\n    var isHelpPopoverShowed = false\n    // 是否从偏好设置手动打开的标识\n    var isManuallyOpened = false\n    \n    // 设置手动打开标识的方法\n    func setManuallyOpened(_ manually: Bool) {\n        isManuallyOpened = manually\n        // 如果是手动打开，停止现有的定时器\n        if manually {\n            accessibilityPermissionsCheckerTimer?.invalidate()\n            accessibilityPermissionsCheckerTimer = nil\n        }\n        // 更新按钮状态\n        updateButtonState()\n    }\n    \n    // 更新按钮状态\n    func updateButtonState() {\n        if AXIsProcessTrusted() {\n            // 如果有权限\n            authButton.title = NSLocalizedString(\"Authorized\", comment: \"\")\n            authButton.isEnabled = false\n        } else {\n            // 如果没权限\n            authButton.title = NSLocalizedString(\"Auth\", comment: \"\")\n            authButton.isEnabled = true\n        }\n    }\n    @IBOutlet weak var helpButton: NSButton!\n    @IBOutlet weak var helpDragAppArrow: NSImageView!\n    @IBOutlet weak var helpDragAppSparkle: NSImageView!\n    \n    // UI Elements\n    @IBOutlet weak var authButton: NSButton!\n    \n    override func viewDidLoad() {\n        // 初始化按钮状态\n        updateButtonState()\n        // 只有在非手动打开的情况下才启动权限检测定时器\n        if !isManuallyOpened {\n            accessibilityPermissionsCheckerTimer = Timer.scheduledTimer(\n                timeInterval: 1.0,\n                target: self,\n                selector: #selector(accessibilityPermissionsChecker(_:)),\n                userInfo: nil,\n                repeats: true\n            )\n        }\n        // 检查获得焦点\n        NotificationCenter.default.addObserver(\n            self,\n            selector: #selector(handleAppActive),\n            name: NSApplication.didBecomeActiveNotification,\n            object: nil\n        )\n    }\n    \n    override func viewWillDisappear() {\n        NotificationCenter.default.removeObserver(self)\n        accessibilityPermissionsCheckerTimer?.invalidate()\n    }\n    \n    @IBAction func handleHelpButtonClick(_ sender: Any) {\n        helpDragAppArrow.isHidden = false\n        helpDragAppSparkle.isHidden = false\n    }\n    \n}\n\n/*\n * 帮助界面处理\n */\nextension IntroductionViewController {\n    // 切换回帮助视图 (用户没授权成功)\n    @objc private func handleAppActive() {\n        // Guard: skip first\n        if (isViewFirstActive) {\n            isViewFirstActive = false\n            return\n        }\n        // Guard: 如果显示过就不再主动触发显示了\n        if (isHelpPopoverShowed) { return }\n        // 显示帮助弹窗\n        isHelpPopoverShowed = true\n        helpDragAppArrow.isHidden = false\n        helpDragAppSparkle.isHidden = false\n        helpButton.performClick(self)\n    }\n}\n\n/*\n * 权限处理\n */\nextension IntroductionViewController {\n    // 检查是否有访问 accessibility 权限, 并设置对应按钮\n    @objc func accessibilityPermissionsChecker(_ timer: Timer) {\n        // 更新按钮状态\n        updateButtonState()\n        // 如果有权限\n        if AXIsProcessTrusted() {\n            // 关闭检测\n            accessibilityPermissionsCheckerTimer?.invalidate()\n            // 只有在非手动打开的情况下才关闭窗口\n            if !isManuallyOpened {\n                view.window?.close()\n            }\n        }\n    }\n    // 请求获取权限\n    @IBAction func authButtonClick(_ sender: NSButton) {\n        Utils.requireAccessibilityPermissions()\n    }\n}\n"
  },
  {
    "path": "Mos/Windows/IntroductionWindow/IntroductionWindowController.swift",
    "content": "//\n//  IntroductionWindowController.swift\n//  Mos\n//  简介界面\n//  Created by Caldis on 15/11/2019.\n//  Copyright © 2019 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nclass IntroductionWindowController: NSWindowController, NSWindowDelegate {\n    \n    @IBOutlet weak var introductionWindow: NSWindow!\n    \n    func windowWillClose(_ notification: Notification) {\n        WindowManager.shared.hideWindow(withIdentifier: WINDOW_IDENTIFIER.introductionWindowController, destroy: true)\n    }\n    \n}\n"
  },
  {
    "path": "Mos/Windows/MonitorWindow/Logger.swift",
    "content": "//\n//  Logger.swift\n//  Mos\n//  日志工具\n//  Created by Caldis on 2018/2/20.\n//  Copyright © 2018年 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nclass Logger {\n    \n    // 解析信息\n    class func getParsedLog(form event: CGEvent) -> String {\n        let isTrackPad = ScrollEvent.isTrackpad(with: event)\n        let isRemote = ScrollUtils.shared.isFromRemoteApplication(event)\n        let runningApplication = ScrollUtils.shared.getRunningApplication(from: event)\n        return \"\"\"\n        Trackpad: \\(isTrackPad)\n        Remote: \\(isRemote)\n        Path: \\(runningApplication?.bundleURL?.path ?? runningApplication?.executableURL?.path ?? \"\")\n        \"\"\"\n    }\n    \n    // 滚动方向信息\n    class func getScrollLog(form event: CGEvent) -> String {\n        // scrollWheelEventDeltaAxis1 基于 scrollWheelEventFixedPtDeltaAxis1 计算, 当大于1时向下取整, 小于1时向上取整\n        // scrollWheelEventDeltaAxis2 同上\n        // scrollWheelEventPointDeltaAxis1 高精度滚动数据, 带有滚轮加速\n        // scrollWheelEventPointDeltaAxis2 高精度滚动数据, 带有滚轮加速\n        // scrollWheelEventFixedPtDeltaAxis1 Y 轴数据 (垂直)\n        // scrollWheelEventFixedPtDeltaAxis2 X 轴数据 (水平)\n        return \"\"\"\n        scrollWheelEventDeltaAxis1 (FixY): \\(event.getDoubleValueField(.scrollWheelEventDeltaAxis1))\n        scrollWheelEventDeltaAxis2 (FixX): \\(event.getDoubleValueField(.scrollWheelEventDeltaAxis2))\n        scrollWheelEventPointDeltaAxis1 (PtY): \\(event.getDoubleValueField(.scrollWheelEventPointDeltaAxis1))\n        scrollWheelEventPointDeltaAxis2 (PtX): \\(event.getDoubleValueField(.scrollWheelEventPointDeltaAxis2))\n        scrollWheelEventFixedPtDeltaAxis1 (FixPtY): \\(String(format: \"%.1f\", event.getDoubleValueField(.scrollWheelEventFixedPtDeltaAxis1)))\n        scrollWheelEventFixedPtDeltaAxis2 (FixPtX): \\(String(format: \"%.1f\", event.getDoubleValueField(.scrollWheelEventFixedPtDeltaAxis2)))\n        unacceleratedPointerMovementY: \\(event.getDoubleValueField(.eventUnacceleratedPointerMovementY))\n        unacceleratedPointerMovementX: \\(event.getDoubleValueField(.eventUnacceleratedPointerMovementX))\n        \"\"\"\n    }\n    \n    // 滚动额外信息\n    class func getScrollDetailLog(form event: CGEvent) -> String {\n        // scrollWheelEventInstantMouser 事件是否应该被 inkWell 子系统忽略 (手写板处理模块), 如果不为零则将会被忽略\n        // scrollWheelEventIsContinuous 事件是否包含连续滚动状态(触控板), 如果事件为行滚动则该值为零, 像素滚动则为非零\n        // scrollWheelEventScrollCount 加速度累计\n        // scrollWheelEventScrollPhase 根据触控板响应阶段改变\n        // CGScrollPhase (触控板滑动阶段)\n        //       1: [触控板]开始(kCGScrollPhaseBegan)\n        //       2: [触控板]双指滑动(无缓动)(kCGScrollPhaseChanged)\n        //       4: [触控板]双指滑动完拿开(无缓动)(最后一下)(kCGScrollPhaseEnded)\n        //       8: [触控板]双指触碰未滑动拿开(kCGScrollPhaseCancelled)\n        //     128: [触控板]双指触碰未滑动(kCGScrollPhaseMayBegin)\n        // scrollWheelEventMomentumPhase 根据触控板响应阶段改变\n        // CGMomentumScrollPhase (触控板缓动阶段)\n        //       1: [触控板]开始(begin)\n        //       2: [触控板]缓动动画进行中(continuous)\n        //       3: [触控板]缓动动画完成(最后一下)(end)\n        // 2-1 内置bounce正常, chrome完全动不了\n        return \"\"\"\n        scrollWheelEventIsContinuous: \\(event.getDoubleValueField(.scrollWheelEventIsContinuous))\n        scrollWheelEventScrollCount: \\(event.getDoubleValueField(.scrollWheelEventScrollCount))\n        scrollWheelEventScrollPhase: \\(event.getDoubleValueField(.scrollWheelEventScrollPhase))\n        scrollWheelEventMomentumPhase: \\(event.getDoubleValueField(.scrollWheelEventMomentumPhase))\n        \"\"\"\n    }\n    \n    // 鼠标信息\n    class func getMouseLog(form event: CGEvent) -> String {\n        return \"\"\"\n        mouseEventNumber: \\(event.getDoubleValueField(.mouseEventNumber))\n        mouseEventClickState: \\(event.getDoubleValueField(.mouseEventClickState))\n        mouseEventPressure: \\(event.getDoubleValueField(.mouseEventPressure))\n        mouseEventButtonNumber: \\(event.getDoubleValueField(.mouseEventButtonNumber))\n        mouseEventDeltaX: \\(event.getDoubleValueField(.mouseEventDeltaX))\n        mouseEventDeltaY: \\(event.getDoubleValueField(.mouseEventDeltaY))\n        mouseEventInstantMouser: \\(event.getDoubleValueField(.mouseEventInstantMouser))\n        mouseEventSubtype: \\(event.getDoubleValueField(.mouseEventSubtype))\n        mouseEventWindowUnderMousePointer: \\(event.getDoubleValueField(.mouseEventWindowUnderMousePointer))\n        mouseEventWindowUnderMousePointerThatCanHandleThisEvent: \\(event.getDoubleValueField(.mouseEventWindowUnderMousePointerThatCanHandleThisEvent))\n        \"\"\"\n    }\n    \n    // 进程信息\n    class func getProcessLog(form event: CGEvent) -> String {\n        return \"\"\"\n        eventTargetProcessSerialNumber: \\(event.getDoubleValueField(.eventTargetProcessSerialNumber))\n        eventTargetUnixProcessID: \\(event.getDoubleValueField(.eventTargetUnixProcessID))\n        eventSourceUnixProcessID: \\(event.getDoubleValueField(.eventSourceUnixProcessID))\n        eventSourceUserData: \\(event.getDoubleValueField(.eventSourceUserData))\n        eventSourceUserID: \\(event.getDoubleValueField(.eventSourceUserID))\n        eventSourceGroupID: \\(event.getDoubleValueField(.eventSourceGroupID))\n        eventSourceStateID: \\(event.getDoubleValueField(.eventSourceStateID))\n        \"\"\"\n    }\n    \n    // tablet(画板) 相关信息\n    class func getTabletEventLog(form event: CGEvent) -> String {\n        return \"\"\"\n        tabletEventPointX: \\(event.getDoubleValueField(.tabletEventPointX))\n        tabletEventPointY: \\(event.getDoubleValueField(.tabletEventPointY))\n        tabletEventPointZ: \\(event.getDoubleValueField(.tabletEventPointZ))\n        tabletEventPointButtons: \\(event.getDoubleValueField(.tabletEventPointButtons))\n        tabletEventPointPressure: \\(event.getDoubleValueField(.tabletEventPointPressure))\n        tabletEventTiltX: \\(event.getDoubleValueField(.tabletEventTiltX))\n        tabletEventTiltY: \\(event.getDoubleValueField(.tabletEventTiltY))\n        tabletEventRotation: \\(event.getDoubleValueField(.tabletEventRotation))\n        tabletEventTangentialPressure: \\(event.getDoubleValueField(.tabletEventTangentialPressure))\n        tabletEventDeviceID: \\(event.getDoubleValueField(.tabletEventDeviceID))\n        tabletEventVendor1: \\(event.getDoubleValueField(.tabletEventVendor1))\n        tabletEventVendor2: \\(event.getDoubleValueField(.tabletEventVendor2))\n        tabletEventVendor3: \\(event.getDoubleValueField(.tabletEventVendor3))\n        \"\"\"\n    }\n    class func getTabletProximityLog(form event: CGEvent) -> String {\n        return \"\"\"\n        tabletProximityEventVendorID: \\(event.getDoubleValueField(.tabletProximityEventVendorID))\n        tabletProximityEventTabletID: \\(event.getDoubleValueField(.tabletProximityEventTabletID))\n        tabletProximityEventPointerID: \\(event.getDoubleValueField(.tabletProximityEventPointerID))\n        tabletProximityEventDeviceID: \\(event.getDoubleValueField(.tabletProximityEventDeviceID))\n        tabletProximityEventSystemTabletID: \\(event.getDoubleValueField(.tabletProximityEventSystemTabletID))\n        tabletProximityEventVendorPointerType: \\(event.getDoubleValueField(.tabletProximityEventVendorPointerType))\n        tabletProximityEventVendorPointerSerialNumber: \\(event.getDoubleValueField(.tabletProximityEventVendorPointerSerialNumber))\n        tabletProximityEventVendorUniqueID: \\(event.getDoubleValueField(.tabletProximityEventVendorUniqueID))\n        tabletProximityEventCapabilityMask: \\(event.getDoubleValueField(.tabletProximityEventCapabilityMask))\n        tabletProximityEventPointerType: \\(event.getDoubleValueField(.tabletProximityEventPointerType))\n        tabletProximityEventEnterProximity: \\(event.getDoubleValueField(.tabletProximityEventEnterProximity))\n        \"\"\"\n    }\n    \n    // 打印 Log\n    class func printLog(form event: CGEvent) {\n//        print(self.getTabletLog(form: event))\n    }\n    \n}\n"
  },
  {
    "path": "Mos/Windows/MonitorWindow/MonitorViewController.swift",
    "content": "//\n//  MonitorViewController.swift\n//  Mos\n//  滚动监控界面\n//  Created by Caldis on 2017/1/10.\n//  Copyright © 2017年 Caldis. All rights reserved.\n//\n\nimport Cocoa\nimport Charts\n\nlet scrollEventName = NSNotification.Name(rawValue: \"ScrollEvent\")\nlet buttonEventName = NSNotification.Name(rawValue: \"ButtonEvent\")\n\nclass MonitorViewController: NSViewController, ChartViewDelegate {\n    \n    // MARK: - UI: 图表\n    var lineChartCount = 0.0\n    @IBOutlet weak var lineChart: LineChartView!\n    \n    // MARK: - UI: Log 文本\n    @IBOutlet var parsedLogTextField: NSTextView!\n    @IBOutlet var scrollLogTextField: NSTextView!\n    @IBOutlet var scrollDetailLogTextField: NSTextView!\n    @IBOutlet var buttonEventLogTextField: NSTextView!\n    @IBOutlet var processLogTextField: NSTextView!\n    @IBOutlet var mouseLogTextField: NSTextView!\n\n    // MARK: - UI: 事件触发器\n    @IBOutlet weak var shortcutMenu: NSMenu!\n    @IBOutlet weak var shortcutPopUpButton: NSPopUpButton!\n\n    // MARK: - 生命周期\n    override func viewWillAppear() {\n        initCharts()\n        initScrollObserver()\n        initButtonObserver()\n        setupShortcutMenu()\n    }\n    override func viewWillDisappear() {\n        uninitScrollObserver()\n        uninitButtonObserver()\n        NotificationCenter.default.removeObserver(self)\n    }\n    \n    // MARK: - 监听: 滚动\n    var scrollEventInterceptor: Interceptor?\n    let scrollEventMask = ScrollCore.shared.scrollEventMask\n    let scrollEventCallBack: CGEventTapCallBack = { (proxy, type, event, refcon) in\n        // 发送 ScrollWheelEventUpdate 通知\n        NotificationCenter.default.post(name: scrollEventName, object: event)\n        // 返回事件对象\n        return Unmanaged.passUnretained(event)\n    }\n    // 更新面板\n    var prevScrollWheelEventScrollPhase = 0.0\n    var prevScrollWheelEventMomentumPhase = 0.0\n    @objc private func updateScrollEventData(notification: NSNotification) {\n        let event = notification.object as! CGEvent\n        // 更新图表\n        if let data = lineChart.data {\n            // scrollWheelEventPointDelta\n            data.appendEntry(ChartDataEntry(x: lineChartCount, y: event.getDoubleValueField(.scrollWheelEventPointDeltaAxis1)), toDataSet: 0)\n            data.appendEntry(ChartDataEntry(x: lineChartCount, y: event.getDoubleValueField(.scrollWheelEventPointDeltaAxis2)), toDataSet: 1)\n\n            // scrollWheelEventIsContinuous\n            let isContinuous = Double(event.getIntegerValueField(.scrollWheelEventIsContinuous))\n            data.appendEntry(ChartDataEntry(x: lineChartCount, y: isContinuous), toDataSet: 2)\n            \n            // scrollWheelEventScrollCount\n            data.appendEntry(ChartDataEntry(x: lineChartCount, y: Double(event.getIntegerValueField(.scrollWheelEventScrollCount))), toDataSet: 3)\n            \n            // scrollWheelEventScrollPhase\n            let scrollPhase = Double(event.getIntegerValueField(.scrollWheelEventScrollPhase))\n            data.appendEntry(ChartDataEntry(x: lineChartCount, y: scrollPhase), toDataSet: 4)\n\n            // scrollWheelEventMomentumPhase\n            let momentumPhase = Double(event.getIntegerValueField(.scrollWheelEventMomentumPhase))\n            data.appendEntry(ChartDataEntry(x: lineChartCount, y: momentumPhase), toDataSet: 5)\n\n            // Logs\n            if prevScrollWheelEventScrollPhase != scrollPhase || prevScrollWheelEventMomentumPhase != momentumPhase {\n                if prevScrollWheelEventScrollPhase != scrollPhase {\n                    prevScrollWheelEventScrollPhase = scrollPhase\n                }\n                if prevScrollWheelEventMomentumPhase != momentumPhase {\n                    prevScrollWheelEventMomentumPhase = momentumPhase\n                }\n                NSLog(\"Phase updated -> prevScrollWheelEventScrollPhase: \\(scrollPhase), prevScrollWheelEventMomentumPhase: \\(momentumPhase)\")\n            }\n\n            lineChart.setVisibleXRange(minXRange: 1.0, maxXRange: 100.0)\n            lineChart.moveViewToX(lineChartCount)\n            lineChart.notifyDataSetChanged()\n            lineChartCount += 1.0\n        }\n        // 更新 Log\n        parsedLogTextField.string = Logger.getParsedLog(form: event)\n        scrollLogTextField.string = Logger.getScrollLog(form: event)\n        scrollDetailLogTextField.string = Logger.getScrollDetailLog(form: event)\n        processLogTextField.string = Logger.getProcessLog(form: event)\n        mouseLogTextField.string = Logger.getMouseLog(form: event)\n    }\n    // 初始化监听\n    func initScrollObserver() {\n        // 监听内部事件\n        NotificationCenter.default.addObserver(self, selector: #selector(updateScrollEventData), name: scrollEventName, object: nil)\n        // 启动事件拦截\n        do {\n            scrollEventInterceptor = try Interceptor(\n                event: scrollEventMask,\n                handleBy: scrollEventCallBack,\n                listenOn: .cgAnnotatedSessionEventTap,\n                placeAt: .tailAppendEventTap,\n                for: .listenOnly\n            )\n        } catch {\n            NSLog(\"[MonitorView] Create scroll interceptor failure: \\(error)\")\n        }\n    }\n    // 停止\n    func uninitScrollObserver() {\n        scrollEventInterceptor?.stop()\n    }\n    \n    // MARK: - 监听: 按键\n    var buttonEventInterceptor: Interceptor?\n    var buttonEventMask: CGEventMask {\n        ButtonCore.shared.leftDown |\n        ButtonCore.shared.rightDown |\n        ButtonCore.shared.otherDown |\n        ButtonCore.shared.keyDown |\n        ButtonCore.shared.flagsChanged\n    }\n    let buttonEventCallBack: CGEventTapCallBack = { (proxy, type, event, refcon) in\n        // 发送按钮事件通知\n        NotificationCenter.default.post(name: buttonEventName, object: event)\n        // 返回事件对象\n        return Unmanaged.passUnretained(event)\n    }\n    // 按钮日志\n    private var buttonEventLog: String = \"\"\n    private let maxButtonLogLines = 50\n    // 更新面板\n    @objc private func updateButtonEventData(notification: NSNotification) {\n        let event = notification.object as! CGEvent\n\n        // 添加按钮标识符信息到描述中\n        let logLine = \"[\\(event.timestampFormatted)] \\(event.displayName) keyCode: \\(event.keyCode), mouseCode: \\(event.mouseCode)\"\n\n        // 将新事件插入到日志开头，确保新事件在首行\n        var logLines = buttonEventLog.isEmpty ? [] : buttonEventLog.components(separatedBy: \"\\n\")\n        logLines.insert(logLine, at: 0)\n        \n        // 管理日志行数，保持最新的 maxButtonLogLines 行（从开头保留）\n        if logLines.count > maxButtonLogLines {\n            logLines = Array(logLines.prefix(maxButtonLogLines))\n        }\n        \n        buttonEventLog = logLines.joined(separator: \"\\n\")\n        \n        // 更新按钮事件专用日志文本框\n        DispatchQueue.main.async { [weak self] in\n            guard let strongSelf = self else { return }\n            \n            if let textView = strongSelf.buttonEventLogTextField {\n                // 使用专用按钮事件文本框\n                textView.string = strongSelf.buttonEventLog\n                // 滚动到顶部以显示最新插入的事件（在首行）\n                textView.scrollRangeToVisible(NSRange(location: 0, length: 0))\n            }\n        }\n    }\n    // 初始化\n    func initButtonObserver() {\n        // 监听内部事件\n        NotificationCenter.default.addObserver(self, selector: #selector(updateButtonEventData), name: buttonEventName, object: nil)\n        // 启动事件拦截\n        do {\n            buttonEventInterceptor = try Interceptor(\n                event: buttonEventMask,\n                handleBy: buttonEventCallBack,\n                listenOn: .cgAnnotatedSessionEventTap,\n                placeAt: .tailAppendEventTap,\n                for: .listenOnly\n            )\n        } catch {\n            NSLog(\"[MonitorView] Create button interceptor failure: \\(error)\")\n        }\n    }\n    // 停止\n    func uninitButtonObserver() {\n        buttonEventInterceptor?.stop()\n    }\n\n    // MARK: - 按键事件处理\n    func setupShortcutMenu() {\n        guard shortcutMenu != nil else {\n            NSLog(\"[MonitorView] shortcutMenu 未连接，无法构建菜单\")\n            return\n        }\n\n        // 使用 ShortcutManager 构建分级菜单\n        ShortcutManager.buildShortcutMenu(\n            into: shortcutMenu,\n            target: self,\n            action: #selector(onShortcutMenuItemSelected(_:))\n        )\n\n        // 设置默认选择 placeholder\n        shortcutPopUpButton?.selectItem(at: 0)\n    }\n    @objc func onShortcutMenuItemSelected(_ sender: NSMenuItem) {\n        guard let shortcut = sender.representedObject as? SystemShortcut.Shortcut else {\n            NSLog(\"[MonitorView] 无法获取快捷键信息\")\n            return\n        }\n        // 使用 ShortcutExecutor 触发快捷键\n        DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {\n            ShortcutExecutor.shared.execute(shortcut)\n        }\n    }\n    \n\n    // MARK: - 图表管理\n    // 初始化\n    func initCharts() {\n        // 定义颜色\n        let green = NSUIColor(red: 96.0/255.0, green: 198.0/255.0, blue: 85.0/255.0, alpha: 1.0)\n        let yellow = NSUIColor(red: 246.0/255.0, green: 191.0/255.0, blue: 79.0/255.0, alpha: 1.0)\n        let blue = NSUIColor(red: 52.0/255.0, green: 152.0/255.0, blue: 219.0/255.0, alpha: 1.0)\n        let purple = NSUIColor(red: 155.0/255.0, green: 89.0/255.0, blue: 182.0/255.0, alpha: 1.0)\n        let orange = NSUIColor(red: 230.0/255.0, green: 126.0/255.0, blue: 34.0/255.0, alpha: 1.0)\n        let red = NSUIColor(red: 231.0/255.0, green: 76.0/255.0, blue: 60.0/255.0, alpha: 1.0)\n        \n        // 设置代理\n        lineChart.delegate = self\n        // 初始化图表数据\n        lineChartCount = 0.0\n        \n        // 设置数据集\n        let verticalData = LineChartDataSet(entries: [ChartDataEntry(x: 0.0, y: 0.0)], label: \"Vertical\")\n        verticalData.valueTextColor = NSColor.labelColor\n        verticalData.colors = [green]\n        verticalData.circleRadius = 1.5\n        verticalData.circleColors = [green]\n        \n        let horizontalData = LineChartDataSet(entries: [ChartDataEntry(x: 0.0, y: 0.0)], label: \"Horizontal\")\n        horizontalData.valueTextColor = NSColor.labelColor\n        horizontalData.colors = [yellow]\n        horizontalData.circleRadius = 1.5\n        horizontalData.circleColors = [yellow]\n        \n        let isContinuousData = LineChartDataSet(entries: [ChartDataEntry(x: 0.0, y: 0.0)], label: \"IsContinuous\")\n        isContinuousData.valueTextColor = NSColor.labelColor\n        isContinuousData.colors = [blue]\n        isContinuousData.circleRadius = 1.5\n        isContinuousData.circleColors = [blue]\n        \n        let scrollCountData = LineChartDataSet(entries: [ChartDataEntry(x: 0.0, y: 0.0)], label: \"ScrollCount\")\n        scrollCountData.valueTextColor = NSColor.labelColor\n        scrollCountData.colors = [purple]\n        scrollCountData.circleRadius = 1.5\n        scrollCountData.circleColors = [purple]\n        \n        let scrollPhaseData = LineChartDataSet(entries: [ChartDataEntry(x: 0.0, y: 0.0)], label: \"ScrollPhase\")\n        scrollPhaseData.valueTextColor = NSColor.labelColor\n        scrollPhaseData.colors = [orange]\n        scrollPhaseData.circleRadius = 1.5\n        scrollPhaseData.circleColors = [orange]\n        \n        let momentumPhaseData = LineChartDataSet(entries: [ChartDataEntry(x: 0.0, y: 0.0)], label: \"MomentumPhase\")\n        momentumPhaseData.valueTextColor = NSColor.labelColor\n        momentumPhaseData.colors = [red]\n        momentumPhaseData.circleRadius = 1.5\n        momentumPhaseData.circleColors = [red]\n        \n        lineChart.data = LineChartData(dataSets: [verticalData, horizontalData, isContinuousData, scrollCountData, scrollPhaseData, momentumPhaseData])\n        \n        // 设置图表样式\n        lineChart.noDataTextColor = NSColor.labelColor\n        lineChart.chartDescription.text = \"\"\n        lineChart.legend.textColor = NSColor.labelColor\n        lineChart.xAxis.labelTextColor = NSColor.labelColor\n        lineChart.leftAxis.labelTextColor = NSColor.labelColor\n        lineChart.rightAxis.labelTextColor = NSColor.labelColor\n        lineChart.drawBordersEnabled = true\n        lineChart.borderColor = NSColor.secondaryLabelColor\n    }\n    // 刷新内容\n    @IBAction func refreshChart(_ sender: Any) {\n        initCharts()\n        // 清空按钮事件日志\n        buttonEventLog = \"\"\n        buttonEventLogTextField?.string = \"\"\n    }\n}\n"
  },
  {
    "path": "Mos/Windows/MonitorWindow/MonitorWindowController.swift",
    "content": "//\n//  MonitorWindowController.swift\n//  Mos\n//  滚动监控界面的容器 Window\n//  Created by Caldis on 2017/1/15.\n//  Copyright © 2017年 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nclass MonitorWindowController: NSWindowController, NSWindowDelegate {\n    \n    @IBOutlet weak var monitorWindow: NSWindow!\n    \n    func windowWillClose(_ notification: Notification) {\n        WindowManager.shared.hideWindow(withIdentifier: WINDOW_IDENTIFIER.monitorWindowController, destroy: true)\n    }\n    \n}\n"
  },
  {
    "path": "Mos/Windows/PreferencesWindow/AboutView/PreferencesAboutViewController.swift",
    "content": "//\n//  PreferencesAboutViewController.swift\n//  Mos\n//  关于界面\n//  Created by Caldis on 2017/1/21.\n//  Copyright © 2017年 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nclass PreferencesAboutViewController: NSViewController {\n    \n    // UI Elements\n    @IBOutlet weak var homePageButton: NSButtonCell!\n    @IBOutlet weak var githubButton: NSButton!\n    @IBOutlet weak var donateButton: NSButton!\n    // Constants\n    let version = Bundle.main.object(forInfoDictionaryKey: \"CFBundleShortVersionString\")!\n    \n    // 主页\n    @IBAction func homepageButtonClick(_ sender: NSButton) {\n        let homePageUrl = \"http://mos.caldis.me?from=MosApplication&version=\\(version as! String)\"\n        NSWorkspace.shared.open(URL(string:homePageUrl)!)\n    }\n    // 项目\n    @IBAction func githubButtonClick(_ sender: NSButton) {\n        NSWorkspace.shared.open(URL(string: \"https://github.com/Caldis/Mos?from=MosApplication&version=\\(version as! String)\")!)\n    }\n    // 贡献\n    @IBAction func contributorsListClick(_ sender: NSButtonCell) {\n        NSWorkspace.shared.open(URL(string: \"https://github.com/Caldis/Mos/graphs/contributors?from=MosApplication&version=\\(version as! String)\")!)\n    }\n    // 帮助\n    @IBAction func helpButtonClick(_ sender: NSButton) {\n        NSWorkspace.shared.open(URL(string: \"https://github.com/Caldis/Mos/wiki?from=MosApplication&version=\\(version as! String)\")!)\n    }\n    // 欢迎\n    @IBAction func welcomeWindowButtonClick(_ sender: NSButton) {\n        // 显示窗口\n        WindowManager.shared.showWindow(withIdentifier: WINDOW_IDENTIFIER.introductionWindowController, withTitle: \"\")\n        // 设置为手动打开标识，避免权限检查导致窗口自动关闭\n        if let windowController = WindowManager.shared.refs[WINDOW_IDENTIFIER.introductionWindowController] as? IntroductionWindowController,\n           let viewController = windowController.contentViewController as? IntroductionViewController {\n            viewController.setManuallyOpened(true)\n        }\n    }\n    \n}\n"
  },
  {
    "path": "Mos/Windows/PreferencesWindow/AboutView/PreferencesContributorsViewController.swift",
    "content": "//\n//  PreferencesContributorsViewController.swift\n//  Mos\n//  贡献者名单\n//  Created by Caldis on 2018/7/9.\n//  Copyright © 2018 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nclass PreferencesContributorsViewController: NSViewController {\n    \n    // 打开 Paypal 捐赠链接\n    @IBAction func contributorsListClick(_ sender: NSButtonCell) {\n        if let url = URL(string: \"https://github.com/Caldis/Mos/graphs/contributors\") {\n            NSWorkspace.shared.open(url)\n        }\n    }\n    \n}\n"
  },
  {
    "path": "Mos/Windows/PreferencesWindow/AboutView/PreferencesDonateViewController.swift",
    "content": "//\n//  PreferencesDonateViewCOntroller.swift\n//  Mos\n//  捐赠界面\n//  Created by Caldis on 2017/1/27.\n//  Copyright © 2017年 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nclass PreferencesDonateViewController: NSViewController {\n    // 打开肥猫链接\n    @IBAction func fatCatClick(_ sender: NSButton) {\n        let version = Bundle.main.object(forInfoDictionaryKey: \"CFBundleShortVersionString\")!\n        if let url = URL(string: \"https://meow.caldis.me?from=MosApplication&version=\\(version as! String)\") {\n            NSWorkspace.shared.open(url)\n        }\n    }\n    \n    // 打开 Paypal 捐赠链接\n    @IBAction func donateByPaypalClick(_ sender: NSButtonCell) {\n        if let url = URL(string: \"https://www.paypal.me/mosapp\") {\n            NSWorkspace.shared.open(url)\n        }\n    }\n\n    // 打开 Buy me a coffee 捐赠链接\n    @IBAction func donateByBuyMeACoffee(_ sender: NSButton) {\n        if let url = URL(string: \"https://buymeacoffee.com/caldis\") {\n            NSWorkspace.shared.open(url)\n        }\n    }\n}\n"
  },
  {
    "path": "Mos/Windows/PreferencesWindow/ApplicationView/Application.swift",
    "content": "//\n//  Application.swift\n//  Mos\n//  应用程序对象\n//  Created by Caldis on 2018/2/20.\n//  Copyright © 2018年 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nclass Application: Codable, Equatable {\n    \n    // 基础\n    var path: String // executablePath or bundlePath\n    // 配置: 名称\n    var displayName: String? = \"\" {\n        didSet { Options.shared.saveOptions() }\n    }\n    // 配置: 继承\n    var inherit = true {\n        didSet { Options.shared.saveOptions() }\n    }\n    // 配置: 滚动\n    var scroll = OPTIONS_SCROLL_DEFAULT() {\n        didSet { Options.shared.saveOptions() }\n    }\n    // 配置: 按钮绑定 (可选表示继承全局配置)\n    var buttons: OPTIONS_BUTTONS_DEFAULT? {\n        didSet { Options.shared.saveOptions() }\n    }\n    // 初始化\n    init(path: String) {\n        self.path = path\n    }\n    \n    // Codable\n    required init(from decoder: Decoder) throws {\n        let container = try decoder.container(keyedBy: CodingKeys.self)\n        // 基础\n        path = try container.decodeIfPresent(String.self, forKey: .path) ?? \"\"\n        // 名称\n        displayName = try container.decodeIfPresent(String.self, forKey: .displayName) ?? \"\"\n        // 继承\n        inherit = try container.decodeIfPresent(Bool.self, forKey: .inherit) ?? true\n        // 滚动\n        scroll = try container.decodeIfPresent(OPTIONS_SCROLL_DEFAULT.self, forKey: .scroll) ?? OPTIONS_SCROLL_DEFAULT()\n        // 按钮绑定\n        buttons = try container.decodeIfPresent(OPTIONS_BUTTONS_DEFAULT.self, forKey: .buttons)\n    }\n    \n    // Equatable\n    static func == (a: Application, b: Application) -> Bool {\n        return a.path == b.path\n    }\n}\n\n/**\n * 工具函数\n */\nextension Application {\n    // 基本信息\n    func getIcon() -> NSImage {\n        return Utils.getApplicationIcon(fromPath: path)\n    }\n    func getName() -> String {\n        if let name = displayName, name.count > 0 {\n            return name\n        }\n        return Utils.getApplicationName(fromPath: path)\n    }\n    // 配置\n    func getStep() -> Double {\n        return inherit ? Options.shared.scroll.step : scroll.step\n    }\n    func getSpeed() -> Double {\n        return inherit ? Options.shared.scroll.speed : scroll.speed\n    }\n    func getDuration() -> Double {\n        return inherit ? Options.shared.scroll.durationTransition : scroll.durationTransition\n    }\n    // 功能\n    func isSmooth(_ block: Bool) -> Bool {\n        if block { return false }\n        if !Options.shared.scroll.smooth { return false }\n        return resolvedScrollOptions().smooth\n    }\n    func isReverse() -> Bool {\n        if !Options.shared.scroll.reverse { return false }\n        return resolvedScrollOptions().reverse\n    }\n    func isReverseVertical() -> Bool {\n        if !Options.shared.scroll.reverse { return false }\n        if !Options.shared.scroll.reverseVertical { return false }\n        let target = resolvedScrollOptions()\n        return target.reverse && target.reverseVertical\n    }\n    func isReverseHorizontal() -> Bool {\n        if !Options.shared.scroll.reverse { return false }\n        if !Options.shared.scroll.reverseHorizontal { return false }\n        let target = resolvedScrollOptions()\n        return target.reverse && target.reverseHorizontal\n    }\n    func isSmoothVertical(_ block: Bool) -> Bool {\n        if block { return false }\n        if !Options.shared.scroll.smooth { return false }\n        if !Options.shared.scroll.smoothVertical { return false }\n        let target = resolvedScrollOptions()\n        return target.smooth && target.smoothVertical\n    }\n    func isSmoothHorizontal(_ block: Bool) -> Bool {\n        if block { return false }\n        if !Options.shared.scroll.smooth { return false }\n        if !Options.shared.scroll.smoothHorizontal { return false }\n        let target = resolvedScrollOptions()\n        return target.smooth && target.smoothHorizontal\n    }\n    // 按钮绑定\n    func getButtonBindings() -> [ButtonBinding] {\n        return buttons?.binding ?? Options.shared.buttons.binding\n    }\n}\n\nprivate extension Application {\n    func resolvedScrollOptions() -> OPTIONS_SCROLL_DEFAULT {\n        return inherit ? Options.shared.scroll : scroll\n    }\n}\n"
  },
  {
    "path": "Mos/Windows/PreferencesWindow/ApplicationView/PreferencesApplicationViewController.swift",
    "content": "//\n//  PreferencesApplicationViewController.swift\n//  Mos\n//  分应用设置界面\n//  Created by Caldis on 2017/1/29.\n//  Copyright © 2017年 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nclass PreferencesApplicationViewController: NSViewController {\n    \n    // MARK: - UI Elements\n    // 白名单\n    @IBOutlet weak var allowlistModeCheckBox: NSButton!\n    // 表格\n    @IBOutlet weak var tableHead: NSVisualEffectView!\n    @IBOutlet weak var tableView: NSTableView!\n    @IBOutlet weak var tableFoot: NSView!\n    @IBOutlet weak var tableEmpty: NSView!\n    // 按钮\n    @IBOutlet weak var createButton: PrimaryButton!\n    @IBOutlet weak var addButton: NSButton!\n    @IBOutlet weak var delButton: NSButton!\n    // 选项菜单\n    @IBOutlet var applicationSourceMenuControl: NSMenu!\n    @IBOutlet weak var runningAndInstalledManuItem: NSMenuItem!\n    private var runningAndInstalledMenuChildrenContainer: NSMenu!\n    @IBOutlet weak var manuallySelectFromFinderMenuItem: NSMenuItem!\n\n    override func viewDidLoad() {\n        // 为 \"Running Applications\" 菜单项动态创建 submenu (避免 Storyboard 中的 menu 父子关系警告)\n        runningAndInstalledMenuChildrenContainer = NSMenu(title: \"\")\n        runningAndInstalledManuItem.submenu = runningAndInstalledMenuChildrenContainer\n        // 设置图标\n        Utils.attachImage(to: runningAndInstalledManuItem, withImage: #imageLiteral(resourceName: \"SF.wand.and.rays.inverse\"))\n        Utils.attachImage(to: manuallySelectFromFinderMenuItem, withImage: #imageLiteral(resourceName: \"SF.tray\"))\n        // 设置表格代理\n        tableView.delegate = self\n        // 读取设置\n        syncViewWithOptions()\n        // 初始化按钮状态\n        updateDelButtonState()\n    }\n    override func viewWillAppear() {\n        // 检查表格数据\n        toggleNoDataHint()\n        // 设置添加按钮回调\n        setupAddButtonCallback()\n    }\n    \n    // 主添加按钮\n    private func setupAddButtonCallback() {\n        createButton.onMouseDown = { [weak self] _ in\n            guard let self = self else { return }\n            guard let sender = self.createButton else { return }\n            let position = NSPoint(x: sender.frame.origin.x - 40, y: sender.frame.origin.y - 44)\n            self.openRunningApplicationPanel(sender, position)\n            self.tableView.reloadData()\n        }\n    }\n    \n    // 白名单模式\n    @IBAction func allowListModeClick(_ sender: NSButton) {\n        Options.shared.application.allowlist = sender.state.rawValue==0 ? false : true\n        syncViewWithOptions()\n    }\n    \n    // 列表底部按钮\n    @IBAction func addItemClick(_ sender: NSButton) {\n        // 添加\n        let position = NSPoint(x: sender.frame.origin.x - 3, y: sender.frame.origin.y + 10)\n        openRunningApplicationPanel(sender, position)\n        // 重新加载\n        tableView.reloadData()\n    }\n    @IBAction func addItemFromFinderClick(_ sender: NSMenuItem) {\n        // 添加\n        openFileSelectionPanel()\n        // 重新加载\n        tableView.reloadData()\n    }\n    @IBAction func removeItemClick(_ sender: NSButton) {\n        // 确保选择了行\n        guard tableView.selectedRow != -1 else { return }\n        // 删除\n        Options.shared.application.applications.remove(at: tableView.selectedRow)\n        // 重新加载\n        tableView.reloadData()\n        // 立即更新空状态显示\n        toggleNoDataHint()\n        // 更新删除按钮状态\n        updateDelButtonState()\n    }\n}\n\n/**\n * 数据持久化\n **/\nextension PreferencesApplicationViewController {\n    // 同步界面与设置参数\n    func syncViewWithOptions() {\n        // 白名单\n        allowlistModeCheckBox.state = NSControl.StateValue(rawValue: Options.shared.application.allowlist ? 1 : 0)\n    }\n    \n    // 更新删除按钮状态\n    func updateDelButtonState() {\n        delButton.isEnabled = tableView.selectedRow != -1\n    }\n}\n\n/**\n * 表格区域渲染及操作\n **/\nextension PreferencesApplicationViewController: NSTableViewDelegate, NSTableViewDataSource {\n    // 每一列在 Storybroad 中的 identifier\n    fileprivate enum CellIdentifiers {\n        static let applicationCell = \"applicationCell\"\n        static let scrollingCell = \"scrollingCell\"\n    }\n    // 切换无数据显示\n    func toggleNoDataHint() {\n        let hasData = Options.shared.application.applications.count != 0\n        updateViewVisibility(view: createButton, visible: !hasData)\n        updateViewVisibility(view: tableEmpty, visible: !hasData)\n        updateViewVisibility(view: tableHead, visible: hasData)\n        updateViewVisibility(view: tableFoot, visible: hasData)\n    }\n    private func updateViewVisibility(view: NSView, visible: Bool) {\n        view.isHidden = !visible\n        view.animator().alphaValue = visible ? 1 : 0\n    }\n    // 点击设置\n    @objc func settingScrollingButtonClick(_ sender: NSButton!) {\n        // 行号\n        let row = sender.tag\n        // 从 SB 构建内容\n        let scrollingWithApplicationViewController = Utils.instantiateControllerFromStoryboard(withIdentifier: PANEL_IDENTIFIER.scrollingWithApplication) as PreferencesScrollingWithApplicationViewController\n        // 更新目标数据\n        scrollingWithApplicationViewController.updateTargetApplication(with: Options.shared.application.applications.get(by: row))\n        scrollingWithApplicationViewController.updateParentData(with: tableView, for: row)\n        // 展示到指定位置\n        present(scrollingWithApplicationViewController, asPopoverRelativeTo: sender.bounds, of: sender, preferredEdge: NSRectEdge.maxX, behavior: NSPopover.Behavior.transient)\n    }\n    // 构建表格数据 (循环生成行)\n    func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {\n        guard let tableColumnIdentifier = tableColumn?.identifier,\n              let cell = tableView.makeView(withIdentifier: tableColumnIdentifier, owner: self) as? NSTableCellView,\n              let application = Options.shared.application.applications.get(by: row) else {\n            return nil\n        }\n        // 生成每行的 Cell\n        switch tableColumnIdentifier.rawValue {\n            // 应用\n            case CellIdentifiers.applicationCell:\n                cell.imageView?.image = application.getIcon()\n                cell.imageView?.toolTip = application.path\n                cell.textField?.stringValue = application.getName()\n                return cell\n            // 设定: 滚动\n            case CellIdentifiers.scrollingCell:\n                let button = cell.subviews[0] as! NSButton\n                button.tag = row\n                button.target = self\n                button.action = #selector(settingScrollingButtonClick)\n                return cell\n            default: break\n        }\n        return nil\n    }\n    // 行高\n    func tableView(_ tableView: NSTableView, heightOfRow row: Int) -> CGFloat {\n        return 30\n    }\n    // 行数\n    func numberOfRows(in tableView: NSTableView) -> Int {\n        return Options.shared.application.applications.count\n    }\n    \n    // 选择变化\n    func tableViewSelectionDidChange(_ notification: Notification) {\n        updateDelButtonState()\n    }\n}\n\n\n\n/**\n * 应用添加/删除控制\n */\nextension PreferencesApplicationViewController: NSMenuDelegate {\n\n    // 打开文件选择窗口\n    func openFileSelectionPanel() {\n        let openPanel = NSOpenPanel()\n        // 默认打开的目录 (/Application)\n        openPanel.directoryURL = FileManager.default.urls(for: .applicationDirectory, in: .localDomainMask).first!\n        // 禁止选择文件夹\n        openPanel.canChooseDirectories = false\n        // 允许选择文件\n        openPanel.canChooseFiles = true\n        // 不允许复数选择\n        openPanel.allowsMultipleSelection = false\n        // 允许的文件类型\n        // openPanel.allowedFileTypes = [\"app\", \"App\", \"APP\"]\n        // 打开文件选择窗口并读取文件添加到 Applications 列表中\n        openPanel.beginSheetModal(for: view.window!, completionHandler: { result in\n            if result.rawValue == NSApplication.ModalResponse.OK.rawValue && result == NSApplication.ModalResponse.OK {\n                // 根据路径获取 application 信息并保存到 Applications 列表中\n                if let bundlePath = openPanel.url?.path {\n                    self.appendApplicationWith(path: bundlePath)\n                }\n            }\n        })\n    }\n\n    // 初始化菜单\n    func openRunningApplicationPanel(_ targetView: NSView, _ targetPosition: NSPoint) {\n        // 清除已有\n        runningAndInstalledMenuChildrenContainer.removeAllItems()\n        // 初始化 Running 应用\n        for runningApplication in NSWorkspace.shared.runningApplications {\n            guard runningApplication.activationPolicy == .regular else { continue }\n            let icon = Utils.getApplicationIcon(fromPath: runningApplication.bundleURL?.path)\n            let name = Utils.getApplicationName(fromPath: runningApplication.executableURL?.path)\n            let isExist = ScrollUtils.shared.getTargetApplication(from: runningApplication) !== nil\n            Utils.addMenuItem(\n                to: runningAndInstalledMenuChildrenContainer,\n                title: name,\n                icon: icon,\n                action: #selector(appendApplicationWithRunningApplication),\n                target: isExist ? nil : self,\n                represent: runningApplication\n            )\n        }\n        // 显示菜单\n        applicationSourceMenuControl.popUp(positioning: nil, at: targetPosition, in: targetView)\n    }\n    \n    // 添加应用\n    func appendApplicationWith(path: String) {\n        let application = Application(path: path)\n        Options.shared.application.applications.append(application)\n        tableView.reloadData()\n        toggleNoDataHint()\n    }\n    @objc func appendApplicationWithRunningApplication(_ sender: NSMenuItem!) {\n        guard let runningApplication = sender.representedObject as? NSRunningApplication else { return }\n        guard let executablePath = runningApplication.executableURL?.path else { return }\n        appendApplicationWith(path: executablePath)\n    }\n}\n"
  },
  {
    "path": "Mos/Windows/PreferencesWindow/ButtonsView/ButtonTableCellView.swift",
    "content": "//\n//  ButtonTableCellView 2.swift\n//  Mos\n//\n//  Created by 陈标 on 2025/9/27.\n//  Copyright © 2025 Caldis. All rights reserved.\n//\n\n\nimport Cocoa\n\nclass ButtonTableCellView: NSTableCellView, NSMenuDelegate {\n\n    // MARK: - IBOutlets\n    @IBOutlet weak var keyDisplayContainerView: NSView!\n    @IBOutlet weak var actionPopUpButton: NSPopUpButton!\n\n    // MARK: - UI Components\n    private var keyPreview: KeyPreview!\n    private var dashedLineLayer: CAShapeLayer?\n\n    // MARK: - Callbacks\n    private var onShortcutSelected: ((SystemShortcut.Shortcut?) -> Void)?\n    private var onDeleteRequested: (() -> Void)?\n\n    // MARK: - Data (只用于UI显示)\n    private var currentShortcut: SystemShortcut.Shortcut?\n    private var originalRowBackgroundColor: NSColor?\n\n    // MARK: - 配置方法\n    func configure(\n        with binding: ButtonBinding,\n        onShortcutSelected: @escaping (SystemShortcut.Shortcut?) -> Void,\n        onDeleteRequested: @escaping () -> Void\n    ) {\n        // 保存回调\n        self.onShortcutSelected = onShortcutSelected\n        self.onDeleteRequested = onDeleteRequested\n        self.currentShortcut = binding.systemShortcut\n\n        // 保存原始背景色（首次或复用时）\n        if originalRowBackgroundColor == nil, let rowView = self.superview as? NSTableRowView {\n            originalRowBackgroundColor = rowView.backgroundColor\n        }\n\n        // 配置按键显示组件\n        setupKeyDisplayView(with: binding.triggerEvent)\n\n        // 判断是否为 Logi 按键 (code >= 1000)\n        let isLogiTrigger = binding.triggerEvent.type == .mouse && LogitechCIDMap.isLogitechCode(binding.triggerEvent.code)\n\n        // 配置动作选择器\n        setupActionPopUpButton(currentShortcut: binding.systemShortcut, showLogiActions: isLogiTrigger)\n\n        // 绘制虚线分隔符(延迟到下一个 runloop,等 AutoLayout 完成布局)\n        DispatchQueue.main.async {\n            self.setupDashedLine()\n        }\n    }\n\n    // 高亮该行（重复两次）\n    func highlight() {\n        guard let rowView = self.superview as? NSTableRowView else { return }\n        // 设置主题色高亮\n        let highlightColor: NSColor\n        if #available(macOS 10.14, *) {\n            highlightColor = NSColor.controlAccentColor.withAlphaComponent(1)\n        } else {\n            highlightColor = NSColor.mainBlue\n        }\n        let originalColor = originalRowBackgroundColor ?? rowView.backgroundColor\n        // 高亮\n        rowView.backgroundColor = highlightColor\n        // 恢复\n        NSAnimationContext.runAnimationGroup({ context in\n            context.duration = 1.5\n            rowView.animator().backgroundColor = originalColor\n        })\n    }\n\n    // 创建按键视图\n    private func setupKeyDisplayView(with recordedEvent: RecordedEvent) {\n        // 清理旧的子视图（复用 cell 时会有残留）\n        keyDisplayContainerView.subviews.forEach { $0.removeFromSuperview() }\n\n        // 创建新的 KeyDisplayView\n        keyPreview = KeyPreview()\n        keyDisplayContainerView.addSubview(keyPreview)\n\n        // 靠左对齐，按内容尺寸显示\n        NSLayoutConstraint.activate([\n            keyPreview.leadingAnchor.constraint(equalTo: keyDisplayContainerView.leadingAnchor),\n            keyPreview.centerYAnchor.constraint(equalTo: keyDisplayContainerView.centerYAnchor),\n        ])\n\n        // 设置事件内容\n        keyPreview.update(from: recordedEvent.displayComponents, status: .normal)\n    }\n\n    /// 绘制虚线分隔符\n    ///\n    /// 在 keyPreview 和 actionPopUpButton 之间绘制垂直居中的虚线\n    /// 虚线使用淡灰色,兼容 macOS 10.13+\n    private func setupDashedLine() {\n        // 清理旧的虚线层(Cell复用时)\n        dashedLineLayer?.removeFromSuperlayer()\n\n        // 获取父容器层级\n        guard let keyBox = keyDisplayContainerView.superview,\n              let contentView = keyBox.superview else {\n            return\n        }\n\n        // 确保 contentView 有 layer（Core Animation 必需）\n        contentView.wantsLayer = true\n\n        // 计算虚线的起点和终点坐标\n        // 需要将 keyPreview 的坐标从 keyDisplayContainerView 转换到 contentView 坐标系\n        let keyPreviewFrameInContentView = keyDisplayContainerView.convert(keyPreview.frame, to: contentView)\n        let buttonFrame = actionPopUpButton.frame\n\n        // 左右边距\n        let horizontalMargin: CGFloat = 8.0\n\n        // 起点: keyPreview 右边缘 + 边距\n        let startX = keyPreviewFrameInContentView.maxX + horizontalMargin\n        // 终点: actionPopUpButton 左边缘 - 边距\n        let endX = buttonFrame.minX - horizontalMargin\n        // 垂直居中\n        let centerY = contentView.bounds.height / 2\n\n        // 创建虚线路径\n        let path = CGMutablePath()\n        path.move(to: CGPoint(x: startX, y: centerY))\n        path.addLine(to: CGPoint(x: endX, y: centerY))\n\n        // 创建 CAShapeLayer 绘制虚线\n        let shapeLayer = CAShapeLayer()\n        shapeLayer.path = path\n        shapeLayer.strokeColor = NSColor.getMainLightBlack(for: self).cgColor\n        shapeLayer.lineWidth = 1.0\n        shapeLayer.lineDashPattern = [2, 2]  // 虚线样式: 4pt 实线, 4pt 间隔\n\n        // 添加到 contentView 的 layer\n        contentView.layer?.addSublayer(shapeLayer)\n\n        // 保存引用,便于下次清理\n        dashedLineLayer = shapeLayer\n    }\n\n    /// 设置动作选择器 PopUpButton\n    ///\n    /// 关键设计：\n    /// 1. 每次配置创建新的 NSMenu 实例，避免 cell 复用时共享状态\n    /// 2. 默认禁用所有菜单项的 keyEquivalent，防止与 ButtonCore 触发的快捷键冲突\n    /// 3. 通过 NSMenuDelegate 在菜单打开时临时启用 keyEquivalent（显示快捷键样式）\n    private func setupActionPopUpButton(currentShortcut: SystemShortcut.Shortcut?, showLogiActions: Bool = false) {\n        // 每次配置时创建新的 menu，避免 cell 复用时共享状态\n        let menu = NSMenu()\n        menu.delegate = self\n\n        // 使用 ShortcutManager 构建菜单\n        ShortcutManager.buildShortcutMenu(\n            into: menu,\n            target: self,\n            action: #selector(shortcutSelected(_:)),\n            showLogiActions: showLogiActions\n        )\n\n        // 初始状态禁用所有 keyEquivalent，防止意外触发\n        // 只在菜单打开时（menuWillOpen）临时启用，以显示快捷键样式\n        disableKeyEquivalents(in: menu)\n\n        // 替换 PopUpButton 的 menu\n        actionPopUpButton.menu = menu\n\n        // 设置当前选择\n        if let shortcut = currentShortcut {\n            selectShortcutInMenu(shortcut)\n        } else {\n            setPlaceholderToUnbound()\n        }\n    }\n    \n    // MARK: - 私有方法\n\n    /// 在菜单中选中指定的快捷键\n    private func selectShortcutInMenu(_ shortcut: SystemShortcut.Shortcut) {\n        guard let menu = actionPopUpButton.menu else {\n            NSLog(\"[ButtonTableCellView] 无法获取菜单\")\n            return\n        }\n\n        // 在子菜单中查找匹配的快捷键\n        for categoryItem in menu.items {\n            guard let subMenu = categoryItem.submenu else { continue }\n\n            for shortcutItem in subMenu.items {\n                if let itemShortcut = shortcutItem.representedObject as? SystemShortcut.Shortcut,\n                   itemShortcut == shortcut {\n                    // 将快捷键的标题和图标复制到占位符,然后选中占位符\n                    setCustomTitle(shortcutItem.title, image: shortcutItem.image)\n                    return\n                }\n            }\n        }\n    }\n\n    /// 手动设置 PopUpButton 的显示标题和图标\n    private func setCustomTitle(_ title: String, image: NSImage?) {\n        guard let menu = actionPopUpButton.menu,\n              let placeholderItem = menu.items.first else {\n            return\n        }\n\n        // 更新占位符的标题为选中的快捷键\n        placeholderItem.title = title\n\n        // 品牌动作: 在图标前添加品牌 tag\n        if let brand = BrandTag.brandForAction(currentShortcut?.identifier ?? \"\") {\n            placeholderItem.image = BrandTag.createPrefixedImage(brand: brand, original: image)\n        } else if let originalImage = image {\n            placeholderItem.image = createImageWithTrailingSpace(originalImage)\n        } else {\n            placeholderItem.image = nil\n        }\n\n        // 选中占位符项\n        actionPopUpButton.selectItem(at: 0)\n    }\n\n    /// 创建带右侧边距的图标 (用于 PopUpButton 显示)\n    private func createImageWithTrailingSpace(_ originalImage: NSImage) -> NSImage {\n        let spacing: CGFloat = 2.0  // 右侧边距\n        let originalSize = originalImage.size\n        let newSize = NSSize(width: originalSize.width + spacing, height: originalSize.height)\n\n        let newImage = NSImage(size: newSize)\n        newImage.lockFocus()\n\n        // 在左侧绘制原始图标,右侧留白\n        originalImage.draw(\n            in: NSRect(x: 0, y: 0, width: originalSize.width, height: originalSize.height),\n            from: NSRect(origin: .zero, size: originalSize),\n            operation: .sourceOver,\n            fraction: 1.0\n        )\n\n        newImage.unlockFocus()\n\n        // template 模式,确保图标能适配系统颜色\n        newImage.isTemplate = originalImage.isTemplate\n\n        return newImage\n    }\n\n    /// 设置占位符为\"未绑定\"状态\n    private func setPlaceholderToUnbound() {\n        setCustomTitle(NSLocalizedString(\"unbound\", comment: \"\"), image: nil)\n    }\n\n    // MARK: - Actions\n\n    /// 快捷键选择回调\n    @objc private func shortcutSelected(_ sender: NSMenuItem) {\n        // representedObject 为 nil 时表示用户选择了\"未绑定\"\n        let shortcut = sender.representedObject as? SystemShortcut.Shortcut\n\n        // 更新本地状态\n        self.currentShortcut = shortcut\n\n        // 更新占位符显示\n        if shortcut != nil {\n            // 选择了具体快捷键,复制标题和图标到占位符\n            setCustomTitle(sender.title, image: sender.image)\n        } else {\n            // 选择了\"未绑定\",设置占位符为未绑定状态\n            setPlaceholderToUnbound()\n        }\n\n        // 通知外部更新(nil 表示清除绑定)\n        onShortcutSelected?(shortcut)\n\n        // 延迟重绘虚线 (等待 PopUpButton 布局更新)\n        DispatchQueue.main.async {\n            self.setupDashedLine()\n        }\n    }\n\n    /// 删除绑定\n    @objc private func deleteRecord(_ sender: NSButton) {\n        onDeleteRequested?()\n    }\n}\n\n// MARK: - NSMenuDelegate\n/// 通过动态管理  keyEquivalent  解决冲突问题：\n///\n/// 问题：ButtonCore 触发快捷键时（如 ⌃→），NSMenu 会响应相同的 keyEquivalent，\n///      导致错首行作为 firstResponsor 会将 popover 变为所按的快捷键\n///\n/// 解决方案：\n/// - 菜单关闭时：禁用所有 keyEquivalent，防止意外触发\n/// - 菜单打开时：启用 keyEquivalent，显示快捷键样式\nextension ButtonTableCellView {\n\n    func menuWillOpen(_ menu: NSMenu) {\n        // 动态调整菜单结构\n        adjustMenuStructure(menu)\n        // 启用 keyEquivalent\n        enableKeyEquivalents(in: menu)\n    }\n\n    func menuDidClose(_ menu: NSMenu) {\n        disableKeyEquivalents(in: menu)\n    }\n\n    /// 根据当前状态动态调整菜单结构\n    ///\n    /// 根据绑定状态动态调整菜单显示:\n    /// - 未绑定时: 隐藏占位符和第一条分割线,菜单只显示\"未绑定\"选项\n    /// - 已绑定时: 显示占位符和第一条分割线,将菜单项改为\"取消绑定\"\n    ///\n    /// 这样避免了\"未绑定\"选项重复显示的问题\n    private func adjustMenuStructure(_ menu: NSMenu) {\n        guard menu.items.count >= 3 else { return }\n\n        let placeholderItem = menu.items[0]  // 占位符\n        let firstSeparator = menu.items[1]   // 第一条分割线\n        let unboundItem = menu.items[2]      // \"未绑定\"/\"取消绑定\"菜单项\n\n        if currentShortcut == nil {\n            // 当前是未绑定状态:隐藏占位符和第一条分割线,显示\"未绑定\"\n            placeholderItem.isHidden = true\n            firstSeparator.isHidden = true\n            unboundItem.title = NSLocalizedString(\"unbound\", comment: \"\")\n        } else {\n            // 当前已绑定:显示占位符和第一条分割线,显示\"取消绑定\"\n            placeholderItem.isHidden = false\n            firstSeparator.isHidden = false\n            unboundItem.title = NSLocalizedString(\"unbind\", comment: \"\")\n        }\n    }\n\n    /// 递归启用菜单的 keyEquivalent（从 representedObject 恢复）\n    private func enableKeyEquivalents(in menu: NSMenu) {\n        for item in menu.items {\n            if let shortcut = item.representedObject as? SystemShortcut.Shortcut {\n                let keyEquivalent = shortcut.keyEquivalent\n                item.keyEquivalent = keyEquivalent.keyEquivalent\n                item.keyEquivalentModifierMask = keyEquivalent.modifierMask\n            }\n\n            if let submenu = item.submenu {\n                enableKeyEquivalents(in: submenu)\n            }\n        }\n    }\n\n    /// 递归禁用菜单的 keyEquivalent\n    private func disableKeyEquivalents(in menu: NSMenu) {\n        for item in menu.items {\n            item.keyEquivalent = \"\"\n            item.keyEquivalentModifierMask = []\n\n            if let submenu = item.submenu {\n                disableKeyEquivalents(in: submenu)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Mos/Windows/PreferencesWindow/ButtonsView/PreferencesButtonsViewController.swift",
    "content": "//\n//  PreferencesButtonsViewController.swift\n//  Mos\n//  按钮绑定配置界面\n//  Created by Claude on 2025/8/10.\n//  Copyright © 2025年 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nclass PreferencesButtonsViewController: NSViewController {\n\n    // MARK: - Recorder\n    private var recorder = KeyRecorder()\n\n    // MARK: - Data\n    private var buttonBindings: [ButtonBinding] = []\n\n    // MARK: - UI Elements\n    // 表格\n    @IBOutlet weak var tableHead: NSVisualEffectView!\n    @IBOutlet weak var tableView: NSTableView!\n    @IBOutlet weak var tableEmpty: NSView!\n    @IBOutlet weak var tableFoot: NSView!\n    // 按钮\n    @IBOutlet weak var createButton: PrimaryButton!\n    @IBOutlet weak var addButton: NSButton!\n    @IBOutlet weak var delButton: NSButton!\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        // 设置代理\n        recorder.delegate = self\n        tableView.delegate = self\n        tableView.dataSource = self\n        // 读取设置\n        loadOptionsToView()\n    }\n    \n    override func viewWillAppear() {\n        // 检查表格数据\n        toggleNoDataHint()\n        // 设置录制按钮回调\n        setupRecordButtonCallback()\n    }\n\n    // 添加\n    @IBAction func addItemClick(_ sender: NSButton) {\n        recorder.startRecording(from: sender)\n    }\n    // 删除\n    @IBAction func removeItemClick(_ sender: NSButton) {\n        // 确保选择了行\n        guard tableView.selectedRow != -1 else { return }\n        // 统一通过 removeButtonBinding 处理删除逻辑\n        let binding = buttonBindings[tableView.selectedRow]\n        removeButtonBinding(id: binding.id)\n        // 更新删除按钮状态\n        updateDelButtonState()\n    }\n}\n\n/**\n * 数据持久化\n **/\nextension PreferencesButtonsViewController {\n    // 从 Options 加载到界面\n    func loadOptionsToView() {\n        buttonBindings = Options.shared.buttons.binding\n        tableView.reloadData()\n        toggleNoDataHint()\n    }\n\n    // 保存界面到 Options, 并同步 divert 状态\n    func syncViewWithOptions() {\n        Options.shared.buttons.binding = buttonBindings\n        // 绑定变更后同步 HID++ divert: 只 divert 有绑定的按键\n        LogitechHIDManager.shared.syncDivertWithBindings()\n    }\n\n    // 更新删除按钮状态\n    func updateDelButtonState() {\n        delButton.isEnabled = tableView.selectedRow != -1\n    }\n\n    // 设置录制按钮回调\n    private func setupRecordButtonCallback() {\n        createButton.onMouseDown = { [weak self] target in\n            self?.recorder.startRecording(from: target)\n        }\n    }\n    \n    private func addRecordedEvent(_ event: MosInputEvent, isDuplicate: Bool) {\n        let recordedEvent = RecordedEvent(from: event)\n\n        if isDuplicate {\n            if let existing = buttonBindings.first(where: { $0.triggerEvent == recordedEvent }) {\n                highlightExistingRow(with: existing.id)\n            }\n            return\n        }\n\n        let binding = ButtonBinding(triggerEvent: recordedEvent, systemShortcutName: \"\", isEnabled: false)\n        buttonBindings.append(binding)\n        tableView.reloadData()\n        toggleNoDataHint()\n        syncViewWithOptions()\n    }\n\n    // 高亮已存在的行 (用于重复录制的视觉反馈)\n    private func highlightExistingRow(with id: UUID) {\n        guard let row = buttonBindings.firstIndex(where: { $0.id == id }) else { return }\n        tableView.deselectAll(nil)\n        tableView.scrollRowToVisible(row)\n        if let cellView = tableView.view(atColumn: 0, row: row, makeIfNecessary: false) as? ButtonTableCellView {\n            cellView.highlight()\n        }\n    }\n\n    // 删除按钮绑定\n    func removeButtonBinding(id: UUID) {\n        buttonBindings.removeAll(where: { $0.id == id })\n        tableView.reloadData()\n        toggleNoDataHint()\n        syncViewWithOptions()\n    }\n\n    /// 更新按钮绑定\n    /// - Parameters:\n    ///   - id: 绑定记录的唯一标识\n    ///   - shortcut: 系统快捷键对象,nil 表示清除绑定\n    func updateButtonBinding(id: UUID, with shortcut: SystemShortcut.Shortcut?) {\n        guard let index = buttonBindings.firstIndex(where: { $0.id == id }) else { return }\n\n        let oldBinding = buttonBindings[index]\n\n        let updatedBinding: ButtonBinding\n        if let shortcut = shortcut {\n            // 绑定快捷键:直接使用快捷键的 identifier\n            updatedBinding = ButtonBinding(\n                id: oldBinding.id,\n                triggerEvent: oldBinding.triggerEvent,\n                systemShortcutName: shortcut.identifier,\n                isEnabled: true\n            )\n        } else {\n            // 清除绑定:保持触发事件,清空快捷键名称并禁用\n            updatedBinding = ButtonBinding(\n                id: oldBinding.id,\n                triggerEvent: oldBinding.triggerEvent,\n                systemShortcutName: \"\",\n                isEnabled: false\n            )\n        }\n\n        buttonBindings[index] = updatedBinding\n        syncViewWithOptions()\n    }\n}\n\n/**\n * 表格区域渲染及操作\n **/\nextension PreferencesButtonsViewController: NSTableViewDelegate, NSTableViewDataSource {\n    // 无数据\n    func toggleNoDataHint() {\n        let hasData = buttonBindings.count != 0\n        updateViewVisibility(view: createButton, visible: !hasData)\n        updateViewVisibility(view: tableEmpty, visible: !hasData)\n        updateViewVisibility(view: tableHead, visible: hasData)\n        updateViewVisibility(view: tableFoot, visible: hasData)\n    }\n    private func updateViewVisibility(view: NSView, visible: Bool) {\n        view.isHidden = !visible\n        view.animator().alphaValue = visible ? 1 : 0\n    }\n    \n    // 表格数据源\n    func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {\n        guard let tableColumnIdentifier = tableColumn?.identifier else { return nil }\n\n        // 创建 Cell\n        if let cell = tableView.makeView(withIdentifier: tableColumnIdentifier, owner: self) as? ButtonTableCellView {\n            let binding = buttonBindings[row]\n\n            cell.configure(\n                with: binding,\n                onShortcutSelected: { [weak self] shortcut in\n                    self?.updateButtonBinding(id: binding.id, with: shortcut)\n                },\n                onDeleteRequested: { [weak self] in\n                    self?.removeButtonBinding(id: binding.id)\n                }\n            )\n            return cell\n        }\n\n        return nil\n    }\n    \n    // 行高\n    func tableView(_ tableView: NSTableView, heightOfRow row: Int) -> CGFloat {\n        return 44\n    }\n    \n    // 行数\n    func numberOfRows(in tableView: NSTableView) -> Int {\n        return buttonBindings.count\n    }\n\n    // 选择变化\n    func tableViewSelectionDidChange(_ notification: Notification) {\n        updateDelButtonState()\n    }\n\n    // Type Selection 支持\n    func tableView(_ tableView: NSTableView, typeSelectStringFor tableColumn: NSTableColumn?, row: Int) -> String? {\n        guard row < buttonBindings.count else { return nil }\n        let components = buttonBindings[row].triggerEvent.displayComponents\n        // 去掉第一项（修饰键），只保留实际按键用于匹配\n        let keyOnly = components.count > 1 ? Array(components.dropFirst()) : components\n        return keyOnly.joined(separator: \" \")\n    }\n}\n\n// MARK: - EventRecorderDelegate\nextension PreferencesButtonsViewController: KeyRecorderDelegate {\n    func validateRecordedEvent(_ recorder: KeyRecorder, event: MosInputEvent) -> Bool {\n        let recordedEvent = RecordedEvent(from: event)\n        return !buttonBindings.contains(where: { $0.triggerEvent == recordedEvent })\n    }\n\n    func onEventRecorded(_ recorder: KeyRecorder, didRecordEvent event: MosInputEvent, isDuplicate: Bool) {\n        DispatchQueue.main.asyncAfter(deadline: .now() + 0.66) { [weak self] in\n            self?.addRecordedEvent(event, isDuplicate: isDuplicate)\n        }\n    }\n}\n"
  },
  {
    "path": "Mos/Windows/PreferencesWindow/ButtonsView/RecordedEvent.swift",
    "content": "//\n//  RecordedEvent.swift\n//  Mos\n//  按钮绑定数据结构, 包含三部分\n//  - EventType: 事件类型枚举 (键盘/鼠标), 供 RecordedEvent 和 ScrollHotkey 共用\n//  - ScrollHotkey: 滚动热键绑定, 仅存储类型和按键码\n//  - RecordedEvent: 录制后的 CGEvent 事件的完整信息, 包含修饰键和展示组件\n//  - ButtonBinding: 用于存储 RecordedEvent - SystemShortcut 的绑定关系\n//  Created by Claude on 2025/9/27.\n//  Copyright © 2025年 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\n// MARK: - EventType\n/// 事件类型枚举 - 键盘或鼠标\nenum EventType: String, Codable {\n    case keyboard = \"keyboard\"\n    case mouse = \"mouse\"\n}\n\n// MARK: - ScrollHotkey\n/// 滚动热键绑定 - 轻量结构，仅存储类型和按键码\n/// 用于 ScrollingView 的 dash/toggle/block 热键配置\nstruct ScrollHotkey: Codable, Equatable {\n\n    // MARK: - 数据字段\n    let type: EventType\n    let code: UInt16\n\n    // MARK: - 初始化\n    init(type: EventType, code: UInt16) {\n        self.type = type\n        self.code = code\n    }\n\n    init(from event: CGEvent) {\n        // 键盘事件 (keyDown/keyUp) 或修饰键事件 (flagsChanged)\n        if event.isKeyboardEvent || event.type == .flagsChanged {\n            self.type = .keyboard\n            self.code = event.keyCode\n        } else {\n            self.type = .mouse\n            self.code = event.mouseCode\n        }\n    }\n\n    /// 从旧版 Int 格式迁移 (向后兼容)\n    init?(legacyCode: Int?) {\n        guard let code = legacyCode else { return nil }\n        self.type = .keyboard\n        self.code = UInt16(code)\n    }\n\n    // MARK: - 显示名称\n    var displayName: String {\n        switch type {\n        case .keyboard:\n            return KeyCode.keyMap[code] ?? \"Key \\(code)\"\n        case .mouse:\n            return KeyCode.mouseMap[code] ?? \"🖱\\(code)\"\n        }\n    }\n\n    // MARK: - 事件匹配\n    func matches(_ event: CGEvent, keyCode: UInt16, mouseButton: UInt16, isMouseEvent: Bool) -> Bool {\n        switch type {\n        case .keyboard:\n            // 键盘按键或修饰键\n            guard !isMouseEvent else { return false }\n            return code == keyCode\n        case .mouse:\n            // 鼠标按键\n            guard isMouseEvent else { return false }\n            return code == mouseButton\n        }\n    }\n\n    /// 是否为修饰键\n    var isModifierKey: Bool {\n        return type == .keyboard && KeyCode.modifierKeys.contains(code)\n    }\n\n    /// 获取修饰键掩码 (仅对键盘修饰键有效)\n    var modifierMask: CGEventFlags {\n        guard type == .keyboard else { return CGEventFlags(rawValue: 0) }\n        return KeyCode.getKeyMask(code)\n    }\n}\n\n// MARK: - RecordedEvent\n/// 录制的事件数据 - 可序列化的事件信息 (完整版，包含修饰键)\nstruct RecordedEvent: Codable, Equatable {\n\n    // MARK: - 数据字段\n    let type: EventType // 事件类型\n    let code: UInt16 // 按键代码\n    let modifiers: UInt // 修饰键\n    let displayComponents: [String] // 展示用名称组件\n    let deviceFilter: DeviceFilter?\n\n    // MARK: - 计算属性\n\n    /// NSEvent.ModifierFlags 格式的修饰键\n    var modifierFlags: NSEvent.ModifierFlags {\n        return NSEvent.ModifierFlags(rawValue: modifiers)\n    }\n\n    /// 转换为 ScrollHotkey (丢弃修饰键信息)\n    var asScrollHotkey: ScrollHotkey {\n        return ScrollHotkey(type: type, code: code)\n    }\n\n    // MARK: - INIT\n    init(from event: CGEvent) {\n        // 修饰键\n        self.modifiers = UInt(event.flags.rawValue)\n        // 根据事件类型匹配\n        if event.isKeyboardEvent {\n            self.type = .keyboard\n            self.code = event.keyCode\n        } else {\n            self.type = .mouse\n            self.code = event.mouseCode\n        }\n        // 展示用名称\n        self.displayComponents = event.displayComponents\n        self.deviceFilter = nil\n    }\n\n    /// 从 MosInputEvent 构造\n    init(from event: MosInputEvent, deviceFilter: DeviceFilter? = nil) {\n        self.type = event.type\n        self.code = event.code\n        self.modifiers = UInt(event.modifiers.rawValue)\n        self.deviceFilter = deviceFilter\n        self.displayComponents = event.displayComponents\n    }\n\n    // MARK: - 匹配方法\n    /// 检查是否与给定的 CGEvent 匹配\n    func matches(_ event: CGEvent) -> Bool {\n        // Guard: 修饰键匹配\n        guard event.flags.rawValue == modifiers else { return false }\n        // 根据类型匹配\n        switch type {\n            case .keyboard:\n                // Guard: 键盘事件 (这里只匹配 keyDown)\n                guard event.type == .keyDown else { return false }\n                // 匹配 code\n                return code == Int(event.getIntegerValueField(.keyboardEventKeycode))\n            case .mouse:\n                // Guard: 鼠标事件\n                guard event.type != .keyDown && event.type != .keyUp else { return false }\n                // 匹配 code\n                return code == Int(event.getIntegerValueField(.mouseEventButtonNumber))\n        }\n    }\n    /// 匹配 MosInputEvent (供 MosInputProcessor 使用)\n    func matchesMosInput(_ event: MosInputEvent) -> Bool {\n        guard UInt(event.modifiers.rawValue) == modifiers else { return false }\n        guard event.type == type else { return false }\n        switch type {\n        case .keyboard:\n            guard event.phase == .down else { return false }\n            guard code == event.code else { return false }\n        case .mouse:\n            guard code == event.code else { return false }\n        }\n        if let filter = deviceFilter {\n            guard filter.matches(event.device) else { return false }\n        }\n        return true\n    }\n\n    /// Equatable\n    static func == (lhs: RecordedEvent, rhs: RecordedEvent) -> Bool {\n        return lhs.type == rhs.type &&\n               lhs.code == rhs.code &&\n               lhs.modifiers == rhs.modifiers\n    }\n}\n\n// MARK: - ButtonBinding\n/// 按钮绑定 - 将录制的事件与系统快捷键关联\nstruct ButtonBinding: Codable, Equatable {\n\n    // MARK: - 数据字段\n\n    /// 唯一标识符\n    let id: UUID\n\n    /// 录制的触发事件\n    let triggerEvent: RecordedEvent\n\n    /// 绑定的系统快捷键名称\n    let systemShortcutName: String\n\n    /// 是否启用\n    var isEnabled: Bool\n\n    /// 创建时间\n    let createdAt: Date\n\n    // MARK: - 计算属性\n\n    /// 获取系统快捷键对象\n    var systemShortcut: SystemShortcut.Shortcut? {\n        return SystemShortcut.getShortcut(named: systemShortcutName)\n    }\n\n    // MARK: - 初始化\n\n    init(id: UUID = UUID(), triggerEvent: RecordedEvent, systemShortcutName: String, isEnabled: Bool = true) {\n        self.id = id\n        self.triggerEvent = triggerEvent\n        self.systemShortcutName = systemShortcutName\n        self.isEnabled = isEnabled\n        self.createdAt = Date()\n    }\n\n    // MARK: - Equatable\n\n    static func == (lhs: ButtonBinding, rhs: ButtonBinding) -> Bool {\n        return lhs.id == rhs.id\n    }\n}\n\n// MARK: - ScrollHotkey + MosInputEvent\nextension ScrollHotkey {\n    /// 从 MosInputEvent 构造\n    init(from event: MosInputEvent) {\n        self.type = event.type\n        self.code = event.code\n    }\n}\n"
  },
  {
    "path": "Mos/Windows/PreferencesWindow/GeneralView/PreferencesGeneralViewController.swift",
    "content": "//\n//  PreferencesViewController.swift\n//  Mos\n//  基础选项界面\n//  Created by Caldis on 2017/1/15.\n//  Copyright © 2017年 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nclass PreferencesGeneralViewController: NSViewController {\n    \n    // UI Elements\n    @IBOutlet weak var launchOnLoginCheckBox: NSButton!\n    @IBOutlet weak var hideStatusBarIconCheckBox: NSButton!\n    \n    override func viewDidLoad() {\n        // 读取设置\n        syncViewWithOptions()\n    }\n    \n    // 自启\n    @IBAction func launchOnLoginClick(_ sender: NSButton) {\n        Options.shared.general.autoLaunch = sender.state.rawValue==0 ? false : true\n        syncViewWithOptions()\n    }\n    \n    // 隐藏\n    @IBAction func hideStatusBarIconClick(_ sender: NSButton) {\n        Options.shared.general.hideStatusItem = sender.state.rawValue==0 ? false : true\n        syncViewWithOptions()\n    }\n}\n\n/**\n * 设置同步\n **/\nextension PreferencesGeneralViewController {\n    // 同步界面与设置\n    func syncViewWithOptions() {\n        // 自启\n        launchOnLoginCheckBox.state = NSControl.StateValue(rawValue: Options.shared.general.autoLaunch ? 1 : 0)\n        // 隐藏\n        hideStatusBarIconCheckBox.state = NSControl.StateValue(rawValue: Options.shared.general.hideStatusItem ? 1 : 0)\n    }\n}\n"
  },
  {
    "path": "Mos/Windows/PreferencesWindow/PreferencesTabViewController.swift",
    "content": "//\n//  PreferencesTabViewController.swift\n//  Mos\n//  偏好设置的 TabViewController 容器\n//  Created by Caldis on 2017/1/20.\n//  Copyright © 2017年 Caldis. All rights reserved.\n//\n\n//  Transition 踩坑指南\n//  1. NSTabViewController 的层级构成\n//  NSTabViewController - NSView - NSTabView - [tabViewItem]\n//  NSTabViewController 的尺寸适应规则\n//  由于 NSTabViewController 完全适配了 AutoLayout,\n//  如果 tabViewItem 使用了 AutoLayout, 且对应宽或高不存在 ambiguous 的情况下, 由于整个 NSTabViewController 内的 view 都设置了对应的  AutoLayout, 因此, 最终的尺寸将自动 pin 至其 tabViewItem 的大小, 且整个 NSWindow 都会自动 Resize\n//  如果 tabViewItem 其没有以 AutoLayout 指定尺寸, 则默认为 500,500\n//  2. NSTabViewController 的动画适配\n//  2.1 tabViewItem 使用了 AutoLayout\n//  在切换 Tab 时, NSTabViewController 使用了 transition(from:to:options:completionHandler:) 方法 (方法可能经过重写, 无法通过对应 Protocol 设定其动画, 只能通过 transitionOptions 参数), 在这种情况下无法触发其 transition 动画, 仅能通过手动触发\n//  这里 (在 viewDidAppear 中操作可以利用 View 出现时的自动布局, 避免第一次界面错位) 将 NSTabViewController 下的第一级 NSView 的  constraints 全部移除, 然后手动添加, 仅将其 Pin 至 top 和 left 位置 (设置 top 可以让 size 的 transition 出现在底部), 然后在  tabView(_ tabView: NSTabView, didSelect tabViewItem: NSTabViewItem?) 方法中获取当前 tabViewItem 的大小, 将其计算偏移量后 apply  到 NSWindow 上\n//  2.2 tabViewItem 没有使用 AutoLayout\n//  与上述操作类似, 只需要跳过移除已有的 constraints 步骤即可\n//  3. 避免动画切换时窗口底部颜色不一致\n//  于 NSTabViewController 下的 NSView 额外叠加一层 NSVisualEffectView, 并固定于界面下方, 避免切换时窗口底部颜色不一致\n\nimport Cocoa\n\nclass PreferencesTabViewController: NSTabViewController {\n    \n    let backgroundVisualEffectView = NSVisualEffectView()\n    \n    override func viewDidAppear() {\n        // 移除已有约束\n        view.removeConstraints(view.constraints)\n        // 将 tabView 固定于界面左上\n        tabView.topAnchor.constraint(equalTo: view.topAnchor, constant: 0).isActive = true\n        tabView.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 0).isActive = true\n        // 额外叠加一层 NSVisualEffectView, 并固定于界面下方, 避免切换时窗口底部颜色不一致\n        backgroundVisualEffectView.blendingMode = NSVisualEffectView.BlendingMode.behindWindow\n        if #available(OSX 10.14, *) { backgroundVisualEffectView.material = NSVisualEffectView.Material.toolTip }\n        view.addSubview(backgroundVisualEffectView, positioned: NSWindow.OrderingMode.below, relativeTo: tabView)\n        backgroundVisualEffectView.frame.size = NSSize(width: 1000, height: 1000) // 只要比预期内容大就行, 不会有额外占用\n        backgroundVisualEffectView.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 0).isActive = true\n        backgroundVisualEffectView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true        \n    }\n\n    override func tabView(_ tabView: NSTabView, didSelect tabViewItem: NSTabViewItem?) {\n        // Tab 切换后同步窗口尺寸\n        updateWindowSize()\n    }\n\n    // 更新窗口尺寸以适应当前内容\n    func updateWindowSize() {\n        if let currentWindow = view.window, let currentContentView = tabView.subviews.first {\n            let windowSize = currentWindow.frame.size\n            let contentSize = currentContentView.frame.size\n            let heightDiff = contentSize.height + TOOLBAR_HEIGHT + MACOS_TAHOE_COMPENSATE - windowSize.height\n            let targetOrigin = NSPoint(x: currentWindow.frame.origin.x, y: currentWindow.frame.origin.y - heightDiff)\n            let targetSize = NSSize(width: contentSize.width, height: contentSize.height + TOOLBAR_HEIGHT + MACOS_TAHOE_COMPENSATE)\n            let targetRect = NSRect(origin: targetOrigin, size: targetSize)\n            Utils.groupAnimatorContainer({(context) in\n                currentWindow.setFrame(targetRect, display: true)\n            })\n        }\n    }\n}\n"
  },
  {
    "path": "Mos/Windows/PreferencesWindow/PreferencesWindowController.swift",
    "content": "//\n//  PreferencesWindowController.swift\n//  Mos\n//  偏好设置面板容器 Window\n//  Created by Caldis on 2017/1/15.\n//  Copyright © 2017年 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nclass PreferencesWindowController: NSWindowController, NSWindowDelegate {\n    \n    @IBOutlet weak var preferenceWindow: NSWindow!\n    \n    override func windowDidLoad() {\n        super.windowDidLoad()\n        // 插入分隔符\n        if #available(OSX 10.16, *) {\n            window?.toolbar?.insertItem(withItemIdentifier: NSToolbarItem.Identifier.flexibleSpace, at: 4)\n            window?.toolbar?.insertItem(withItemIdentifier: NSToolbarItem.Identifier.flexibleSpace, at: 3)\n            window?.toolbar?.insertItem(withItemIdentifier: NSToolbarItem.Identifier.flexibleSpace, at: 2)\n            window?.toolbar?.insertItem(withItemIdentifier: NSToolbarItem.Identifier.flexibleSpace, at: 1)\n        } else {\n            window?.toolbar?.insertItem(withItemIdentifier: NSToolbarItem.Identifier.flexibleSpace, at: 3)\n        }\n    }\n    \n    func windowWillClose(_ notification: Notification) {\n        WindowManager.shared.hideWindow(withIdentifier: WINDOW_IDENTIFIER.preferencesWindowController, destroy: true)\n    }\n}\n"
  },
  {
    "path": "Mos/Windows/PreferencesWindow/ScrollingView/PreferencesScrollingViewController.swift",
    "content": "//\n//  PreferencesScrollingViewController.swift\n//  Mos\n//  滚动选项界面\n//  Created by Caldis on 2017/1/26.\n//  Copyright © 2017年 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nclass PreferencesScrollingViewController: NSViewController, ScrollOptionsContextProviding {\n\n    // Target application\n    // - Using when the VC is inside the Application Setting Popup\n    var currentTargetApplication: Application?\n    // UI Elements\n    @IBOutlet weak var scrollSmoothCheckBox: NSButton!\n    @IBOutlet weak var scrollReverseCheckBox: NSButton!\n    @IBOutlet weak var dashKeyBindButton: NSButton!\n    @IBOutlet weak var dashKeyDelButton: NSButton!\n    @IBOutlet weak var toggleKeyBindButton: NSButton!\n    @IBOutlet weak var toggleKeyDelButton: NSButton!\n    @IBOutlet weak var disableKeyBindButton: NSButton!\n    @IBOutlet weak var disableKeyDelButton: NSButton!\n    @IBOutlet weak var scrollStepSlider: NSSlider!\n    @IBOutlet weak var scrollStepInput: NSTextField!\n    @IBOutlet weak var scrollStepStepper: NSStepper!\n    @IBOutlet weak var scrollSpeedSlider: NSSlider!\n    @IBOutlet weak var scrollSpeedInput: NSTextField!\n    @IBOutlet weak var scrollSpeedStepper: NSStepper!\n    @IBOutlet weak var scrollDurationSlider: NSSlider!\n    @IBOutlet weak var scrollDurationInput: NSTextField!\n    @IBOutlet weak var scrollDurationStepper: NSStepper!\n    @IBOutlet weak var scrollDurationDescriptionLabel: NSTextField?\n    @IBOutlet weak var resetToDefaultsButton: NSButton!\n    var resetButtonHeightConstraint: NSLayoutConstraint?\n    // Constants\n    let DefaultConfigForCompare = OPTIONS_SCROLL_DEFAULT()\n    private var scrollDurationDescriptionDefaultText: String?\n    private let scrollDurationLockedDescription = NSLocalizedString(\n        \"scrollDurationLockedMessage\",\n        comment: \"Message shown when simulate trackpad locks the duration setting\"\n    )\n    // KeyRecorder for custom hotkey recording\n    private let keyRecorder = KeyRecorder()\n    private weak var currentRecordingPopup: NSButton?\n\n    override func viewDidLoad() {\n        // 禁止自动 Focus\n        scrollStepInput.refusesFirstResponder = true\n        scrollSpeedInput.refusesFirstResponder = true\n        scrollDurationInput.refusesFirstResponder = true\n        // 创建高度约束\n        resetButtonHeightConstraint = resetToDefaultsButton.heightAnchor.constraint(equalToConstant: 24)\n        resetButtonHeightConstraint?.isActive = true\n        scrollDurationDescriptionDefaultText = scrollDurationDescriptionLabel?.stringValue\n        // 设置 KeyRecorder 代理\n        keyRecorder.delegate = self\n        // 读取设置\n        syncViewWithOptions()\n    }\n\n    override func prepare(for segue: NSStoryboardSegue, sender: Any?) {\n        super.prepare(for: segue, sender: sender)\n        if let smoothPopover = segue.destinationController as? ScrollSmoothDetailSettingsPopoverViewController {\n            smoothPopover.currentTargetApplication = currentTargetApplication\n            smoothPopover.onOptionsChanged = { [weak self] in\n                self?.syncViewWithOptions()\n            }\n        } else if let reversePopover = segue.destinationController as? ScrollReverseDetailSettingsPopoverViewController {\n            reversePopover.currentTargetApplication = currentTargetApplication\n            reversePopover.onOptionsChanged = { [weak self] in\n                self?.syncViewWithOptions()\n            }\n        }\n    }\n    \n    // 平滑\n    @IBAction func scrollSmoothClick(_ sender: NSButton) {\n        getTargetApplicationScrollOptions().smooth = sender.state.rawValue != 0\n        syncViewWithOptions()\n    }\n\n    // 翻转\n    @IBAction func scrollReverseClick(_ sender: NSButton) {\n        getTargetApplicationScrollOptions().reverse = sender.state.rawValue != 0\n        syncViewWithOptions()\n    }\n    \n    // 加速键 - 点击触发录制\n    @IBAction func dashKeyButtonClick(_ sender: NSButton) {\n        currentRecordingPopup = sender\n        keyRecorder.startRecording(from: sender, mode: .singleKey)\n    }\n    // 加速键 - 清除绑定\n    @IBAction func dashKeyDelButtonClick(_ sender: NSButton) {\n        getTargetApplicationScrollOptions().dash = nil\n        syncViewWithOptions()\n    }\n    // 转换键 - 点击触发录制\n    @IBAction func toggleKeyButtonClick(_ sender: NSButton) {\n        currentRecordingPopup = sender\n        keyRecorder.startRecording(from: sender, mode: .singleKey)\n    }\n    // 转换键 - 清除绑定\n    @IBAction func toggleKeyDelButtonClick(_ sender: NSButton) {\n        getTargetApplicationScrollOptions().toggle = nil\n        syncViewWithOptions()\n    }\n    // 禁用键 - 点击触发录制\n    @IBAction func disableKeyButtonClick(_ sender: NSButton) {\n        currentRecordingPopup = sender\n        keyRecorder.startRecording(from: sender, mode: .singleKey)\n    }\n    // 禁用键 - 清除绑定\n    @IBAction func disableKeyDelButtonClick(_ sender: NSButton) {\n        getTargetApplicationScrollOptions().block = nil\n        syncViewWithOptions()\n    }\n    \n    // 步长\n    @IBAction func scrollStepSliderChange(_ sender: NSSlider) {\n        setScrollStep(value: sender.doubleValue)\n    }\n    @IBAction func scrollStepInputChange(_ sender: NSTextField) {\n        setScrollStep(value: sender.doubleValue)\n    }\n    @IBAction func scrollStepStepperChange(_ sender: NSStepper) {\n        setScrollStep(value: sender.doubleValue)\n    }\n    func setScrollStep(value: Double) {\n        getTargetApplicationScrollOptions().step = value\n        syncViewWithOptions()\n    }\n    \n    // 速度\n    @IBAction func scrollSpeedSliderChange(_ sender: NSSlider) {\n        setScrollSpeed(value: sender.doubleValue)\n    }\n    @IBAction func scrollSpeedInputChange(_ sender: NSTextField) {\n        setScrollSpeed(value: sender.doubleValue)\n    }\n    @IBAction func scrollSpeedStepperChange(_ sender: NSStepper) {\n        setScrollSpeed(value: sender.doubleValue)\n    }\n    func setScrollSpeed(value: Double) {\n        getTargetApplicationScrollOptions().speed = value\n        syncViewWithOptions()\n    }\n    \n    // 过渡\n    @IBAction func scrollDurationSliderChange(_ sender: NSSlider) {\n        setScrollDuration(value: sender.doubleValue)\n    }\n    @IBAction func scrollDurationInputChange(_ sender: NSTextField) {\n        setScrollDuration(value: sender.doubleValue)\n    }\n    @IBAction func scrollDurationStepperChange(_ sender: NSStepper) {\n        setScrollDuration(value: sender.doubleValue)\n    }\n    func setScrollDuration(value: Double) {\n        let scrollOptions = getTargetApplicationScrollOptions()\n        if scrollOptions.smoothSimTrackpad {\n            scrollOptions.duration = ScrollDurationLimits.simulateTrackpadDefault\n        } else {\n            scrollOptions.duration = value\n        }\n        syncViewWithOptions()\n    }\n    \n    // 重置\n    @IBAction func resetToDefaultClick(_ sender: NSButton) {\n        if let target = currentTargetApplication {\n            target.scroll = OPTIONS_SCROLL_DEFAULT()\n        } else {\n            Options.shared.scroll = OPTIONS_SCROLL_DEFAULT()\n        }\n        syncViewWithOptions()\n    }\n    \n}\n\n/**\n * 工具函数\n **/\nextension PreferencesScrollingViewController {\n    // 同步界面与设置\n    func syncViewWithOptions() {\n        // 是否继承配置\n        let isNotInherit = !isTargetApplicationInheritOptions()\n        // 滚动配置\n        let scroll = getTargetApplicationScrollOptions()\n        // 平滑\n        scrollSmoothCheckBox.state = NSControl.StateValue(rawValue: scroll.smooth ? 1 : 0)\n        scrollSmoothCheckBox.isEnabled = isNotInherit\n        // 翻转\n        scrollReverseCheckBox.state = NSControl.StateValue(rawValue: scroll.reverse ? 1 : 0)\n        scrollReverseCheckBox.isEnabled = isNotInherit\n        // 加速键\n        updateHotkeyButton(dashKeyBindButton, delButton: dashKeyDelButton, hotkey: scroll.dash, enabled: isNotInherit)\n        // 转换键\n        updateHotkeyButton(toggleKeyBindButton, delButton: toggleKeyDelButton, hotkey: scroll.toggle, enabled: isNotInherit)\n        // 禁用键\n        updateHotkeyButton(disableKeyBindButton, delButton: disableKeyDelButton, hotkey: scroll.block, enabled: isNotInherit)\n        // 步长\n        let step = scroll.step\n        scrollStepSlider.doubleValue = step\n        scrollStepSlider.isEnabled = isNotInherit\n        scrollStepStepper.doubleValue = step\n        scrollStepStepper.isEnabled = isNotInherit\n        scrollStepInput.stringValue = String(format: \"%.2f\", step)\n        scrollStepInput.isEnabled = isNotInherit\n        // 速度\n        let speed = scroll.speed\n        scrollSpeedSlider.doubleValue = speed\n        scrollSpeedSlider.isEnabled = isNotInherit\n        scrollSpeedStepper.doubleValue = speed\n        scrollSpeedStepper.isEnabled = isNotInherit\n        scrollSpeedInput.stringValue = String(format: \"%.2f\", speed)\n        scrollSpeedInput.isEnabled = isNotInherit\n        // 过渡\n        let isSimTrackpadEnabled = scroll.smoothSimTrackpad\n        let resolvedDuration: Double\n        if isSimTrackpadEnabled {\n            resolvedDuration = ScrollDurationLimits.simulateTrackpadDefault\n            if scroll.duration != resolvedDuration {\n                scroll.duration = resolvedDuration\n            }\n        } else {\n            resolvedDuration = scroll.duration\n        }\n        scrollDurationSlider.doubleValue = resolvedDuration\n        scrollDurationSlider.isEnabled = isNotInherit && !isSimTrackpadEnabled\n        scrollDurationStepper.doubleValue = resolvedDuration\n        scrollDurationStepper.isEnabled = isNotInherit && !isSimTrackpadEnabled\n        scrollDurationInput.stringValue = String(format: \"%.2f\", resolvedDuration)\n        scrollDurationInput.isEnabled = isNotInherit && !isSimTrackpadEnabled\n        if isSimTrackpadEnabled {\n            scrollDurationDescriptionLabel?.stringValue = scrollDurationLockedDescription\n        } else if let defaultText = scrollDurationDescriptionDefaultText {\n            scrollDurationDescriptionLabel?.stringValue = defaultText\n        }\n        // 更新重置按钮状态\n        updateResetButtonState()\n    }\n    // 更新重置按钮状态与显示\n    func updateResetButtonState() {\n        let isNotInherit = !isTargetApplicationInheritOptions()\n        let scroll = getTargetApplicationScrollOptions()\n        let shouldShowResetButton = isNotInherit && scroll != DefaultConfigForCompare\n        // 动画过渡\n        NSAnimationContext.runAnimationGroup({ context in\n            context.duration = ANIMATION.duration\n            context.allowsImplicitAnimation = true\n            resetToDefaultsButton.animator().isEnabled = shouldShowResetButton\n            resetToDefaultsButton.animator().alphaValue = shouldShowResetButton ? 1.0 : 0.0\n            resetButtonHeightConstraint?.animator().constant = shouldShowResetButton ? 24 : 0\n        }, completionHandler: {\n            // 触发父视图窗口尺寸更新\n            self.view.needsLayout = true\n            self.view.layout()\n            (self.parent as? PreferencesTabViewController)?.updateWindowSize()\n        })\n    }\n\n    /// 键盘按键的完整名称映射 (仅用于 ScrollingView 按钮显示)\n    private static let keyFullNames: [UInt16: String] = [\n        // 修饰键\n        KeyCode.commandL: \"⌘ Command\",\n        KeyCode.commandR: \"⌘ Command\",\n        KeyCode.optionL: \"⌥ Option\",\n        KeyCode.optionR: \"⌥ Option\",\n        KeyCode.shiftL: \"⇧ Shift\",\n        KeyCode.shiftR: \"⇧ Shift\",\n        KeyCode.controlL: \"⌃ Control\",\n        KeyCode.controlR: \"⌃ Control\",\n        KeyCode.fnL: \"Fn\",\n        KeyCode.fnR: \"Fn\",\n        // 特殊键\n        49: \"⎵ Space\",\n        51: \"⌫ Delete\",\n        53: \"⎋ Escape\",\n        36: \"↩ Return\",\n        76: \"↩ Return\",\n        48: \"↹ Tab\",\n    ]\n\n    /// 获取 ScrollHotkey 的完整显示名称\n    /// 获取按键基础名称 (不含品牌前缀)\n    private func getBaseDisplayName(for hotkey: ScrollHotkey) -> String {\n        switch hotkey.type {\n        case .keyboard:\n            if let fullName = PreferencesScrollingViewController.keyFullNames[hotkey.code] {\n                return fullName\n            }\n            return KeyCode.keyMap[hotkey.code] ?? \"Key \\(hotkey.code)\"\n        case .mouse:\n            return KeyCode.mouseMap[hotkey.code] ?? \"🖱\\(hotkey.code)\"\n        }\n    }\n\n    /// 获取完整显示名称 (含品牌前缀, 用于纯文本场景)\n    private func getFullDisplayName(for hotkey: ScrollHotkey) -> String {\n        let baseName = getBaseDisplayName(for: hotkey)\n        if let brand = BrandTag.brandForCode(hotkey.code) {\n            return BrandTag.prefixedName(baseName, brand: brand)\n        }\n        return baseName\n    }\n\n    /// 更新热键按钮的显示文本和删除按钮可见性\n    private func updateHotkeyButton(_ button: NSButton?, delButton: NSButton?, hotkey: ScrollHotkey?, enabled: Bool) {\n        guard let button = button else { return }\n\n        let hasBound = hotkey != nil\n\n        // 设置按钮标题\n        if let hotkey = hotkey {\n            let baseName = getBaseDisplayName(for: hotkey)\n            if let brand = BrandTag.brandForCode(hotkey.code) {\n                // 品牌按键: image=tag, title=名称, 左图右文\n                button.image = BrandTag.createTagImage(brand: brand, fontSize: 7, height: 14, padH: 5, marginRight: 4)\n                button.imagePosition = .imageLeft\n                button.title = baseName\n            } else {\n                button.image = nil\n                button.imagePosition = .noImage\n                button.title = getFullDisplayName(for: hotkey)\n            }\n        } else {\n            button.image = nil\n            button.imagePosition = .noImage\n            button.title = NSLocalizedString(\"Disabled\", comment: \"Hotkey disabled state\")\n        }\n\n        button.isEnabled = enabled\n\n        // 设置删除按钮可见性：仅在有绑定且启用时显示\n        delButton?.alphaValue = (hasBound && enabled) ? 1.0 : 0.0\n        delButton?.isEnabled = hasBound && enabled\n    }\n}\n\n// MARK: - KeyRecorderDelegate\nextension PreferencesScrollingViewController: KeyRecorderDelegate {\n    func onEventRecorded(_ recorder: KeyRecorder, didRecordEvent event: MosInputEvent, isDuplicate: Bool) {\n        guard let popup = currentRecordingPopup else { return }\n\n        let hotkey = ScrollHotkey(from: event)\n\n        if popup === dashKeyBindButton {\n            getTargetApplicationScrollOptions().dash = hotkey\n        } else if popup === toggleKeyBindButton {\n            getTargetApplicationScrollOptions().toggle = hotkey\n        } else if popup === disableKeyBindButton {\n            getTargetApplicationScrollOptions().block = hotkey\n        }\n\n        currentRecordingPopup = nil\n        syncViewWithOptions()\n    }\n}\n"
  },
  {
    "path": "Mos/Windows/PreferencesWindow/ScrollingView/PreferencesScrollingWithApplicationViewController.swift",
    "content": "//\n//  PreferencesScrollingWithApplicationViewController.swift\n//  Mos\n//  滚动窗口容器\n//  Created by Caldis on 31/10/2019.\n//  Copyright © 2019 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nclass PreferencesScrollingWithApplicationViewController: NSViewController {\n    \n    // Parent view\n    private var parentTableView: NSTableView?\n    private var parentTableRow: Int!\n    // Target application\n    private var currentTargetApplication: Application?\n    private var currentContentViewController: PreferencesScrollingViewController?\n    // UI Elements\n    @IBOutlet weak var currentTargetApplicationIcon: NSImageView!\n    @IBOutlet weak var currentTargetApplicationName: NSTextField!\n    @IBOutlet weak var inheritGlobalSettingCheckBox: NSButton!\n    \n    override func viewDidLoad() {\n        // 初始化显示内容\n        currentTargetApplicationIcon.image = currentTargetApplication?.getIcon()\n        currentTargetApplicationIcon.toolTip = currentTargetApplication?.path\n        currentTargetApplicationName.stringValue = currentTargetApplication?.getName() ?? \"\"\n        // 读取设置\n        syncViewWithOptions()\n    }\n    \n    override func prepare(for segue: NSStoryboardSegue, sender: Any?) {\n        currentContentViewController = (segue.destinationController as! PreferencesScrollingViewController)\n        if let vaildContentViewController = currentContentViewController, let validTargetApplication = currentTargetApplication {\n            vaildContentViewController.currentTargetApplication = validTargetApplication\n        }\n    }\n    \n    public func updateTargetApplication(with target: Application?) {\n        currentTargetApplication = target\n        if let vaildContentViewController = currentContentViewController, let validTargetApplication = currentTargetApplication {\n            vaildContentViewController.currentTargetApplication = validTargetApplication\n        }\n    }\n    public func updateParentData(with target: NSTableView, for row: Int) {\n        parentTableView = target\n        parentTableRow = row\n    }\n    \n    // 名称\n    @IBAction func currentTargetApplicationNameChange(_ sender: NSTextField) {\n        let name = sender.stringValue\n        if name.count > 0 {\n            currentTargetApplication?.displayName = name\n            if let validParentTableView = parentTableView, let validParentTableRow = parentTableRow {\n                validParentTableView.reloadData(forRowIndexes: [validParentTableRow], columnIndexes: [0, 1, 2])\n            }\n        }\n    }\n    \n    // 继承\n    @IBAction func inheritGlobalSettingClick(_ sender: NSButton) {\n        if let vaildContentViewController = currentContentViewController, let validTargetApplication = currentTargetApplication {\n            validTargetApplication.inherit = sender.state.rawValue==0 ? false : true\n            vaildContentViewController.syncViewWithOptions()\n        }\n    }\n}\n\n/**\n * 工具函数\n **/\nextension PreferencesScrollingWithApplicationViewController {\n    // 同步界面与设置\n    func syncViewWithOptions() {\n        // 继承\n        inheritGlobalSettingCheckBox.state = NSControl.StateValue(rawValue: (currentTargetApplication?.inherit ?? false) ? 1 : 0)\n    }\n}\n"
  },
  {
    "path": "Mos/Windows/PreferencesWindow/ScrollingView/ScrollOptionsContextProviding.swift",
    "content": "//\n//  ScrollOptionsContextProviding.swift\n//  Mos\n//  Shared helpers for view controllers that operate on scroll options.\n//  Created by Caldis on 10/25/2025.\n//  Copyright © 2025 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nprotocol ScrollOptionsContextProviding: AnyObject {\n    var currentTargetApplication: Application? { get set }\n\n    func getTargetApplicationScrollOptions() -> OPTIONS_SCROLL_DEFAULT\n    func isTargetApplicationInheritOptions() -> Bool\n}\n\nextension ScrollOptionsContextProviding {\n    func getTargetApplicationScrollOptions() -> OPTIONS_SCROLL_DEFAULT {\n        if let application = currentTargetApplication, application.inherit == false {\n            return application.scroll\n        }\n        return Options.shared.scroll\n    }\n\n    func isTargetApplicationInheritOptions() -> Bool {\n        if let application = currentTargetApplication {\n            return application.inherit\n        }\n        return false\n    }\n\n    func updateSmoothDependentControl(_ control: NSButton?, isOn: Bool) {\n        // Keep the original sync logic shared between the preferences panel and the popover.\n        let isNotInherit = !isTargetApplicationInheritOptions()\n        let scroll = getTargetApplicationScrollOptions()\n        control?.state = NSControl.StateValue(rawValue: isOn ? 1 : 0)\n        control?.isEnabled = isNotInherit && scroll.smooth\n    }\n\n    func updateSimulateTrackpadControl(_ control: NSButton?) {\n        let scroll = getTargetApplicationScrollOptions()\n        updateSmoothDependentControl(control, isOn: scroll.smoothSimTrackpad)\n    }\n\n    func updateReverseDependentControl(_ control: NSButton?, isOn: Bool) {\n        let isNotInherit = !isTargetApplicationInheritOptions()\n        let scroll = getTargetApplicationScrollOptions()\n        control?.state = NSControl.StateValue(rawValue: isOn ? 1 : 0)\n        control?.isEnabled = isNotInherit && scroll.reverse\n    }\n}\n"
  },
  {
    "path": "Mos/Windows/PreferencesWindow/ScrollingView/ScrollReverseDetailSettingsPopoverViewController.swift",
    "content": "import Cocoa\n\nclass ScrollReverseDetailSettingsPopoverViewController: AdaptivePopover, ScrollOptionsContextProviding {\n\n    @IBOutlet weak var verticalReverseCheckBox: NSButton?\n    @IBOutlet weak var horizontalReverseCheckBox: NSButton?\n\n    var currentTargetApplication: Application?\n    var onOptionsChanged: (() -> Void)?\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        syncViewWithOptions()\n    }\n\n    override func viewWillAppear() {\n        super.viewWillAppear()\n        syncViewWithOptions()\n    }\n\n    override func viewDidLayout() {\n        super.viewDidLayout()\n        updatePreferredContentSize()\n    }\n\n    @IBAction func verticalReverseToggle(_ sender: NSButton) {\n        getTargetApplicationScrollOptions().reverseVertical = sender.state == .on\n        syncViewWithOptions()\n        onOptionsChanged?()\n    }\n\n    @IBAction func horizontalReverseToggle(_ sender: NSButton) {\n        getTargetApplicationScrollOptions().reverseHorizontal = sender.state == .on\n        syncViewWithOptions()\n        onOptionsChanged?()\n    }\n\n    private func syncViewWithOptions() {\n        let scroll = getTargetApplicationScrollOptions()\n        updateReverseDependentControl(verticalReverseCheckBox, isOn: scroll.reverseVertical)\n        updateReverseDependentControl(horizontalReverseCheckBox, isOn: scroll.reverseHorizontal)\n    }\n}\n"
  },
  {
    "path": "Mos/Windows/PreferencesWindow/ScrollingView/ScrollSmoothDetailSettingsPopoverViewController.swift",
    "content": "import Cocoa\n\nclass ScrollSmoothDetailSettingsPopoverViewController: AdaptivePopover, ScrollOptionsContextProviding {\n\n    @IBOutlet weak var verticalSmoothCheckBox: NSButton?\n    @IBOutlet weak var horizontalSmoothCheckBox: NSButton?\n    @IBOutlet weak var simulateTrackpadCheckBox: NSButton?\n\n    var currentTargetApplication: Application?\n    var onOptionsChanged: (() -> Void)?\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        syncViewWithOptions()\n    }\n\n    override func viewWillAppear() {\n        super.viewWillAppear()\n        syncViewWithOptions()\n    }\n\n    override func viewDidLayout() {\n        super.viewDidLayout()\n        updatePreferredContentSize()\n    }\n\n    @IBAction func verticalSmoothToggle(_ sender: NSButton) {\n        getTargetApplicationScrollOptions().smoothVertical = sender.state == .on\n        syncViewWithOptions()\n        onOptionsChanged?()\n    }\n\n    @IBAction func horizontalSmoothToggle(_ sender: NSButton) {\n        getTargetApplicationScrollOptions().smoothHorizontal = sender.state == .on\n        syncViewWithOptions()\n        onOptionsChanged?()\n    }\n\n    @IBAction func simulateTrackpadToggle(_ sender: NSButton) {\n        let scrollOptions = getTargetApplicationScrollOptions()\n        let isOn = sender.state == .on\n        let wasOn = scrollOptions.smoothSimTrackpad\n        scrollOptions.smoothSimTrackpad = isOn\n        if isOn {\n            if !wasOn {\n                scrollOptions.durationBeforeSimTrackpadLock = scrollOptions.duration\n            }\n            scrollOptions.duration = ScrollDurationLimits.simulateTrackpadDefault\n        } else {\n            if wasOn, let previous = scrollOptions.durationBeforeSimTrackpadLock {\n                scrollOptions.duration = previous\n            }\n            if wasOn {\n                scrollOptions.durationBeforeSimTrackpadLock = nil\n            }\n        }\n        syncViewWithOptions()\n        onOptionsChanged?()\n    }\n\n    private func syncViewWithOptions() {\n        updateSimulateTrackpadControl(simulateTrackpadCheckBox)\n        let scroll = getTargetApplicationScrollOptions()\n        updateSmoothDependentControl(verticalSmoothCheckBox, isOn: scroll.smoothVertical)\n        updateSmoothDependentControl(horizontalSmoothCheckBox, isOn: scroll.smoothHorizontal)\n    }\n}\n"
  },
  {
    "path": "Mos/Windows/PreferencesWindow/UpdateView/PreferencesUpdatesViewController.swift",
    "content": "//\n//  PreferencesUpdatesViewController.swift\n//  Mos\n//  更新界面\n//  Created by Caldis on 2017/1/21.\n//  Copyright © 2017年 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nclass PreferencesUpdatesViewController: NSViewController {\n    \n    // UI Elements\n    // 版本号\n    @IBOutlet weak var versionLabel: NSTextField!\n    @IBOutlet weak var checkOnAppStartCheckbox: NSButton!\n    @IBOutlet weak var includingBetaVersionCheckbox: NSButton!\n    \n    override func viewDidLoad() {\n        // 版本号\n        let version = Bundle.main.object(forInfoDictionaryKey: \"CFBundleShortVersionString\")!\n        let build = Bundle.main.object(forInfoDictionaryKey: \"CFBundleVersion\")!\n        versionLabel.stringValue = \"\\(NSLocalizedString(\"Current Version\", comment: \"\")): \\(version as! String) · \\(build as! String)\"\n\n        checkOnAppStartCheckbox.state = Options.shared.update.checkOnAppStart ? .on : .off\n        includingBetaVersionCheckbox.state = Options.shared.update.includingBetaVersion ? .on : .off\n    }\n    \n    // 查询更新\n    @IBAction func checkButtonClick(_ sender: NSButton) {\n        UpdateManager.shared.checkForUpdates()\n    }\n    @IBAction func checkOnAppStartClick(_ sender: NSButton) {\n        Options.shared.update.checkOnAppStart = sender.state == .on\n    }\n    @IBAction func includingBetaVersionClick(_ sender: NSButtonCell) {\n        Options.shared.update.includingBetaVersion = sender.state == .on\n    }\n    \n}\n"
  },
  {
    "path": "Mos/Windows/WelcomeWindow/WelcomeViewController.swift",
    "content": "//\n//  WelcomeViewController.swift\n//  Mos\n//  欢迎界面的 View\n//  Created by Caldis on 2018/7/9.\n//  Copyright © 2018年 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nclass WelcomeViewController: NSViewController {\n    \n    @IBOutlet weak var versionLabel: NSTextField!\n    @IBOutlet weak var allowToAccessButton: NSButton!\n    @IBOutlet weak var beginSmoothButton: NSButton!\n    \n    // 检查器\n    var checkerTimer: Timer!\n    \n    override func viewDidLoad() {\n        // 获取版本号\n        let version = Bundle.main.object(forInfoDictionaryKey: \"CFBundleShortVersionString\")!\n        versionLabel.stringValue = \"\\(NSLocalizedString(\"Current Version\", comment: \"\")) : \\(version as! String)\"\n    }\n    override func viewWillAppear() {\n        // 启动定时器检测权限, 当拥有授权时启动滚动处理\n        checkerTimer = Timer.scheduledTimer(\n            timeInterval: 0.5,\n            target: self,\n            selector: #selector(accessibilityPermissionsChecker(_:)),\n            userInfo: nil,\n            repeats: true\n        )\n    }\n    override func viewWillDisappear() {\n        checkerTimer.invalidate()\n    }\n    \n    @IBAction func allowToAccessButtonClick(_ sender: NSButton) {\n        Utils.requireAccessibilityPermissions()\n    }\n    @IBAction func beginSmoothButtonClick(_ sender: NSButton) {\n        WindowManager.shared.refs[WINDOW_IDENTIFIER.welcomeWindowController]?.close()\n    }\n    \n\n    // 检查是否有访问 accessibility 权限, 并设置对应按钮\n    @objc func accessibilityPermissionsChecker(_ timer: Timer) {\n        if AXIsProcessTrusted() {\n            // 如果有权限\n            allowToAccessButton.title = NSLocalizedString(\"Authorized\", comment: \"\")\n            allowToAccessButton.isEnabled = false\n            beginSmoothButton.isEnabled = true\n        } else {\n            // 如果没权限\n            allowToAccessButton.title = NSLocalizedString(\"Auth\", comment: \"\")\n            allowToAccessButton.isEnabled = true\n            beginSmoothButton.isEnabled = false\n        }\n    }\n    \n}\n"
  },
  {
    "path": "Mos/Windows/WelcomeWindow/WelcomeWindowController.swift",
    "content": "//\n//  WelcomeWindowController.swift\n//  Mos\n//  欢迎界面的 Window\n//  Created by Caldis on 2018/7/9.\n//  Copyright © 2018年 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nclass WelcomeWindowController: NSWindowController, NSWindowDelegate {\n    \n    @IBOutlet weak var welcomeWindow: NSWindow!\n    \n    func windowWillClose(_ notification: Notification) {\n        WindowManager.shared.hideWindow(withIdentifier: WINDOW_IDENTIFIER.welcomeWindowController, destroy: true)\n    }\n    \n}\n"
  },
  {
    "path": "Mos/mul.lproj/Main.xcstrings",
    "content": "{\n  \"sourceLanguage\" : \"en\",\n  \"strings\" : {\n    \"1LK-nr-g7N.title\" : {\n      \"comment\" : \"Class = \\\"NSMenuItem\\\"; title = \\\"⌥ Option\\\"; ObjectID = \\\"1LK-nr-g7N\\\";\",\n      \"extractionState\" : \"stale\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        }\n      }\n    },\n    \"1su-Cm-MUc.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"After the update, macOS sometimes fails to authorize correctly.\\\\nRemove Mos from the list first, and then re-add Mos to authorize. (You can also drag the icon above directly)\\\"; ObjectID = \\\"1su-Cm-MUc\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Po aktualizaci systému macOS se někdy může stát, že autorizace není rozpoznána.\\nOdeberte Mos ze seznamu a poté jej znovu přidejte. (Ikonu můžete také přetáhnout přímo.)\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"macOS kann manchmal aktualisierte App-Berechtigungen nicht verarbeiten.\\nVersuchen Sie zunächst, Mos aus der Liste zu entfernen und dann erneut zu autorisieren, indem Sie das Mos-Symbol oben in die Bedienungshilfen-Liste ziehen.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"Το macOS μερικές φορές αποτυγχάνει να διαχειριστεί ενημερωμένες άδειες εφαρμογής.\\nΔοκιμάστε να αφαιρέσετε πρώτα το Mos από τη λίστα και στη συνέχεια να εξουσιοδοτήσετε ξανά σύροντας το εικονίδιο Mos παραπάνω στη λίστα προσβασιμότητας.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"After the update, macOS sometimes fails to authorize correctly.\\nRemove Mos from the list first, and then re-add Mos to authorize. (You can also drag the icon above directly)\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Après la mise à jour, macOS échoue parfois à autoriser correctement l’application.\\nRetirez d’abord Mos de la liste, puis ajoutez-la de nouveau pour l’autoriser.\\n(Vous pouvez aussi faire glisser l’icône ci-dessus directement.)\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"アプリ更新後、macOSはアクセスの許可に失敗することがあります。\\nリストからMosを削除してから、Mosを追加し直して再認証してください。（上のMosアイコンをリストに直接ドラッグできます）\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"macOS가 업데이트된 앱 권한을 처리하지 못하는 경우가 있습니다.\\n먼저 목록에서 Mos를 제거한 다음, 위의 Mos 아이콘을 손쉬운 사용 목록으로 드래그하여 다시 인증하십시오.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"macOS иногда не может обработать обновленные разрешения приложения.\\nПопробуйте сначала удалить Mos из списка, затем повторно авторизовать, перетащив значок Mos выше в список универсального доступа.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"macOS bazen güncellenmiş uygulama izinlerini işleyemez.\\nÖnce Mos'u listeden kaldırmayı deneyin, ardından yukarıdaki Mos simgesini erişilebilirlik listesine sürükleyerek yeniden yetkilendirin.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"macOS іноді не може обробити оновлені дозволи програми.\\nСпробуйте спочатку видалити Mos зі списку, потім повторно авторизувати, перетягнувши значок Mos вище до списку доступності.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"macOS 有时无法处理更新的应用权限。\\n请先从列表中移除 Mos，然后将上方的 Mos 图标拖到辅助功能列表中以重新授权。\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"macOS 有時無法處理更新的應用程式權限。\\n請先從列表中移除 Mos，然後將上方的 Mos 圖示拖移到輔助使用列表中以重新授權。\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"macOS 有時無法處理更新的應用程式權限。\\n請先從列表中移除 Mos，然後將上方的 Mos 圖示拖移到輔助使用列表中以重新授權。\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"macOS 有時無法處理更新的應用程式權限。\\n請先從列表中移除 Mos，然後將上方的 Mos 圖示拖移到輔助使用列表中以重新授權。\"\n          }\n        }\n      }\n    },\n    \"2AK-Pu-mot.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Mos\\\"; ObjectID = \\\"2AK-Pu-mot\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mos\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mos\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mos\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Mos\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mos\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mos\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mos\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mos\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mos\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mos\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mos\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mos\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mos\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mos\"\n          }\n        }\n      }\n    },\n    \"2dJ-u6-vHd.title\" : {\n      \"comment\" : \"Class = \\\"NSButtonCell\\\"; title = \\\"Disabled\\\"; ObjectID = \\\"2dJ-u6-vHd\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Vypnuto\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Disabled\"\n          }\n        }\n      }\n    },\n    \"2hV-f7-8yO.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Customize mouse buttons to enhance your experience\\\"; ObjectID = \\\"2hV-f7-8yO\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Přizpůsobte si tlačítka myši pro pohodlnější ovládání\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Passen Sie Maustasten an, um Ihr Erlebnis zu verbessern\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Προσαρμόστε τα κουμπιά του ποντικιού για καλύτερη εμπειρία\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Customize mouse buttons to enhance your experience\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Personnalisez les boutons de souris pour améliorer votre expérience\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"マウスボタンをカスタマイズして使いやすくする\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"마우스 버튼을 사용자화하여 경험을 개선하세요\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Настройте кнопки мыши для улучшения работы\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Deneyiminizi geliştirmek için fare düğmelerini özelleştirin\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Налаштуйте кнопки миші для покращення роботи\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"自定义鼠标按键以提升体验\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"自訂滑鼠按鍵以提升體驗\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"自訂滑鼠按鍵以提升體驗\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"自訂滑鼠按鍵以提升體驗\"\n          }\n        }\n      }\n    },\n    \"2v8-3K-NkQ.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Andrew Mclaren(@mclvren)\\\"; ObjectID = \\\"2v8-3K-NkQ\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Andrew Mclaren(@mclvren)\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Andrew Mclaren(@mclvren)\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Andrew Mclaren(@mclvren)\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Andrew Mclaren(@mclvren)\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Andrew Mclaren(@mclvren)\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Andrew Mclaren(@mclvren)\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Andrew Mclaren(@mclvren)\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Andrew Mclaren(@mclvren)\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Andrew Mclaren(@mclvren)\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Andrew Mclaren(@mclvren)\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Andrew Mclaren(@mclvren)\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Andrew Mclaren(@mclvren)\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Andrew Mclaren(@mclvren)\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Andrew Mclaren(@mclvren)\"\n          }\n        }\n      }\n    },\n    \"5cx-xS-eRe.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Just some little job for your mouse.\\\"; ObjectID = \\\"5cx-xS-eRe\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Malý praktický nástroj pro vaší myš.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Nur eine kleine Aufgabe für Ihre Maus.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Απλά μια μικρή δουλειά για το ποντίκι σας.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Just some little job for your mouse.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Un petit job pour votre souris.\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"マウスのちょっとした便利ツール。\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"여러분의 마우스를 위한 작은 소품.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Просто небольшая работа для вашей мыши.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Fareniz için küçük bir iş.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Просто невелика робота для вашої миші.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"很惭愧，就做了一点微小的工作\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"很慚愧，就做了一點微小的工作\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"很慚愧，就做了一點微小的工作\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"很慚愧，就做了一點微小的工作\"\n          }\n        }\n      }\n    },\n    \"5Yv-xg-jrn.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Korean\\\"; ObjectID = \\\"5Yv-xg-jrn\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Korejština\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Koreanisch\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Κορεατικά\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Korean\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Coréen\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"韓国語\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"한국어\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Корейский\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Korece\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Корейська\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"韩语\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"韓文\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"韓文\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"韓文\"\n          }\n        }\n      }\n    },\n    \"8By-V1-U9w.headerCell.title\" : {\n      \"comment\" : \"Class = \\\"NSTableColumn\\\"; headerCell.title = \\\"Scrolling\\\"; ObjectID = \\\"8By-V1-U9w\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Posouvání\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"Einstellung\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"Ρυθμίσεις\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Scrolling\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Défilement\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"設定\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"설정\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"Настройка\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"Ayar\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"Налаштування\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"滚动\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"设定\"\n          }\n        }\n      }\n    },\n    \"8GX-j2-4nN.title\" : {\n      \"comment\" : \"Class = \\\"NSMenuItem\\\"; title = \\\"⌃ Control\\\"; ObjectID = \\\"8GX-j2-4nN\\\";\",\n      \"extractionState\" : \"stale\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        }\n      }\n    },\n    \"11f-uB-gEM.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Introducting\\\"; ObjectID = \\\"11f-uB-gEM\\\";\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Představujeme\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Einführung\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Εισαγωγή\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Introducing\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Découvrez\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"ご紹介しましょう\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"소개합니다\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Начало работы\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Tanıtım\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Представлення\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"隆重介绍\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"隆重介紹\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"隆重介紹\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"隆重介紹\"\n          }\n        }\n      }\n    },\n    \"18C-IE-EKk.title\" : {\n      \"comment\" : \"Class = \\\"NSMenuItem\\\"; title = \\\"⌘ Command\\\"; ObjectID = \\\"18C-IE-EKk\\\";\",\n      \"extractionState\" : \"stale\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Command\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Befehl\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Command\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"⌘ Command\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Command\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Command\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Command\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Command\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Command\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Command\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Command\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Command\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Command\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Command\"\n          }\n        }\n      }\n    },\n    \"89F-B4-NIY.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Application\\\"; ObjectID = \\\"89F-B4-NIY\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aplikace\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"App\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Εφαρμογή\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Application\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Application\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"アプリケーション\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"어플리케이션\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Приложение\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Uygulama\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Програма\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"应用程序\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"應用程式\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"應用程式\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"應用程式\"\n          }\n        }\n      }\n    },\n    \"99M-8D-HLN.title\" : {\n      \"comment\" : \"Class = \\\"NSButtonCell\\\"; title = \\\"GitHub\\\"; ObjectID = \\\"99M-8D-HLN\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"GitHub\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"GitHub\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"GitHub\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"GitHub\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"GitHub\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"GitHub\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"GitHub\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"GitHub\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"GitHub\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"GitHub\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"GitHub\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"GitHub\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"GitHub\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"GitHub\"\n          }\n        }\n      }\n    },\n    \"265-WS-XEd.title\" : {\n      \"comment\" : \"Class = \\\"NSButtonCell\\\"; title = \\\"Contributors\\\"; ObjectID = \\\"265-WS-XEd\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Přispěvatelé\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"Mitwirkende\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"Οι Συνεισφέροντες\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Contributors\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Contributeurs\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"コントリビューター\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"기여자들\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"Авторы\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"Katkı Sağlayıcılar\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"Учасники\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"贡献者们\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"貢獻者名單\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"貢獻者名單\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"貢獻者名單\"\n          }\n        }\n      }\n    },\n    \"a3I-0T-N5a.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Application Name\\\"; ObjectID = \\\"a3I-0T-N5a\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Název aplikace\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"App-Name\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Όνομα Εφαρμογής\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Application Name\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Nom de l’application\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"アプリケーション名\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"응용 프로그램 이름\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Название приложения\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Uygulama Adı\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Назва програми\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"应用名称\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"應用程式名稱\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"應用程式名稱\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"應用程式名稱\"\n          }\n        }\n      }\n    },\n    \"AbN-7n-hF7.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Button\\\"; ObjectID = \\\"AbN-7n-hF7\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Tlačítko\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Taste\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Κουμπί\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Button\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Bouton\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"ボタン\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"버튼\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Кнопка\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Düğme\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Кнопка\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"按键\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"按鍵\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"按鍵\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"按鍵\"\n          }\n        }\n      }\n    },\n    \"AGU-43-8RD.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Status Bar Icon\\\"; ObjectID = \\\"AGU-43-8RD\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ikona v řádku nabídek\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Menüleistensymbol\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Εικονίδιο Γραμμής Κατάστασης\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Status Bar Icon\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Icône dans la barre de statut\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"ステータスバーアイコン\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"상태 막대 아이콘\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Значок в строке меню\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Durum Çubuğu Simgesi\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Значок у рядку статусу\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"状态栏图标\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"狀態列圖示\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"狀態列圖示\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"狀態列圖示\"\n          }\n        }\n      }\n    },\n    \"AM8-cj-DnH.title\" : {\n      \"comment\" : \"Class = \\\"NSButtonCell\\\"; title = \\\"Feed 🍥 a fet MEOW\\\"; ObjectID = \\\"AM8-cj-DnH\\\";\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Nakrmit 🍥 kočičku MEOW\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Spenden\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Feed 🍥 a pet MEOW\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Feed 🍥 a pet MEOW\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Nourrissez 🍥 un animal MIAOU\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"うちの猫に餌をやってください🍥\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"배고픈 고양이에게 🍥 을\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Покормить 🍥 кота\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Şişman bir Kediyi 🍥 besle\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Нагодуйте 🍥 кота МЯУ\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"喂胖大咪\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"餵肥大咪\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"餵肥大咪\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"餵肥大咪\"\n          }\n        }\n      }\n    },\n    \"aPi-cE-maK.title\" : {\n      \"comment\" : \"Class = \\\"NSButtonCell\\\"; title = \\\"Donate via PayPal\\\"; ObjectID = \\\"aPi-cE-maK\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Darovat přes PayPal\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Donate using PayPal\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Κάντε δωρεά μέσω PayPal\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Donate via PayPal\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Donnez via PayPal\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"PayPalで寄付\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Paypal을 이용하여 기부\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Донат PayPal\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"PayPal kullanarak bağış yap\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Пожертвувати через PayPal\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"通过 Paypal 捐赠\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"透過 PayPal 捐贈\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"透過 PayPal 捐贈\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"透過 PayPal 捐贈\"\n          }\n        }\n      }\n    },\n    \"Aur-fR-tik.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Current Version\\\"; ObjectID = \\\"Aur-fR-tik\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aktuální verze\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aktuelle Version\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Τρέχουσα Έκδοση\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Current Version\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Version actuelle\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"現在のバージョン\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"현재 버전\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Текущая версия\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Geçerli Sürüm\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Поточна версія\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"当前版本\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"目前版本\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"目前版本\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"目前版本\"\n          }\n        }\n      }\n    },\n    \"AYu-sK-qS6.title\" : {\n      \"comment\" : \"Class = \\\"NSMenu\\\"; title = \\\"Main Menu\\\"; ObjectID = \\\"AYu-sK-qS6\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Hlavní menu\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Hauptmenü\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Κύριο Μενού\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Main Menu\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Menu principal\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"メインメニュー\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"메인 메뉴\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Главное меню\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ana Menü\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Головне меню\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"主菜单\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"主選單\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"主選單\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"主選單\"\n          }\n        }\n      }\n    },\n    \"B3O-iI-E7v.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Sets scrolling acceleration\\\"; ObjectID = \\\"B3O-iI-E7v\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Nastaví zrychlení posouvání\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Legt die Scrollgeschwindigkeit fest\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ορίζει επιτάχυνση κύλισης\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Sets scrolling acceleration\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Définir l’accélération du défilement\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"スクロール加速度を設定します\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"스크롤 속도를 설정합니다\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ускорение прокрутки\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Kaydırma hızlanmasını ayarla\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Встановлює прискорення прокручування\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"控制持续滚动的跟踪速度增益\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"設定持續捲動的加速程度\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"設定持續捲動的加速程度\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"設定持續捲動的加速程度\"\n          }\n        }\n      }\n    },\n    \"B8B-hi-x3v.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Step\\\"; ObjectID = \\\"B8B-hi-x3v\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Krok\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Schritt\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Βήμα\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Step\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Etape\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"ステップ\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"스텝\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Шаг\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Adım\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Крок\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"最短步长\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"單次捲動距離：\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"單次捲動距離：\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"單次捲動距離\"\n          }\n        }\n      }\n    },\n    \"bB5-2R-9Da.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Re-run Mos again to show the hidden Icon\\\"; ObjectID = \\\"bB5-2R-9Da\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Skrytou ikonu zobrazíte opětovným spuštěním aplikace Mos\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mos neustarten, um das ausgeblendete Symbol zu zeigen\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Εκτελέστε ξανά το Mos για εμφάνιση του κρυφού εικονιδίου\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Re-run Mos again to show the hidden Icon\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Relancez Mos pour afficher l’icône masquée\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"アイコンを再表示するには、Mosを再実行してください\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"숨겨진 아이콘을 표시하려면 Mos를 다시 실행하세요\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Перезапустите Mos, чтобы иконка вновь появилась\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Gizli Simgeyi görmek için Mos'u tekrar çalıştırın\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Перезапустіть Mos знову, щоб показати прихований значок\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"再次运行 Mos 以显示状态栏图标\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"重新執行 Mos 即可重新顯示狀態列圖示\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"重新執行 Mos 即可重新顯示狀態列圖示\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"重新執行 Mos 即可重新顯示狀態列圖示\"\n          }\n        }\n      }\n    },\n    \"bga-wG-iim.title\" : {\n      \"comment\" : \"Class = \\\"NSViewController\\\"; title = \\\"Application\\\"; ObjectID = \\\"bga-wG-iim\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aplikace\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ausnahmen\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Εφαρμογή\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Application\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Application\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"アプリ\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"예외\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Исключения\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"İstisna\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Програма\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"应用程序\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"例外\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"應用程式\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"應用程式\"\n          }\n        }\n      }\n    },\n    \"bqU-Is-gFB.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Duration\\\"; ObjectID = \\\"bqU-Is-gFB\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Trvání\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Dauer\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Διάρκεια\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Duration\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Durée\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"継続時間\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"지속 시간\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Продолжительность\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Süre\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Тривалість\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"持续时间\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"持續時間\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"持續時間\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"持續時間\"\n          }\n        }\n      }\n    },\n    \"bQw-5w-Yv0.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Toggle Key\\\"; ObjectID = \\\"bQw-5w-Yv0\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Klávesa přepnutí\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Umschalttaste\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Πλήκτρο εναλλαγής\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Toggle Key\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Touche de bascule\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"トグルキー\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"토글 키\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Кнопка смены направления\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Geçiş Tuşu\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Клавіша перемикання\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"转换键\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"轉向鍵\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"轉向鍵\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"轉向鍵\"\n          }\n        }\n      }\n    },\n    \"bsq-Pe-sDy.title\" : {\n      \"comment\" : \"Class = \\\"NSButtonCell\\\"; title = \\\"Enable seamless scrolling\\\"; ObjectID = \\\"bsq-Pe-sDy\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Povolit plynulé posouvání\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Nahtlos scrollen\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Απρόσκοπτη κύλιση\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Enable seamless scrolling\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Activer défilement fluide\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"シームレススクロール\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"매끄러운 스크롤\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Плавная прокрутка\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Kesintisiz kaydırma\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Безшовна прокрутка\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"启用流畅滚动\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"啟用順暢捲動\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"啟用順暢捲動\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"啟用順暢捲動\"\n          }\n        }\n      }\n    },\n    \"BTN-VC-123.title\" : {\n      \"comment\" : \"Class = \\\"NSViewController\\\"; title = \\\"Buttons\\\"; ObjectID = \\\"BTN-VC-123\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Tlačítka\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Tasten\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Κουμπιά\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Buttons\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Boutons\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"ボタン\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"버튼\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Кнопки\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Düğmeler\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Кнопки\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"按键\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"按鍵\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"按鍵\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"按鍵\"\n          }\n        }\n      }\n    },\n    \"c62-LZ-JNT.title\" : {\n      \"comment\" : \"Class = \\\"NSMenuItem\\\"; title = \\\"⌘ Command\\\"; ObjectID = \\\"c62-LZ-JNT\\\";\",\n      \"extractionState\" : \"stale\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Command\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Befehl\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Command\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"⌘ Command\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Command\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Command\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Command\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Command\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Command\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Command\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Command\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Command\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Command\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Command\"\n          }\n        }\n      }\n    },\n    \"Car-A5-sHp.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Turkish\\\"; ObjectID = \\\"Car-A5-sHp\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Turečtina\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Türkisch\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Τουρκικά\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Turkish\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Turc\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"トルコ語\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"터키어\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Турецкий\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Türkçe\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Турецька\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"土耳其语\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"土耳其文\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"土耳其文\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"土耳其文\"\n          }\n        }\n      }\n    },\n    \"cIk-j1-vYt.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"You need to re-run Mos to change the settings\\\"; ObjectID = \\\"cIk-j1-vYt\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Musíte znovu spustit Mos, aby se projevila změna nastavení\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"Starten Sie Mos neu, um die Konfiguration zu ändern\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"Εκτελέστε ξανά το Mos για να αλλάξετε τις ρυθμίσεις\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You need to re-run Mos to change the settings\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Vous devez relancer Mos pour prendre en compte ce paramétrage\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mosを再起動して設定を適用してください\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"Mos를 다시 실행하여 설정을 변경하세요\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"Перезапустите Mos для изменения конфигурации\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"Yapılandırmayı değiştirmek için Mos'u yeniden çalıştırın\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"Перезапустіть Mos для зміни конфігурації\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"重新运行 Mos 以更改配置\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"重新執行 Mos 以更改設定\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"重新執行 Mos 以更改設定\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"重新執行 Mos 以更改設定\"\n          }\n        }\n      }\n    },\n    \"cTe-aL-0GQ.title\" : {\n      \"comment\" : \"Class = \\\"NSMenuItem\\\"; title = \\\"Disabled\\\"; ObjectID = \\\"cTe-aL-0GQ\\\";\",\n      \"extractionState\" : \"stale\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Vypnuto\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Deaktiviert\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Απενεργοποιημένο\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Disabled\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Désactivé\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"無効\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"허용하지 않음\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Не задана\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Devre Dışı\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Вимкнено\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"不使用\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"停用\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"停用\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"停用\"\n          }\n        }\n      }\n    },\n    \"cvF-hf-KVW.title\" : {\n      \"comment\" : \"Class = \\\"NSWindow\\\"; title = \\\"Preferences\\\"; ObjectID = \\\"cvF-hf-KVW\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Nastavení\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Einstellungen\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Προτιμήσεις\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Preferences\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Préférences\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"設定\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"설정\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Настройки\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Tercihler\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Налаштування\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"偏好设置\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"偏好設定\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"偏好設定\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"偏好設定\"\n          }\n        }\n      }\n    },\n    \"D0v-Oj-ekP.title\" : {\n      \"comment\" : \"Class = \\\"NSButtonCell\\\"; title = \\\"How fat is the cat ?\\\"; ObjectID = \\\"D0v-Oj-ekP\\\";\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Jak tlustá je tato kočka?\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Wie dick ist diese Katze?\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Πόσο παχύ είναι αυτό το γατί;\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"How fat is this cat?\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"A quel point ce chat est gros ?\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"MEOWをもっと見たいですか？\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"이 고양이는 얼마나 뚱뚱한지요?\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Насколько толстый этот кот?\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Kedi ne kadar şişman?\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Наскільки товстий цей кіт?\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"它有多胖?\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"這🐱多胖？\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"這🐱多胖？\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"這🐱多胖？\"\n          }\n        }\n      }\n    },\n    \"dhF-95-kUJ.title\" : {\n      \"comment\" : \"Class = \\\"NSMenuItem\\\"; title = \\\"Manually Select From Finder\\\"; ObjectID = \\\"dhF-95-kUJ\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ruční výběr z Finderu\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Manuelle Auswahl mit Finder\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Χειροκίνητη Επιλογή από το Finder\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Manually Select From Finder\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Sélectionner depuis le Finder\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Finderから手動で選択\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Finder에서 선택한 항목\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Выбрать вручную из Finder\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Finder'dan El ile Seç\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Вибрати вручну з Finder\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"手动从访达中选择\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"自行從 Finder 選擇\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"自行從 Finder 選擇\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"自行從 Finder 選擇\"\n          }\n        }\n      }\n    },\n    \"dN3-Eq-Xi1.title\" : {\n      \"comment\" : \"Class = \\\"NSMenuItem\\\"; title = \\\"⌃ Control\\\"; ObjectID = \\\"dN3-Eq-Xi1\\\";\",\n      \"extractionState\" : \"stale\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        }\n      }\n    },\n    \"DS8-og-1pp.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Create a custom configuration for specific apps\\\"; ObjectID = \\\"DS8-og-1pp\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Vytvořte vlastní konfiguraci pro konkrétní aplikace\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Erstellen Sie eine benutzerdefinierte Konfiguration für bestimmte Apps\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Δημιουργήστε προσαρμοσμένη διαμόρφωση για συγκεκριμένες εφαρμογές\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a custom configuration for specific apps\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Personnalisez la configuration pour des apps spécifiques\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"特定のアプリ用にカスタム設定を作成\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"특정 앱에 대한 사용자 구성을 만드세요\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Создайте конфигурацию для определенных приложений\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Belirli uygulamalar için özel yapılandırma oluşturun\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Створіть конфігурацію для певних програм\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"为特定应用创建自定义配置\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"為特定應用程式建立自訂設定\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"為特定應用程式建立自訂設定\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"為特定應用程式建立自訂設定\"\n          }\n        }\n      }\n    },\n    \"DsD-EW-zCH.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Sets the duration of the scroll animation\\\"; ObjectID = \\\"DsD-EW-zCH\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Nastaví délku animace posouvání\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Legt die Dauer der Bildlaufanimation fest\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ορίζει τη διάρκεια του animation κύλισης\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Sets the duration of the scroll animation\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Définir la durée de l’animation du défilement\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"スクロールアニメーションの継続時間を設定します\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"스크롤 애니메이션의 지속 시간을 설정합니다\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Продолжительность анимации прокрутки\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Kaydırma animasyonunun süresini ayarlar\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Встановлює тривалість анімації прокручування\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"控制滚动的缓动持续时间\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"設定捲動動畫的持續時間\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"設定捲動動畫的持續時間\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"設定捲動動畫的持續時間\"\n          }\n        }\n      }\n    },\n    \"DYt-9m-sTf.title\" : {\n      \"comment\" : \"Class = \\\"NSButtonCell\\\"; title = \\\"Allow to access\\\"; ObjectID = \\\"DYt-9m-sTf\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Povolit přístup\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Zugriff erlauben\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Επιτρέψτε πρόσβαση\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Allow to access\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Autoriser l’accès\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"アクセスを許可する\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"접근 허용\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Разрешить доступ\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Erişime izin ver\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Дозволити доступ\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"允许访问\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"允許存取\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"允許存取\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"允許存取\"\n          }\n        }\n      }\n    },\n    \"E82-7w-YCr.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Startup\\\"; ObjectID = \\\"E82-7w-YCr\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Spuštění\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Autostart\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Εκκίνηση\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Startup\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Démarrage\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"起動\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"시작\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Автозапуск\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Başlangıç\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Автозапуск\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"启动\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"啟動\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"啟動\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"啟動\"\n          }\n        }\n      }\n    },\n    \"ebE-Zf-T98.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Block Key\\\"; ObjectID = \\\"ebE-Zf-T98\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Klávesa blokování\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Sperrtaste\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Πλήκτρο αποκλεισμού\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Block Key\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Touche de blocage\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"ブロックキー\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"차단 키\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Кнопка блокировки\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Bloklama Tuşu\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Клавіша блокування\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"禁用键\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"停用鍵\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"停用鍵\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"停用鍵\"\n          }\n        }\n      }\n    },\n    \"epU-lS-atX.title\" : {\n      \"comment\" : \"Class = \\\"NSMenuItem\\\"; title = \\\"No Action\\\"; ObjectID = \\\"epU-lS-atX\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Žádná Akce\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Keine Aktion\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Καμία ενέργεια\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Action\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aucune action\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"アクションなし\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"작업 없음\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Нет действия\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Eylem Yok\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Немає дії\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"无操作\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"無操作\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"無操作\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"無操作\"\n          }\n        }\n      }\n    },\n    \"eVu-TE-yMr.title\" : {\n      \"comment\" : \"Class = \\\"NSButtonCell\\\"; title = \\\"Horizontal Reverse\\\"; ObjectID = \\\"eVu-TE-yMr\\\";\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Vodorovně\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Horizontale Umkehrung\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Αντιστροφή οριζόντιας κύλισης\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"Horizontal Reverse\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Inversion horizontale\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"水平スクロールを反転\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"가로 스크롤 반전\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Инверсия горизонтальной прокрутки\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Yatay kaydırmayı ters çevir\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Інвертувати горизонтальну прокрутку\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"反转水平滚动\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"反轉水平捲動\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"反轉水平捲動\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"反轉水平捲動\"\n          }\n        }\n      }\n    },\n    \"EWu-DP-7Gj.title\" : {\n      \"comment\" : \"Class = \\\"NSViewController\\\"; title = \\\"Updates\\\"; ObjectID = \\\"EWu-DP-7Gj\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aktualizace\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aktualisierungen\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ενημερώσεις\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Updates\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mises à jour\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"更新\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"업데이트\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Обновления\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Güncellemeler\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Оновлення\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"更新\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"更新\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"更新\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"更新\"\n          }\n        }\n      }\n    },\n    \"Fgm-mm-22Q.placeholderString\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; placeholderString = \\\"1-10\\\"; ObjectID = \\\"Fgm-mm-22Q\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"1-10\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"1-10\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"1-10\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"1-10\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"1-10\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"1-10\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"1-10\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"1-10\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"1-10\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"1-10\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"1-10\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"1-10\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"1-10\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"1-10\"\n          }\n        }\n      }\n    },\n    \"Fgm-mm-22Q.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"3.00\\\"; ObjectID = \\\"Fgm-mm-22Q\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"3.00\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"3.00\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"3.00\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"3.00\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"3.00\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"3.00\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"3.00\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"3.00\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"3.00\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"3.00\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"3.00\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"3.00\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"3.00\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"3.00\"\n          }\n        }\n      }\n    },\n    \"FIh-fA-18k.title\" : {\n      \"comment\" : \"Class = \\\"NSButtonCell\\\"; title = \\\"Welcome Window\\\"; ObjectID = \\\"FIh-fA-18k\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Uvítací okno\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Willkommensfenster\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Παράθυρο Καλωσορίσματος\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Welcome Window\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Fenêtre de bienvenue\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"ようこそウインドウ\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"환영합니다\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Окно приветствия\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Karşılama Penceresi\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Вікно привітання\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"欢迎界面\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"歡迎畫面\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"歡迎畫面\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"歡迎畫面\"\n          }\n        }\n      }\n    },\n    \"fXu-uF-M3Q.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Assign a button to a specific action\\\"; ObjectID = \\\"fXu-uF-M3Q\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Přiřaďte tlačítku konkrétní akci\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Weisen Sie einer Taste eine bestimmte Aktion zu\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Αντιστοιχίστε κουμπί σε συγκεκριμένη ενέργεια\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Assign a button to a specific action\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Assigner un bouton à une action spécifique\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"ボタンを特定のアクションに割り当てる\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"버튼을 특정 작업에 할당하세요\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Назначьте кнопке определенное действие\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Bir düğmeye belirli bir eylem atayın\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Призначте кнопці певну дію\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"为按键分配特定操作\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"為按鍵分配特定操作\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"為按鍵分配特定操作\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"為按鍵分配特定操作\"\n          }\n        }\n      }\n    },\n    \"Gct-aO-hq1.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Russian\\\"; ObjectID = \\\"Gct-aO-hq1\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ruština\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Russisch\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ρωσικά\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Russian\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Russe\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"ロシア語\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"러시아어\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Русский\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Rusça\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Російська\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"俄语\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"俄文\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"俄文\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"俄文\"\n          }\n        }\n      }\n    },\n    \"Gcw-Ir-olP.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Speed\\\"; ObjectID = \\\"Gcw-Ir-olP\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Rychlost\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Geschwindigkeit\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ταχύτητα\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Speed\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Vitesse\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"速度\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"속도\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Скорость\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Hız\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Швидкість\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"速度增益\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"加速捲動\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"加速捲動\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"加速捲動\"\n          }\n        }\n      }\n    },\n    \"gd2-WO-uk9.headerCell.title\" : {\n      \"comment\" : \"Class = \\\"NSTableColumn\\\"; headerCell.title = \\\"Hotkey\\\"; ObjectID = \\\"gd2-WO-uk9\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Horká klávesa\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Tastenkombination\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Συντόμευση Πλήκτρων\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Hotkey\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Raccourci\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"ホットキー\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"단축키\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Горячая клавиша\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Kısayol Tuşu\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Гаряча клавіша\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"热键\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"快捷鍵\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"快捷鍵\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"快捷鍵\"\n          }\n        }\n      }\n    },\n    \"Gmk-Ru-er7.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Add Application\\\"; ObjectID = \\\"Gmk-Ru-er7\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Přidat Aplikaci\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"App hinzufügen\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Προσθήκη Εφαρμογής\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Add Application\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ajouter Application\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"アプリケーションを追加\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"응용 프로그램 추가\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Добавить приложение\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Uygulama Ekle\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Додати програму\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"添加应用\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"加入應用程式\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"加入應用程式\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"加入應用程式\"\n          }\n        }\n      }\n    },\n    \"GtT-zh-x8d.title\" : {\n      \"comment\" : \"Class = \\\"NSButtonCell\\\"; title = \\\"Vertical Smooth\\\"; ObjectID = \\\"GtT-zh-x8d\\\";\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Svisle\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Vertikales Glätten\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ομαλή κατακόρυφη κύλιση\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"Vertical Smooth\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Défilement doux vertical\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"垂直スクロールを滑らかに\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"세로 스크롤 부드럽게\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Плавная вертикальная прокрутка\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Düşey kaydırmayı yumuşat\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Згладити вертикальну прокрутку\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"平滑垂直滚动\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"平滑垂直捲動\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"平滑垂直捲動\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"平滑垂直捲動\"\n          }\n        }\n      }\n    },\n    \"GWm-aK-UoV.title\" : {\n      \"comment\" : \"Class = \\\"NSButtonCell\\\"; title = \\\"Contributors List\\\"; ObjectID = \\\"GWm-aK-UoV\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Seznam \"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Liste der Mitwirkenden\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Λίστα Συνεισφερόντων\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Contributors List\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Liste des contributeurs\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"コントリビューターリスト\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"기여자들\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Список разработчиков\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Katkıda Bulunanlar Listesi\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Список учасників\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"贡献者名目\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"貢獻者名單\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"貢獻者名單\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"貢獻者名單\"\n          }\n        }\n      }\n    },\n    \"gz6-ih-1iJ.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"German\\\"; ObjectID = \\\"gz6-ih-1iJ\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Nemčina\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Deutsch\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Γερμανικά\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"German\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Allemand\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"ドイツ語\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"독일어\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Немецкий\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Almanca\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Німецька\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"德语\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"德文\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"德文\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"德文\"\n          }\n        }\n      }\n    },\n    \"H2Z-K0-g9o.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Scroll Reverse\\\"; ObjectID = \\\"H2Z-K0-g9o\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Směr posouvání\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Scrollrichtung umkehren\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Αντιστροφή Κύλισης\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Scroll Reverse\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Inverser le défilement\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"スクロールを逆にする\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"스크롤 방향 전환\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Обратная прокрутка\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Kaydırmayı Tersine Çevir\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Зворотне прокручування\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"反转滚动\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"反轉捲動\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"反轉捲動\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"反轉捲動\"\n          }\n        }\n      }\n    },\n    \"hGj-vV-zcY.title\" : {\n      \"comment\" : \"Class = \\\"NSButtonCell\\\"; title = \\\"Hide Status Bar Icon\\\"; ObjectID = \\\"hGj-vV-zcY\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Skrýt ikonu v řádku nabídek\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Statusleistensymbol ausblenden\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Απόκρυψη εικονιδίου γραμμής κατάστασης\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Hide Status Bar Icon\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Masquer l’icône dans la barre des tâches\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"ステータスバーアイコンを非表示\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"메뉴 바에서 숨기기\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Спрятать иконку\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Durum Çubuğu Simgesini Gizle\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Приховати значок рядка стану\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"隐藏状态栏图标\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"隱藏狀態列圖示\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"隱藏狀態列圖示\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"隱藏狀態列圖示\"\n          }\n        }\n      }\n    },\n    \"HLn-aB-Grd.title\" : {\n      \"comment\" : \"Class = \\\"NSMenuItem\\\"; title = \\\"Select an action\\\"; ObjectID = \\\"HLn-aB-Grd\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Vybrat akci\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Wählen Sie eine Aktion\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Επιλέξτε μια ενέργεια\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Select an action\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Choisir une action\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"アクションを選択\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"작업 선택\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Выберите действие\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Bir eylem seçin\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Виберіть дію\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"选择操作\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"選擇操作\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"選擇操作\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"選擇操作\"\n          }\n        }\n      }\n    },\n    \"hOO-M8-I1z.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Dash Key\\\"; ObjectID = \\\"hOO-M8-I1z\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Klávesa zrychlení\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Bindestrich-Taste\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Πλήκτρο επιτάχυνσης\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Dash Key\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Touche d’accélération\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"加速キー\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"대시 키\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Кнопка ускорения\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Hızlanma Tuşu\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Клавіша прискорення\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"加速键\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"加速鍵\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"加速鍵\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"加速鍵\"\n          }\n        }\n      }\n    },\n    \"HrY-s6-CCB.title\" : {\n      \"comment\" : \"Class = \\\"NSMenuItem\\\"; title = \\\"⌃ Control\\\"; ObjectID = \\\"HrY-s6-CCB\\\";\",\n      \"extractionState\" : \"stale\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌃ Control\"\n          }\n        }\n      }\n    },\n    \"I6G-zh-cEt.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Wang Yudong(@wyudong)\\\"; ObjectID = \\\"I6G-zh-cEt\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Wang Yudong(@wyudong)\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Wang Yudong(@wyudong)\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Wang Yudong(@wyudong)\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Wang Yudong(@wyudong)\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Wang Yudong(@wyudong)\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Wang Yudong(@wyudong)\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Wang Yudong(@wyudong)\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Wang Yudong(@wyudong)\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Wang Yudong(@wyudong)\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Wang Yudong(@wyudong)\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Wang Yudong(@wyudong)\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Wang Yudong(@wyudong)\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Wang Yudong(@wyudong)\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Wang Yudong(@wyudong)\"\n          }\n        }\n      }\n    },\n    \"iki-Jk-qSr.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Temporarily block smooth scrolling\\\"; ObjectID = \\\"iki-Jk-qSr\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Dočasně zablokuje plynulé posouvání\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Smooth Scrolling vorübergehend deaktivieren\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Προσωρινός αποκλεισμός ομαλής κύλισης\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Temporarily block smooth scrolling\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Bloquer temporairement le défilement doux\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"スムーズスクロールを一時的に停止\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"잠시 스크롤링을 차단합니다\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Временно блокирует плавную прокрутку\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Yumuşak kaydırmayı geçici olarak engelle\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Тимчасово заблокувати плавне прокручування\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"按下时禁用平滑滚动\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"暫時停用平滑捲動\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"暫時停用平滑捲動\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"暫時停用平滑捲動\"\n          }\n        }\n      }\n    },\n    \"Imc-rJ-YnM.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\" jrthsr700tmax(@jrthsr700tmax), Crizant(@crizant)\\\"; ObjectID = \\\"Imc-rJ-YnM\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \" jrthsr700tmax(@jrthsr700tmax), Crizant(@crizant)\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \" jrthsr700tmax(@jrthsr700tmax), Crizant(@crizant)\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \" jrthsr700tmax(@jrthsr700tmax), Crizant(@crizant)\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \" jrthsr700tmax(@jrthsr700tmax), Crizant(@crizant)\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \" jrthsr700tmax(@jrthsr700tmax), Crizant(@crizant)\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"jrthsr700tmax(@jrthsr700tmax), Crizant(@crizant)\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \" jrthsr700tmax(@jrthsr700tmax), Crizant(@crizant)\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \" jrthsr700tmax(@jrthsr700tmax), Crizant(@crizant)\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \" jrthsr700tmax(@jrthsr700tmax), Crizant(@crizant)\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \" jrthsr700tmax(@jrthsr700tmax), Crizant(@crizant)\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \" jrthsr700tmax(@jrthsr700tmax), Crizant(@crizant)\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \" jrthsr700tmax(@jrthsr700tmax), Crizant(@crizant)\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \" jrthsr700tmax(@jrthsr700tmax), Crizant(@crizant)\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \" jrthsr700tmax(@jrthsr700tmax), Crizant(@crizant)\"\n          }\n        }\n      }\n    },\n    \"ITL-GD-CPd.title\" : {\n      \"comment\" : \"Class = \\\"NSViewController\\\"; title = \\\"General\\\"; ObjectID = \\\"ITL-GD-CPd\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Obecné\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Allgemein\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Γενικά\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"General\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Général\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"一般\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"일반\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Главные\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Genel\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Загальні\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"基础\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"一般\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"一般\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"一般\"\n          }\n        }\n      }\n    },\n    \"iW5-CD-5OC.title\" : {\n      \"comment\" : \"Class = \\\"NSViewController\\\"; title = \\\"Scrolling\\\"; ObjectID = \\\"iW5-CD-5OC\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Posouvání\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Erweiterte Einstellungen\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Κύλιση\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Scrolling\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Défilement\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"スクロール\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"고급 설정\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Расширенные\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Kaydırma\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Прокручування\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"滚动\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"捲動\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"捲動\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"捲動\"\n          }\n        }\n      }\n    },\n    \"Jan-OY-m70.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Sets the minimum scroll distance\\\"; ObjectID = \\\"Jan-OY-m70\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Nastaví minimální vzdálenost posunutí\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Legt den minimalen Bildlaufabstand fest\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ορίζει την ελάχιστη απόσταση κύλισης\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Sets the minimum scroll distance\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Définir la distance de défilement minimale\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"最小スクロール距離を設定します\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"최소 스크롤 거리를 설정합니다\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Минимальное расстояние прокрутки\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Minimum kaydırma uzaklığını ayarlar\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Встановлює мінімальну відстань прокручування\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"控制单次滚动的最短距离\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"設定單次捲動距離\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"設定單次捲動距離\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"設定單次捲動距離\"\n          }\n        }\n      }\n    },\n    \"jaq-Cb-dKM.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Customize individual settings for each app\\\"; ObjectID = \\\"jaq-Cb-dKM\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Přizpůsobte individuální nastavení pro každou aplikaci\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Passen Sie Einstellungen für jede App individuell an\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Προσαρμόστε μεμονωμένες ρυθμίσεις για κάθε εφαρμογή\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Customize individual settings for each app\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Personnaliser le paramétrage pour chaque app\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"アプリごとに個別の設定をカスタマイズ\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"각 앱에 대한 개별 설정을 사용자화하세요\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Настройте параметры для каждого приложения\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Her uygulama için ayrı ayarları özelleştirin\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Налаштуйте параметри для кожної програми\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"为每个应用自定义各自设置\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"為每個應用程式自訂各自設定\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"為每個應用程式自訂各自設定\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"為每個應用程式自訂各自設定\"\n          }\n        }\n      }\n    },\n    \"JQK-PN-VMN.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Scrolling\\\"; ObjectID = \\\"JQK-PN-VMN\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Posouvání\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Scrolling\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Défilement\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"設定\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"滚动\"\n          }\n        }\n      }\n    },\n    \"jzQ-oc-Ugr.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Traditional Chinese\\\"; ObjectID = \\\"jzQ-oc-Ugr\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Tradiční čínština\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Traditionelles Chinesisch\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Παραδοσιακά Κινεζικά\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Traditional Chinese\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Chinois traditionnel\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"繁体中国語\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"중국어 번체\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Традиционный китайский\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Geleneksel Çince\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Традиційна китайська\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"繁体中文\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"繁體中文\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"繁體中文\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"繁體中文\"\n          }\n        }\n      }\n    },\n    \"KnM-kA-wn5.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Change vertical scrolling to horizontal scrolling\\\"; ObjectID = \\\"KnM-kA-wn5\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Změní svislé posouvání na vodorovné\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Vertikalen Bildlauf in horizontalen Bildlauf ändern\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Αλλαγή κάθετης κύλισης σε οριζόντια\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Change vertical scrolling to horizontal scrolling\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Remplacer le défilement vertical par le défilement horizontal\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"垂直スクロールを水平スクロールに変更\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"수직 스크롤링을 수평 스크롤링으로 바꿔줍니다\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Изменяет вертикальную прокрутку на горизонтальную\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Dikey kaydırmayı yatay kaydırma ile değiştir\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Змінити вертикальне прокручування на горизонтальне\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"按下时将垂直方向的滚动变换为水平方向\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"暫時將垂直方向捲動轉成水平方向\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"暫時將垂直方向捲動轉成水平方向\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"暫時將垂直方向捲動轉成水平方向\"\n          }\n        }\n      }\n    },\n    \"Ksp-g1-48g.title\" : {\n      \"comment\" : \"Class = \\\"NSButtonCell\\\"; title = \\\"Allow list Mode\\\"; ObjectID = \\\"Ksp-g1-48g\\\";\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Režim povolených aplikací\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Allowlist-Modus\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Λειτουργία Λίστας Επιτρεπόμενων\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Allowlist Mode\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mode liste autorisée\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"許可リストモード\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"허가 모드\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Белый список\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Beyaz Liste Modu\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Режим списку дозволених\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"白名单模式\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"白名單模式\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"白名單模式\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"白名單模式\"\n          }\n        }\n      }\n    },\n    \"Ky0-gH-I3A.title\" : {\n      \"comment\" : \"Class = \\\"NSButtonCell\\\"; title = \\\"Disabled\\\"; ObjectID = \\\"Ky0-gH-I3A\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Vypnuto\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Disabled\"\n          }\n        }\n      }\n    },\n    \"l7O-So-nw1.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Record Button\\\"; ObjectID = \\\"l7O-So-nw1\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Zaznamenat tlačítko\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Taste aufzeichnen\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Εγγραφή κουμπιού\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Record Button\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Bouton d’enregistrement\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"ボタンを記録\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"버튼 기록\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Записать кнопку\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Düğme kaydet\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Записати кнопку\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"录制按键\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"錄製按鍵\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"錄製按鍵\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"錄製按鍵\"\n          }\n        }\n      }\n    },\n    \"Lhz-x5-X0I.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Translation\\\"; ObjectID = \\\"Lhz-x5-X0I\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Překlad\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Übersetzung\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Μετάφραση\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Translation\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Traduction\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"翻訳\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"번역 기여자들\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Перевод\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Çeviri\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Переклад\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"译者\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"譯者\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"譯者\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"譯者\"\n          }\n        }\n      }\n    },\n    \"Luy-Tf-2zi.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"*\\\"; ObjectID = \\\"Luy-Tf-2zi\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"*\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"*\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"*\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"*\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"*\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"*\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"*\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"*\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"*\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"*\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"*\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"*\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"*\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"*\"\n          }\n        }\n      }\n    },\n    \"MI6-Tq-Nev.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"© 2017-2026 Caldis. All rights reserved.\\\"; ObjectID = \\\"MI6-Tq-Nev\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"© 2017-2026 Caldis. Všechna práva vyhrazena.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"© 2017-2026 Caldis. Alle Rechte vorbehalten.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"© 2017-2026 Caldis. All rights reserved.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"© 2017-2026 Caldis. All rights reserved.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"© 2017-2026 Caldis. Tous droits réservés.\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"© 2017-2026 Caldis. All rights reserved.\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"© 2017-2026 Caldis. All rights reserved.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"© 2017-2026 Caldis. Все права защищены.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"© 2017-2026 Caldis. Tüm hakları saklıdır.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"© 2017-2026 Caldis. Усі права захищено.\"\n          }\n        }\n      }\n    },\n    \"mmw-45-VYt.title\" : {\n      \"comment\" : \"Class = \\\"NSMenuItem\\\"; title = \\\"⌥ Option\\\"; ObjectID = \\\"mmw-45-VYt\\\";\",\n      \"extractionState\" : \"stale\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        }\n      }\n    },\n    \"n8O-2V-Zob.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Seçkin Kükrer(@LeaveNhA)\\\"; ObjectID = \\\"n8O-2V-Zob\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Seçkin Kükrer(@LeaveNhA)\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Seçkin Kükrer(@LeaveNhA)\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Seçkin Kükrer(@LeaveNhA)\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Seçkin Kükrer(@LeaveNhA)\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Seçkin Kükrer(@LeaveNhA)\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Seçkin Kükrer(@LeaveNhA)\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Seçkin Kükrer(@LeaveNhA)\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Seçkin Kükrer(@LeaveNhA)\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Seçkin Kükrer(@LeaveNhA)\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Seçkin Kükrer(@LeaveNhA)\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Seçkin Kükrer(@LeaveNhA)\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Seçkin Kükrer(@LeaveNhA)\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Seçkin Kükrer(@LeaveNhA)\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Seçkin Kükrer(@LeaveNhA)\"\n          }\n        }\n      }\n    },\n    \"Ngq-sZ-qrp.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Smooth Scrolling\\\"; ObjectID = \\\"Ngq-sZ-qrp\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Plynulé posouvání\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Sanftes Scrollen\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ομαλή Κύλιση\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Smooth Scrolling\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Défilement doux\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"スムーズスクロール\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"부드러운 스크롤\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Плавная прокрутка\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Yumuşak Kaydırma\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Плавне прокручування\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"平滑滚动\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"平滑捲動\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"平滑捲動\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"平滑捲動\"\n          }\n        }\n      }\n    },\n    \"NGY-5D-ZYm.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Selim(@lima0)\\\"; ObjectID = \\\"NGY-5D-ZYm\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Selim(@lima0)\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Selim(@lima0)\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Selim(@lima0)\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Selim(@lima0)\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Selim(@lima0)\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Selim(@lima0)\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Selim(@lima0)\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Selim(@lima0)\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Selim(@lima0)\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Selim(@lima0)\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Selim(@lima0)\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Selim(@lima0)\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Selim(@lima0)\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Selim(@lima0)\"\n          }\n        }\n      }\n    },\n    \"Nh1-iw-yGN.title\" : {\n      \"comment\" : \"Class = \\\"NSButtonCell\\\"; title = \\\"Horizontal Smooth\\\"; ObjectID = \\\"Nh1-iw-yGN\\\";\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Vodorovně\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Horizontales Glätten\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ομαλή οριζόντια κύλιση\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"Horizontal Smooth\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Fluidité horizontale\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"水平スクロールを滑らかに\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"가로 스크롤 부드럽게\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Плавная горизонтальная прокрутка\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Yatay kaydırmayı yumuşat\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Згладити горизонтальну прокрутку\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"平滑水平滚动\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"平滑水平捲動\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"平滑水平捲動\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"平滑水平捲動\"\n          }\n        }\n      }\n    },\n    \"p7Y-SJ-d6t.title\" : {\n      \"comment\" : \"Class = \\\"NSButtonCell\\\"; title = \\\"Simulate Trackpad (Beta)\\\"; ObjectID = \\\"p7Y-SJ-d6t\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Simulovat trackpad (Beta)\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Trackpad simulieren (Beta)\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Προσομοίωση trackpad (Beta)\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Simulate Trackpad (Beta)\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Simuler Trackpad (Beta)\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"トラックパッドをシミュレート（ベータ）\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"트랙패드를 시뮬레이션 (베타)\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Симулировать трекпад (бета)\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Trackpad’i simüle et (Beta)\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Імітація трекпада (бета)\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"模拟触控板 (Beta)\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"模擬觸控板 (Beta)\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"模擬觸控板 (Beta)\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"模擬觸控板 (Beta)\"\n          }\n        }\n      }\n    },\n    \"PIa-ES-2Sf.title\" : {\n      \"comment\" : \"Class = \\\"NSMenuItem\\\"; title = \\\"⇧ Shift\\\"; ObjectID = \\\"PIa-ES-2Sf\\\";\",\n      \"extractionState\" : \"stale\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        }\n      }\n    },\n    \"qjy-uD-jMy.title\" : {\n      \"comment\" : \"Class = \\\"NSButtonCell\\\"; title = \\\"Vertical Reverse\\\"; ObjectID = \\\"qjy-uD-jMy\\\";\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Svisle\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Vertikale Umkehrung\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Αντιστροφή κατακόρυφης κύλισης\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"Vertical Reverse\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Inversion verticale\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"垂直スクロールを反転\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"세로 스크롤 반전\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Инверсия вертикальной прокрутки\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Düşey kaydırmayı ters çevir\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Інвертувати вертикальну прокрутку\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"反转垂直滚动\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"反轉垂直捲動\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"反轉垂直捲動\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"反轉垂直捲動\"\n          }\n        }\n      }\n    },\n    \"Qse-ik-rgy.placeholderString\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; placeholderString = \\\"1-5\\\"; ObjectID = \\\"Qse-ik-rgy\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"1-5\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"1-5\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"1-5\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"1-5\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"1-5\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"1-5\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"1-5\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"1-5\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"1-5\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"1-5\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"1-5\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"1-5\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"1-5\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"1-5\"\n          }\n        }\n      }\n    },\n    \"Qse-ik-rgy.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"3.90\\\"; ObjectID = \\\"Qse-ik-rgy\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"3.90\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"3.90\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"3.90\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"3.90\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"3.90\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"3.90\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"3.90\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"3.90\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"3.90\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"3.90\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"3.90\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"3.90\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"3.90\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"3.90\"\n          }\n        }\n      }\n    },\n    \"Qx7-hF-cCG.title\" : {\n      \"comment\" : \"Class = \\\"NSButtonCell\\\"; title = \\\"Including beta version\\\"; ObjectID = \\\"Qx7-hF-cCG\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Zahrnout beta verze\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Including beta version\"\n          }\n        }\n      }\n    },\n    \"R0d-21-g6W.title\" : {\n      \"comment\" : \"Class = \\\"NSMenuItem\\\"; title = \\\"Running Applications\\\"; ObjectID = \\\"R0d-21-g6W\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Spuštěné Aplikace\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ausgeführte Apps\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Εφαρμογές σε Λειτουργία\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Running Applications\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Applications en cours d’exécution\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"実行中のアプリケーション\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"실행중인 애플리케이션\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Запущенные приложения\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Çalışan Uygulamalar\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Запущені програми\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"运行中的应用程序\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"執行中的應用程式\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"執行中的應用程式\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"執行中的應用程式\"\n          }\n        }\n      }\n    },\n    \"RfV-Ow-3mF.title\" : {\n      \"comment\" : \"Class = \\\"NSViewController\\\"; title = \\\"About\\\"; ObjectID = \\\"RfV-Ow-3mF\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"O aplikaci\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Info\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Σχετικά\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"About\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"A propos\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"情報\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"대하여\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Инфо\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Hakkında\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Про програму\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"关于\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"關於\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"關於\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"關於\"\n          }\n        }\n      }\n    },\n    \"Rgq-87-vjY.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Temporarily disable smooth scrolling to improve scrolling accuracy.\\\"; ObjectID = \\\"Rgq-87-vjY\\\";\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Dočasně deaktivuje plynulé posouvání, aby se zlepšila přesnost posouvání.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Glätten vorübergehend deaktivieren, um die Scrollgenauigkeit zu verbessern\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Απενεργοποιήστε προσωρινά την ομαλή κύλιση για βελτίωση της ακρίβειας κύλισης\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Temporarily disable smooth scrolling to improve scrolling accuracy\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Désactiver temporairement le défilement doux pour améliorer la précision du défilement\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"スクロール精度を向上させるためにスムーズスクロールを一時的に無効化\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"스크롤 정확도를 높이기 위해 부드러운 스크롤링을 일시적으로 비활성화\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Временно отключить плавную прокрутку для повышения точности прокрутки\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Kaydırma doğruluğunu artırmak için yumuşak kaydırmayı geçici olarak devre dışı bırakın\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Тимчасово вимкнути плавне прокручування для підвищення точності прокручування\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"暂时性地禁用平滑滚动以提高滚动精度\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"暫時性地停用平滑捲動以提高捲動精度\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"暫時性地停用平滑捲動以提高捲動精度\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"暫時性地停用平滑捲動以提高捲動精度\"\n          }\n        }\n      }\n    },\n    \"sdr-Ih-rCr.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Action\\\"; ObjectID = \\\"sdr-Ih-rCr\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Akce\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aktion\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ενέργεια\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Action\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Action\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"アクション\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"작업\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Действие\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Eylem\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Дія\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"操作\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"操作\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"操作\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"操作\"\n          }\n        }\n      }\n    },\n    \"Sfx-Rp-8QA.title\" : {\n      \"comment\" : \"Class = \\\"NSMenuItem\\\"; title = \\\"⇧ Shift\\\"; ObjectID = \\\"Sfx-Rp-8QA\\\";\",\n      \"extractionState\" : \"stale\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        }\n      }\n    },\n    \"Sma-iA-YxQ.title\" : {\n      \"comment\" : \"Class = \\\"NSMenuItem\\\"; title = \\\"⇧ Shift\\\"; ObjectID = \\\"Sma-iA-YxQ\\\";\",\n      \"extractionState\" : \"stale\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⇧ Shift\"\n          }\n        }\n      }\n    },\n    \"SuH-MV-uUc.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Joshua Park(@godly-devotion), OrcaXS(@OrcaXS) ...\\\"; ObjectID = \\\"SuH-MV-uUc\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Joshua Park(@godly-devotion), OrcaXS(@OrcaXS) ...\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Joshua Park(@godly-devotion), OrcaXS(@OrcaXS) ...\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Joshua Park(@godly-devotion), OrcaXS(@OrcaXS) ...\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Joshua Park(@godly-devotion), OrcaXS(@OrcaXS) ...\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Joshua Park(@godly-devotion), OrcaXS(@OrcaXS) ...\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Joshua Park(@godly-devotion), OrcaXS(@OrcaXS) ...\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Joshua Park(@godly-devotion), OrcaXS(@OrcaXS) ...\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Joshua Park(@godly-devotion), OrcaXS(@OrcaXS) ...\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Joshua Park(@godly-devotion), OrcaXS(@OrcaXS) ...\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Joshua Park(@godly-devotion), OrcaXS(@OrcaXS) ...\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Joshua Park(@godly-devotion), OrcaXS(@OrcaXS) ...\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Joshua Park(@godly-devotion), OrcaXS(@OrcaXS) ...\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Joshua Park(@godly-devotion), OrcaXS(@OrcaXS) ...\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Joshua Park(@godly-devotion), OrcaXS(@OrcaXS) ...\"\n          }\n        }\n      }\n    },\n    \"SUM-eh-Lms.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Other\\\"; ObjectID = \\\"SUM-eh-Lms\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ostatní\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Andere\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Άλλο\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Other\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Autre\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"その他\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"기타\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Другое\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Diğer\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Інше\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"其他\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"其他\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"其他\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"其他\"\n          }\n        }\n      }\n    },\n    \"t00-ho-RN1.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Not effective?\\\"; ObjectID = \\\"t00-ho-RN1\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Nedaří se autorizace?\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"Keine Wirkung?\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"Δεν λειτουργεί;\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Not effective?\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Pas effectif ?\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"有効にできない時は？\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"적용되지 않나요?\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"Не работает?\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"Etkisi yok mu?\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"Не працює?\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"未生效？\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"未生效？\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"未生效？\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"未生效？\"\n          }\n        }\n      }\n    },\n    \"t2D-X2-Y6W.title\" : {\n      \"comment\" : \"Class = \\\"NSButtonCell\\\"; title = \\\"Reset to defaults\\\"; ObjectID = \\\"t2D-X2-Y6W\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Obnovit výchozí nastavení\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Auf Standardwerte zurücksetzen\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Επαναφορά στις προεπιλογές\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Reset to defaults\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Réinitialiser tout\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"デフォルトに戻す\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"기본 값으로 돌리기\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Восстановить стандартные\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Varsayılan'a ayarlar\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Скинути до типових\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"恢复为预设值\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"還原為預設值\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"還原為預設值\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"還原為預設值\"\n          }\n        }\n      }\n    },\n    \"T9f-TL-GYj.title\" : {\n      \"comment\" : \"Class = \\\"NSButtonCell\\\"; title = \\\"Check Now\\\"; ObjectID = \\\"T9f-TL-GYj\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Zkontrolovat nyní\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Jetzt prüfen\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Έλεγχος Τώρα\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Check Now\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Vérifier maintenant\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"今すぐ確認\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"지금 확인\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Проверить сейчас\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Şimdi Kontrol Et\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Перевірити зараз\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"获取新版本\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"尋找新版本\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"尋找新版本\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"尋找新版本\"\n          }\n        }\n      }\n    },\n    \"ThS-Rm-st2.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"No application is Special\\\"; ObjectID = \\\"ThS-Rm-st2\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Žádná aplikace není speciální\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Keine App ist speziell\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Καμία εφαρμογή δεν είναι ειδική\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No application is Special\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aucune application n’est Spéciale\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"特別なアプリケーションはありません\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"특별한 애플리케이션이 없습니다\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Нет особых приложений\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Özel uygulama yok\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Немає особливих програм\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"没有特殊应用\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"沒有特殊應用程式\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"沒有特殊應用程式\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"沒有特殊應用程式\"\n          }\n        }\n      }\n    },\n    \"Tje-UR-0oP.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Woosuk Park(@readingsnail)\\\"; ObjectID = \\\"Tje-UR-0oP\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Woosuk Park(@readingsnail)\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Woosuk Park(@readingsnail)\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Woosuk Park(@readingsnail)\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Woosuk Park(@readingsnail)\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Woosuk Park(@readingsnail)\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Woosuk Park(@readingsnail)\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Woosuk Park(@readingsnail)\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Woosuk Park(@readingsnail)\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Woosuk Park(@readingsnail)\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Woosuk Park(@readingsnail)\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Woosuk Park(@readingsnail)\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Woosuk Park(@readingsnail)\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Woosuk Park(@readingsnail)\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Woosuk Park(@readingsnail)\"\n          }\n        }\n      }\n    },\n    \"TUE-3v-CaJ.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Rendering this chart will affect scrolling performance. Close the window when not in use.\\\"; ObjectID = \\\"TUE-3v-CaJ\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Zobrazení tohoto grafu ovlivní výkon posouvání. Pokud jej nepoužíváte, zavřete okno.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Das Rendern dieses Diagramms wirkt sich auf die Bildlaufleistung aus. Schließen Sie das Fenster, wenn es nicht verwendet wird.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Η απόδοση αυτού του γραφήματος θα επηρεάσει την απόδοση κύλισης. Κλείστε το παράθυρο όταν δεν χρησιμοποιείται.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Rendering this chart will affect scrolling performance. Close the window when not in use.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"La génération de ce graphique impacte les performances du défilement. Fermez la fenêtre lorsque vous ne l’utilisez pas.\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"グラフ表示はスクロールのパフォーマンスに影響します。使用しないときはウィンドウを閉じてください。\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"이 차트를 랜더링 할때 스크롤링 성능에 영향을 줍니다. 사용하지 않을시엔 닫아주세요.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Визуализация этой диаграммы повлияет на производительность прокрутки. Закройте окно, когда оно не нужно.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Bu grafiği işlemek, kaydırma performansını etkileyecektir. Kullanılmadığı zaman pencereyi kapatın.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Відображення цієї діаграми вплине на продуктивність прокручування. Закрийте вікно, коли не використовується.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"呈现该窗口的数据会显著影响滚动性能, 请仅在需要时开启\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"顯示視窗資訊對捲動效能會有顯著影響。請僅在必要時開啟\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"顯示視窗資訊對捲動效能會有顯著影響。請僅在必要時開啟\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"顯示視窗資訊對捲動效能會有顯著影響。請僅在必要時開啟\"\n          }\n        }\n      }\n    },\n    \"tum-Lo-TC6.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"No buttons are set up yet\\\"; ObjectID = \\\"tum-Lo-TC6\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Zatím nejsou nastavena žádná tlačítka\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Noch keine Tasten eingerichtet\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Δεν έχουν ρυθμιστεί ακόμα κουμπιά\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No buttons are set up yet\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aucun bouton configuré actuellement\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"まだボタンが設定されていません\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"아직 버튼이 설정되지 않았습니다\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Кнопки еще не настроены\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Henüz düğme ayarlanmadı\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Кнопки ще не налаштовані\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"尚未设置按键\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"尚未設定按鍵\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"尚未設定按鍵\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"尚未設定按鍵\"\n          }\n        }\n      }\n    },\n    \"tXQ-GJ-k5M.title\" : {\n      \"comment\" : \"Class = \\\"NSMenu\\\"; title = \\\"Running Applications\\\"; ObjectID = \\\"tXQ-GJ-k5M\\\";\",\n      \"extractionState\" : \"stale\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Spuštěné aplikace\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ausgeführte Apps\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Εφαρμογές σε Λειτουργία\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Running Applications\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Applications en cours d’exécution\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"実行中のアプリケーション\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"실행 중인 응용 프로그램\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Запущенные приложения\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Çalışan Uygulamalar\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Запущені програми\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"正在运行的应用\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"執行中的應用程式\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"執行中的應用程式\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"執行中的應用程式\"\n          }\n        }\n      }\n    },\n    \"u2R-oy-a1c.title\" : {\n      \"comment\" : \"Class = \\\"NSButtonCell\\\"; title = \\\"Buy me a coffee\\\"; ObjectID = \\\"u2R-oy-a1c\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Kupte mi kávu\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Buy me a coffee\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Payez-moi un café\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"请我喝咖\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"請我喝咖\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"請我飲咖\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"請我喝咖\"\n          }\n        }\n      }\n    },\n    \"UJ4-y2-HO8.title\" : {\n      \"comment\" : \"Class = \\\"NSMenuItem\\\"; title = \\\"⌥ Option\\\"; ObjectID = \\\"UJ4-y2-HO8\\\";\",\n      \"extractionState\" : \"stale\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌥ Option\"\n          }\n        }\n      }\n    },\n    \"v26-RK-BtL.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"The allow list mode will make Mos only apply to apps within the application list.\\\"; ObjectID = \\\"v26-RK-BtL\\\";\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"V režimu povolených aplikací bude Mos aktivní pouze pro aplikace v tomto seznamu\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Der Allowlistmodus bewirkt, dass Mos nur für Anwendungen innerhalb der Ausnahmeliste gilt.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"The allow list mode will make Mos only apply to apps within the application list.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"The allowlist mode will make Mos only apply to apps within the application list.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Le mode liste autorisée fait que Mos ne s’applique qu’aux apps de la liste.\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"許可リストモードは、このリストにあるアプリのみにMosを適用します。\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"이 모드는 Mos가 제외 목록 안의 앱만 설정하게 해줍니다.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Режим белого списка заставит Mos применяться только к приложениям из списка исключений.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Beyaz liste modu, Mos'ın yalnızca istisna listesindeki uygulamalar için geçerli olmasını sağlar.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Режим списку дозволених застосує Mos лише до програм у списку винятків.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"启用白名单模式后, Mos 仅会对包含在例外列表内的程序启用, 其他的则不受任何影响\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"啟用白名單模式後，Mos 只會對例外列表中的應用程式啟用，其他不受影響\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"啟用白名單模式後，Mos 只會對列表中的應用程式啟用，其他不受影響\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"啟用白名單模式後，Mos 只會對列表中的應用程式啟用，其他不受影響\"\n          }\n        }\n      }\n    },\n    \"vcQ-FZ-z8x.placeholderString\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; placeholderString = \\\"0.1-100\\\"; ObjectID = \\\"vcQ-FZ-z8x\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"0.1-100\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"10-100\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"10-100\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"0.1-100\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"0.1-100\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"0.1-100\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"10-100\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"10-100\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"10-100\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"10-100\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"10-100\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"10-100\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"10-100\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"10-100\"\n          }\n        }\n      }\n    },\n    \"vcQ-FZ-z8x.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"35.00\\\"; ObjectID = \\\"vcQ-FZ-z8x\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"35.00\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"35.00\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"35.00\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"35.00\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"35.00\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"35.00\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"35.00\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"35.00\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"35.00\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"35.00\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"35.00\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"35.00\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"35.00\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"35.00\"\n          }\n        }\n      }\n    },\n    \"vdI-K4-SBh.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Check for updates:\\\"; ObjectID = \\\"vdI-K4-SBh\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aktualizace:\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Auf Aktualisierungen prüfen:\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Έλεγχος για ενημερώσεις:\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Check for updates:\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Vérifier mises à jour :\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"アップデートを確認：\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"업데이트 확인:\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Проверить наличие обновлений:\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Güncellemeleri kontrol et:\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Перевірка оновлень:\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"检查更新:\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"檢查更新：\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"檢查更新：\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"檢查更新：\"\n          }\n        }\n      }\n    },\n    \"vFk-37-HRU.title\" : {\n      \"comment\" : \"Class = \\\"NSMenuItem\\\"; title = \\\"Disabled\\\"; ObjectID = \\\"vFk-37-HRU\\\";\",\n      \"extractionState\" : \"stale\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Vypnuto\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Deaktiviert\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Απενεργοποιημένο\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Disabled\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Désactivé\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"無効\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"허용하지 않음\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Не задана\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Devre dışı\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Вимкнено\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"不使用\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"停用\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"停用\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"停用\"\n          }\n        }\n      }\n    },\n    \"Vhz-Rn-lcU.title\" : {\n      \"comment\" : \"Class = \\\"NSMenuItem\\\"; title = \\\"Disabled\\\"; ObjectID = \\\"Vhz-Rn-lcU\\\";\",\n      \"extractionState\" : \"stale\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Vypnuto\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Deaktiviert\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Απενεργοποιημένο\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Disabled\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Désactivé\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"無効\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"허용하지 않음\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Не задана\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Devre dışı\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Вимкнено\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"不使用\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"停用\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"停用\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"停用\"\n          }\n        }\n      }\n    },\n    \"vjK-Rg-us9.title\" : {\n      \"comment\" : \"Class = \\\"NSButtonCell\\\"; title = \\\"Invert wheel direction\\\"; ObjectID = \\\"vjK-Rg-us9\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Obrátit směr posouvání\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Radrichtung umkehren\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Αντιστροφή τροχού\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Invert wheel direction\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Inverser le sens de la roue\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"ホイール反転\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"휠 방향 반전\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Инверсия колеса\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Teker yönünü ters çevir\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Інвертувати колесо\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"反转滚轮方向\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"反轉滾輪方向\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"反轉滾輪方向\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"反轉滾輪方向\"\n          }\n        }\n      }\n    },\n    \"W2z-NX-9UO.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"May affect the scrolling behavior\\\"; ObjectID = \\\"W2z-NX-9UO\\\";\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Může ovlivnit chování posouvání.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Kann das Scrollverhalten beeinflussen.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Μπορεί να επηρεάσει τη συμπεριφορά κύλισης.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"needs_review\",\n            \"value\" : \"May affect the scrolling behavior.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Peut affecter le comportement du défilement\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"スクロールの動作に影響する場合があります。\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"스크롤 동작에 영향을 줄 수 있습니다.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Может повлиять на поведение прокрутки.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Kaydırma davranışını etkileyebilir.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Може вплинути на поведінку прокручування.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"可能会影响滚动行为。\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"可能會影響捲動行為。\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"可能會影響捲動行為。\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"可能會影響捲動行為。\"\n          }\n        }\n      }\n    },\n    \"Wls-5g-cNZ.title\" : {\n      \"comment\" : \"Class = \\\"NSButtonCell\\\"; title = \\\"Inherit Global Settings\\\"; ObjectID = \\\"Wls-5g-cNZ\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Převzít globální nastavení\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Globale Einstellungen vererben\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Κληρονομία Γενικών Ρυθμίσεων\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Inherit Global Settings\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Paramétrage Global Hérité\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"グローバル設定を使用\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"전역 설정 따라가기\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Наследовать глобальные настройки\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Evrensel Ayarlardan Al\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Успадкувати глобальні налаштування\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"继承全局设定\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"繼承全域設定\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"繼承全域設定\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"繼承全域設定\"\n          }\n        }\n      }\n    },\n    \"wrT-sk-Qjf.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"English\\\"; ObjectID = \\\"wrT-sk-Qjf\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Angličtina\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Englisch\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Αγγλικά\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"English\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Anglais\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"英語\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"영어\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Английский\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"İngilizce\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Англійська\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"英语\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"英文\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"英文\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"英文\"\n          }\n        }\n      }\n    },\n    \"xfG-Cd-oIk.headerCell.title\" : {\n      \"comment\" : \"Class = \\\"NSTableColumn\\\"; headerCell.title = \\\" Application\\\"; ObjectID = \\\"xfG-Cd-oIk\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aplikace\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \" App\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \" Εφαρμογή\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \" Application\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Application\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"アプリケーション\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \" 응용 프로그램\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \" Приложение\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \" Uygulama\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \" Програма\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \" 应用\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \" 應用程式\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \" 應用程式\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \" 應用程式\"\n          }\n        }\n      }\n    },\n    \"XjY-7g-GLL.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Application Name\\\"; ObjectID = \\\"XjY-7g-GLL\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Název aplikace\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"App-Name\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Όνομα Εφαρμογής\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Application Name\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Nom de l’application\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"アプリケーション名\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"응용 프로그램 이름\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Название приложения\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Uygulama İsmi\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Назва програми\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"应用名称\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"應用程式名稱\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"應用程式名稱\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"應用程式名稱\"\n          }\n        }\n      }\n    },\n    \"XMw-QE-lsq.title\" : {\n      \"comment\" : \"Class = \\\"NSButtonCell\\\"; title = \\\"Getting trouble ?\\\"; ObjectID = \\\"XMw-QE-lsq\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Máte potíže?\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Probleme?\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Προβλήματα;\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Getting trouble ?\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Un problème ?\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"動かない時は？\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"문제가 있나요?\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Проблемы?\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Sorun mu yaşıyorsunuz?\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Проблеми?\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"遇到问题？\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"遇到問題？\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"遇到問題？\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"遇到問題？\"\n          }\n        }\n      }\n    },\n    \"xnQ-YR-qNR.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Waiting for you\\\"; ObjectID = \\\"xnQ-YR-qNR\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Čekáme na vás\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Wartet auf Sie\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Σας περιμένει\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Waiting for you\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Vous attend\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"お待ちしています\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"기다리고 있습니다\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ожидает вас\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Seni bekliyor\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Чекає на вас\"\n          }\n        }\n      }\n    },\n    \"xoR-7p-3qj.title\" : {\n      \"comment\" : \"Class = \\\"NSButtonCell\\\"; title = \\\"Launch Mos at Login\\\"; ObjectID = \\\"xoR-7p-3qj\\\";\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Otevřít při přihlášení\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Start beim Login\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Εκκίνηση κατά τη σύνδεση\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Launch on Login\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Démarrer avec la session\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"ログイン時に起動\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"시작시 실행\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Запустить при входе\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Başlangıçta Çalıştır\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Запускати при вході\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"在开机时启动\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"開機啟動\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"開機啟動\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"開機啟動\"\n          }\n        }\n      }\n    },\n    \"yDf-dn-Mcz.title\" : {\n      \"comment\" : \"Class = \\\"NSButtonCell\\\"; title = \\\"Home Page\\\"; ObjectID = \\\"yDf-dn-Mcz\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Domovská stránka\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Homepage\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Αρχική Σελίδα\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Home Page\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Page d'accueil\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"ホームページ\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"홈페이지\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Сайт\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ana Sayfa\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Домашня сторінка\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"主页\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"首頁\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"首頁\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"首頁\"\n          }\n        }\n      }\n    },\n    \"yFl-4N-WcD.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Your mouse is about to get a smoothest scrolling experience.\\\\nPick up your mouse, we just have a few thing that you need to check.\\\"; ObjectID = \\\"yFl-4N-WcD\\\";\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Vaše myš získá plynulejší posouvání.\\nNež začnete, je třeba nastavit několik věcí.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ihre Maus ist im Begriff, einen reibungslosen Bildlauf zu ermöglichen. \\nHeben Sie Ihre Maus ab, wir haben nur ein paar Dinge, die Sie überprüfen müssen.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Your mouse is about to get a smoothest scrolling experience.\\nPick up your mouse, we just have a few thing that you need to check.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Your mouse is about to get a smoother scrolling experience.\\nPick up your mouse, there are a few things you need to check.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Votre souris est sur le point de vous faire bénéficier d’une meilleure expérience de défilement. Munissez-vous d’elle, il y a d’abord quelques détails à vérifier.\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"マウスのスクロールがよりスムーズになります。\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"여러분의 마우스의 스크롤링을 더욱 부드럽게 해줍니다.\\n마우스를 드신후에, 몇가지 확인할 사항을 알려드리겠습니다.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ваша мышь готова к плавной прокрутке, но есть еще несколько важных моментов.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Fareniz en akıcı bir kaydırma deneyimini yaşamak üzere.\\nFarenizi alın, kontrol etmeniz gereken birkaç şeyimiz var.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ваша миша отримає найплавніше прокручування.\\nВозьміть мишу, є кілька речей, які потрібно перевірити.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"你的鼠标即将获得顺滑的滚动体验\\n由于 macOS 的限制, 应用需要辅助功能权限方可工作\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"您的滑鼠即將獲得順滑的滾動體驗，抓穩您的滑鼠！只有一些選項需要調整\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"您的滑鼠即將獲得順滑的滾動體驗，抓穩您的滑鼠！只有一些選項需要調整\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"您的滑鼠即將獲得順滑的滾動體驗，抓穩您的滑鼠！只有一些選項需要調整\"\n          }\n        }\n      }\n    },\n    \"YHn-dn-A4n.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Mos\\\"; ObjectID = \\\"YHn-dn-A4n\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mos\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mos\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mos\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Mos\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mos\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mos\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mos\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mos\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mos\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mos\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mos\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mos\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mos\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mos\"\n          }\n        }\n      }\n    },\n    \"Yj9-j0-202.title\" : {\n      \"comment\" : \"Class = \\\"NSButtonCell\\\"; title = \\\"Check on app start\\\"; ObjectID = \\\"Yj9-j0-202\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Kontrolovat při spuštění aplikace\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Check on app start\"\n          }\n        }\n      }\n    },\n    \"Z59-tN-QjE.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Increase scrolling speed on long pages\\\"; ObjectID = \\\"Z59-tN-QjE\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Zvýší rychlost posouvání na dlouhých stránkách\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Scrollgeschwindigkeit auf längeren Seiten erhöhen\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Αυξήστε την ταχύτητα κύλισης σε μεγάλες σελίδες\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Increase scrolling speed on long pages\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Augmenter la vitesse de défilement sur les longues pages\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"長いページでスクロール速度を上げる\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"긴 페이지를 읽을때 스크롤링 속도를 올려줍니다\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Увеличивает скорость прокрутки на длинных страницах\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Uzun sayfalarda kaydırma hızını arttırın\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Збільшити швидкість прокручування на довгих сторінках\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"加快在长页面时的滚动速度\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"加快在長頁面的捲動速度\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"加快在長頁面的捲動速度\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"加快在長頁面的捲動速度\"\n          }\n        }\n      }\n    },\n    \"ZJY-Yg-Qev.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Contributors\\\"; ObjectID = \\\"ZJY-Yg-Qev\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Přispěvatelé\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mitwirkende\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Συνεισφέροντες\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Contributors\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Contributeurs\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"コントリビューター\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"기여자들\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Авторы\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Katkı Sağlayanlar\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Учасники\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"贡献者们\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"貢獻者名單\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"貢獻者名單\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"貢獻者名單\"\n          }\n        }\n      }\n    },\n    \"ZMc-lN-S4q.title\" : {\n      \"comment\" : \"Class = \\\"NSTextFieldCell\\\"; title = \\\"Simplified Chinese\\\"; ObjectID = \\\"ZMc-lN-S4q\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Zjednodušená čínština\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Vereinfachtes Chinesisch\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Απλοποιημένα Κινεζικά\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Simplified Chinese\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Chinois simplifié\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"簡体中国語\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"중국어 간체\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Упрощенный китайский\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Basitleştirilmiş Çince\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Спрощена китайська\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"简体中文\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"簡體中文\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"簡體中文\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"簡體中文\"\n          }\n        }\n      }\n    },\n    \"ZqO-Rs-CpS.title\" : {\n      \"comment\" : \"Class = \\\"NSMenuItem\\\"; title = \\\"⌘ Command\\\"; ObjectID = \\\"ZqO-Rs-CpS\\\";\",\n      \"extractionState\" : \"stale\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Command\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Befehl\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Command\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"⌘ Command\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Command\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Command\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Command\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Command\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Command\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Command\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Command\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Command\"\n          }\n        },\n        \"zh-Hant-HK\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Command\"\n          }\n        },\n        \"zh-Hant-TW\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"⌘ Command\"\n          }\n        }\n      }\n    },\n    \"zTP-iu-A6h.title\" : {\n      \"comment\" : \"Class = \\\"NSButtonCell\\\"; title = \\\"Disabled\\\"; ObjectID = \\\"zTP-iu-A6h\\\";\",\n      \"extractionState\" : \"extracted_with_value\",\n      \"localizations\" : {\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Vypnuto\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Disabled\"\n          }\n        }\n      }\n    }\n  },\n  \"version\" : \"1.1\"\n}"
  },
  {
    "path": "Mos.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 70;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t0BE5A292253A1168006D61C0 /* LoginServiceKit in Frameworks */ = {isa = PBXBuildFile; productRef = 0BE5A291253A1168006D61C0 /* LoginServiceKit */; };\n\t\t0BE5A296253A119C006D61C0 /* Charts in Frameworks */ = {isa = PBXBuildFile; productRef = 0BE5A295253A119C006D61C0 /* Charts */; };\n\t\t0BE5A29A2F7A1C5B006D61C0 /* Sparkle in Frameworks */ = {isa = PBXBuildFile; productRef = 0BE5A29B2F7A1C5B006D61C0 /* Sparkle */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t22142DA01E25344E00E4BFBF /* Mos Debug.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"Mos Debug.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n/* End PBXFileReference section */\n\n/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */\n\t\t0BB750CD2E5F6D8C007C402A /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = {\n\t\t\tisa = PBXFileSystemSynchronizedBuildFileExceptionSet;\n\t\t\tmembershipExceptions = (\n\t\t\t\tInfo.plist,\n\t\t\t);\n\t\t\ttarget = 22142D9F1E25344E00E4BFBF /* Mos */;\n\t\t};\n/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */\n\n/* Begin PBXFileSystemSynchronizedRootGroup section */\n\t\t0BB750952E5F6D8C007C402A /* Mos */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (0BB750CD2E5F6D8C007C402A /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = Mos; sourceTree = \"<group>\"; };\n/* End PBXFileSystemSynchronizedRootGroup section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t22142D9D1E25344E00E4BFBF /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t0BE5A292253A1168006D61C0 /* LoginServiceKit in Frameworks */,\n\t\t\t\t0BE5A296253A119C006D61C0 /* Charts in Frameworks */,\n\t\t\t\t0BE5A29A2F7A1C5B006D61C0 /* Sparkle in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t22142D971E25344E00E4BFBF = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t0BB750952E5F6D8C007C402A /* Mos */,\n\t\t\t\t22142DA11E25344E00E4BFBF /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t22142DA11E25344E00E4BFBF /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t22142DA01E25344E00E4BFBF /* Mos Debug.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t22142D9F1E25344E00E4BFBF /* Mos */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 22142DC51E25344F00E4BFBF /* Build configuration list for PBXNativeTarget \"Mos\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t22142D9C1E25344E00E4BFBF /* Sources */,\n\t\t\t\t22142D9D1E25344E00E4BFBF /* Frameworks */,\n\t\t\t\t22142D9E1E25344E00E4BFBF /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tfileSystemSynchronizedGroups = (\n\t\t\t\t0BB750952E5F6D8C007C402A /* Mos */,\n\t\t\t);\n\t\t\tname = Mos;\n\t\t\tpackageProductDependencies = (\n\t\t\t\t0BE5A291253A1168006D61C0 /* LoginServiceKit */,\n\t\t\t\t0BE5A295253A119C006D61C0 /* Charts */,\n\t\t\t\t0BE5A29B2F7A1C5B006D61C0 /* Sparkle */,\n\t\t\t);\n\t\t\tproductName = Mos;\n\t\t\tproductReference = 22142DA01E25344E00E4BFBF /* Mos Debug.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t22142D981E25344E00E4BFBF /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tBuildIndependentTargetsInParallel = YES;\n\t\t\t\tLastSwiftUpdateCheck = 0930;\n\t\t\t\tLastUpgradeCheck = 2630;\n\t\t\t\tORGANIZATIONNAME = Caldis;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t22142D9F1E25344E00E4BFBF = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.2.1;\n\t\t\t\t\t\tLastSwiftMigration = 1020;\n\t\t\t\t\t\tSystemCapabilities = {\n\t\t\t\t\t\t\tcom.apple.HardenedRuntime = {\n\t\t\t\t\t\t\t\tenabled = 0;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tcom.apple.Sandbox = {\n\t\t\t\t\t\t\t\tenabled = 0;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t};\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 22142D9B1E25344E00E4BFBF /* Build configuration list for PBXProject \"Mos\" */;\n\t\t\tcompatibilityVersion = \"Xcode 8.0\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\tBase,\n\t\t\t\t\"zh-Hans\",\n\t\t\t\tja,\n\t\t\t\t\"zh-Hant\",\n\t\t\t\ten,\n\t\t\t\tru,\n\t\t\t\ttr,\n\t\t\t\tko,\n\t\t\t\tde,\n\t\t\t\t\"zh-Hant-TW\",\n\t\t\t\t\"zh-Hant-HK\",\n\t\t\t\tel,\n\t\t\t\tuk,\n\t\t\t\tfr,\n\t\t\t\tcs,\n\t\t\t);\n\t\t\tmainGroup = 22142D971E25344E00E4BFBF;\n\t\t\tpackageReferences = (\n\t\t\t\t0BE5A290253A1168006D61C0 /* XCRemoteSwiftPackageReference \"LoginServiceKit\" */,\n\t\t\t\t0BE5A294253A119C006D61C0 /* XCRemoteSwiftPackageReference \"Charts\" */,\n\t\t\t\t0BE5A29C2F7A1C5B006D61C0 /* XCRemoteSwiftPackageReference \"Sparkle\" */,\n\t\t\t);\n\t\t\tproductRefGroup = 22142DA11E25344E00E4BFBF /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t22142D9F1E25344E00E4BFBF /* Mos */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t22142D9E1E25344E00E4BFBF /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t22142D9C1E25344E00E4BFBF /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t22142DC31E25344F00E4BFBF /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"compiler-default\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"compiler-default\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEVELOPMENT_TEAM = N7Z52F27XK;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = \"compiler-default\";\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = \"\";\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tLOCALIZATION_PREFERS_STRING_CATALOGS = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.13;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSTRING_CATALOG_GENERATE_SYMBOLS = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_PRECOMPILE_BRIDGING_HEADER = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t22142DC41E25344F00E4BFBF /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"compiler-default\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"compiler-default\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEVELOPMENT_TEAM = N7Z52F27XK;\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = NO;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = \"compiler-default\";\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = fast;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tLOCALIZATION_PREFERS_STRING_CATALOGS = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.13;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tONLY_ACTIVE_ARCH = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSTRING_CATALOG_GENERATE_SYMBOLS = YES;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tSWIFT_PRECOMPILE_BRIDGING_HEADER = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t22142DC61E25344F00E4BFBF /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tAUTOMATION_APPLE_EVENTS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"compiler-default\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"compiler-default\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = Mos/MosRelease.entitlements;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=macosx*]\" = \"Apple Development\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 20260318.2;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEVELOPMENT_ASSET_PATHS = \"\";\n\t\t\t\tDEVELOPMENT_TEAM = N7Z52F27XK;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tINFOPLIST_FILE = Mos/Info.plist;\n\t\t\t\tINFOPLIST_KEY_CFBundleDisplayName = \"Mos Debug\";\n\t\t\t\tINFOPLIST_KEY_LSApplicationCategoryType = \"public.app-category.utilities\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.13;\n\t\t\t\tMARKETING_VERSION = 4.1.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\t\"OTHER_SWIFT_FLAGS[arch=*]\" = \"-DDEBUG\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.caldis.Mos.debug;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME) Debug\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tRUNTIME_EXCEPTION_ALLOW_DYLD_ENVIRONMENT_VARIABLES = NO;\n\t\t\t\tRUNTIME_EXCEPTION_ALLOW_JIT = NO;\n\t\t\t\tRUNTIME_EXCEPTION_ALLOW_UNSIGNED_EXECUTABLE_MEMORY = NO;\n\t\t\t\tRUNTIME_EXCEPTION_DEBUGGING_TOOL = NO;\n\t\t\t\tRUNTIME_EXCEPTION_DISABLE_EXECUTABLE_PAGE_PROTECTION = NO;\n\t\t\t\tRUNTIME_EXCEPTION_DISABLE_LIBRARY_VALIDATION = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t22142DC71E25344F00E4BFBF /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tAUTOMATION_APPLE_EVENTS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"compiler-default\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"compiler-default\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = Mos/MosRelease.entitlements;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=macosx*]\" = \"Apple Development\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 20260318.2;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEVELOPMENT_ASSET_PATHS = \"\";\n\t\t\t\tDEVELOPMENT_TEAM = N7Z52F27XK;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = fast;\n\t\t\t\tINFOPLIST_FILE = Mos/Info.plist;\n\t\t\t\tINFOPLIST_KEY_CFBundleDisplayName = Mos;\n\t\t\t\tINFOPLIST_KEY_LSApplicationCategoryType = \"public.app-category.utilities\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.13;\n\t\t\t\tMARKETING_VERSION = 4.1.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.caldis.Mos;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tRUNTIME_EXCEPTION_ALLOW_DYLD_ENVIRONMENT_VARIABLES = NO;\n\t\t\t\tRUNTIME_EXCEPTION_ALLOW_JIT = NO;\n\t\t\t\tRUNTIME_EXCEPTION_ALLOW_UNSIGNED_EXECUTABLE_MEMORY = NO;\n\t\t\t\tRUNTIME_EXCEPTION_DEBUGGING_TOOL = NO;\n\t\t\t\tRUNTIME_EXCEPTION_DISABLE_EXECUTABLE_PAGE_PROTECTION = NO;\n\t\t\t\tRUNTIME_EXCEPTION_DISABLE_LIBRARY_VALIDATION = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t22142D9B1E25344E00E4BFBF /* Build configuration list for PBXProject \"Mos\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t22142DC31E25344F00E4BFBF /* Debug */,\n\t\t\t\t22142DC41E25344F00E4BFBF /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t22142DC51E25344F00E4BFBF /* Build configuration list for PBXNativeTarget \"Mos\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t22142DC61E25344F00E4BFBF /* Debug */,\n\t\t\t\t22142DC71E25344F00E4BFBF /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\n/* Begin XCRemoteSwiftPackageReference section */\n\t\t0BE5A290253A1168006D61C0 /* XCRemoteSwiftPackageReference \"LoginServiceKit\" */ = {\n\t\t\tisa = XCRemoteSwiftPackageReference;\n\t\t\trepositoryURL = \"https://github.com/Clipy/LoginServiceKit\";\n\t\t\trequirement = {\n\t\t\t\tkind = exactVersion;\n\t\t\t\tversion = 2.4.0;\n\t\t\t};\n\t\t};\n\t\t0BE5A294253A119C006D61C0 /* XCRemoteSwiftPackageReference \"Charts\" */ = {\n\t\t\tisa = XCRemoteSwiftPackageReference;\n\t\t\trepositoryURL = \"https://github.com/danielgindi/Charts\";\n\t\t\trequirement = {\n\t\t\t\tkind = exactVersion;\n\t\t\t\tversion = 4.1.0;\n\t\t\t};\n\t\t};\n\t\t0BE5A29C2F7A1C5B006D61C0 /* XCRemoteSwiftPackageReference \"Sparkle\" */ = {\n\t\t\tisa = XCRemoteSwiftPackageReference;\n\t\t\trepositoryURL = \"https://github.com/sparkle-project/Sparkle\";\n\t\t\trequirement = {\n\t\t\t\tkind = upToNextMajorVersion;\n\t\t\t\tminimumVersion = 2.0.0;\n\t\t\t};\n\t\t};\n/* End XCRemoteSwiftPackageReference section */\n\n/* Begin XCSwiftPackageProductDependency section */\n\t\t0BE5A291253A1168006D61C0 /* LoginServiceKit */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = 0BE5A290253A1168006D61C0 /* XCRemoteSwiftPackageReference \"LoginServiceKit\" */;\n\t\t\tproductName = LoginServiceKit;\n\t\t};\n\t\t0BE5A295253A119C006D61C0 /* Charts */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = 0BE5A294253A119C006D61C0 /* XCRemoteSwiftPackageReference \"Charts\" */;\n\t\t\tproductName = Charts;\n\t\t};\n\t\t0BE5A29B2F7A1C5B006D61C0 /* Sparkle */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = 0BE5A29C2F7A1C5B006D61C0 /* XCRemoteSwiftPackageReference \"Sparkle\" */;\n\t\t\tproductName = Sparkle;\n\t\t};\n/* End XCSwiftPackageProductDependency section */\n\t};\n\trootObject = 22142D981E25344E00E4BFBF /* Project object */;\n}\n"
  },
  {
    "path": "Mos.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Mos.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Mos.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict/>\n</plist>\n"
  },
  {
    "path": "Mos.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved",
    "content": "{\n  \"originHash\" : \"cbdd3e98dceb33f1d8c60bd4f8b77a6dce7375a680fa9378f22fc5212378a305\",\n  \"pins\" : [\n    {\n      \"identity\" : \"charts\",\n      \"kind\" : \"remoteSourceControl\",\n      \"location\" : \"https://github.com/danielgindi/Charts\",\n      \"state\" : {\n        \"revision\" : \"07b23476ad52b926be772f317d8f1d4511ee8d02\",\n        \"version\" : \"4.1.0\"\n      }\n    },\n    {\n      \"identity\" : \"loginservicekit\",\n      \"kind\" : \"remoteSourceControl\",\n      \"location\" : \"https://github.com/Clipy/LoginServiceKit\",\n      \"state\" : {\n        \"revision\" : \"5af9098805ff603830aec65754071c6514bbcacd\",\n        \"version\" : \"2.4.0\"\n      }\n    },\n    {\n      \"identity\" : \"sparkle\",\n      \"kind\" : \"remoteSourceControl\",\n      \"location\" : \"https://github.com/sparkle-project/Sparkle\",\n      \"state\" : {\n        \"revision\" : \"5581748cef2bae787496fe6d61139aebe0a451f6\",\n        \"version\" : \"2.8.1\"\n      }\n    },\n    {\n      \"identity\" : \"swift-algorithms\",\n      \"kind\" : \"remoteSourceControl\",\n      \"location\" : \"https://github.com/apple/swift-algorithms\",\n      \"state\" : {\n        \"revision\" : \"b14b7f4c528c942f121c8b860b9410b2bf57825e\",\n        \"version\" : \"1.0.0\"\n      }\n    },\n    {\n      \"identity\" : \"swift-numerics\",\n      \"kind\" : \"remoteSourceControl\",\n      \"location\" : \"https://github.com/apple/swift-numerics\",\n      \"state\" : {\n        \"revision\" : \"0a5bc04095a675662cf24757cc0640aa2204253b\",\n        \"version\" : \"1.0.2\"\n      }\n    }\n  ],\n  \"version\" : 3\n}\n"
  },
  {
    "path": "Mos.xcodeproj/xcshareddata/xcschemes/Debug.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"2630\"\n   version = \"1.7\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\"\n      buildArchitectures = \"Automatic\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"22142D9F1E25344E00E4BFBF\"\n               BuildableName = \"Mos.app\"\n               BlueprintName = \"Mos\"\n               ReferencedContainer = \"container:Mos.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      shouldAutocreateTestPlan = \"YES\">\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"22142D9F1E25344E00E4BFBF\"\n            BuildableName = \"Mos.app\"\n            BlueprintName = \"Mos\"\n            ReferencedContainer = \"container:Mos.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"22142D9F1E25344E00E4BFBF\"\n            BuildableName = \"Mos.app\"\n            BlueprintName = \"Mos\"\n            ReferencedContainer = \"container:Mos.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Mos.xcodeproj/xcshareddata/xcschemes/Profile.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"2630\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"22142D9F1E25344E00E4BFBF\"\n               BuildableName = \"Mos.app\"\n               BlueprintName = \"Mos\"\n               ReferencedContainer = \"container:Mos.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"22142D9F1E25344E00E4BFBF\"\n            BuildableName = \"Mos.app\"\n            BlueprintName = \"Mos\"\n            ReferencedContainer = \"container:Mos.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"22142D9F1E25344E00E4BFBF\"\n            BuildableName = \"Mos.app\"\n            BlueprintName = \"Mos\"\n            ReferencedContainer = \"container:Mos.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "README.enUS.md",
    "content": "<p align=\"center\">\n  <a href=\"http://mos.caldis.me/\">\n    <img width=\"320\" src=\"https://github.com/Caldis/Mos/blob/master/dmg/dmg-icon.png?raw=true\">\n  </a>\n</p>\n\n\n# Mos\n\n![Xcode 9.0+](https://img.shields.io/badge/Xcode-9.0%2B-blue.svg)\n![Swift 4.0+](https://img.shields.io/badge/Swift-4.0%2B-orange.svg)\n\nA free & simple app to allow your mouse wheel to scroll smoothly on macOS.\n\n[中文](https://github.com/Caldis/Mos/blob/master/README.md) | [English](https://github.com/Caldis/Mos/blob/master/README.enUS.md) |\n[Русский](https://github.com/Caldis/Mos/blob/master/README.ru.md)\n\n\n## Homepage\n\nhttp://mos.caldis.me/\n\n\n## Features\n\n- Smooth out your mouse wheel and customize acceleration and easing curves.\n- Configure touchpad and mouse wheel independently, including per-axis smooth & reverse settings.\n- Simulate trackpad scrolling on a regular mouse for a continuous, touch-like experience.\n- New “Buttons” panel records mouse or keyboard events and binds them to system shortcuts with one click.\n- The “Application” module lets each app inherit or override scroll, shortcut, and button-binding rules.\n- Scroll and button monitors visualize live events to help with troubleshooting.\n\n## What’s new in 4.0\n\n- Preferences got a fresh redesign: PrimaryButton, table views, and popovers now feel consistent in both light and dark mode.\n- Button bindings persist automatically, surface duplicate recordings, and highlight existing entries for quick editing.\n- The shortcut catalog now includes screenshots, screen recording, space switching, and more—default mappings are smarter out of the box.\n- Localization moved to Xcode string catalogs; new strings for buttons and shortcuts land alongside a multilingual website refresh.\n- Mission Control, app switching, and other edge cases no longer break smooth scrolling, making daily use more reliable.\n\n\n## Download & Install\n\n### Homebrew\n\nIf you wish to install the application from [Homebrew](https://brew.sh):\n\n```bash\n$ brew install --cask mos@beta\n```\n\nThe application will live at `/Applications/Mos.app`.\n\nTo update the app:\n\n```bash\n$ brew update\n$ brew upgrade mos@beta\n```\n\nQuit then relaunch the app.\n\n### Manual Installation\n\n- [GithubRelease](https://github.com/Caldis/Mos/releases/)\n\n\n## Guide\n\n- [Wiki](https://github.com/Caldis/Mos/wiki)\n\n\n## Thanks\n\n- [Charts](https://github.com/danielgindi/Charts)\n- [iconfont.cn](http://www.iconfont.cn)\n- [LoginServiceKit](https://github.com/Clipy/LoginServiceKit)\n- [Smoothscroll-for-websites](https://github.com/galambalazs/smoothscroll-for-websites)\n\n\n## Contributing\n\nFeel free to submit or propose improvements to the code or to the translation of Mos in different languages. Please submit new issues through [GitHub issues](https://github.com/Caldis/Mos/issues). If you are good at coding, please submit a PR directly!\n\n\n## LICENSE\n\nCopyright (c) 2018 Caldis rights reserved.\n\n[CC Attribution-NonCommercial](http://creativecommons.org/licenses/by-nc/4.0/)\n\nDo not upload Mos to the App Store.\n"
  },
  {
    "path": "README.id.md",
    "content": "<p align=\"center\">\n  <a href=\"http://mos.caldis.me/\">\n    <img width=\"320\" src=\"https://github.com/Caldis/Mos/blob/master/dmg/dmg-icon.png?raw=true\">\n  </a>\n</p>\n\n\n# Mos\n\n![Xcode 9.0+](https://img.shields.io/badge/Xcode-9.0%2B-blue.svg)\n![Swift 4.0+](https://img.shields.io/badge/Swift-4.0%2B-orange.svg)\n\nAplikasi gratis & sederhana yang bikin mouse kamu discroll lebih halus di macOS.\n\n[中文](https://github.com/Caldis/Mos/blob/master/README.md) | [English](https://github.com/Caldis/Mos/blob/master/README.enUS.md) |\n[Русский](https://github.com/Caldis/Mos/blob/master/README.ru.md) |\n[Indonesia](https://github.com/Caldis/Mos/blob/master/README.id.md)\n\n\n## Homepage\n\nhttp://mos.caldis.me/\n\n\n## Features\n\n- Bikin scroll pakai mouse wheel sehalus pakai touchpad.\n- Bisa atur gaya scroll sesuka hati — dari kecepatan sampai akselerasinya.\n- Mau bedain cara scroll mouse dan touchpad? Bisa banget.\n- Ada grafik kece yang nunjukin gimana scroll kamu bekerja.\n- Punya fitur blokir/izin scroll per aplikasi, langsung dari dalem.\n- Dibangun pakai Swift, jadi ringan dan responsif.\n\n\n## Download & Install\n\n### Homebrew\n\nKalau kamu mau instal aplikasi ini lewat [Homebrew](https://brew.sh):\n\n```bash\n$ brew install --cask mos@beta\n```\n\nAplikasi ada di `/Applications/Mos.app`.\n\nUntuk Update Aplikasi\n\n```bash\n$ brew update\n$ brew upgrade mos@beta\n```\n\nKeluar dan jalankan lagi aplikasi\n\n### Manual Installation\n\n- [GithubRelease](https://github.com/Caldis/Mos/releases/)\n\n\n## Guide\n\n- [Wiki](https://github.com/Caldis/Mos/wiki)\n\n\n## Thanks\n\n- [Charts](https://github.com/danielgindi/Charts)\n- [iconfont.cn](http://www.iconfont.cn)\n- [LoginServiceKit](https://github.com/Clipy/LoginServiceKit)\n- [Smoothscroll-for-websites](https://github.com/galambalazs/smoothscroll-for-websites)\n\n\n## Contributing\n\nFeel free to submit or propose improvements to the code or to the translation of Mos in different languages. Please submit new issues through [GitHub issues](https://github.com/Caldis/Mos/issues). If you are good at coding, please submit a PR directly!\n\nTidak perlu ragu untuk mengirim dan mengusulkan perbaikan untuk kode atau terjemahan Mos dalam bahasa berbeda. Tolong kirim issue baru melalui [GitHub issues](https://github.com/Caldis/Mos/issues). Kalau kamu merasa jago ngoding, kirim PR saja. \n\n\n## LICENSE\n\nCopyright (c) 2018 Caldis rights reserved.\n\n[CC Attribution-NonCommercial](http://creativecommons.org/licenses/by-nc/4.0/)\n\nJangan di upload di App Store\n"
  },
  {
    "path": "README.md",
    "content": "<p align=\"center\">\n  <a href=\"http://mos.caldis.me/\">\n    <img width=\"320\" src=\"https://github.com/Caldis/Mos/blob/master/dmg/dmg-icon.png?raw=true\">\n  </a>\n</p>\n\n\n# Mos\n\n![Xcode 9.0+](https://img.shields.io/badge/Xcode-9.0%2B-blue.svg)\n![Swift 4.0+](https://img.shields.io/badge/Swift-4.0%2B-orange.svg)\n\n一个用于在MacOS上平滑你的鼠标滚动效果的小工具, 让你的滚轮爽如触控板。\n\n[中文](https://github.com/Caldis/Mos/blob/master/README.md) | [English](https://github.com/Caldis/Mos/blob/master/README.enUS.md) |\n[Русский](https://github.com/Caldis/Mos/blob/master/README.ru.md) |\n[Indonesia](https://github.com/Caldis/Mos/blob/master/README.id.md)\n\n\n## 主页\n\nhttp://mos.caldis.me/\n\n\n## 特性\n\n- 平滑你的鼠标滚动体验, 并可自定义加速度与曲线, 也可按滚动方向分别处理\n- 支持分离触控板/鼠标事件, 可按垂直/水平方向分别设置平滑与反向\n- 支持自订鼠标快捷键, 绑定各种系统快捷键\n- 支持按应用处理不同的配置策略\n\n## 下载及安装\n\n### Homebrew安装\n\nMos可通过[Homebrew](https://brew.sh)来安装:\n\n```bash\n$ brew install --cask mos@beta\n```\n\n应用将被安装至 `/Applications/Mos.app`。\n\n若有新版本,可用以下命令升级:\n\n```bash\n$ brew update\n$ brew upgrade mos@beta\n```\n\n重新启动应用即可。\n\n### 手动安装\n\n- [GithubRelease](https://github.com/Caldis/Mos/releases/)\n\n\n## 帮助\n\n- [Wiki](https://github.com/Caldis/Mos/wiki)\n\n\n## 鸣谢\n- [Charts](https://github.com/danielgindi/Charts)\n- [iconfont.cn](http://www.iconfont.cn)\n- [LoginServiceKit](https://github.com/Clipy/LoginServiceKit)\n- [Smoothscroll-for-websites](https://github.com/galambalazs/smoothscroll-for-websites)\n\n\n## 贡献\n\n如果您觉得 Mos 的本地化做的有任何不妥之处, 欢迎您提交任何关于文本修改的意见, 您可以通过提交 Github Issue 的方式告诉我们, 如果您善于编码, 我们非常欢迎您提交一个 PR !\n\n我们欢迎任何形式的贡献，有任何建议或意见您可以给我们 [提问](https://github.com/Caldis/Mos/issues)。\n\n\n  ## LICENSE\n\nCopyright (c) 2017 Caldis rights reserved.\n\n[署名-非商业性使用协议](http://creativecommons.org/licenses/by-nc/3.0/cn/)\n\nAnd you can not upload it to the App Store.\n"
  },
  {
    "path": "README.ru.md",
    "content": "<p align=\"center\">\n  <a href=\"http://mos.caldis.me/\">\n    <img width=\"320\" src=\"https://github.com/Caldis/Mos/blob/master/dmg/dmg-icon.png?raw=true\">\n  </a>\n</p>\n\n\n# Mos\n\n![Xcode 9.0+](https://img.shields.io/badge/Xcode-9.0%2B-blue.svg)\n![Swift 4.0+](https://img.shields.io/badge/Swift-4.0%2B-orange.svg)\n\nБесплатное и простое приложение, позволяющее колесу мыши плавно прокручиваться в macOS.\n\n[中文](https://github.com/Caldis/Mos/blob/master/README.md) | [English](https://github.com/Caldis/Mos/blob/master/README.enUS.md) |\n[Русский](https://github.com/Caldis/Mos/blob/master/README.ru.md)\n\n\n## Главная страница\n\nhttp://mos.caldis.me/\n\n\n## Функции\n\n- Сделайте прокрутку колеса мыши плавной и настройте ускорение и кривые отклика.\n- Настраивайте сенсорную панель и мышь отдельно, включая независимое сглаживание и инверсию по вертикали и горизонтали.\n- Режим «Эмуляция трекпада» дарит обычной мыши непрерывную прокрутку, как на тачпаде.\n- Панель «Кнопки» записывает события мыши или клавиатуры и связывает их с системными сочетаниями в один клик.\n- Модуль «Приложения» позволяет каждому приложению наследовать или переопределять правила прокрутки, хоткеев и привязок кнопок.\n- Окна мониторинга прокрутки и кнопок показывают живые логи, помогая с диагностикой.\n\n## Что нового в 4.0\n\n- Настройки получили новый дизайн: PrimaryButton, таблицы и всплывающие панели выглядят единообразно в светлой и тёмной теме.\n- Привязки кнопок автоматически сохраняются, подсвечивают дубликаты и позволяют быстро редактировать найденные записи.\n- Каталог системных сочетаний пополнился скриншотами, записью экрана, переключением рабочих столов и другими опциями — стандартные привязки стали умнее.\n- Локализации переехали в каталоги строк Xcode, добавлены новые тексты для кнопок и сочетаний, а сайт теперь доступен на нескольких языках.\n- Mission Control, переключение приложений и другие крайние сценарии больше не ломают плавную прокрутку — поведение стало стабильнее.\n\n\n## Загрузка & Установка\n\n### Homebrew\n\nЕсли вы хотите установить приложение с помощью [Homebrew](https://brew.sh):\n\n```bash\n$ brew install --cask mos@beta\n```\n\nПриложение будет находится по адресу `/Applications/Mos.app`.\n\nЧтобы обновить приложение:\n\n```bash\n$ brew update\n$ brew upgrade mos@beta\n```\n\nЗакройте и перезапустите приложение.\n\n### Ручная установка\n\n- [GithubRelease](https://github.com/Caldis/Mos/releases/)\n\n\n## Инструкция\n\n- [Wiki](https://github.com/Caldis/Mos/wiki)\n\n\n## Благодарность\n\n- [Charts](https://github.com/danielgindi/Charts)\n- [iconfont.cn](http://www.iconfont.cn)\n- [LoginServiceKit](https://github.com/Clipy/LoginServiceKit)\n- [Smoothscroll-for-websites](https://github.com/galambalazs/smoothscroll-for-websites)\n\n\n## Содействие\n\nНе стесняйтесь представлять или предлагать улучшения кода или перевода Mos на разные языки. Пожалуйста, отправляйте вопросы через [GitHub issues](https://github.com/Caldis/Mos/issues). Если вы хорошо разбираетесь в программировании, отправьте PR напрямую!\n\n\n## ЛИЦЕНЗИЯ\n\nCopyright (c) 2018 Caldis rights reserved.\n\n[CC Attribution-NonCommercial](http://creativecommons.org/licenses/by-nc/4.0/)\n\nНе загружайте Mos в App Store.\n"
  },
  {
    "path": "dmg/README.md",
    "content": "# DMG 构建说明\n\n创建 mos 安装用的 dmg, 使用 create-dmg 脚本实现\n\n先安装 https://github.com/create-dmg/create-dmg\n\n如果 command 报错记得 chmod +x 一下\n\n然后确保 dmg 目录下东西都在:\n\n- dmg-bg.png DMG 的背景图, 分辨率 700x400\n\n- dmg-icon.png DMG 的图标, 分辨率 1204*1024\n\n- Mos, 应用本体"
  },
  {
    "path": "dmg/create-dmg.command",
    "content": "#!/bin/bash\n\n# 创建 mos 安装用的 dmg, 使用 create-dmg 脚本实现\n# 先安装 https://github.com/create-dmg/create-dmg\n# 然后东西都丢到 Mos 的 dmg 目录下\n# - dmg-bg.png DMG 的背景图, 分辨率 700x400\n# - dmg-icon.png DMG 的图标, 分辨率 1204*1024\n# - Mos, 应用本体\n\n# 设置变量\nVERSION=$(/usr/libexec/PlistBuddy -c \"Print CFBundleShortVersionString\" \"Mos.app/Contents/Info.plist\")\n\necho \"开始构建 DMG...\"\n\necho \"清除遗留文件\"\nrm -f Mos.*.dmg\n\necho \"生成 dmg-icon.png 对应的 icns 文件\"\nmkdir tmp.iconset && cp dmg-icon.png tmp.iconset/icon_512x512@2x.png && iconutil -c icns tmp.iconset -o tmp.icns && rm -rf tmp.iconset\n\necho \"创建 DMG\"\ncreate-dmg \\\n  --volname \"Mos\" \\\n  --volicon \"tmp.icns\" \\\n  --background \"dmg-bg.png\" \\\n  --window-pos 200 120 \\\n  --window-size 700 400 \\\n  --icon-size 150 \\\n  --icon \"Mos.app\" 170 205 \\\n  --app-drop-link 535 195 \\\n  --hide-extension \"Mos.app\" \\\n  --no-internet-enable \\\n  \"Mos.${VERSION}.dmg\" \\\n  \"Mos.app\"\n\necho \"删除临时创建的图标\"\nrm -f tmp.icns\n\necho \"构建完成\""
  },
  {
    "path": "docs/.nojekyll",
    "content": ""
  },
  {
    "path": "docs/404/index.html",
    "content": "<!DOCTYPE html><!--4xlWUdmYkOQZmVpTO2yEI--><html lang=\"en\" class=\"js\"><head><meta charSet=\"utf-8\"/><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/><link rel=\"stylesheet\" href=\"/_next/static/chunks/543732a8392562b4.css\" data-precedence=\"next\"/><link rel=\"preload\" as=\"script\" fetchPriority=\"low\" href=\"/_next/static/chunks/12c422bc11762090.js\"/><script src=\"/_next/static/chunks/b4611851359555bd.js\" async=\"\"></script><script src=\"/_next/static/chunks/f1a98b44d1dc31f1.js\" async=\"\"></script><script src=\"/_next/static/chunks/turbopack-98aeb181aa636c3c.js\" async=\"\"></script><script src=\"/_next/static/chunks/19717b1d18b1c046.js\" async=\"\"></script><script src=\"/_next/static/chunks/c62ecb7f1a587007.js\" async=\"\"></script><script src=\"/_next/static/chunks/2f0565a65fa02d97.js\" async=\"\"></script><link rel=\"preload\" href=\"https://www.googletagmanager.com/gtag/js?id=G-9M7WPLB8BR\" as=\"script\"/><title>404: This page could not be found.</title><meta name=\"robots\" content=\"noindex\"/><meta name=\"next-size-adjust\" content=\"\"/><link rel=\"icon\" href=\"/favicon.ico?favicon.6def09c8.ico\" sizes=\"256x256\" type=\"image/x-icon\"/><script type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https://mos.caldis.me/#website\",\"url\":\"https://mos.caldis.me/\",\"name\":\"Mos\",\"description\":\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\",\"inLanguage\":\"en\"},{\"@type\":\"SoftwareApplication\",\"@id\":\"https://mos.caldis.me/#software\",\"name\":\"Mos\",\"url\":\"https://mos.caldis.me/\",\"operatingSystem\":\"macOS\",\"applicationCategory\":\"UtilitiesApplication\",\"description\":\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\",\"downloadUrl\":\"https://github.com/Caldis/Mos/releases/latest\",\"softwareHelp\":\"https://github.com/Caldis/Mos/wiki\",\"sameAs\":[\"https://github.com/Caldis/Mos\"],\"license\":\"https://creativecommons.org/licenses/by-nc/4.0/\",\"offers\":{\"@type\":\"Offer\",\"price\":\"0\",\"priceCurrency\":\"USD\"}}]}</script><noscript><style>html.js .reveal{opacity:1!important;transform:none!important;filter:none!important}</style></noscript><script src=\"/_next/static/chunks/a6dad97d9634a72d.js\" noModule=\"\"></script></head><body class=\"syne_d93b7706-module__Y_KGdq__variable space_grotesk_8677877b-module__OT3qGa__variable ibm_plex_mono_e0f5f7ea-module__w-hdTq__variable antialiased\"><div hidden=\"\"><!--$--><!--/$--></div><div style=\"font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center\"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class=\"next-error-h1\" style=\"display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px\">404</h1><div style=\"display:inline-block\"><h2 style=\"font-size:14px;font-weight:400;line-height:49px;margin:0\">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src=\"/_next/static/chunks/12c422bc11762090.js\" id=\"_R_\" async=\"\"></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,\"1:\\\"$Sreact.fragment\\\"\\n3:I[96923,[\\\"/_next/static/chunks/19717b1d18b1c046.js\\\"],\\\"Providers\\\"]\\n4:I[33720,[\\\"/_next/static/chunks/c62ecb7f1a587007.js\\\",\\\"/_next/static/chunks/2f0565a65fa02d97.js\\\"],\\\"default\\\"]\\n5:I[16458,[\\\"/_next/static/chunks/c62ecb7f1a587007.js\\\",\\\"/_next/static/chunks/2f0565a65fa02d97.js\\\"],\\\"default\\\"]\\n6:I[13154,[\\\"/_next/static/chunks/19717b1d18b1c046.js\\\"],\\\"\\\"]\\nb:I[70566,[\\\"/_next/static/chunks/c62ecb7f1a587007.js\\\",\\\"/_next/static/chunks/2f0565a65fa02d97.js\\\"],\\\"default\\\"]\\n:HL[\\\"/_next/static/chunks/543732a8392562b4.css\\\",\\\"style\\\"]\\n2:[\\\"$\\\",\\\"style\\\",null,{\\\"children\\\":\\\"html.js .reveal{opacity:1!important;transform:none!important;filter:none!important}\\\"}]\\n\"])</script><script>self.__next_f.push([1,\"0:{\\\"P\\\":null,\\\"b\\\":\\\"4xlWUdmYkOQZmVpTO2yEI\\\",\\\"c\\\":[\\\"\\\",\\\"_not-found\\\",\\\"\\\"],\\\"q\\\":\\\"\\\",\\\"i\\\":false,\\\"f\\\":[[[\\\"\\\",{\\\"children\\\":[\\\"/_not-found\\\",{\\\"children\\\":[\\\"__PAGE__\\\",{}]}]},\\\"$undefined\\\",\\\"$undefined\\\",true],[[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[[[\\\"$\\\",\\\"link\\\",\\\"0\\\",{\\\"rel\\\":\\\"stylesheet\\\",\\\"href\\\":\\\"/_next/static/chunks/543732a8392562b4.css\\\",\\\"precedence\\\":\\\"next\\\",\\\"crossOrigin\\\":\\\"$undefined\\\",\\\"nonce\\\":\\\"$undefined\\\"}],[\\\"$\\\",\\\"script\\\",\\\"script-0\\\",{\\\"src\\\":\\\"/_next/static/chunks/19717b1d18b1c046.js\\\",\\\"async\\\":true,\\\"nonce\\\":\\\"$undefined\\\"}]],[\\\"$\\\",\\\"html\\\",null,{\\\"lang\\\":\\\"en\\\",\\\"className\\\":\\\"js\\\",\\\"children\\\":[[\\\"$\\\",\\\"head\\\",null,{\\\"children\\\":[[\\\"$\\\",\\\"script\\\",null,{\\\"type\\\":\\\"application/ld+json\\\",\\\"dangerouslySetInnerHTML\\\":{\\\"__html\\\":\\\"{\\\\\\\"@context\\\\\\\":\\\\\\\"https://schema.org\\\\\\\",\\\\\\\"@graph\\\\\\\":[{\\\\\\\"@type\\\\\\\":\\\\\\\"WebSite\\\\\\\",\\\\\\\"@id\\\\\\\":\\\\\\\"https://mos.caldis.me/#website\\\\\\\",\\\\\\\"url\\\\\\\":\\\\\\\"https://mos.caldis.me/\\\\\\\",\\\\\\\"name\\\\\\\":\\\\\\\"Mos\\\\\\\",\\\\\\\"description\\\\\\\":\\\\\\\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\\\\\\\",\\\\\\\"inLanguage\\\\\\\":\\\\\\\"en\\\\\\\"},{\\\\\\\"@type\\\\\\\":\\\\\\\"SoftwareApplication\\\\\\\",\\\\\\\"@id\\\\\\\":\\\\\\\"https://mos.caldis.me/#software\\\\\\\",\\\\\\\"name\\\\\\\":\\\\\\\"Mos\\\\\\\",\\\\\\\"url\\\\\\\":\\\\\\\"https://mos.caldis.me/\\\\\\\",\\\\\\\"operatingSystem\\\\\\\":\\\\\\\"macOS\\\\\\\",\\\\\\\"applicationCategory\\\\\\\":\\\\\\\"UtilitiesApplication\\\\\\\",\\\\\\\"description\\\\\\\":\\\\\\\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\\\\\\\",\\\\\\\"downloadUrl\\\\\\\":\\\\\\\"https://github.com/Caldis/Mos/releases/latest\\\\\\\",\\\\\\\"softwareHelp\\\\\\\":\\\\\\\"https://github.com/Caldis/Mos/wiki\\\\\\\",\\\\\\\"sameAs\\\\\\\":[\\\\\\\"https://github.com/Caldis/Mos\\\\\\\"],\\\\\\\"license\\\\\\\":\\\\\\\"https://creativecommons.org/licenses/by-nc/4.0/\\\\\\\",\\\\\\\"offers\\\\\\\":{\\\\\\\"@type\\\\\\\":\\\\\\\"Offer\\\\\\\",\\\\\\\"price\\\\\\\":\\\\\\\"0\\\\\\\",\\\\\\\"priceCurrency\\\\\\\":\\\\\\\"USD\\\\\\\"}}]}\\\"}}],[\\\"$\\\",\\\"noscript\\\",null,{\\\"children\\\":\\\"$2\\\"}]]}],[\\\"$\\\",\\\"body\\\",null,{\\\"className\\\":\\\"syne_d93b7706-module__Y_KGdq__variable space_grotesk_8677877b-module__OT3qGa__variable ibm_plex_mono_e0f5f7ea-module__w-hdTq__variable antialiased\\\",\\\"children\\\":[[\\\"$\\\",\\\"$L3\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"$L4\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L5\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"notFound\\\":[[[\\\"$\\\",\\\"title\\\",null,{\\\"children\\\":\\\"404: This page could not be found.\\\"}],[\\\"$\\\",\\\"div\\\",null,{\\\"style\\\":{\\\"fontFamily\\\":\\\"system-ui,\\\\\\\"Segoe UI\\\\\\\",Roboto,Helvetica,Arial,sans-serif,\\\\\\\"Apple Color Emoji\\\\\\\",\\\\\\\"Segoe UI Emoji\\\\\\\"\\\",\\\"height\\\":\\\"100vh\\\",\\\"textAlign\\\":\\\"center\\\",\\\"display\\\":\\\"flex\\\",\\\"flexDirection\\\":\\\"column\\\",\\\"alignItems\\\":\\\"center\\\",\\\"justifyContent\\\":\\\"center\\\"},\\\"children\\\":[\\\"$\\\",\\\"div\\\",null,{\\\"children\\\":[[\\\"$\\\",\\\"style\\\",null,{\\\"dangerouslySetInnerHTML\\\":{\\\"__html\\\":\\\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\\\"}}],[\\\"$\\\",\\\"h1\\\",null,{\\\"className\\\":\\\"next-error-h1\\\",\\\"style\\\":{\\\"display\\\":\\\"inline-block\\\",\\\"margin\\\":\\\"0 20px 0 0\\\",\\\"padding\\\":\\\"0 23px 0 0\\\",\\\"fontSize\\\":24,\\\"fontWeight\\\":500,\\\"verticalAlign\\\":\\\"top\\\",\\\"lineHeight\\\":\\\"49px\\\"},\\\"children\\\":404}],[\\\"$\\\",\\\"div\\\",null,{\\\"style\\\":{\\\"display\\\":\\\"inline-block\\\"},\\\"children\\\":[\\\"$\\\",\\\"h2\\\",null,{\\\"style\\\":{\\\"fontSize\\\":14,\\\"fontWeight\\\":400,\\\"lineHeight\\\":\\\"49px\\\",\\\"margin\\\":0},\\\"children\\\":\\\"This page could not be found.\\\"}]}]]}]}]],[]],\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]}],[\\\"$\\\",\\\"$L6\\\",null,{\\\"src\\\":\\\"https://www.googletagmanager.com/gtag/js?id=G-9M7WPLB8BR\\\",\\\"strategy\\\":\\\"afterInteractive\\\"}],[\\\"$\\\",\\\"$L6\\\",null,{\\\"id\\\":\\\"ga4\\\",\\\"strategy\\\":\\\"afterInteractive\\\",\\\"children\\\":\\\"\\\\n            window.dataLayer = window.dataLayer || [];\\\\n            function gtag(){dataLayer.push(arguments);}\\\\n            gtag('js', new Date());\\\\n            gtag('config', 'G-9M7WPLB8BR');\\\\n          \\\"}]]}]]}]]}],{\\\"children\\\":[[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"$L4\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L5\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]]}],{\\\"children\\\":[[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[[[\\\"$\\\",\\\"title\\\",null,{\\\"children\\\":\\\"404: This page could not be found.\\\"}],[\\\"$\\\",\\\"div\\\",null,{\\\"style\\\":\\\"$0:f:0:1:0:props:children:1:props:children:1:props:children:0:props:children:props:notFound:0:1:props:style\\\",\\\"children\\\":[\\\"$\\\",\\\"div\\\",null,{\\\"children\\\":[[\\\"$\\\",\\\"style\\\",null,{\\\"dangerouslySetInnerHTML\\\":{\\\"__html\\\":\\\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\\\"}}],\\\"$L7\\\",\\\"$L8\\\"]}]}]],null,\\\"$L9\\\"]}],{},null,false,false]},null,false,false]},null,false,false],\\\"$La\\\",false]],\\\"m\\\":\\\"$undefined\\\",\\\"G\\\":[\\\"$b\\\",\\\"$undefined\\\"],\\\"S\\\":true}\\n\"])</script><script>self.__next_f.push([1,\"c:I[45924,[\\\"/_next/static/chunks/c62ecb7f1a587007.js\\\",\\\"/_next/static/chunks/2f0565a65fa02d97.js\\\"],\\\"OutletBoundary\\\"]\\nd:\\\"$Sreact.suspense\\\"\\nf:I[45924,[\\\"/_next/static/chunks/c62ecb7f1a587007.js\\\",\\\"/_next/static/chunks/2f0565a65fa02d97.js\\\"],\\\"ViewportBoundary\\\"]\\n11:I[45924,[\\\"/_next/static/chunks/c62ecb7f1a587007.js\\\",\\\"/_next/static/chunks/2f0565a65fa02d97.js\\\"],\\\"MetadataBoundary\\\"]\\n7:[\\\"$\\\",\\\"h1\\\",null,{\\\"className\\\":\\\"next-error-h1\\\",\\\"style\\\":\\\"$0:f:0:1:0:props:children:1:props:children:1:props:children:0:props:children:props:notFound:0:1:props:children:props:children:1:props:style\\\",\\\"children\\\":404}]\\n8:[\\\"$\\\",\\\"div\\\",null,{\\\"style\\\":\\\"$0:f:0:1:0:props:children:1:props:children:1:props:children:0:props:children:props:notFound:0:1:props:children:props:children:2:props:style\\\",\\\"children\\\":[\\\"$\\\",\\\"h2\\\",null,{\\\"style\\\":\\\"$0:f:0:1:0:props:children:1:props:children:1:props:children:0:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\\\",\\\"children\\\":\\\"This page could not be found.\\\"}]}]\\n9:[\\\"$\\\",\\\"$Lc\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"$d\\\",null,{\\\"name\\\":\\\"Next.MetadataOutlet\\\",\\\"children\\\":\\\"$@e\\\"}]}]\\na:[\\\"$\\\",\\\"$1\\\",\\\"h\\\",{\\\"children\\\":[[\\\"$\\\",\\\"meta\\\",null,{\\\"name\\\":\\\"robots\\\",\\\"content\\\":\\\"noindex\\\"}],[\\\"$\\\",\\\"$Lf\\\",null,{\\\"children\\\":\\\"$L10\\\"}],[\\\"$\\\",\\\"div\\\",null,{\\\"hidden\\\":true,\\\"children\\\":[\\\"$\\\",\\\"$L11\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"$d\\\",null,{\\\"name\\\":\\\"Next.Metadata\\\",\\\"children\\\":\\\"$L12\\\"}]}]}],[\\\"$\\\",\\\"meta\\\",null,{\\\"name\\\":\\\"next-size-adjust\\\",\\\"content\\\":\\\"\\\"}]]}]\\n\"])</script><script>self.__next_f.push([1,\"10:[[\\\"$\\\",\\\"meta\\\",\\\"0\\\",{\\\"charSet\\\":\\\"utf-8\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"1\\\",{\\\"name\\\":\\\"viewport\\\",\\\"content\\\":\\\"width=device-width, initial-scale=1\\\"}]]\\n\"])</script><script>self.__next_f.push([1,\"13:I[46886,[\\\"/_next/static/chunks/c62ecb7f1a587007.js\\\",\\\"/_next/static/chunks/2f0565a65fa02d97.js\\\"],\\\"IconMark\\\"]\\ne:null\\n12:[[\\\"$\\\",\\\"link\\\",\\\"0\\\",{\\\"rel\\\":\\\"icon\\\",\\\"href\\\":\\\"/favicon.ico?favicon.6def09c8.ico\\\",\\\"sizes\\\":\\\"256x256\\\",\\\"type\\\":\\\"image/x-icon\\\"}],[\\\"$\\\",\\\"$L13\\\",\\\"1\\\",{}]]\\n\"])</script></body></html>"
  },
  {
    "path": "docs/404.html",
    "content": "<!DOCTYPE html><!--4xlWUdmYkOQZmVpTO2yEI--><html lang=\"en\" class=\"js\"><head><meta charSet=\"utf-8\"/><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/><link rel=\"stylesheet\" href=\"/_next/static/chunks/543732a8392562b4.css\" data-precedence=\"next\"/><link rel=\"preload\" as=\"script\" fetchPriority=\"low\" href=\"/_next/static/chunks/12c422bc11762090.js\"/><script src=\"/_next/static/chunks/b4611851359555bd.js\" async=\"\"></script><script src=\"/_next/static/chunks/f1a98b44d1dc31f1.js\" async=\"\"></script><script src=\"/_next/static/chunks/turbopack-98aeb181aa636c3c.js\" async=\"\"></script><script src=\"/_next/static/chunks/19717b1d18b1c046.js\" async=\"\"></script><script src=\"/_next/static/chunks/c62ecb7f1a587007.js\" async=\"\"></script><script src=\"/_next/static/chunks/2f0565a65fa02d97.js\" async=\"\"></script><link rel=\"preload\" href=\"https://www.googletagmanager.com/gtag/js?id=G-9M7WPLB8BR\" as=\"script\"/><title>404: This page could not be found.</title><meta name=\"robots\" content=\"noindex\"/><meta name=\"next-size-adjust\" content=\"\"/><link rel=\"icon\" href=\"/favicon.ico?favicon.6def09c8.ico\" sizes=\"256x256\" type=\"image/x-icon\"/><script type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https://mos.caldis.me/#website\",\"url\":\"https://mos.caldis.me/\",\"name\":\"Mos\",\"description\":\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\",\"inLanguage\":\"en\"},{\"@type\":\"SoftwareApplication\",\"@id\":\"https://mos.caldis.me/#software\",\"name\":\"Mos\",\"url\":\"https://mos.caldis.me/\",\"operatingSystem\":\"macOS\",\"applicationCategory\":\"UtilitiesApplication\",\"description\":\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\",\"downloadUrl\":\"https://github.com/Caldis/Mos/releases/latest\",\"softwareHelp\":\"https://github.com/Caldis/Mos/wiki\",\"sameAs\":[\"https://github.com/Caldis/Mos\"],\"license\":\"https://creativecommons.org/licenses/by-nc/4.0/\",\"offers\":{\"@type\":\"Offer\",\"price\":\"0\",\"priceCurrency\":\"USD\"}}]}</script><noscript><style>html.js .reveal{opacity:1!important;transform:none!important;filter:none!important}</style></noscript><script src=\"/_next/static/chunks/a6dad97d9634a72d.js\" noModule=\"\"></script></head><body class=\"syne_d93b7706-module__Y_KGdq__variable space_grotesk_8677877b-module__OT3qGa__variable ibm_plex_mono_e0f5f7ea-module__w-hdTq__variable antialiased\"><div hidden=\"\"><!--$--><!--/$--></div><div style=\"font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center\"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class=\"next-error-h1\" style=\"display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px\">404</h1><div style=\"display:inline-block\"><h2 style=\"font-size:14px;font-weight:400;line-height:49px;margin:0\">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src=\"/_next/static/chunks/12c422bc11762090.js\" id=\"_R_\" async=\"\"></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,\"1:\\\"$Sreact.fragment\\\"\\n3:I[96923,[\\\"/_next/static/chunks/19717b1d18b1c046.js\\\"],\\\"Providers\\\"]\\n4:I[33720,[\\\"/_next/static/chunks/c62ecb7f1a587007.js\\\",\\\"/_next/static/chunks/2f0565a65fa02d97.js\\\"],\\\"default\\\"]\\n5:I[16458,[\\\"/_next/static/chunks/c62ecb7f1a587007.js\\\",\\\"/_next/static/chunks/2f0565a65fa02d97.js\\\"],\\\"default\\\"]\\n6:I[13154,[\\\"/_next/static/chunks/19717b1d18b1c046.js\\\"],\\\"\\\"]\\nb:I[70566,[\\\"/_next/static/chunks/c62ecb7f1a587007.js\\\",\\\"/_next/static/chunks/2f0565a65fa02d97.js\\\"],\\\"default\\\"]\\n:HL[\\\"/_next/static/chunks/543732a8392562b4.css\\\",\\\"style\\\"]\\n2:[\\\"$\\\",\\\"style\\\",null,{\\\"children\\\":\\\"html.js .reveal{opacity:1!important;transform:none!important;filter:none!important}\\\"}]\\n\"])</script><script>self.__next_f.push([1,\"0:{\\\"P\\\":null,\\\"b\\\":\\\"4xlWUdmYkOQZmVpTO2yEI\\\",\\\"c\\\":[\\\"\\\",\\\"_not-found\\\",\\\"\\\"],\\\"q\\\":\\\"\\\",\\\"i\\\":false,\\\"f\\\":[[[\\\"\\\",{\\\"children\\\":[\\\"/_not-found\\\",{\\\"children\\\":[\\\"__PAGE__\\\",{}]}]},\\\"$undefined\\\",\\\"$undefined\\\",true],[[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[[[\\\"$\\\",\\\"link\\\",\\\"0\\\",{\\\"rel\\\":\\\"stylesheet\\\",\\\"href\\\":\\\"/_next/static/chunks/543732a8392562b4.css\\\",\\\"precedence\\\":\\\"next\\\",\\\"crossOrigin\\\":\\\"$undefined\\\",\\\"nonce\\\":\\\"$undefined\\\"}],[\\\"$\\\",\\\"script\\\",\\\"script-0\\\",{\\\"src\\\":\\\"/_next/static/chunks/19717b1d18b1c046.js\\\",\\\"async\\\":true,\\\"nonce\\\":\\\"$undefined\\\"}]],[\\\"$\\\",\\\"html\\\",null,{\\\"lang\\\":\\\"en\\\",\\\"className\\\":\\\"js\\\",\\\"children\\\":[[\\\"$\\\",\\\"head\\\",null,{\\\"children\\\":[[\\\"$\\\",\\\"script\\\",null,{\\\"type\\\":\\\"application/ld+json\\\",\\\"dangerouslySetInnerHTML\\\":{\\\"__html\\\":\\\"{\\\\\\\"@context\\\\\\\":\\\\\\\"https://schema.org\\\\\\\",\\\\\\\"@graph\\\\\\\":[{\\\\\\\"@type\\\\\\\":\\\\\\\"WebSite\\\\\\\",\\\\\\\"@id\\\\\\\":\\\\\\\"https://mos.caldis.me/#website\\\\\\\",\\\\\\\"url\\\\\\\":\\\\\\\"https://mos.caldis.me/\\\\\\\",\\\\\\\"name\\\\\\\":\\\\\\\"Mos\\\\\\\",\\\\\\\"description\\\\\\\":\\\\\\\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\\\\\\\",\\\\\\\"inLanguage\\\\\\\":\\\\\\\"en\\\\\\\"},{\\\\\\\"@type\\\\\\\":\\\\\\\"SoftwareApplication\\\\\\\",\\\\\\\"@id\\\\\\\":\\\\\\\"https://mos.caldis.me/#software\\\\\\\",\\\\\\\"name\\\\\\\":\\\\\\\"Mos\\\\\\\",\\\\\\\"url\\\\\\\":\\\\\\\"https://mos.caldis.me/\\\\\\\",\\\\\\\"operatingSystem\\\\\\\":\\\\\\\"macOS\\\\\\\",\\\\\\\"applicationCategory\\\\\\\":\\\\\\\"UtilitiesApplication\\\\\\\",\\\\\\\"description\\\\\\\":\\\\\\\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\\\\\\\",\\\\\\\"downloadUrl\\\\\\\":\\\\\\\"https://github.com/Caldis/Mos/releases/latest\\\\\\\",\\\\\\\"softwareHelp\\\\\\\":\\\\\\\"https://github.com/Caldis/Mos/wiki\\\\\\\",\\\\\\\"sameAs\\\\\\\":[\\\\\\\"https://github.com/Caldis/Mos\\\\\\\"],\\\\\\\"license\\\\\\\":\\\\\\\"https://creativecommons.org/licenses/by-nc/4.0/\\\\\\\",\\\\\\\"offers\\\\\\\":{\\\\\\\"@type\\\\\\\":\\\\\\\"Offer\\\\\\\",\\\\\\\"price\\\\\\\":\\\\\\\"0\\\\\\\",\\\\\\\"priceCurrency\\\\\\\":\\\\\\\"USD\\\\\\\"}}]}\\\"}}],[\\\"$\\\",\\\"noscript\\\",null,{\\\"children\\\":\\\"$2\\\"}]]}],[\\\"$\\\",\\\"body\\\",null,{\\\"className\\\":\\\"syne_d93b7706-module__Y_KGdq__variable space_grotesk_8677877b-module__OT3qGa__variable ibm_plex_mono_e0f5f7ea-module__w-hdTq__variable antialiased\\\",\\\"children\\\":[[\\\"$\\\",\\\"$L3\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"$L4\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L5\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"notFound\\\":[[[\\\"$\\\",\\\"title\\\",null,{\\\"children\\\":\\\"404: This page could not be found.\\\"}],[\\\"$\\\",\\\"div\\\",null,{\\\"style\\\":{\\\"fontFamily\\\":\\\"system-ui,\\\\\\\"Segoe UI\\\\\\\",Roboto,Helvetica,Arial,sans-serif,\\\\\\\"Apple Color Emoji\\\\\\\",\\\\\\\"Segoe UI Emoji\\\\\\\"\\\",\\\"height\\\":\\\"100vh\\\",\\\"textAlign\\\":\\\"center\\\",\\\"display\\\":\\\"flex\\\",\\\"flexDirection\\\":\\\"column\\\",\\\"alignItems\\\":\\\"center\\\",\\\"justifyContent\\\":\\\"center\\\"},\\\"children\\\":[\\\"$\\\",\\\"div\\\",null,{\\\"children\\\":[[\\\"$\\\",\\\"style\\\",null,{\\\"dangerouslySetInnerHTML\\\":{\\\"__html\\\":\\\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\\\"}}],[\\\"$\\\",\\\"h1\\\",null,{\\\"className\\\":\\\"next-error-h1\\\",\\\"style\\\":{\\\"display\\\":\\\"inline-block\\\",\\\"margin\\\":\\\"0 20px 0 0\\\",\\\"padding\\\":\\\"0 23px 0 0\\\",\\\"fontSize\\\":24,\\\"fontWeight\\\":500,\\\"verticalAlign\\\":\\\"top\\\",\\\"lineHeight\\\":\\\"49px\\\"},\\\"children\\\":404}],[\\\"$\\\",\\\"div\\\",null,{\\\"style\\\":{\\\"display\\\":\\\"inline-block\\\"},\\\"children\\\":[\\\"$\\\",\\\"h2\\\",null,{\\\"style\\\":{\\\"fontSize\\\":14,\\\"fontWeight\\\":400,\\\"lineHeight\\\":\\\"49px\\\",\\\"margin\\\":0},\\\"children\\\":\\\"This page could not be found.\\\"}]}]]}]}]],[]],\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]}],[\\\"$\\\",\\\"$L6\\\",null,{\\\"src\\\":\\\"https://www.googletagmanager.com/gtag/js?id=G-9M7WPLB8BR\\\",\\\"strategy\\\":\\\"afterInteractive\\\"}],[\\\"$\\\",\\\"$L6\\\",null,{\\\"id\\\":\\\"ga4\\\",\\\"strategy\\\":\\\"afterInteractive\\\",\\\"children\\\":\\\"\\\\n            window.dataLayer = window.dataLayer || [];\\\\n            function gtag(){dataLayer.push(arguments);}\\\\n            gtag('js', new Date());\\\\n            gtag('config', 'G-9M7WPLB8BR');\\\\n          \\\"}]]}]]}]]}],{\\\"children\\\":[[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"$L4\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L5\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]]}],{\\\"children\\\":[[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[[[\\\"$\\\",\\\"title\\\",null,{\\\"children\\\":\\\"404: This page could not be found.\\\"}],[\\\"$\\\",\\\"div\\\",null,{\\\"style\\\":\\\"$0:f:0:1:0:props:children:1:props:children:1:props:children:0:props:children:props:notFound:0:1:props:style\\\",\\\"children\\\":[\\\"$\\\",\\\"div\\\",null,{\\\"children\\\":[[\\\"$\\\",\\\"style\\\",null,{\\\"dangerouslySetInnerHTML\\\":{\\\"__html\\\":\\\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\\\"}}],\\\"$L7\\\",\\\"$L8\\\"]}]}]],null,\\\"$L9\\\"]}],{},null,false,false]},null,false,false]},null,false,false],\\\"$La\\\",false]],\\\"m\\\":\\\"$undefined\\\",\\\"G\\\":[\\\"$b\\\",\\\"$undefined\\\"],\\\"S\\\":true}\\n\"])</script><script>self.__next_f.push([1,\"c:I[45924,[\\\"/_next/static/chunks/c62ecb7f1a587007.js\\\",\\\"/_next/static/chunks/2f0565a65fa02d97.js\\\"],\\\"OutletBoundary\\\"]\\nd:\\\"$Sreact.suspense\\\"\\nf:I[45924,[\\\"/_next/static/chunks/c62ecb7f1a587007.js\\\",\\\"/_next/static/chunks/2f0565a65fa02d97.js\\\"],\\\"ViewportBoundary\\\"]\\n11:I[45924,[\\\"/_next/static/chunks/c62ecb7f1a587007.js\\\",\\\"/_next/static/chunks/2f0565a65fa02d97.js\\\"],\\\"MetadataBoundary\\\"]\\n7:[\\\"$\\\",\\\"h1\\\",null,{\\\"className\\\":\\\"next-error-h1\\\",\\\"style\\\":\\\"$0:f:0:1:0:props:children:1:props:children:1:props:children:0:props:children:props:notFound:0:1:props:children:props:children:1:props:style\\\",\\\"children\\\":404}]\\n8:[\\\"$\\\",\\\"div\\\",null,{\\\"style\\\":\\\"$0:f:0:1:0:props:children:1:props:children:1:props:children:0:props:children:props:notFound:0:1:props:children:props:children:2:props:style\\\",\\\"children\\\":[\\\"$\\\",\\\"h2\\\",null,{\\\"style\\\":\\\"$0:f:0:1:0:props:children:1:props:children:1:props:children:0:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\\\",\\\"children\\\":\\\"This page could not be found.\\\"}]}]\\n9:[\\\"$\\\",\\\"$Lc\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"$d\\\",null,{\\\"name\\\":\\\"Next.MetadataOutlet\\\",\\\"children\\\":\\\"$@e\\\"}]}]\\na:[\\\"$\\\",\\\"$1\\\",\\\"h\\\",{\\\"children\\\":[[\\\"$\\\",\\\"meta\\\",null,{\\\"name\\\":\\\"robots\\\",\\\"content\\\":\\\"noindex\\\"}],[\\\"$\\\",\\\"$Lf\\\",null,{\\\"children\\\":\\\"$L10\\\"}],[\\\"$\\\",\\\"div\\\",null,{\\\"hidden\\\":true,\\\"children\\\":[\\\"$\\\",\\\"$L11\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"$d\\\",null,{\\\"name\\\":\\\"Next.Metadata\\\",\\\"children\\\":\\\"$L12\\\"}]}]}],[\\\"$\\\",\\\"meta\\\",null,{\\\"name\\\":\\\"next-size-adjust\\\",\\\"content\\\":\\\"\\\"}]]}]\\n\"])</script><script>self.__next_f.push([1,\"10:[[\\\"$\\\",\\\"meta\\\",\\\"0\\\",{\\\"charSet\\\":\\\"utf-8\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"1\\\",{\\\"name\\\":\\\"viewport\\\",\\\"content\\\":\\\"width=device-width, initial-scale=1\\\"}]]\\n\"])</script><script>self.__next_f.push([1,\"13:I[46886,[\\\"/_next/static/chunks/c62ecb7f1a587007.js\\\",\\\"/_next/static/chunks/2f0565a65fa02d97.js\\\"],\\\"IconMark\\\"]\\ne:null\\n12:[[\\\"$\\\",\\\"link\\\",\\\"0\\\",{\\\"rel\\\":\\\"icon\\\",\\\"href\\\":\\\"/favicon.ico?favicon.6def09c8.ico\\\",\\\"sizes\\\":\\\"256x256\\\",\\\"type\\\":\\\"image/x-icon\\\"}],[\\\"$\\\",\\\"$L13\\\",\\\"1\\\",{}]]\\n\"])</script></body></html>"
  },
  {
    "path": "docs/CNAME",
    "content": "mos.caldis.me"
  },
  {
    "path": "docs/__next.__PAGE__.txt",
    "content": "1:\"$Sreact.fragment\"\n2:I[61096,[\"/_next/static/chunks/19717b1d18b1c046.js\",\"/_next/static/chunks/d95bda38d1a9ce53.js\",\"/_next/static/chunks/b492b32695e3b282.js\"],\"default\"]\n3:I[45924,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"OutletBoundary\"]\n4:\"$Sreact.suspense\"\n0:{\"buildId\":\"4xlWUdmYkOQZmVpTO2yEI\",\"rsc\":[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L2\",null,{}],[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/d95bda38d1a9ce53.js\",\"async\":true}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/b492b32695e3b282.js\",\"async\":true}]],[\"$\",\"$L3\",null,{\"children\":[\"$\",\"$4\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@5\"}]}]]}],\"loading\":null,\"isPartial\":false}\n5:null\n"
  },
  {
    "path": "docs/__next._full.txt",
    "content": "1:\"$Sreact.fragment\"\n3:I[96923,[\"/_next/static/chunks/19717b1d18b1c046.js\"],\"Providers\"]\n4:I[33720,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"default\"]\n5:I[16458,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"default\"]\n6:I[13154,[\"/_next/static/chunks/19717b1d18b1c046.js\"],\"\"]\n7:I[61096,[\"/_next/static/chunks/19717b1d18b1c046.js\",\"/_next/static/chunks/d95bda38d1a9ce53.js\",\"/_next/static/chunks/b492b32695e3b282.js\"],\"default\"]\n8:I[45924,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"OutletBoundary\"]\n9:\"$Sreact.suspense\"\nb:I[45924,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"ViewportBoundary\"]\nd:I[45924,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"MetadataBoundary\"]\nf:I[70566,[],\"default\"]\n:HL[\"/_next/static/chunks/543732a8392562b4.css\",\"style\"]\n:HL[\"/_next/static/media/0c795a286deabae8-s.p.b6c48e4e.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/0c89a48fa5027cee-s.p.4564287c.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/23b7a97ae3b5c134-s.p.2902b61f.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/99e609270109b47d-s.p.64b9304e.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/effe91970fc4db64-s.p.19510058.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n2:[\"$\",\"style\",null,{\"children\":\"html.js .reveal{opacity:1!important;transform:none!important;filter:none!important}\"}]\n0:{\"P\":null,\"b\":\"4xlWUdmYkOQZmVpTO2yEI\",\"c\":[\"\",\"\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]},\"$undefined\",\"$undefined\",true],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/543732a8392562b4.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/19717b1d18b1c046.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"js\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"script\",null,{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@graph\\\":[{\\\"@type\\\":\\\"WebSite\\\",\\\"@id\\\":\\\"https://mos.caldis.me/#website\\\",\\\"url\\\":\\\"https://mos.caldis.me/\\\",\\\"name\\\":\\\"Mos\\\",\\\"description\\\":\\\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\\\",\\\"inLanguage\\\":\\\"en\\\"},{\\\"@type\\\":\\\"SoftwareApplication\\\",\\\"@id\\\":\\\"https://mos.caldis.me/#software\\\",\\\"name\\\":\\\"Mos\\\",\\\"url\\\":\\\"https://mos.caldis.me/\\\",\\\"operatingSystem\\\":\\\"macOS\\\",\\\"applicationCategory\\\":\\\"UtilitiesApplication\\\",\\\"description\\\":\\\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\\\",\\\"downloadUrl\\\":\\\"https://github.com/Caldis/Mos/releases/latest\\\",\\\"softwareHelp\\\":\\\"https://github.com/Caldis/Mos/wiki\\\",\\\"sameAs\\\":[\\\"https://github.com/Caldis/Mos\\\"],\\\"license\\\":\\\"https://creativecommons.org/licenses/by-nc/4.0/\\\",\\\"offers\\\":{\\\"@type\\\":\\\"Offer\\\",\\\"price\\\":\\\"0\\\",\\\"priceCurrency\\\":\\\"USD\\\"}}]}\"}}],[\"$\",\"noscript\",null,{\"children\":\"$2\"}]]}],[\"$\",\"body\",null,{\"className\":\"syne_d93b7706-module__Y_KGdq__variable space_grotesk_8677877b-module__OT3qGa__variable ibm_plex_mono_e0f5f7ea-module__w-hdTq__variable antialiased\",\"children\":[[\"$\",\"$L3\",null,{\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}],[\"$\",\"$L6\",null,{\"src\":\"https://www.googletagmanager.com/gtag/js?id=G-9M7WPLB8BR\",\"strategy\":\"afterInteractive\"}],[\"$\",\"$L6\",null,{\"id\":\"ga4\",\"strategy\":\"afterInteractive\",\"children\":\"\\n            window.dataLayer = window.dataLayer || [];\\n            function gtag(){dataLayer.push(arguments);}\\n            gtag('js', new Date());\\n            gtag('config', 'G-9M7WPLB8BR');\\n          \"}]]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L7\",null,{}],[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/d95bda38d1a9ce53.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/b492b32695e3b282.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L8\",null,{\"children\":[\"$\",\"$9\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@a\"}]}]]}],{},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$Lb\",null,{\"children\":\"$Lc\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Ld\",null,{\"children\":[\"$\",\"$9\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Le\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$f\",[]],\"S\":true}\nc:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n10:I[46886,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"IconMark\"]\na:null\ne:[[\"$\",\"title\",\"0\",{\"children\":\"Mos | Turn the mouse into flow\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\"}],[\"$\",\"link\",\"2\",{\"rel\":\"canonical\",\"href\":\"https://mos.caldis.me/\"}],[\"$\",\"meta\",\"3\",{\"property\":\"og:title\",\"content\":\"Mos | Turn the mouse into flow\"}],[\"$\",\"meta\",\"4\",{\"property\":\"og:description\",\"content\":\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\"}],[\"$\",\"meta\",\"5\",{\"property\":\"og:url\",\"content\":\"https://mos.caldis.me/\"}],[\"$\",\"meta\",\"6\",{\"property\":\"og:site_name\",\"content\":\"Mos\"}],[\"$\",\"meta\",\"7\",{\"property\":\"og:image\",\"content\":\"https://mos.caldis.me/og.svg\"}],[\"$\",\"meta\",\"8\",{\"property\":\"og:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"9\",{\"property\":\"og:image:height\",\"content\":\"630\"}],[\"$\",\"meta\",\"10\",{\"property\":\"og:image:alt\",\"content\":\"Mos | Turn the mouse into flow\"}],[\"$\",\"meta\",\"11\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"$\",\"meta\",\"12\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"13\",{\"name\":\"twitter:title\",\"content\":\"Mos | Turn the mouse into flow\"}],[\"$\",\"meta\",\"14\",{\"name\":\"twitter:description\",\"content\":\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\"}],[\"$\",\"meta\",\"15\",{\"name\":\"twitter:image\",\"content\":\"https://mos.caldis.me/og.svg\"}],[\"$\",\"link\",\"16\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.6def09c8.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$L10\",\"17\",{}]]\n"
  },
  {
    "path": "docs/__next._head.txt",
    "content": "1:\"$Sreact.fragment\"\n2:I[45924,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"ViewportBoundary\"]\n3:I[45924,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"MetadataBoundary\"]\n4:\"$Sreact.suspense\"\n5:I[46886,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"IconMark\"]\n0:{\"buildId\":\"4xlWUdmYkOQZmVpTO2yEI\",\"rsc\":[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L2\",null,{\"children\":[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L3\",null,{\"children\":[\"$\",\"$4\",null,{\"name\":\"Next.Metadata\",\"children\":[[\"$\",\"title\",\"0\",{\"children\":\"Mos | Turn the mouse into flow\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\"}],[\"$\",\"link\",\"2\",{\"rel\":\"canonical\",\"href\":\"https://mos.caldis.me/\"}],[\"$\",\"meta\",\"3\",{\"property\":\"og:title\",\"content\":\"Mos | Turn the mouse into flow\"}],[\"$\",\"meta\",\"4\",{\"property\":\"og:description\",\"content\":\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\"}],[\"$\",\"meta\",\"5\",{\"property\":\"og:url\",\"content\":\"https://mos.caldis.me/\"}],[\"$\",\"meta\",\"6\",{\"property\":\"og:site_name\",\"content\":\"Mos\"}],[\"$\",\"meta\",\"7\",{\"property\":\"og:image\",\"content\":\"https://mos.caldis.me/og.svg\"}],[\"$\",\"meta\",\"8\",{\"property\":\"og:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"9\",{\"property\":\"og:image:height\",\"content\":\"630\"}],[\"$\",\"meta\",\"10\",{\"property\":\"og:image:alt\",\"content\":\"Mos | Turn the mouse into flow\"}],[\"$\",\"meta\",\"11\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"$\",\"meta\",\"12\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"13\",{\"name\":\"twitter:title\",\"content\":\"Mos | Turn the mouse into flow\"}],[\"$\",\"meta\",\"14\",{\"name\":\"twitter:description\",\"content\":\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\"}],[\"$\",\"meta\",\"15\",{\"name\":\"twitter:image\",\"content\":\"https://mos.caldis.me/og.svg\"}],[\"$\",\"link\",\"16\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.6def09c8.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$L5\",\"17\",{}]]}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],\"loading\":null,\"isPartial\":false}\n"
  },
  {
    "path": "docs/__next._index.txt",
    "content": "1:\"$Sreact.fragment\"\n3:I[96923,[\"/_next/static/chunks/19717b1d18b1c046.js\"],\"Providers\"]\n4:I[33720,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"default\"]\n5:I[16458,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"default\"]\n6:I[13154,[\"/_next/static/chunks/19717b1d18b1c046.js\"],\"\"]\n:HL[\"/_next/static/chunks/543732a8392562b4.css\",\"style\"]\n2:[\"$\",\"style\",null,{\"children\":\"html.js .reveal{opacity:1!important;transform:none!important;filter:none!important}\"}]\n0:{\"buildId\":\"4xlWUdmYkOQZmVpTO2yEI\",\"rsc\":[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/543732a8392562b4.css\",\"precedence\":\"next\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/19717b1d18b1c046.js\",\"async\":true}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"js\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"script\",null,{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@graph\\\":[{\\\"@type\\\":\\\"WebSite\\\",\\\"@id\\\":\\\"https://mos.caldis.me/#website\\\",\\\"url\\\":\\\"https://mos.caldis.me/\\\",\\\"name\\\":\\\"Mos\\\",\\\"description\\\":\\\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\\\",\\\"inLanguage\\\":\\\"en\\\"},{\\\"@type\\\":\\\"SoftwareApplication\\\",\\\"@id\\\":\\\"https://mos.caldis.me/#software\\\",\\\"name\\\":\\\"Mos\\\",\\\"url\\\":\\\"https://mos.caldis.me/\\\",\\\"operatingSystem\\\":\\\"macOS\\\",\\\"applicationCategory\\\":\\\"UtilitiesApplication\\\",\\\"description\\\":\\\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\\\",\\\"downloadUrl\\\":\\\"https://github.com/Caldis/Mos/releases/latest\\\",\\\"softwareHelp\\\":\\\"https://github.com/Caldis/Mos/wiki\\\",\\\"sameAs\\\":[\\\"https://github.com/Caldis/Mos\\\"],\\\"license\\\":\\\"https://creativecommons.org/licenses/by-nc/4.0/\\\",\\\"offers\\\":{\\\"@type\\\":\\\"Offer\\\",\\\"price\\\":\\\"0\\\",\\\"priceCurrency\\\":\\\"USD\\\"}}]}\"}}],[\"$\",\"noscript\",null,{\"children\":\"$2\"}]]}],[\"$\",\"body\",null,{\"className\":\"syne_d93b7706-module__Y_KGdq__variable space_grotesk_8677877b-module__OT3qGa__variable ibm_plex_mono_e0f5f7ea-module__w-hdTq__variable antialiased\",\"children\":[[\"$\",\"$L3\",null,{\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"template\":[\"$\",\"$L5\",null,{}],\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]]}]}],[\"$\",\"$L6\",null,{\"src\":\"https://www.googletagmanager.com/gtag/js?id=G-9M7WPLB8BR\",\"strategy\":\"afterInteractive\"}],[\"$\",\"$L6\",null,{\"id\":\"ga4\",\"strategy\":\"afterInteractive\",\"children\":\"\\n            window.dataLayer = window.dataLayer || [];\\n            function gtag(){dataLayer.push(arguments);}\\n            gtag('js', new Date());\\n            gtag('config', 'G-9M7WPLB8BR');\\n          \"}]]}]]}]]}],\"loading\":null,\"isPartial\":false}\n"
  },
  {
    "path": "docs/__next._tree.txt",
    "content": ":HL[\"/_next/static/chunks/543732a8392562b4.css\",\"style\"]\n:HL[\"/_next/static/media/0c795a286deabae8-s.p.b6c48e4e.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/0c89a48fa5027cee-s.p.4564287c.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/23b7a97ae3b5c134-s.p.2902b61f.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/99e609270109b47d-s.p.64b9304e.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/effe91970fc4db64-s.p.19510058.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n0:{\"buildId\":\"4xlWUdmYkOQZmVpTO2yEI\",\"tree\":{\"name\":\"\",\"paramType\":null,\"paramKey\":\"\",\"hasRuntimePrefetch\":false,\"slots\":{\"children\":{\"name\":\"__PAGE__\",\"paramType\":null,\"paramKey\":\"__PAGE__\",\"hasRuntimePrefetch\":false,\"slots\":null,\"isRootLayout\":false}},\"isRootLayout\":true},\"staleTime\":300}\n"
  },
  {
    "path": "docs/_next/static/4xlWUdmYkOQZmVpTO2yEI/_buildManifest.js",
    "content": "self.__BUILD_MANIFEST = {\n  \"__rewrites\": {\n    \"afterFiles\": [],\n    \"beforeFiles\": [],\n    \"fallback\": []\n  },\n  \"sortedPages\": [\n    \"/_app\",\n    \"/_error\"\n  ]\n};self.__BUILD_MANIFEST_CB && self.__BUILD_MANIFEST_CB()"
  },
  {
    "path": "docs/_next/static/4xlWUdmYkOQZmVpTO2yEI/_clientMiddlewareManifest.json",
    "content": "[]"
  },
  {
    "path": "docs/_next/static/4xlWUdmYkOQZmVpTO2yEI/_ssgManifest.js",
    "content": "self.__SSG_MANIFEST=new Set([]);self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB()"
  },
  {
    "path": "docs/_next/static/chunks/12c422bc11762090.js",
    "content": "(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push([\"object\"==typeof document?document.currentScript:void 0,70566,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"default\",{enumerable:!0,get:function(){return s}});let n=e.r(964),o=e.r(60364),i={fontFamily:'system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"',height:\"100vh\",textAlign:\"center\",display:\"flex\",flexDirection:\"column\",alignItems:\"center\",justifyContent:\"center\"},u={fontSize:\"14px\",fontWeight:400,lineHeight:\"28px\",margin:\"0 8px\"},s=function({error:e}){let t=e?.digest;return(0,n.jsxs)(\"html\",{id:\"__next_error__\",children:[(0,n.jsx)(\"head\",{}),(0,n.jsxs)(\"body\",{children:[(0,n.jsx)(o.HandleISRError,{error:e}),(0,n.jsx)(\"div\",{style:i,children:(0,n.jsxs)(\"div\",{children:[(0,n.jsxs)(\"h2\",{style:u,children:[\"Application error: a \",t?\"server\":\"client\",\"-side exception has occurred while loading \",window.location.hostname,\" (see the\",\" \",t?\"server logs\":\"browser console\",\" for more information).\"]}),t?(0,n.jsx)(\"p\",{style:u,children:`Digest: ${t}`}):null]})})]})]})};(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},44186,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={bindSnapshot:function(){return a},createAsyncLocalStorage:function(){return c},createSnapshot:function(){return l}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let i=Object.defineProperty(Error(\"Invariant: AsyncLocalStorage accessed in runtime where it is not available\"),\"__NEXT_ERROR_CODE\",{value:\"E504\",enumerable:!1,configurable:!0});class u{disable(){throw i}getStore(){}run(){throw i}exit(){throw i}enterWith(){throw i}static bind(e){return e}}let s=\"u\">typeof globalThis&&globalThis.AsyncLocalStorage;function c(){return s?new s:new u}function a(e){return s?s.bind(e):u.bind(e)}function l(){return s?s.snapshot():function(e,...t){return e(...t)}}},55405,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"workAsyncStorageInstance\",{enumerable:!0,get:function(){return n}});let n=(0,e.r(44186).createAsyncLocalStorage)()},30946,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"workAsyncStorage\",{enumerable:!0,get:function(){return n.workAsyncStorageInstance}});let n=e.r(55405)},60364,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"HandleISRError\",{enumerable:!0,get:function(){return o}});let n=\"u\"<typeof window?e.r(30946).workAsyncStorage:void 0;function o({error:e}){if(n){let t=n.getStore();if(t?.isStaticGeneration)throw e&&console.error(e),e}return null}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},76396,(e,t,r)=>{var n={229:function(e){var t,r,n,o=e.exports={};function i(){throw Error(\"setTimeout has not been defined\")}function u(){throw Error(\"clearTimeout has not been defined\")}try{t=\"function\"==typeof setTimeout?setTimeout:i}catch(e){t=i}try{r=\"function\"==typeof clearTimeout?clearTimeout:u}catch(e){r=u}function s(e){if(t===setTimeout)return setTimeout(e,0);if((t===i||!t)&&setTimeout)return t=setTimeout,setTimeout(e,0);try{return t(e,0)}catch(r){try{return t.call(null,e,0)}catch(r){return t.call(this,e,0)}}}var c=[],a=!1,l=-1;function f(){a&&n&&(a=!1,n.length?c=n.concat(c):l=-1,c.length&&p())}function p(){if(!a){var e=s(f);a=!0;for(var t=c.length;t;){for(n=c,c=[];++l<t;)n&&n[l].run();l=-1,t=c.length}n=null,a=!1,function(e){if(r===clearTimeout)return clearTimeout(e);if((r===u||!r)&&clearTimeout)return r=clearTimeout,clearTimeout(e);try{r(e)}catch(t){try{return r.call(null,e)}catch(t){return r.call(this,e)}}}(e)}}function d(e,t){this.fun=e,this.array=t}function y(){}o.nextTick=function(e){var t=Array(arguments.length-1);if(arguments.length>1)for(var r=1;r<arguments.length;r++)t[r-1]=arguments[r];c.push(new d(e,t)),1!==c.length||a||s(p)},d.prototype.run=function(){this.fun.apply(null,this.array)},o.title=\"browser\",o.browser=!0,o.env={},o.argv=[],o.version=\"\",o.versions={},o.on=y,o.addListener=y,o.once=y,o.off=y,o.removeListener=y,o.removeAllListeners=y,o.emit=y,o.prependListener=y,o.prependOnceListener=y,o.listeners=function(e){return[]},o.binding=function(e){throw Error(\"process.binding is not supported\")},o.cwd=function(){return\"/\"},o.chdir=function(e){throw Error(\"process.chdir is not supported\")},o.umask=function(){return 0}}},o={};function i(e){var t=o[e];if(void 0!==t)return t.exports;var r=o[e]={exports:{}},u=!0;try{n[e](r,r.exports,i),u=!1}finally{u&&delete o[e]}return r.exports}i.ab=\"/ROOT/node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/compiled/process/\",t.exports=i(229)},96171,(e,t,r)=>{\"use strict\";var n,o;t.exports=(null==(n=e.g.process)?void 0:n.env)&&\"object\"==typeof(null==(o=e.g.process)?void 0:o.env)?e.g.process:e.r(76396)},12412,(e,t,r)=>{\"use strict\";var n=Symbol.for(\"react.transitional.element\");function o(e,t,r){var o=null;if(void 0!==r&&(o=\"\"+r),void 0!==t.key&&(o=\"\"+t.key),\"key\"in t)for(var i in r={},t)\"key\"!==i&&(r[i]=t[i]);else r=t;return{$$typeof:n,type:e,key:o,ref:void 0!==(t=r.ref)?t:null,props:r}}r.Fragment=Symbol.for(\"react.fragment\"),r.jsx=o,r.jsxs=o},964,(e,t,r)=>{\"use strict\";t.exports=e.r(12412)},81258,(e,t,r)=>{\"use strict\";r._=function(e){return e&&e.__esModule?e:{default:e}}},94627,(e,t,r)=>{\"use strict\";var n=e.i(96171),o=Symbol.for(\"react.transitional.element\"),i=Symbol.for(\"react.portal\"),u=Symbol.for(\"react.fragment\"),s=Symbol.for(\"react.strict_mode\"),c=Symbol.for(\"react.profiler\"),a=Symbol.for(\"react.consumer\"),l=Symbol.for(\"react.context\"),f=Symbol.for(\"react.forward_ref\"),p=Symbol.for(\"react.suspense\"),d=Symbol.for(\"react.memo\"),y=Symbol.for(\"react.lazy\"),_=Symbol.for(\"react.activity\"),h=Symbol.for(\"react.view_transition\"),g=Symbol.iterator,v={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},m=Object.assign,b={};function S(e,t,r){this.props=e,this.context=t,this.refs=b,this.updater=r||v}function O(){}function j(e,t,r){this.props=e,this.context=t,this.refs=b,this.updater=r||v}S.prototype.isReactComponent={},S.prototype.setState=function(e,t){if(\"object\"!=typeof e&&\"function\"!=typeof e&&null!=e)throw Error(\"takes an object of state variables to update or a function which returns an object of state variables.\");this.updater.enqueueSetState(this,e,t,\"setState\")},S.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,\"forceUpdate\")},O.prototype=S.prototype;var E=j.prototype=new O;E.constructor=j,m(E,S.prototype),E.isPureReactComponent=!0;var T=Array.isArray;function w(){}var P={H:null,A:null,T:null,S:null},R=Object.prototype.hasOwnProperty;function x(e,t,r){var n=r.ref;return{$$typeof:o,type:e,key:t,ref:void 0!==n?n:null,props:r}}function A(e){return\"object\"==typeof e&&null!==e&&e.$$typeof===o}var C=/\\/+/g;function k(e,t){var r,n;return\"object\"==typeof e&&null!==e&&null!=e.key?(r=\"\"+e.key,n={\"=\":\"=0\",\":\":\"=2\"},\"$\"+r.replace(/[=:]/g,function(e){return n[e]})):t.toString(36)}function M(e,t,r){if(null==e)return e;var n=[],u=0;return!function e(t,r,n,u,s){var c,a,l,f=typeof t;(\"undefined\"===f||\"boolean\"===f)&&(t=null);var p=!1;if(null===t)p=!0;else switch(f){case\"bigint\":case\"string\":case\"number\":p=!0;break;case\"object\":switch(t.$$typeof){case o:case i:p=!0;break;case y:return e((p=t._init)(t._payload),r,n,u,s)}}if(p)return s=s(t),p=\"\"===u?\".\"+k(t,0):u,T(s)?(n=\"\",null!=p&&(n=p.replace(C,\"$&/\")+\"/\"),e(s,r,n,\"\",function(e){return e})):null!=s&&(A(s)&&(c=s,a=n+(null==s.key||t&&t.key===s.key?\"\":(\"\"+s.key).replace(C,\"$&/\")+\"/\")+p,s=x(c.type,a,c.props)),r.push(s)),1;p=0;var d=\"\"===u?\".\":u+\":\";if(T(t))for(var _=0;_<t.length;_++)f=d+k(u=t[_],_),p+=e(u,r,n,f,s);else if(\"function\"==typeof(_=null===(l=t)||\"object\"!=typeof l?null:\"function\"==typeof(l=g&&l[g]||l[\"@@iterator\"])?l:null))for(t=_.call(t),_=0;!(u=t.next()).done;)f=d+k(u=u.value,_++),p+=e(u,r,n,f,s);else if(\"object\"===f){if(\"function\"==typeof t.then)return e(function(e){switch(e.status){case\"fulfilled\":return e.value;case\"rejected\":throw e.reason;default:switch(\"string\"==typeof e.status?e.then(w,w):(e.status=\"pending\",e.then(function(t){\"pending\"===e.status&&(e.status=\"fulfilled\",e.value=t)},function(t){\"pending\"===e.status&&(e.status=\"rejected\",e.reason=t)})),e.status){case\"fulfilled\":return e.value;case\"rejected\":throw e.reason}}throw e}(t),r,n,u,s);throw Error(\"Objects are not valid as a React child (found: \"+(\"[object Object]\"===(r=String(t))?\"object with keys {\"+Object.keys(t).join(\", \")+\"}\":r)+\"). If you meant to render a collection of children, use an array instead.\")}return p}(e,n,\"\",\"\",function(e){return t.call(r,e,u++)}),n}function H(e){if(-1===e._status){var t=e._result;(t=t()).then(function(t){(0===e._status||-1===e._status)&&(e._status=1,e._result=t)},function(t){(0===e._status||-1===e._status)&&(e._status=2,e._result=t)}),-1===e._status&&(e._status=0,e._result=t)}if(1===e._status)return e._result.default;throw e._result}var L=\"function\"==typeof reportError?reportError:function(e){if(\"object\"==typeof window&&\"function\"==typeof window.ErrorEvent){var t=new window.ErrorEvent(\"error\",{bubbles:!0,cancelable:!0,message:\"object\"==typeof e&&null!==e&&\"string\"==typeof e.message?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if(\"object\"==typeof n.default&&\"function\"==typeof n.default.emit)return void n.default.emit(\"uncaughtException\",e);console.error(e)};function I(e){var t=P.T,r={};r.types=null!==t?t.types:null,P.T=r;try{var n=e(),o=P.S;null!==o&&o(r,n),\"object\"==typeof n&&null!==n&&\"function\"==typeof n.then&&n.then(w,L)}catch(e){L(e)}finally{null!==t&&null!==r.types&&(t.types=r.types),P.T=t}}function N(e){var t=P.T;if(null!==t){var r=t.types;null===r?t.types=[e]:-1===r.indexOf(e)&&r.push(e)}else I(N.bind(null,e))}r.Activity=_,r.Children={map:M,forEach:function(e,t,r){M(e,function(){t.apply(this,arguments)},r)},count:function(e){var t=0;return M(e,function(){t++}),t},toArray:function(e){return M(e,function(e){return e})||[]},only:function(e){if(!A(e))throw Error(\"React.Children.only expected to receive a single React element child.\");return e}},r.Component=S,r.Fragment=u,r.Profiler=c,r.PureComponent=j,r.StrictMode=s,r.Suspense=p,r.ViewTransition=h,r.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=P,r.__COMPILER_RUNTIME={__proto__:null,c:function(e){return P.H.useMemoCache(e)}},r.addTransitionType=N,r.cache=function(e){return function(){return e.apply(null,arguments)}},r.cacheSignal=function(){return null},r.cloneElement=function(e,t,r){if(null==e)throw Error(\"The argument must be a React element, but you passed \"+e+\".\");var n=m({},e.props),o=e.key;if(null!=t)for(i in void 0!==t.key&&(o=\"\"+t.key),t)R.call(t,i)&&\"key\"!==i&&\"__self\"!==i&&\"__source\"!==i&&(\"ref\"!==i||void 0!==t.ref)&&(n[i]=t[i]);var i=arguments.length-2;if(1===i)n.children=r;else if(1<i){for(var u=Array(i),s=0;s<i;s++)u[s]=arguments[s+2];n.children=u}return x(e.type,o,n)},r.createContext=function(e){return(e={$$typeof:l,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null}).Provider=e,e.Consumer={$$typeof:a,_context:e},e},r.createElement=function(e,t,r){var n,o={},i=null;if(null!=t)for(n in void 0!==t.key&&(i=\"\"+t.key),t)R.call(t,n)&&\"key\"!==n&&\"__self\"!==n&&\"__source\"!==n&&(o[n]=t[n]);var u=arguments.length-2;if(1===u)o.children=r;else if(1<u){for(var s=Array(u),c=0;c<u;c++)s[c]=arguments[c+2];o.children=s}if(e&&e.defaultProps)for(n in u=e.defaultProps)void 0===o[n]&&(o[n]=u[n]);return x(e,i,o)},r.createRef=function(){return{current:null}},r.forwardRef=function(e){return{$$typeof:f,render:e}},r.isValidElement=A,r.lazy=function(e){return{$$typeof:y,_payload:{_status:-1,_result:e},_init:H}},r.memo=function(e,t){return{$$typeof:d,type:e,compare:void 0===t?null:t}},r.startTransition=I,r.unstable_useCacheRefresh=function(){return P.H.useCacheRefresh()},r.use=function(e){return P.H.use(e)},r.useActionState=function(e,t,r){return P.H.useActionState(e,t,r)},r.useCallback=function(e,t){return P.H.useCallback(e,t)},r.useContext=function(e){return P.H.useContext(e)},r.useDebugValue=function(){},r.useDeferredValue=function(e,t){return P.H.useDeferredValue(e,t)},r.useEffect=function(e,t){return P.H.useEffect(e,t)},r.useEffectEvent=function(e){return P.H.useEffectEvent(e)},r.useId=function(){return P.H.useId()},r.useImperativeHandle=function(e,t,r){return P.H.useImperativeHandle(e,t,r)},r.useInsertionEffect=function(e,t){return P.H.useInsertionEffect(e,t)},r.useLayoutEffect=function(e,t){return P.H.useLayoutEffect(e,t)},r.useMemo=function(e,t){return P.H.useMemo(e,t)},r.useOptimistic=function(e,t){return P.H.useOptimistic(e,t)},r.useReducer=function(e,t,r){return P.H.useReducer(e,t,r)},r.useRef=function(e){return P.H.useRef(e)},r.useState=function(e){return P.H.useState(e)},r.useSyncExternalStore=function(e,t,r){return P.H.useSyncExternalStore(e,t,r)},r.useTransition=function(){return P.H.useTransition()},r.version=\"19.3.0-canary-f93b9fd4-20251217\"},33664,(e,t,r)=>{\"use strict\";t.exports=e.r(94627)},44777,(e,t,r)=>{\"use strict\";var n=e.r(33664);function o(e){var t=\"https://react.dev/errors/\"+e;if(1<arguments.length){t+=\"?args[]=\"+encodeURIComponent(arguments[1]);for(var r=2;r<arguments.length;r++)t+=\"&args[]=\"+encodeURIComponent(arguments[r])}return\"Minified React error #\"+e+\"; visit \"+t+\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"}function i(){}var u={d:{f:i,r:function(){throw Error(o(522))},D:i,C:i,L:i,m:i,X:i,S:i,M:i},p:0,findDOMNode:null},s=Symbol.for(\"react.portal\"),c=Symbol.for(\"react.optimistic_key\"),a=n.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;function l(e,t){return\"font\"===e?\"\":\"string\"==typeof t?\"use-credentials\"===t?t:\"\":void 0}r.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=u,r.createPortal=function(e,t){var r=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!t||1!==t.nodeType&&9!==t.nodeType&&11!==t.nodeType)throw Error(o(299));return function(e,t,r){var n=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:s,key:null==n?null:n===c?c:\"\"+n,children:e,containerInfo:t,implementation:r}}(e,t,null,r)},r.flushSync=function(e){var t=a.T,r=u.p;try{if(a.T=null,u.p=2,e)return e()}finally{a.T=t,u.p=r,u.d.f()}},r.preconnect=function(e,t){\"string\"==typeof e&&(t=t?\"string\"==typeof(t=t.crossOrigin)?\"use-credentials\"===t?t:\"\":void 0:null,u.d.C(e,t))},r.prefetchDNS=function(e){\"string\"==typeof e&&u.d.D(e)},r.preinit=function(e,t){if(\"string\"==typeof e&&t&&\"string\"==typeof t.as){var r=t.as,n=l(r,t.crossOrigin),o=\"string\"==typeof t.integrity?t.integrity:void 0,i=\"string\"==typeof t.fetchPriority?t.fetchPriority:void 0;\"style\"===r?u.d.S(e,\"string\"==typeof t.precedence?t.precedence:void 0,{crossOrigin:n,integrity:o,fetchPriority:i}):\"script\"===r&&u.d.X(e,{crossOrigin:n,integrity:o,fetchPriority:i,nonce:\"string\"==typeof t.nonce?t.nonce:void 0})}},r.preinitModule=function(e,t){if(\"string\"==typeof e)if(\"object\"==typeof t&&null!==t){if(null==t.as||\"script\"===t.as){var r=l(t.as,t.crossOrigin);u.d.M(e,{crossOrigin:r,integrity:\"string\"==typeof t.integrity?t.integrity:void 0,nonce:\"string\"==typeof t.nonce?t.nonce:void 0})}}else null==t&&u.d.M(e)},r.preload=function(e,t){if(\"string\"==typeof e&&\"object\"==typeof t&&null!==t&&\"string\"==typeof t.as){var r=t.as,n=l(r,t.crossOrigin);u.d.L(e,r,{crossOrigin:n,integrity:\"string\"==typeof t.integrity?t.integrity:void 0,nonce:\"string\"==typeof t.nonce?t.nonce:void 0,type:\"string\"==typeof t.type?t.type:void 0,fetchPriority:\"string\"==typeof t.fetchPriority?t.fetchPriority:void 0,referrerPolicy:\"string\"==typeof t.referrerPolicy?t.referrerPolicy:void 0,imageSrcSet:\"string\"==typeof t.imageSrcSet?t.imageSrcSet:void 0,imageSizes:\"string\"==typeof t.imageSizes?t.imageSizes:void 0,media:\"string\"==typeof t.media?t.media:void 0})}},r.preloadModule=function(e,t){if(\"string\"==typeof e)if(t){var r=l(t.as,t.crossOrigin);u.d.m(e,{as:\"string\"==typeof t.as&&\"script\"!==t.as?t.as:void 0,crossOrigin:r,integrity:\"string\"==typeof t.integrity?t.integrity:void 0})}else u.d.m(e)},r.requestFormReset=function(e){u.d.r(e)},r.unstable_batchedUpdates=function(e,t){return e(t)},r.useFormState=function(e,t,r){return a.H.useFormState(e,t,r)},r.useFormStatus=function(){return a.H.useHostTransitionStatus()},r.version=\"19.3.0-canary-f93b9fd4-20251217\"},72491,(e,t,r)=>{\"use strict\";!function e(){if(\"u\">typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&\"function\"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(e){console.error(e)}}(),t.exports=e.r(44777)},44066,(e,t,r)=>{\"use strict\";function n(e){if(\"function\"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(n=function(e){return e?r:t})(e)}r._=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||\"object\"!=typeof e&&\"function\"!=typeof e)return{default:e};var r=n(t);if(r&&r.has(e))return r.get(e);var o={__proto__:null},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var u in e)if(\"default\"!==u&&Object.prototype.hasOwnProperty.call(e,u)){var s=i?Object.getOwnPropertyDescriptor(e,u):null;s&&(s.get||s.set)?Object.defineProperty(o,u,s):o[u]=e[u]}return o.default=e,r&&r.set(e,o),o}},77447,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={getDeploymentId:function(){return i},getDeploymentIdQueryOrEmptyString:function(){return u}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});function i(){return!1}function u(){return\"\"}},38019,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"HeadManagerContext\",{enumerable:!0,get:function(){return n}});let n=e.r(81258)._(e.r(33664)).default.createContext({})},1042,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"setAttributesFromProps\",{enumerable:!0,get:function(){return u}});let n={acceptCharset:\"accept-charset\",className:\"class\",htmlFor:\"for\",httpEquiv:\"http-equiv\",noModule:\"noModule\"},o=[\"onLoad\",\"onReady\",\"dangerouslySetInnerHTML\",\"children\",\"onError\",\"strategy\",\"stylesheets\"];function i(e){return[\"async\",\"defer\",\"noModule\"].includes(e)}function u(e,t){for(let[r,u]of Object.entries(t)){if(!t.hasOwnProperty(r)||o.includes(r)||void 0===u)continue;let s=n[r]||r.toLowerCase();\"SCRIPT\"===e.tagName&&i(s)?e[s]=!!u:e.setAttribute(s,String(u)),(!1===u||\"SCRIPT\"===e.tagName&&i(s)&&(!u||\"false\"===u))&&(e.setAttribute(s,\"\"),e.removeAttribute(s))}}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)}]);"
  },
  {
    "path": "docs/_next/static/chunks/19717b1d18b1c046.js",
    "content": "(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push([\"object\"==typeof document?document.currentScript:void 0,22576,e=>{\"use strict\";var t=e.i(964),a=e.i(33664);let i={languageSelector:{title:\"Select Language\"},a11y:{skipToContent:\"Skip to content\",closeDialog:\"Close dialog\",githubAria:\"Mos on GitHub\",appIconAlt:\"Mos app icon\",scrollCurveGraph:\"Scroll curve graph\"},nav:{githubTitle:\"GitHub\"},hero:{badgeLine1:\"Smooth scrolling for mouse wheels on macOS\",badgeLine2:\"per-app profiles · independent axes · buttons & shortcuts\",titleLine1:\"Turn the mouse\",titleLine2Before:\"into \",titleLine2Highlight:\"flow\",titleLine2After:\".\",lead:\"Mos is a free, open-source macOS utility that makes wheel scrolling feel closer to a trackpad, without getting in your way. Tune curves, split axes, and override behavior per app.\",ctaDownload:\"Download Mos\",ctaViewGitHub:\"View on GitHub\",ctaInstallHomebrew:\"Install via Homebrew\",requirementsLine1:\"Requires macOS 10.13+\",requirementsLine2:\"Free · Open source\",scrollHint:\"Scroll to explore\"},sectionFeel:{title:\"Deterministic scroll. Tunable feel.\",lead:\"Mos turns raw wheel deltas into predictable motion. Keep the same feel across apps, and override it when you need to.\",cards:{curves:{kicker:\"Curves & Acceleration\",title:\"Shape the feel.\",body:\"Smoothness is a curve. Adjust step, gain, and duration, and see how raw wheel deltas turn into controlled motion.\"},axes:{kicker:\"Independent Axes\",title:\"Split X and Y.\",body:\"Treat vertical and horizontal scroll as separate axes. Toggle smoothing and reverse independently for each.\",smooth:\"Smooth\",reverse:\"Reverse\",on:\"On\",off:\"Off\"},perApp:{kicker:\"Per-app Profiles\",title:\"Different apps, different feel.\",body:\"Let each app inherit defaults, or override scroll and button rules. Precision where it matters, smooth everywhere else.\"},buttons:{kicker:\"Buttons & Shortcuts\",title:\"Bind, record, repeat.\",body:\"Record mouse or keyboard events and bind them to system shortcuts. Use the live monitor to see what your devices are sending.\",quickBind:\"Quick Bind\",rows:{button4:\"Button 4\",button5:\"Button 5\",wheelClick:\"Wheel Click\",missionControl:\"Mission Control\",nextSpace:\"Next Space\",appSwitcher:\"App Switcher\"}}}},download:{title:\"Download Mos. Tune your scroll.\",body:\"Install in seconds, tweak it when you need to, and keep your scroll behavior consistent across the apps you live in.\",ctaDownload:\"Download\",releaseNotes:\"Release notes\",docs:\"Docs\"},homebrew:{title:\"Homebrew\",copy:\"Copy\",copied:\"Copied\",tip:\"Tip: If you’re on beta, your cask might be {cask}.\"},footer:{latestRelease:\"Latest release\",latestVersion:\"Latest {version}\",requiresMacos:\"Requires macOS 10.13+\",github:\"GitHub\",wiki:\"Wiki\",releases:\"Releases\"},easing:{graphAria:\"Scroll curve graph\",step:{label:\"Step\",aria:\"Step\",help:\"Quantization floor for wheel deltas.\"},gain:{label:\"Gain\",aria:\"Gain\",help:\"Scales distance per tick and how fast the curve ramps.\"},duration:{label:\"Duration\",aria:\"Duration\",help:\"Smoothing time constant (higher means longer tail).\"},footer:\"ScrollCore curve\"}},r=[\"en\",\"zh\",\"zh-Hant\",\"ja\",\"ko\",\"ru\",\"de\",\"pl\",\"el\",\"tr\",\"uk\",\"id\"],o={en:i,zh:{languageSelector:{title:\"选择语言\"},a11y:{skipToContent:\"跳到正文\",closeDialog:\"关闭对话框\",githubAria:\"Mos 的 GitHub\",appIconAlt:\"Mos 应用图标\",scrollCurveGraph:\"滚动曲线图\"},nav:{githubTitle:\"GitHub\"},hero:{badgeLine1:\"让 macOS 上的鼠标滚轮滚动更顺滑\",badgeLine2:\"按应用配置 · 横纵轴独立 · 按键与快捷键\",titleLine1:\"让鼠标\",titleLine2Before:\"变得\",titleLine2Highlight:\"顺滑\",titleLine2After:\"。\",lead:\"Mos 是一个免费的开源 macOS 小工具，让滚轮滚动更接近触控板的手感，同时不影响你的控制。你可以调曲线、分离横纵轴，也可以按 App 覆盖行为。\",ctaDownload:\"下载 Mos\",ctaViewGitHub:\"在 GitHub 查看\",ctaInstallHomebrew:\"通过 Homebrew 安装\",requirementsLine1:\"需要 macOS 10.13+\",requirementsLine2:\"免费 · 开源\",scrollHint:\"向下滚动了解更多\"},sectionFeel:{title:\"滚动更可控。手感可调。\",lead:\"Mos 会把原始滚轮增量变成更可预测的运动。不同 App 也能保持同样的手感，需要时再按应用覆盖。\",cards:{curves:{kicker:\"曲线与加速\",title:\"调出你喜欢的手感。\",body:\"顺滑其实是一条曲线。调整步进、增益和时长，看看原始滚轮增量如何变成更可控的滚动。\"},axes:{kicker:\"轴向独立\",title:\"横纵轴分开调。\",body:\"把垂直/水平当成两条独立的轴：平滑与反向都可以按轴单独开关。\",smooth:\"平滑\",reverse:\"反向\",on:\"开\",off:\"关\"},perApp:{kicker:\"按应用配置\",title:\"不同 App，不同规则。\",body:\"每个 App 可以继承默认值，也可以单独覆盖滚动和按键规则。需要精准就精准，其他地方保持顺滑。\"},buttons:{kicker:\"按键与快捷键\",title:\"绑定、记录、重复。\",body:\"把鼠标或键盘事件录下来，绑定到系统快捷键。也可以用实时监视器看看设备到底发了什么。\",quickBind:\"快速绑定\",rows:{button4:\"按键 4\",button5:\"按键 5\",wheelClick:\"滚轮按下\",missionControl:\"调度中心\",nextSpace:\"下一个空间\",appSwitcher:\"应用切换器\"}}}},download:{title:\"下载 Mos。按你的习惯调。\",body:\"几秒就能装好，需要时再慢慢调参数，让常用 App 里滚动手感保持一致。\",ctaDownload:\"下载\",releaseNotes:\"更新日志\",docs:\"文档\"},homebrew:{title:\"Homebrew\",copy:\"复制\",copied:\"已复制\",tip:\"提示：如果你在用 beta 版，cask 可能是 {cask}。\"},footer:{latestRelease:\"最新发布\",latestVersion:\"最新 {version}\",requiresMacos:\"需要 macOS 10.13+\",github:\"GitHub\",wiki:\"Wiki\",releases:\"Releases\"},easing:{graphAria:\"滚动曲线图\",step:{label:\"步进\",aria:\"步进\",help:\"滚轮增量的量化下限。\"},gain:{label:\"增益\",aria:\"增益\",help:\"决定每次滚动的距离，以及曲线爬升的速度。\"},duration:{label:\"时长\",aria:\"时长\",help:\"平滑时间常数（越大尾巴越长）。\"},footer:\"ScrollCore 曲线\"}},\"zh-Hant\":{languageSelector:{title:\"選擇語言\"},a11y:{skipToContent:\"跳到內容\",closeDialog:\"關閉對話框\",githubAria:\"Mos 的 GitHub\",appIconAlt:\"Mos 應用程式圖示\",scrollCurveGraph:\"捲動曲線圖\"},nav:{githubTitle:\"GitHub\"},hero:{badgeLine1:\"讓 macOS 上的滑鼠滾輪捲動更順\",badgeLine2:\"按 App 設定 · X/Y 軸獨立 · 按鍵與快捷鍵\",titleLine1:\"讓滑鼠\",titleLine2Before:\"變得\",titleLine2Highlight:\"順滑\",titleLine2After:\"。\",lead:\"Mos 是一個免費、開源的 macOS 小工具，讓滾輪捲動更接近觸控板手感，同時不影響你的控制。你可以調曲線、分離 X/Y，也能針對不同 App 覆寫行為。\",ctaDownload:\"下載 Mos\",ctaViewGitHub:\"在 GitHub 查看\",ctaInstallHomebrew:\"透過 Homebrew 安裝\",requirementsLine1:\"需要 macOS 10.13+\",requirementsLine2:\"免費 · 開源\",scrollHint:\"往下滑看看\"},sectionFeel:{title:\"捲動更可控。手感可調。\",lead:\"Mos 會把原始滾輪增量變成更可預測的動作。不同 App 也能維持同樣的手感，需要時再按應用覆寫。\",cards:{curves:{kicker:\"曲線與加速\",title:\"調出你喜歡的手感。\",body:\"順滑其實是一條曲線。調整步進、增益與時長，看看原始滾輪增量如何變成更可控的捲動。\"},axes:{kicker:\"軸向獨立\",title:\"X 與 Y 分開調。\",body:\"把垂直/水平當成兩條獨立的軸：平滑與反向都可以按軸單獨開關。\",smooth:\"平滑\",reverse:\"反向\",on:\"開\",off:\"關\"},perApp:{kicker:\"按 App 設定\",title:\"不同 App，不同規則。\",body:\"每個 App 可以繼承預設值，也可以單獨覆寫捲動與按鍵規則。需要精準就精準，其餘保持順滑。\"},buttons:{kicker:\"按鍵與快捷鍵\",title:\"綁定、記錄、重複。\",body:\"把滑鼠或鍵盤事件錄下來，綁定到系統快捷鍵。也能用即時監視器看看裝置到底送了什麼。\",quickBind:\"快速綁定\",rows:{button4:\"按鍵 4\",button5:\"按鍵 5\",wheelClick:\"滾輪按下\",missionControl:\"控制中心\",nextSpace:\"下一個空間\",appSwitcher:\"App 切換器\"}}}},download:{title:\"下載 Mos。按你的習慣調。\",body:\"幾秒就能裝好，需要時再慢慢調參數，讓常用 App 裡的捲動手感保持一致。\",ctaDownload:\"下載\",releaseNotes:\"更新紀錄\",docs:\"文件\"},homebrew:{title:\"Homebrew\",copy:\"複製\",copied:\"已複製\",tip:\"提示：如果你在用 beta 版，cask 可能是 {cask}。\"},footer:{latestRelease:\"最新發佈\",latestVersion:\"最新 {version}\",requiresMacos:\"需要 macOS 10.13+\",github:\"GitHub\",wiki:\"Wiki\",releases:\"Releases\"},easing:{graphAria:\"捲動曲線圖\",step:{label:\"步進\",aria:\"步進\",help:\"滾輪增量的量化下限。\"},gain:{label:\"增益\",aria:\"增益\",help:\"決定每次捲動的距離，以及曲線爬升的速度。\"},duration:{label:\"時長\",aria:\"時長\",help:\"平滑時間常數（越大尾巴越長）。\"},footer:\"ScrollCore 曲線\"}},ja:{languageSelector:{title:\"言語を選択\"},a11y:{skipToContent:\"本文へスキップ\",closeDialog:\"ダイアログを閉じる\",githubAria:\"Mos の GitHub\",appIconAlt:\"Mos アプリアイコン\",scrollCurveGraph:\"スクロールカーブのグラフ\"},nav:{githubTitle:\"GitHub\"},hero:{badgeLine1:\"macOS のマウスホイールをスムーズに\",badgeLine2:\"アプリ別プロファイル · 軸の分離 · ボタン/ショートカット\",titleLine1:\"マウスを\",titleLine2Before:\"\",titleLine2Highlight:\"flow\",titleLine2After:\" に変える。\",lead:\"Mos は無料・オープンソースの macOS ユーティリティです。ホイールスクロールをトラックパッドに近い感触にしつつ、操作感はそのまま。カーブ調整、X/Y の分離、アプリ別の上書きができます。\",ctaDownload:\"Mos をダウンロード\",ctaViewGitHub:\"GitHub で見る\",ctaInstallHomebrew:\"Homebrew でインストール\",requirementsLine1:\"macOS 10.13 以降\",requirementsLine2:\"無料 · オープンソース\",scrollHint:\"スクロールして見る\"},sectionFeel:{title:\"狙いどおりにスクロール。手触りは調整できる。\",lead:\"Mos は生のホイール入力を予測しやすい動きに変換します。アプリ間で同じ感触を保ち、必要なときだけアプリ別に上書きできます。\",cards:{curves:{kicker:\"カーブと加速\",title:\"手触りを作る。\",body:\"滑らかさはカーブです。Step / Gain / Duration を調整して、生の入力がどう制御された動きになるかを確認できます。\"},axes:{kicker:\"独立した軸\",title:\"X と Y を分ける。\",body:\"縦と横を別々の軸として扱えます。スムーズと反転は、軸ごとにオン/オフできます。\",smooth:\"スムーズ\",reverse:\"反転\",on:\"ON\",off:\"OFF\"},perApp:{kicker:\"アプリ別プロファイル\",title:\"アプリごとに手触りを。\",body:\"基本設定のまま使うことも、アプリごとにスクロールやボタンのルールを上書きすることもできます。必要なところは正確に、他は滑らかに。\"},buttons:{kicker:\"ボタンとショートカット\",title:\"割り当てて、記録して、繰り返す。\",body:\"マウスやキーボードのイベントを記録して、システムのショートカットに割り当てます。ライブモニターで送信内容も確認できます。\",quickBind:\"クイックバインド\",rows:{button4:\"ボタン 4\",button5:\"ボタン 5\",wheelClick:\"ホイールクリック\",missionControl:\"Mission Control\",nextSpace:\"次のスペース\",appSwitcher:\"アプリ切り替え\"}}}},download:{title:\"Mos をダウンロード。スクロールを自分好みに。\",body:\"数秒で入れて、必要なときに調整。よく使うアプリでも同じ感触に揃えられます。\",ctaDownload:\"ダウンロード\",releaseNotes:\"リリースノート\",docs:\"ドキュメント\"},homebrew:{title:\"Homebrew\",copy:\"コピー\",copied:\"コピーしました\",tip:\"ヒント: beta を使っている場合、cask は {cask} かもしれません。\"},footer:{latestRelease:\"最新リリース\",latestVersion:\"最新 {version}\",requiresMacos:\"macOS 10.13 以降\",github:\"GitHub\",wiki:\"Wiki\",releases:\"Releases\"},easing:{graphAria:\"スクロールカーブのグラフ\",step:{label:\"Step\",aria:\"Step\",help:\"ホイール入力の量子化の下限。\"},gain:{label:\"Gain\",aria:\"Gain\",help:\"1 ティックあたりの距離と、立ち上がりの速さを決めます。\"},duration:{label:\"Duration\",aria:\"Duration\",help:\"平滑化の時間定数（大きいほど尾を引きます）。\"},footer:\"ScrollCore curve\"}},ko:{languageSelector:{title:\"언어 선택\"},a11y:{skipToContent:\"본문으로 건너뛰기\",closeDialog:\"대화상자 닫기\",githubAria:\"Mos GitHub\",appIconAlt:\"Mos 앱 아이콘\",scrollCurveGraph:\"스크롤 커브 그래프\"},nav:{githubTitle:\"GitHub\"},hero:{badgeLine1:\"macOS에서 마우스 휠 스크롤을 부드럽게\",badgeLine2:\"앱별 프로필 · 축 분리 · 버튼/단축키\",titleLine1:\"마우스를\",titleLine2Before:\"\",titleLine2Highlight:\"flow\",titleLine2After:\"로 바꿉니다.\",lead:\"Mos는 무료 오픈소스 macOS 유틸리티입니다. 휠 스크롤을 트랙패드에 가까운 느낌으로 만들면서도, 필요한 제어는 그대로 남겨둡니다. 곡선을 조정하고, X/Y 축을 분리하고, 앱별로 동작을 덮어쓸 수 있어요.\",ctaDownload:\"Mos 다운로드\",ctaViewGitHub:\"GitHub에서 보기\",ctaInstallHomebrew:\"Homebrew로 설치\",requirementsLine1:\"macOS 10.13+ 필요\",requirementsLine2:\"무료 · 오픈 소스\",scrollHint:\"스크롤해서 더 보기\"},sectionFeel:{title:\"예측 가능한 스크롤. 조절 가능한 감각.\",lead:\"Mos는 원시 휠 델타를 예측 가능한 움직임으로 바꿉니다. 앱 전반에 같은 느낌을 유지하고, 필요할 때만 앱별로 덮어쓰세요.\",cards:{curves:{kicker:\"곡선과 가속\",title:\"느낌을 다듬기.\",body:\"부드러움은 곡선입니다. Step, Gain, Duration을 조절하고, 원시 휠 델타가 어떻게 제어된 움직임으로 바뀌는지 확인하세요.\"},axes:{kicker:\"독립 축\",title:\"X와 Y를 분리.\",body:\"세로/가로를 서로 다른 축으로 취급합니다. 스무딩과 반전은 축별로 ON/OFF 할 수 있어요.\",smooth:\"스무딩\",reverse:\"반전\",on:\"ON\",off:\"OFF\"},perApp:{kicker:\"앱별 프로필\",title:\"앱마다 다른 감각.\",body:\"각 앱은 기본값을 그대로 쓰거나, 스크롤/버튼 규칙을 앱별로 덮어쓸 수 있습니다. 필요한 곳은 정확하게, 나머지는 부드럽게.\"},buttons:{kicker:\"버튼과 단축키\",title:\"바인딩, 기록, 반복.\",body:\"마우스나 키보드 이벤트를 기록해 시스템 단축키에 바인딩합니다. 라이브 모니터로 기기가 보내는 값을 확인할 수도 있어요.\",quickBind:\"빠른 바인드\",rows:{button4:\"버튼 4\",button5:\"버튼 5\",wheelClick:\"휠 클릭\",missionControl:\"Mission Control\",nextSpace:\"다음 공간\",appSwitcher:\"앱 전환기\"}}}},download:{title:\"Mos 다운로드. 스크롤을 내 취향으로.\",body:\"몇 초 만에 설치하고, 필요할 때만 조절하세요. 자주 쓰는 앱에서도 같은 스크롤 감각을 유지할 수 있습니다.\",ctaDownload:\"다운로드\",releaseNotes:\"릴리스 노트\",docs:\"문서\"},homebrew:{title:\"Homebrew\",copy:\"복사\",copied:\"복사됨\",tip:\"팁: beta를 사용 중이라면 cask가 {cask}일 수 있어요.\"},footer:{latestRelease:\"최신 릴리스\",latestVersion:\"최신 {version}\",requiresMacos:\"macOS 10.13+ 필요\",github:\"GitHub\",wiki:\"Wiki\",releases:\"Releases\"},easing:{graphAria:\"스크롤 커브 그래프\",step:{label:\"Step\",aria:\"Step\",help:\"휠 델타의 양자화 하한.\"},gain:{label:\"Gain\",aria:\"Gain\",help:\"틱당 이동 거리와 곡선이 올라가는 속도를 결정합니다.\"},duration:{label:\"Duration\",aria:\"Duration\",help:\"스무딩 시간 상수(클수록 꼬리가 길어짐).\"},footer:\"ScrollCore curve\"}},ru:{languageSelector:{title:\"Выбор языка\"},a11y:{skipToContent:\"Перейти к содержимому\",closeDialog:\"Закрыть диалог\",githubAria:\"Mos на GitHub\",appIconAlt:\"Иконка Mos\",scrollCurveGraph:\"График кривой прокрутки\"},nav:{githubTitle:\"GitHub\"},hero:{badgeLine1:\"Плавная прокрутка колесом мыши в macOS\",badgeLine2:\"профили по приложениям · независимые оси · кнопки и шорткаты\",titleLine1:\"Превратите мышь\",titleLine2Before:\"в \",titleLine2Highlight:\"flow\",titleLine2After:\".\",lead:\"Mos — бесплатная утилита с открытым кодом для macOS. Она делает прокрутку колесом ближе по ощущениям к трекпаду, не забирая контроль. Настраивайте кривые, разделяйте оси и переопределяйте поведение для каждого приложения.\",ctaDownload:\"Скачать Mos\",ctaViewGitHub:\"Открыть на GitHub\",ctaInstallHomebrew:\"Установить через Homebrew\",requirementsLine1:\"Нужна macOS 10.13+\",requirementsLine2:\"Бесплатно · Открытый код\",scrollHint:\"Прокрутите вниз\"},sectionFeel:{title:\"Предсказуемая прокрутка. Настраиваемое ощущение.\",lead:\"Mos превращает сырые дельты колеса в предсказуемое движение. Сохраняйте одинаковое ощущение в разных приложениях и включайте исключения там, где нужно.\",cards:{curves:{kicker:\"Кривые и ускорение\",title:\"Сформируйте ощущение.\",body:\"Плавность — это кривая. Меняйте шаг, усиление и длительность и смотрите, как сырые дельты превращаются в контролируемое движение.\"},axes:{kicker:\"Независимые оси\",title:\"Разделите X и Y.\",body:\"Вертикальная и горизонтальная прокрутка идут как отдельные оси. Плавность и реверс можно включать и выключать независимо для каждой.\",smooth:\"Плавность\",reverse:\"Реверс\",on:\"Вкл\",off:\"Выкл\"},perApp:{kicker:\"Профили по приложениям\",title:\"Разным приложениям — разное ощущение.\",body:\"Пусть приложение наследует настройки по умолчанию или переопределяйте правила прокрутки и кнопок. Точность там, где нужно, и плавность везде.\"},buttons:{kicker:\"Кнопки и шорткаты\",title:\"Привязать, записать, повторить.\",body:\"Записывайте события мыши или клавиатуры и привязывайте их к системным сочетаниям. В живом мониторе видно, что отправляют ваши устройства.\",quickBind:\"Быстрая привязка\",rows:{button4:\"Кнопка 4\",button5:\"Кнопка 5\",wheelClick:\"Нажатие колеса\",missionControl:\"Mission Control\",nextSpace:\"Следующее пространство\",appSwitcher:\"Переключатель приложений\"}}}},download:{title:\"Скачать Mos. Настройте прокрутку под себя.\",body:\"Устанавливается за секунды. Настраивайте, когда понадобится, и держите одинаковое поведение прокрутки в тех приложениях, где вы живете.\",ctaDownload:\"Скачать\",releaseNotes:\"Заметки к релизу\",docs:\"Документация\"},homebrew:{title:\"Homebrew\",copy:\"Копировать\",copied:\"Скопировано\",tip:\"Подсказка: если вы на beta, ваш cask может быть {cask}.\"},footer:{latestRelease:\"Последний релиз\",latestVersion:\"Последний {version}\",requiresMacos:\"Нужна macOS 10.13+\",github:\"GitHub\",wiki:\"Wiki\",releases:\"Releases\"},easing:{graphAria:\"График кривой прокрутки\",step:{label:\"Шаг\",aria:\"Шаг\",help:\"Нижний предел квантования для дельт колеса.\"},gain:{label:\"Усиление\",aria:\"Усиление\",help:\"Масштабирует расстояние за тик и скорость разгона кривой.\"},duration:{label:\"Длительность\",aria:\"Длительность\",help:\"Константа сглаживания (выше — длиннее хвост).\"},footer:\"Кривая ScrollCore\"}},de:{languageSelector:{title:\"Sprache auswählen\"},a11y:{skipToContent:\"Zum Inhalt springen\",closeDialog:\"Dialog schließen\",githubAria:\"Mos auf GitHub\",appIconAlt:\"Mos App-Icon\",scrollCurveGraph:\"Scrollkurven-Diagramm\"},nav:{githubTitle:\"GitHub\"},hero:{badgeLine1:\"Sanftes Scrollen mit dem Mausrad unter macOS\",badgeLine2:\"App-Profile · getrennte Achsen · Buttons & Shortcuts\",titleLine1:\"Mach aus der Maus\",titleLine2Before:\"einen \",titleLine2Highlight:\"Flow\",titleLine2After:\".\",lead:\"Mos ist ein kostenloses Open-Source-Tool für macOS. Es macht das Scrollen mit dem Mausrad so glatt wie beim Trackpad, ohne dir die Kontrolle zu nehmen. Kurven anpassen, Achsen trennen und Regeln pro App überschreiben.\",ctaDownload:\"Mos herunterladen\",ctaViewGitHub:\"Auf GitHub ansehen\",ctaInstallHomebrew:\"Mit Homebrew installieren\",requirementsLine1:\"macOS 10.13+ erforderlich\",requirementsLine2:\"Kostenlos · Open Source\",scrollHint:\"Scrollen zum Entdecken\"},sectionFeel:{title:\"Deterministisch scrollen. Gefühl feinjustieren.\",lead:\"Mos verwandelt rohe Mausrad-Deltas in vorhersehbare Bewegung. Behalte in allen Apps dasselbe Gefühl und überschreibe es nur dort, wo du es brauchst.\",cards:{curves:{kicker:\"Kurven & Beschleunigung\",title:\"Das Gefühl formen.\",body:\"Smoothness ist eine Kurve. Stell Step, Gain und Duration ein und sieh, wie rohe Deltas in kontrollierte Bewegung werden.\"},axes:{kicker:\"Unabhängige Achsen\",title:\"X und Y trennen.\",body:\"Vertikal und horizontal sind getrennte Achsen. Glätten und Invert kannst du pro Achse an- und ausschalten.\",smooth:\"Glätten\",reverse:\"Invert\",on:\"An\",off:\"Aus\"},perApp:{kicker:\"Profile pro App\",title:\"Andere Apps, anderes Gefühl.\",body:\"Jede App kann die Defaults übernehmen oder Scroll- und Button-Regeln überschreiben. Präzise, wo’s zählt, smooth überall sonst.\"},buttons:{kicker:\"Buttons & Shortcuts\",title:\"Binden, aufnehmen, wiederholen.\",body:\"Maus- oder Tastatur-Events aufnehmen und an System-Shortcuts binden. Im Live-Monitor siehst du, was deine Geräte senden.\",quickBind:\"Schnell binden\",rows:{button4:\"Taste 4\",button5:\"Taste 5\",wheelClick:\"Radklick\",missionControl:\"Mission Control\",nextSpace:\"Nächster Bereich\",appSwitcher:\"App-Umschalter\"}}}},download:{title:\"Mos herunterladen. Scrollen nach deinem Geschmack.\",body:\"In Sekunden installiert, in deinem Tempo eingestellt. Und das Scroll-Gefühl bleibt in deinen Apps konsistent.\",ctaDownload:\"Herunterladen\",releaseNotes:\"Release Notes\",docs:\"Doku\"},homebrew:{title:\"Homebrew\",copy:\"Kopieren\",copied:\"Kopiert\",tip:\"Tipp: Wenn du die Beta nutzt, heißt dein Cask vielleicht {cask}.\"},footer:{latestRelease:\"Neuester Release\",latestVersion:\"Neueste {version}\",requiresMacos:\"macOS 10.13+ erforderlich\",github:\"GitHub\",wiki:\"Wiki\",releases:\"Releases\"},easing:{graphAria:\"Scrollkurven-Diagramm\",step:{label:\"Step\",aria:\"Step\",help:\"Quantisierungs-Untergrenze für Mausrad-Deltas.\"},gain:{label:\"Gain\",aria:\"Gain\",help:\"Skaliert die Strecke pro Tick und wie schnell die Kurve anzieht.\"},duration:{label:\"Duration\",aria:\"Duration\",help:\"Zeitkonstante fürs Glätten (höher = längerer Nachlauf).\"},footer:\"ScrollCore curve\"}},pl:{languageSelector:{title:\"Wybierz język\"},a11y:{skipToContent:\"Przejdź do treści\",closeDialog:\"Zamknij okno dialogowe\",githubAria:\"Mos na GitHubie\",appIconAlt:\"Ikona aplikacji Mos\",scrollCurveGraph:\"Wykres krzywej przewijania\"},nav:{githubTitle:\"GitHub\"},hero:{badgeLine1:\"Płynne przewijanie kółkiem myszy w macOS\",badgeLine2:\"profile per aplikacja · niezależne osie · przyciski i skróty\",titleLine1:\"Zamień mysz\",titleLine2Before:\"w \",titleLine2Highlight:\"flow\",titleLine2After:\".\",lead:\"Mos to darmowe, otwartoźródłowe narzędzie dla macOS. Sprawia, że przewijanie kółkiem jest bliższe wrażeniu z trackpada, bez odbierania kontroli. Dostosuj krzywe, rozdziel osie i nadpisuj zachowanie dla poszczególnych aplikacji.\",ctaDownload:\"Pobierz Mos\",ctaViewGitHub:\"Zobacz na GitHubie\",ctaInstallHomebrew:\"Zainstaluj przez Homebrew\",requirementsLine1:\"Wymaga macOS 10.13+\",requirementsLine2:\"Darmowe · Open source\",scrollHint:\"Przewiń, aby zobaczyć więcej\"},sectionFeel:{title:\"Przewidywalne przewijanie. Odczucie do ustawienia.\",lead:\"Mos zamienia surowe delty kółka w przewidywalny ruch. Zachowaj to samo odczucie w aplikacjach i nadpisuj je tylko tam, gdzie trzeba.\",cards:{curves:{kicker:\"Krzywe i przyspieszenie\",title:\"Ułóż odczucie.\",body:\"Płynność to krzywa. Zmieniaj Step, Gain i Duration i zobacz, jak surowe delty stają się kontrolowanym ruchem.\"},axes:{kicker:\"Niezależne osie\",title:\"Rozdziel X i Y.\",body:\"Pion i poziom to niezależne osie. Wygładzanie i odwrócenie możesz włączać osobno dla każdej z nich.\",smooth:\"Wygładzanie\",reverse:\"Odwróć\",on:\"Wł.\",off:\"Wył.\"},perApp:{kicker:\"Profile per aplikacja\",title:\"Inne aplikacje, inne odczucie.\",body:\"Każda aplikacja może dziedziczyć ustawienia domyślne albo nadpisywać reguły przewijania i przycisków. Precyzja tam, gdzie trzeba, płynność wszędzie indziej.\"},buttons:{kicker:\"Przyciski i skróty\",title:\"Przypnij, nagraj, powtórz.\",body:\"Nagraj zdarzenia myszy lub klawiatury i przypisz je do skrótów systemowych. W monitorze na żywo sprawdzisz, co wysyłają urządzenia.\",quickBind:\"Szybkie przypisanie\",rows:{button4:\"Przycisk 4\",button5:\"Przycisk 5\",wheelClick:\"Klik kółka\",missionControl:\"Mission Control\",nextSpace:\"Następna przestrzeń\",appSwitcher:\"Przełącznik aplikacji\"}}}},download:{title:\"Pobierz Mos. Ustaw przewijanie pod siebie.\",body:\"Instalacja w kilka sekund. Dopasuj, kiedy potrzebujesz, i utrzymaj spójne przewijanie w aplikacjach, z których korzystasz na co dzień.\",ctaDownload:\"Pobierz\",releaseNotes:\"Informacje o wydaniu\",docs:\"Dokumentacja\"},homebrew:{title:\"Homebrew\",copy:\"Kopiuj\",copied:\"Skopiowano\",tip:\"Wskazówka: jeśli używasz bety, twój cask może nazywać się {cask}.\"},footer:{latestRelease:\"Najnowsze wydanie\",latestVersion:\"Najnowsza {version}\",requiresMacos:\"Wymaga macOS 10.13+\",github:\"GitHub\",wiki:\"Wiki\",releases:\"Releases\"},easing:{graphAria:\"Wykres krzywej przewijania\",step:{label:\"Krok\",aria:\"Krok\",help:\"Dolny próg kwantyzacji dla delt kółka.\"},gain:{label:\"Wzmocnienie\",aria:\"Wzmocnienie\",help:\"Skaluje dystans na тик i szybkość narastania krzywej.\"},duration:{label:\"Czas\",aria:\"Czas\",help:\"Stała czasowa wygładzania (większa = dłuższy ogon).\"},footer:\"Krzywa ScrollCore\"}},el:{languageSelector:{title:\"Επιλογή γλώσσας\"},a11y:{skipToContent:\"Μετάβαση στο περιεχόμενο\",closeDialog:\"Κλείσιμο διαλόγου\",githubAria:\"Mos στο GitHub\",appIconAlt:\"Εικονίδιο εφαρμογής Mos\",scrollCurveGraph:\"Γράφημα καμπύλης κύλισης\"},nav:{githubTitle:\"GitHub\"},hero:{badgeLine1:\"Ομαλό scrolling με ροδέλα ποντικιού στο macOS\",badgeLine2:\"προφίλ ανά εφαρμογή · ανεξάρτητοι άξονες · κουμπιά & shortcuts\",titleLine1:\"Κάνε το ποντίκι\",titleLine2Before:\"να \",titleLine2Highlight:\"ρέει\",titleLine2After:\".\",lead:\"Το Mos είναι ένα δωρεάν, open-source εργαλείο για macOS. Κάνει το scrolling με ροδέλα να θυμίζει trackpad, χωρίς να χάνεις τον έλεγχο. Ρύθμισε καμπύλες, χώρισε άξονες και βάλε εξαιρέσεις ανά εφαρμογή.\",ctaDownload:\"Λήψη Mos\",ctaViewGitHub:\"Δες το στο GitHub\",ctaInstallHomebrew:\"Εγκατάσταση με Homebrew\",requirementsLine1:\"Απαιτεί macOS 10.13+\",requirementsLine2:\"Δωρεάν · Open source\",scrollHint:\"Κάνε scroll για συνέχεια\"},sectionFeel:{title:\"Προβλέψιμο scrolling. Ρυθμιζόμενη αίσθηση.\",lead:\"Το Mos μετατρέπει τις ωμές μεταβολές της ροδέλας σε προβλέψιμη κίνηση. Κράτα την ίδια αίσθηση σε όλες τις εφαρμογές και κάνε override όπου χρειάζεται.\",cards:{curves:{kicker:\"Καμπύλες & επιτάχυνση\",title:\"Διαμόρφωσε την αίσθηση.\",body:\"Η ομαλότητα είναι καμπύλη. Ρύθμισε step, gain και duration και δες πώς οι ωμές μεταβολές γίνονται ελεγχόμενη κίνηση.\"},axes:{kicker:\"Ανεξάρτητοι άξονες\",title:\"Χώρισε X και Y.\",body:\"Κάνε την κάθετη και την οριζόντια κύλιση ξεχωριστούς άξονες. Ενεργοποίησε/απενεργοποίησε την ομαλότητα και την αντιστροφή ανεξάρτητα για τον καθένα.\",smooth:\"Ομαλότητα\",reverse:\"Αντιστροφή\",on:\"ON\",off:\"OFF\"},perApp:{kicker:\"Προφίλ ανά εφαρμογή\",title:\"Άλλες εφαρμογές, άλλη αίσθηση.\",body:\"Άφησε κάθε εφαρμογή να κληρονομεί τα default ή κάνε override κανόνες κύλισης και κουμπιών. Ακρίβεια όπου χρειάζεται, ομαλότητα παντού αλλού.\"},buttons:{kicker:\"Κουμπιά & shortcuts\",title:\"Δέσε, γράψε, επανάλαβε.\",body:\"Κατέγραψε events από ποντίκι ή πληκτρολόγιο και δέσε τα σε system shortcuts. Με το live monitor βλέπεις τι στέλνουν οι συσκευές σου.\",quickBind:\"Γρήγορη δέσμευση\",rows:{button4:\"Κουμπί 4\",button5:\"Κουμπί 5\",wheelClick:\"Κλικ ροδέλας\",missionControl:\"Mission Control\",nextSpace:\"Επόμενος χώρος\",appSwitcher:\"Εναλλαγή εφαρμογών\"}}}},download:{title:\"Λήψη Mos. Ρύθμισε το scrolling σου.\",body:\"Εγκατάσταση σε δευτερόλεπτα, ρύθμιση με τον ρυθμό σου, και σταθερή συμπεριφορά κύλισης στις εφαρμογές που χρησιμοποιείς καθημερινά.\",ctaDownload:\"Λήψη\",releaseNotes:\"Σημειώσεις έκδοσης\",docs:\"Οδηγίες\"},homebrew:{title:\"Homebrew\",copy:\"Αντιγραφή\",copied:\"Αντιγράφηκε\",tip:\"Συμβουλή: αν είσαι σε beta, το cask μπορεί να είναι {cask}.\"},footer:{latestRelease:\"Τελευταία έκδοση\",latestVersion:\"Τελευταίο {version}\",requiresMacos:\"Απαιτεί macOS 10.13+\",github:\"GitHub\",wiki:\"Wiki\",releases:\"Releases\"},easing:{graphAria:\"Γράφημα καμπύλης κύλισης\",step:{label:\"Βήμα\",aria:\"Βήμα\",help:\"Κατώφλι κβαντοποίησης για τις μεταβολές της ροδέλας.\"},gain:{label:\"Κέρδος\",aria:\"Κέρδος\",help:\"Κλιμακώνει την απόσταση ανά tick και το πόσο γρήγορα ανεβαίνει η καμπύλη.\"},duration:{label:\"Διάρκεια\",aria:\"Διάρκεια\",help:\"Χρονική σταθερά εξομάλυνσης (μεγαλύτερη = μεγαλύτερη ουρά).\"},footer:\"Καμπύλη ScrollCore\"}},tr:{languageSelector:{title:\"Dil seç\"},a11y:{skipToContent:\"İçeriğe atla\",closeDialog:\"İletişim penceresini kapat\",githubAria:\"GitHub'da Mos\",appIconAlt:\"Mos uygulama simgesi\",scrollCurveGraph:\"Kaydırma eğrisi grafiği\"},nav:{githubTitle:\"GitHub\"},hero:{badgeLine1:\"macOS'ta mouse tekeri için akıcı kaydırma\",badgeLine2:\"uygulama profilleri · bağımsız eksenler · tuşlar ve kısayollar\",titleLine1:\"Fareyi\",titleLine2Before:\"\",titleLine2Highlight:\"flow\",titleLine2After:\"'a çevir.\",lead:\"Mos, macOS için ücretsiz ve açık kaynak bir araç. Mouse tekeri kaydırmasını trackpad'e daha yakın hissettirir, kontrolü elinden almaz. Eğrileri ayarla, X/Y eksenlerini ayır ve uygulama bazında davranışı geçersiz kıl.\",ctaDownload:\"Mos'u indir\",ctaViewGitHub:\"GitHub'da gör\",ctaInstallHomebrew:\"Homebrew ile yükle\",requirementsLine1:\"macOS 10.13+ gerekir\",requirementsLine2:\"Ücretsiz · Açık kaynak\",scrollHint:\"Keşfetmek için kaydır\"},sectionFeel:{title:\"Tahmin edilebilir kaydırma. Ayarlanabilir his.\",lead:\"Mos, ham teker delta değerlerini öngörülebilir harekete çevirir. Uygulamalar arasında aynı hissi koru, gerektiğinde uygulama bazında geçersiz kıl.\",cards:{curves:{kicker:\"Eğriler ve hızlanma\",title:\"Hissi şekillendir.\",body:\"Akıcılık bir eğridir. Step, Gain ve Duration'ı ayarla; ham delta değerlerinin nasıl kontrollü harekete dönüştüğünü gör.\"},axes:{kicker:\"Bağımsız eksenler\",title:\"X ve Y'yi ayır.\",body:\"Dikey ve yatay kaydırmayı ayrı eksenler olarak düşün. Akıcılığı ve ters çevirmeyi her eksen için ayrı ayrı aç/kapat.\",smooth:\"Akıcılık\",reverse:\"Ters çevir\",on:\"Açık\",off:\"Kapalı\"},perApp:{kicker:\"Uygulama profilleri\",title:\"Farklı uygulamalar, farklı his.\",body:\"Her uygulama varsayılanları devralabilir ya da kaydırma ve tuş kurallarını geçersiz kılabilir. Gerekli yerde hassas, diğer her yerde akıcı.\"},buttons:{kicker:\"Tuşlar ve kısayollar\",title:\"Bağla, kaydet, tekrar et.\",body:\"Mouse veya klavye olaylarını kaydet ve sistem kısayollarına bağla. Canlı monitörle cihazlarının ne gönderdiğini görebilirsin.\",quickBind:\"Hızlı bağla\",rows:{button4:\"Tuş 4\",button5:\"Tuş 5\",wheelClick:\"Teker tıklaması\",missionControl:\"Mission Control\",nextSpace:\"Sonraki alan\",appSwitcher:\"Uygulama değiştirici\"}}}},download:{title:\"Mos'u indir. Kaydırmanı kendine göre ayarla.\",body:\"Saniyeler içinde kur. İhtiyacın olduğunda ayarla ve kullandığın uygulamalarda kaydırma davranışını tutarlı tut.\",ctaDownload:\"İndir\",releaseNotes:\"Sürüm notları\",docs:\"Dokümanlar\"},homebrew:{title:\"Homebrew\",copy:\"Kopyala\",copied:\"Kopyalandı\",tip:\"İpucu: beta kullanıyorsan cask'in {cask} olabilir.\"},footer:{latestRelease:\"En son sürüm\",latestVersion:\"En son {version}\",requiresMacos:\"macOS 10.13+ gerekir\",github:\"GitHub\",wiki:\"Wiki\",releases:\"Releases\"},easing:{graphAria:\"Kaydırma eğrisi grafiği\",step:{label:\"Adım\",aria:\"Adım\",help:\"Teker delta değerleri için kuantizasyon eşiği.\"},gain:{label:\"Kazanç\",aria:\"Kazanç\",help:\"Tick başına mesafeyi ve eğrinin ne kadar hızlı yükseldiğini ölçekler.\"},duration:{label:\"Süre\",aria:\"Süre\",help:\"Yumuşatma zaman sabiti (daha yüksek = daha uzun kuyruk).\"},footer:\"ScrollCore eğrisi\"}},uk:{languageSelector:{title:\"Вибір мови\"},a11y:{skipToContent:\"Перейти до вмісту\",closeDialog:\"Закрити діалог\",githubAria:\"Mos на GitHub\",appIconAlt:\"Іконка Mos\",scrollCurveGraph:\"Графік кривої прокручування\"},nav:{githubTitle:\"GitHub\"},hero:{badgeLine1:\"Плавне прокручування коліщатком миші в macOS\",badgeLine2:\"профілі для програм · незалежні осі · кнопки й скорочення\",titleLine1:\"Перетвори мишу\",titleLine2Before:\"на \",titleLine2Highlight:\"flow\",titleLine2After:\".\",lead:\"Mos — безкоштовна утиліта з відкритим кодом для macOS. Вона робить прокручування коліщатком ближчим до відчуття трекпада, не забираючи контроль. Налаштовуй криві, розділяй осі та перевизначай поведінку для кожного застосунку.\",ctaDownload:\"Завантажити Mos\",ctaViewGitHub:\"Переглянути на GitHub\",ctaInstallHomebrew:\"Встановити через Homebrew\",requirementsLine1:\"Потрібна macOS 10.13+\",requirementsLine2:\"Безкоштовно · Відкритий код\",scrollHint:\"Прокрути вниз\"},sectionFeel:{title:\"Передбачуване прокручування. Налаштовуване відчуття.\",lead:\"Mos перетворює сирі дельти коліщатка на передбачуваний рух. Зберігай однакове відчуття між застосунками і роби override там, де потрібно.\",cards:{curves:{kicker:\"Криві й прискорення\",title:\"Сформуй відчуття.\",body:\"Плавність — це крива. Налаштуй step, gain і duration та подивись, як сирі дельти стають керованим рухом.\"},axes:{kicker:\"Незалежні осі\",title:\"Розділи X і Y.\",body:\"Вертикальне й горизонтальне прокручування — окремі осі. Плавність і реверс можна вмикати та вимикати для кожної осі незалежно.\",smooth:\"Плавність\",reverse:\"Реверс\",on:\"Увімк.\",off:\"Вимк.\"},perApp:{kicker:\"Профілі для програм\",title:\"Різні застосунки, різне відчуття.\",body:\"Нехай кожен застосунок успадковує налаштування за замовчуванням або перевизначуй правила прокручування й кнопок. Точність там, де треба, плавність всюди інде.\"},buttons:{kicker:\"Кнопки й скорочення\",title:\"Прив’яжи, запиши, повтори.\",body:\"Записуй події миші або клавіатури та прив’язуй їх до системних скорочень. У живому моніторі видно, що надсилають твої пристрої.\",quickBind:\"Швидка прив’язка\",rows:{button4:\"Кнопка 4\",button5:\"Кнопка 5\",wheelClick:\"Натиск коліщатка\",missionControl:\"Mission Control\",nextSpace:\"Наступний простір\",appSwitcher:\"Перемикач програм\"}}}},download:{title:\"Завантаж Mos. Налаштуй прокручування під себе.\",body:\"Встановлюється за секунди. Налаштовуй, коли потрібно, і тримай однакову поведінку прокручування у своїх застосунках.\",ctaDownload:\"Завантажити\",releaseNotes:\"Нотатки до релізу\",docs:\"Документація\"},homebrew:{title:\"Homebrew\",copy:\"Копіювати\",copied:\"Скопійовано\",tip:\"Порада: якщо ти на beta, твій cask може бути {cask}.\"},footer:{latestRelease:\"Останній реліз\",latestVersion:\"Остання {version}\",requiresMacos:\"Потрібна macOS 10.13+\",github:\"GitHub\",wiki:\"Wiki\",releases:\"Releases\"},easing:{graphAria:\"Графік кривої прокручування\",step:{label:\"Крок\",aria:\"Крок\",help:\"Нижній поріг квантування для дельт коліщатка.\"},gain:{label:\"Підсилення\",aria:\"Підсилення\",help:\"Масштабує відстань за тик і швидкість наростання кривої.\"},duration:{label:\"Тривалість\",aria:\"Тривалість\",help:\"Часова константа згладжування (вище = довший хвіст).\"},footer:\"Крива ScrollCore\"}},id:{languageSelector:{title:\"Pilih Bahasa\"},a11y:{skipToContent:\"Lewati ke konten\",closeDialog:\"Tutup dialog\",githubAria:\"Mos di GitHub\",appIconAlt:\"Ikon aplikasi Mos\",scrollCurveGraph:\"Grafik kurva scroll\"},nav:{githubTitle:\"GitHub\"},hero:{badgeLine1:\"Scroll halus untuk roda mouse di macOS\",badgeLine2:\"profil per aplikasi · sumbu terpisah · tombol & pintasan\",titleLine1:\"Ubah mouse\",titleLine2Before:\"menjadi \",titleLine2Highlight:\"flow\",titleLine2After:\".\",lead:\"Mos adalah utilitas macOS gratis dan open-source yang membuat scroll roda mouse terasa lebih seperti trackpad, tanpa mengurangi kontrol. Atur kurva, pisahkan sumbu, dan override perilaku per aplikasi.\",ctaDownload:\"Unduh Mos\",ctaViewGitHub:\"Lihat di GitHub\",ctaInstallHomebrew:\"Instal via Homebrew\",requirementsLine1:\"Butuh macOS 10.13+\",requirementsLine2:\"Gratis · Open source\",scrollHint:\"Scroll untuk melihat\"},sectionFeel:{title:\"Scroll yang konsisten. Rasa yang bisa diatur.\",lead:\"Mos mengubah delta roda mentah menjadi gerakan yang bisa diprediksi. Pertahankan rasa yang sama di berbagai aplikasi, dan override saat perlu.\",cards:{curves:{kicker:\"Kurva & akselerasi\",title:\"Bentuk rasanya.\",body:\"Kehalusan adalah kurva. Ubah step, gain, dan duration, lalu lihat bagaimana delta mentah menjadi gerakan yang terkontrol.\"},axes:{kicker:\"Sumbu terpisah\",title:\"Pisahkan X dan Y.\",body:\"Anggap scroll vertikal dan horizontal sebagai dua sumbu terpisah. Kehalusan dan reverse bisa dinyalakan/dimatikan secara independen untuk tiap sumbu.\",smooth:\"Kehalusan\",reverse:\"Reverse\",on:\"Nyala\",off:\"Mati\"},perApp:{kicker:\"Profil per aplikasi\",title:\"Aplikasi berbeda, rasa berbeda.\",body:\"Setiap aplikasi bisa memakai default atau meng-override aturan scroll dan tombol. Presisi saat dibutuhkan, halus di tempat lain.\"},buttons:{kicker:\"Tombol & pintasan\",title:\"Ikat, rekam, ulangi.\",body:\"Rekam event mouse atau keyboard lalu ikat ke pintasan sistem. Dengan live monitor kamu bisa melihat apa yang dikirim perangkatmu.\",quickBind:\"Quick Bind\",rows:{button4:\"Button 4\",button5:\"Button 5\",wheelClick:\"Wheel Click\",missionControl:\"Mission Control\",nextSpace:\"Next Space\",appSwitcher:\"App Switcher\"}}}},download:{title:\"Unduh Mos. Atur scroll sesuai kamu.\",body:\"Instal dalam hitungan detik, atur saat perlu, dan jaga perilaku scroll tetap konsisten di aplikasi yang kamu pakai setiap hari.\",ctaDownload:\"Unduh\",releaseNotes:\"Catatan rilis\",docs:\"Dokumentasi\"},homebrew:{title:\"Homebrew\",copy:\"Salin\",copied:\"Disalin\",tip:\"Tips: jika kamu memakai beta, cask-nya mungkin {cask}.\"},footer:{latestRelease:\"Rilis terbaru\",latestVersion:\"Terbaru {version}\",requiresMacos:\"Butuh macOS 10.13+\",github:\"GitHub\",wiki:\"Wiki\",releases:\"Releases\"},easing:{graphAria:\"Grafik kurva scroll\",step:{label:\"Step\",aria:\"Step\",help:\"Batas kuantisasi untuk delta roda.\"},gain:{label:\"Gain\",aria:\"Gain\",help:\"Mengalikan jarak per tick dan seberapa cepat kurva naik.\"},duration:{label:\"Duration\",aria:\"Duration\",help:\"Konstanta waktu smoothing (lebih besar = tail lebih panjang).\"},footer:\"ScrollCore curve\"}}},n=(0,a.createContext)(null);function l({children:e}){let[l,s]=(0,a.useState)(\"en\"),c=(0,a.useRef)(!1),u=(0,a.useMemo)(()=>o[l]??i,[l]);return(0,a.useEffect)(()=>{let e=localStorage.getItem(\"language\"),t=e&&r.includes(e)?e:function(){for(let e of\"u\">typeof navigator?Array.from(new Set([...navigator.languages??[],navigator.language??\"\"].filter(Boolean))):[]){let t=function(e){let t=e.trim().toLowerCase();if(!t)return null;if(\"zh\"===t||t.startsWith(\"zh-\")||t.startsWith(\"zh_\")){let e=t.replace(\"_\",\"-\");return e.includes(\"hant\")||e.startsWith(\"zh-hk\")||e.startsWith(\"zh-tw\")||e.startsWith(\"zh-mo\")?\"zh-Hant\":\"zh\"}let a=t.split(/[-_]/)[0]??\"\";return\"in\"===a?\"id\":r.includes(a)?a:null}(e);if(t)return t}return\"en\"}();s(t);try{localStorage.setItem(\"language\",t)}catch{}try{document.documentElement.lang=t}catch{}},[]),(0,a.useEffect)(()=>{if(!c.current){c.current=!0;return}try{localStorage.setItem(\"language\",l)}catch{}try{document.documentElement.lang=l}catch{}},[l]),(0,t.jsx)(n.Provider,{value:{language:l,t:u,setLanguage:s},children:e})}function s(){let e=(0,a.useContext)(n);if(!e)throw Error(\"useI18n must be used within an I18nProvider\");return e}e.s([\"I18nProvider\",()=>l,\"useI18n\",()=>s],22576)},87724,(e,t,a)=>{\"use strict\";Object.defineProperty(a,\"__esModule\",{value:!0});var i={cancelIdleCallback:function(){return n},requestIdleCallback:function(){return o}};for(var r in i)Object.defineProperty(a,r,{enumerable:!0,get:i[r]});let o=\"u\">typeof self&&self.requestIdleCallback&&self.requestIdleCallback.bind(window)||function(e){let t=Date.now();return self.setTimeout(function(){e({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-t))}})},1)},n=\"u\">typeof self&&self.cancelIdleCallback&&self.cancelIdleCallback.bind(window)||function(e){return clearTimeout(e)};(\"function\"==typeof a.default||\"object\"==typeof a.default&&null!==a.default)&&void 0===a.default.__esModule&&(Object.defineProperty(a.default,\"__esModule\",{value:!0}),Object.assign(a.default,a),t.exports=a.default)},13154,(e,t,a)=>{\"use strict\";Object.defineProperty(a,\"__esModule\",{value:!0});var i={default:function(){return w},handleClientScriptLoad:function(){return m},initScriptLoader:function(){return g}};for(var r in i)Object.defineProperty(a,r,{enumerable:!0,get:i[r]});let o=e.r(81258),n=e.r(44066),l=e.r(964),s=o._(e.r(72491)),c=n._(e.r(33664)),u=e.r(38019),d=e.r(1042),p=e.r(87724),b=new Map,k=new Set,h=e=>{let{src:t,id:a,onLoad:i=()=>{},onReady:r=null,dangerouslySetInnerHTML:o,children:n=\"\",strategy:l=\"afterInteractive\",onError:c,stylesheets:u}=e,p=a||t;if(p&&k.has(p))return;if(b.has(t)){k.add(p),b.get(t).then(i,c);return}let h=()=>{r&&r(),k.add(p)},m=document.createElement(\"script\"),g=new Promise((e,t)=>{m.addEventListener(\"load\",function(t){e(),i&&i.call(this,t),h()}),m.addEventListener(\"error\",function(e){t(e)})}).catch(function(e){c&&c(e)});o?(m.innerHTML=o.__html||\"\",h()):n?(m.textContent=\"string\"==typeof n?n:Array.isArray(n)?n.join(\"\"):\"\",h()):t&&(m.src=t,b.set(t,g)),(0,d.setAttributesFromProps)(m,e),\"worker\"===l&&m.setAttribute(\"type\",\"text/partytown\"),m.setAttribute(\"data-nscript\",l),u&&(e=>{if(s.default.preinit)return e.forEach(e=>{s.default.preinit(e,{as:\"style\"})});if(\"u\">typeof window){let t=document.head;e.forEach(e=>{let a=document.createElement(\"link\");a.type=\"text/css\",a.rel=\"stylesheet\",a.href=e,t.appendChild(a)})}})(u),document.body.appendChild(m)};function m(e){let{strategy:t=\"afterInteractive\"}=e;\"lazyOnload\"===t?window.addEventListener(\"load\",()=>{(0,p.requestIdleCallback)(()=>h(e))}):h(e)}function g(e){e.forEach(m),[...document.querySelectorAll('[data-nscript=\"beforeInteractive\"]'),...document.querySelectorAll('[data-nscript=\"beforePageRender\"]')].forEach(e=>{let t=e.id||e.getAttribute(\"src\");k.add(t)})}function y(e){let{id:t,src:a=\"\",onLoad:i=()=>{},onReady:r=null,strategy:o=\"afterInteractive\",onError:n,stylesheets:d,...b}=e,{updateScripts:m,scripts:g,getIsSsr:y,appDir:w,nonce:f}=(0,c.useContext)(u.HeadManagerContext);f=b.nonce||f;let S=(0,c.useRef)(!1);(0,c.useEffect)(()=>{let e=t||a;S.current||(r&&e&&k.has(e)&&r(),S.current=!0)},[r,t,a]);let v=(0,c.useRef)(!1);if((0,c.useEffect)(()=>{if(!v.current){if(\"afterInteractive\"===o)h(e);else\"lazyOnload\"===o&&(\"complete\"===document.readyState?(0,p.requestIdleCallback)(()=>h(e)):window.addEventListener(\"load\",()=>{(0,p.requestIdleCallback)(()=>h(e))}));v.current=!0}},[e,o]),(\"beforeInteractive\"===o||\"worker\"===o)&&(m?(g[o]=(g[o]||[]).concat([{id:t,src:a,onLoad:i,onReady:r,onError:n,...b,nonce:f}]),m(g)):y&&y()?k.add(t||a):y&&!y()&&h({...e,nonce:f})),w){if(d&&d.forEach(e=>{s.default.preinit(e,{as:\"style\"})}),\"beforeInteractive\"===o)if(!a)return b.dangerouslySetInnerHTML&&(b.children=b.dangerouslySetInnerHTML.__html,delete b.dangerouslySetInnerHTML),(0,l.jsx)(\"script\",{nonce:f,dangerouslySetInnerHTML:{__html:`(self.__next_s=self.__next_s||[]).push(${JSON.stringify([0,{...b,id:t}])})`}});else return s.default.preload(a,b.integrity?{as:\"script\",integrity:b.integrity,nonce:f,crossOrigin:b.crossOrigin}:{as:\"script\",nonce:f,crossOrigin:b.crossOrigin}),(0,l.jsx)(\"script\",{nonce:f,dangerouslySetInnerHTML:{__html:`(self.__next_s=self.__next_s||[]).push(${JSON.stringify([a,{...b,id:t}])})`}});\"afterInteractive\"===o&&a&&s.default.preload(a,b.integrity?{as:\"script\",integrity:b.integrity,nonce:f,crossOrigin:b.crossOrigin}:{as:\"script\",nonce:f,crossOrigin:b.crossOrigin})}return null}Object.defineProperty(y,\"__nextScript\",{value:!0});let w=y;(\"function\"==typeof a.default||\"object\"==typeof a.default&&null!==a.default)&&void 0===a.default.__esModule&&(Object.defineProperty(a.default,\"__esModule\",{value:!0}),Object.assign(a.default,a),t.exports=a.default)},96923,e=>{\"use strict\";var t=e.i(964),a=e.i(22576);function i({children:e}){return(0,t.jsx)(a.I18nProvider,{children:e})}e.s([\"Providers\",()=>i])}]);"
  },
  {
    "path": "docs/_next/static/chunks/2f0565a65fa02d97.js",
    "content": "(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push([\"object\"==typeof document?document.currentScript:void 0,64942,(e,t,r)=>{\"use strict\";function n(e,t={}){if(t.onlyHashChange)return void e();let r=document.documentElement;if(\"smooth\"!==r.dataset.scrollBehavior)return void e();let a=r.style.scrollBehavior;r.style.scrollBehavior=\"auto\",t.dontForceLayout||r.getClientRects(),e(),r.style.scrollBehavior=a}Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"disableSmoothScrollDuringRouteTransition\",{enumerable:!0,get:function(){return n}}),e.r(46424)},35998,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"HTTPAccessFallbackBoundary\",{enumerable:!0,get:function(){return l}});let n=e.r(44066),a=e.r(964),o=n._(e.r(33664)),i=e.r(56668),s=e.r(38747);e.r(46424);let c=e.r(7e4);class u extends o.default.Component{constructor(e){super(e),this.state={triggeredStatus:void 0,previousPathname:e.pathname}}componentDidCatch(){}static getDerivedStateFromError(e){if((0,s.isHTTPAccessFallbackError)(e))return{triggeredStatus:(0,s.getAccessFallbackHTTPStatus)(e)};throw e}static getDerivedStateFromProps(e,t){return e.pathname!==t.previousPathname&&t.triggeredStatus?{triggeredStatus:void 0,previousPathname:e.pathname}:{triggeredStatus:t.triggeredStatus,previousPathname:e.pathname}}render(){let{notFound:e,forbidden:t,unauthorized:r,children:n}=this.props,{triggeredStatus:o}=this.state,i={[s.HTTPAccessErrorStatus.NOT_FOUND]:e,[s.HTTPAccessErrorStatus.FORBIDDEN]:t,[s.HTTPAccessErrorStatus.UNAUTHORIZED]:r};if(o){let c=o===s.HTTPAccessErrorStatus.NOT_FOUND&&e,u=o===s.HTTPAccessErrorStatus.FORBIDDEN&&t,l=o===s.HTTPAccessErrorStatus.UNAUTHORIZED&&r;return c||u||l?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(\"meta\",{name:\"robots\",content:\"noindex\"}),!1,i[o]]}):n}return n}}function l({notFound:e,forbidden:t,unauthorized:r,children:n}){let s=(0,i.useUntrackedPathname)(),l=(0,o.useContext)(c.MissingSlotContext);return e||t||r?(0,a.jsx)(u,{pathname:s,notFound:e,forbidden:t,unauthorized:r,missingSlots:l,children:n}):(0,a.jsx)(a.Fragment,{children:n})}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},84259,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"useRouterBFCache\",{enumerable:!0,get:function(){return a}});let n=e.r(33664);function a(e,t){let[r,a]=(0,n.useState)(()=>({tree:e,stateKey:t,next:null}));if(r.tree===e)return r;let o={tree:e,stateKey:t,next:null},i=1,s=r,c=o;for(;null!==s&&i<1;){if(s.stateKey===t){c.next=s.next;break}{i++;let e={tree:s.tree,stateKey:s.stateKey,next:null};c.next=e,c=e}s=s.next}return a(o),o}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},33720,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"default\",{enumerable:!0,get:function(){return w}});let n=e.r(81258),a=e.r(44066),o=e.r(964),i=a._(e.r(33664)),s=n._(e.r(72491)),c=e.r(7e4),u=e.r(81814),l=e.r(74506),d=e.r(77617),f=e.r(64942),p=e.r(13409),h=e.r(35998),m=e.r(75861),g=e.r(84259);e.r(2415);let y=e.r(53675),b=e.r(29136),P=e.r(46088),_=s.default.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,S=[\"bottom\",\"height\",\"left\",\"right\",\"top\",\"width\",\"x\",\"y\"];function v(e,t){let r=e.getBoundingClientRect();return r.top>=0&&r.top<=t}class O extends i.default.Component{componentDidMount(){this.handlePotentialScroll()}componentDidUpdate(){this.props.focusAndScrollRef.apply&&this.handlePotentialScroll()}render(){return this.props.children}constructor(...e){super(...e),this.handlePotentialScroll=()=>{let{focusAndScrollRef:e,segmentPath:t}=this.props;if(e.apply){if(0!==e.segmentPaths.length&&!e.segmentPaths.some(e=>t.every((t,r)=>(0,d.matchSegment)(t,e[r]))))return;let r=null,n=e.hashFragment;if(n&&(r=\"top\"===n?document.body:document.getElementById(n)??document.getElementsByName(n)[0]),r||(r=\"u\"<typeof window?null:(0,_.findDOMNode)(this)),!(r instanceof Element))return;for(;!(r instanceof HTMLElement)||function(e){if([\"sticky\",\"fixed\"].includes(getComputedStyle(e).position))return!0;let t=e.getBoundingClientRect();return S.every(e=>0===t[e])}(r);){if(null===r.nextElementSibling)return;r=r.nextElementSibling}e.apply=!1,e.hashFragment=null,e.segmentPaths=[],(0,f.disableSmoothScrollDuringRouteTransition)(()=>{if(n)return void r.scrollIntoView();let e=document.documentElement,t=e.clientHeight;!v(r,t)&&(e.scrollTop=0,v(r,t)||r.scrollIntoView())},{dontForceLayout:!0,onlyHashChange:e.onlyHashChange}),e.onlyHashChange=!1,r.focus()}}}}function R({segmentPath:e,children:t}){let r=(0,i.useContext)(c.GlobalLayoutRouterContext);if(!r)throw Object.defineProperty(Error(\"invariant global layout router not mounted\"),\"__NEXT_ERROR_CODE\",{value:\"E473\",enumerable:!1,configurable:!0});return(0,o.jsx)(O,{segmentPath:e,focusAndScrollRef:r.focusAndScrollRef,children:t})}function E({tree:e,segmentPath:t,debugNameContext:r,cacheNode:n,params:a,url:s,isActive:l}){let d,f=(0,i.useContext)(c.GlobalLayoutRouterContext);if((0,i.useContext)(y.NavigationPromisesContext),!f)throw Object.defineProperty(Error(\"invariant global layout router not mounted\"),\"__NEXT_ERROR_CODE\",{value:\"E473\",enumerable:!1,configurable:!0});let p=null!==n?n:(0,i.use)(u.unresolvedThenable),h=null!==p.prefetchRsc?p.prefetchRsc:p.rsc,m=(0,i.useDeferredValue)(p.rsc,h);if((0,P.isDeferredRsc)(m)){let e=(0,i.use)(m);null===e&&(0,i.use)(u.unresolvedThenable),d=e}else null===m&&(0,i.use)(u.unresolvedThenable),d=m;let g=d;return(0,o.jsx)(c.LayoutRouterContext.Provider,{value:{parentTree:e,parentCacheNode:p,parentSegmentPath:t,parentParams:a,debugNameContext:r,url:s,isActive:l},children:g})}function j({name:e,loading:t,children:r}){let n;if(n=\"object\"==typeof t&&null!==t&&\"function\"==typeof t.then?(0,i.use)(t):t){let t=n[0],a=n[1],s=n[2];return(0,o.jsx)(i.Suspense,{name:e,fallback:(0,o.jsxs)(o.Fragment,{children:[a,s,t]}),children:r})}return(0,o.jsx)(o.Fragment,{children:r})}function w({parallelRouterKey:e,error:t,errorStyles:r,errorScripts:n,templateStyles:a,templateScripts:s,template:d,notFound:f,forbidden:y,unauthorized:P,segmentViewBoundaries:_}){let S=(0,i.useContext)(c.LayoutRouterContext);if(!S)throw Object.defineProperty(Error(\"invariant expected layout router to be mounted\"),\"__NEXT_ERROR_CODE\",{value:\"E56\",enumerable:!1,configurable:!0});let{parentTree:v,parentCacheNode:O,parentSegmentPath:w,parentParams:C,url:T,isActive:x,debugNameContext:A}=S,M=O.parallelRoutes,D=M.get(e);D||(D=new Map,M.set(e,D));let F=v[0],I=null===w?[e]:w.concat([F,e]),k=v[1][e];void 0===k&&(0,i.use)(u.unresolvedThenable);let N=k[0],U=(0,m.createRouterCacheKey)(N,!0),B=(0,g.useRouterBFCache)(k,U),L=[];do{let e=B.tree,i=B.stateKey,u=e[0],g=(0,m.createRouterCacheKey)(u),_=D.get(g)??null,S=C;if(Array.isArray(u)){let e=u[0],t=u[1],r=u[2],n=(0,b.getParamValueFromCacheKey)(t,r);null!==n&&(S={...C,[e]:n})}let v=function(e){if(\"/\"===e)return\"/\";if(\"string\"==typeof e)if(\"(slot)\"===e)return;else return e+\"/\";return e[1]+\"/\"}(u),w=v??A,M=void 0===v?void 0:A,F=O.loading,k=(0,o.jsxs)(c.TemplateContext.Provider,{value:(0,o.jsxs)(R,{segmentPath:I,children:[(0,o.jsx)(l.ErrorBoundary,{errorComponent:t,errorStyles:r,errorScripts:n,children:(0,o.jsx)(j,{name:M,loading:F,children:(0,o.jsx)(h.HTTPAccessFallbackBoundary,{notFound:f,forbidden:y,unauthorized:P,children:(0,o.jsxs)(p.RedirectBoundary,{children:[(0,o.jsx)(E,{url:T,tree:e,params:S,cacheNode:_,segmentPath:I,debugNameContext:w,isActive:x&&i===U}),null]})})})}),null]}),children:[a,s,d]},i);L.push(k),B=B.next}while(null!==B)return L}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},16458,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"default\",{enumerable:!0,get:function(){return s}});let n=e.r(44066),a=e.r(964),o=n._(e.r(33664)),i=e.r(7e4);function s(){let e=(0,o.useContext)(i.TemplateContext);return(0,a.jsx)(a.Fragment,{children:e})}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},86379,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"createRenderSearchParamsFromClient\",{enumerable:!0,get:function(){return a}});let n=new WeakMap;function a(e){let t=n.get(e);if(t)return t;let r=Promise.resolve(e);return n.set(e,r),r}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},77888,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"createRenderSearchParamsFromClient\",{enumerable:!0,get:function(){return n}});let n=e.r(86379).createRenderSearchParamsFromClient;(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},57664,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"createRenderParamsFromClient\",{enumerable:!0,get:function(){return a}});let n=new WeakMap;function a(e){let t=n.get(e);if(t)return t;let r=Promise.resolve(e);return n.set(e,r),r}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},76850,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"createRenderParamsFromClient\",{enumerable:!0,get:function(){return n}});let n=e.r(57664).createRenderParamsFromClient;(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},37461,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"ReflectAdapter\",{enumerable:!0,get:function(){return n}});class n{static get(e,t,r){let n=Reflect.get(e,t,r);return\"function\"==typeof n?n.bind(e):n}static set(e,t,r,n){return Reflect.set(e,t,r,n)}static has(e,t){return Reflect.has(e,t)}static deleteProperty(e,t){return Reflect.deleteProperty(e,t)}}},67190,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"createDedupedByCallsiteServerErrorLoggerDev\",{enumerable:!0,get:function(){return c}});let n=function(e,t){if(e&&e.__esModule)return e;if(null===e||\"object\"!=typeof e&&\"function\"!=typeof e)return{default:e};var r=a(void 0);if(r&&r.has(e))return r.get(e);var n={__proto__:null},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var i in e)if(\"default\"!==i&&Object.prototype.hasOwnProperty.call(e,i)){var s=o?Object.getOwnPropertyDescriptor(e,i):null;s&&(s.get||s.set)?Object.defineProperty(n,i,s):n[i]=e[i]}return n.default=e,r&&r.set(e,n),n}(e.r(33664));function a(e){if(\"function\"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(a=function(e){return e?r:t})(e)}let o={current:null},i=\"function\"==typeof n.cache?n.cache:e=>e,s=console.warn;function c(e){return function(...t){s(e(...t))}}i(e=>{try{s(o.current)}finally{o.current=null}})},10018,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={describeHasCheckingStringProperty:function(){return s},describeStringPropertyAccess:function(){return i},wellKnownProperties:function(){return c}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=/^[A-Za-z_$][A-Za-z0-9_$]*$/;function i(e,t){return o.test(t)?`\\`${e}.${t}\\``:`\\`${e}[${JSON.stringify(t)}]\\``}function s(e,t){let r=JSON.stringify(t);return`\\`Reflect.has(${e}, ${r})\\`, \\`${r} in ${e}\\`, or similar`}let c=new Set([\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"toString\",\"valueOf\",\"toLocaleString\",\"then\",\"catch\",\"finally\",\"status\",\"displayName\",\"_debugInfo\",\"toJSON\",\"$$typeof\",\"__esModule\"])},49641,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"afterTaskAsyncStorageInstance\",{enumerable:!0,get:function(){return n}});let n=(0,e.r(44186).createAsyncLocalStorage)()},90977,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"afterTaskAsyncStorage\",{enumerable:!0,get:function(){return n.afterTaskAsyncStorageInstance}});let n=e.r(49641)},3937,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={isRequestAPICallableInsideAfter:function(){return u},throwForSearchParamsAccessInUseCache:function(){return c},throwWithStaticGenerationBailoutErrorWithDynamicError:function(){return s}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(90636),i=e.r(90977);function s(e,t){throw Object.defineProperty(new o.StaticGenBailoutError(`Route ${e} with \\`dynamic = \"error\"\\` couldn't be rendered statically because it used ${t}. See more info here: https://nextjs.org/docs/app/building-your-application/rendering/static-and-dynamic#dynamic-rendering`),\"__NEXT_ERROR_CODE\",{value:\"E543\",enumerable:!1,configurable:!0})}function c(e,t){let r=Object.defineProperty(Error(`Route ${e.route} used \\`searchParams\\` inside \"use cache\". Accessing dynamic request data inside a cache scope is not supported. If you need some search params inside a cached function await \\`searchParams\\` outside of the cached function and pass only the required search params as arguments to the cached function. See more info here: https://nextjs.org/docs/messages/next-request-in-use-cache`),\"__NEXT_ERROR_CODE\",{value:\"E842\",enumerable:!1,configurable:!0});throw Error.captureStackTrace(r,t),e.invalidDynamicUsageError??=r,r}function u(){let e=i.afterTaskAsyncStorage.getStore();return(null==e?void 0:e.rootTaskSpawnPhase)===\"action\"}},33006,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n,a={RenderStage:function(){return c},StagedRenderingController:function(){return u}};for(var o in a)Object.defineProperty(r,o,{enumerable:!0,get:a[o]});let i=e.r(17421),s=e.r(85131);var c=((n={})[n.Before=1]=\"Before\",n[n.Static=2]=\"Static\",n[n.Runtime=3]=\"Runtime\",n[n.Dynamic=4]=\"Dynamic\",n[n.Abandoned=5]=\"Abandoned\",n);class u{constructor(e=null,t){this.abortSignal=e,this.hasRuntimePrefetch=t,this.currentStage=1,this.staticInterruptReason=null,this.runtimeInterruptReason=null,this.staticStageEndTime=1/0,this.runtimeStageEndTime=1/0,this.runtimeStageListeners=[],this.dynamicStageListeners=[],this.runtimeStagePromise=(0,s.createPromiseWithResolvers)(),this.dynamicStagePromise=(0,s.createPromiseWithResolvers)(),this.mayAbandon=!1,e&&(e.addEventListener(\"abort\",()=>{let{reason:t}=e;this.currentStage<3&&(this.runtimeStagePromise.promise.catch(l),this.runtimeStagePromise.reject(t)),(this.currentStage<4||5===this.currentStage)&&(this.dynamicStagePromise.promise.catch(l),this.dynamicStagePromise.reject(t))},{once:!0}),this.mayAbandon=!0)}onStage(e,t){if(this.currentStage>=e)t();else if(3===e)this.runtimeStageListeners.push(t);else if(4===e)this.dynamicStageListeners.push(t);else throw Object.defineProperty(new i.InvariantError(`Invalid render stage: ${e}`),\"__NEXT_ERROR_CODE\",{value:\"E881\",enumerable:!1,configurable:!0})}canSyncInterrupt(){if(1===this.currentStage)return!1;let e=this.hasRuntimePrefetch?4:3;return this.currentStage<e}syncInterruptCurrentStageWithReason(e){if(1!==this.currentStage){if(this.mayAbandon)return this.abandonRenderImpl();switch(this.currentStage){case 2:this.staticInterruptReason=e,this.advanceStage(4);return;case 3:this.hasRuntimePrefetch&&(this.runtimeInterruptReason=e,this.advanceStage(4));return}}}getStaticInterruptReason(){return this.staticInterruptReason}getRuntimeInterruptReason(){return this.runtimeInterruptReason}getStaticStageEndTime(){return this.staticStageEndTime}getRuntimeStageEndTime(){return this.runtimeStageEndTime}abandonRender(){if(!this.mayAbandon)throw Object.defineProperty(new i.InvariantError(\"`abandonRender` called on a stage controller that cannot be abandoned.\"),\"__NEXT_ERROR_CODE\",{value:\"E938\",enumerable:!1,configurable:!0});this.abandonRenderImpl()}abandonRenderImpl(){let{currentStage:e}=this;switch(e){case 2:this.currentStage=5,this.resolveRuntimeStage();return;case 3:this.currentStage=5;return}}advanceStage(e){if(e<=this.currentStage)return;let t=this.currentStage;if(this.currentStage=e,t<3&&e>=3&&(this.staticStageEndTime=performance.now()+performance.timeOrigin,this.resolveRuntimeStage()),t<4&&e>=4){this.runtimeStageEndTime=performance.now()+performance.timeOrigin,this.resolveDynamicStage();return}}resolveRuntimeStage(){let e=this.runtimeStageListeners;for(let t=0;t<e.length;t++)e[t]();e.length=0,this.runtimeStagePromise.resolve()}resolveDynamicStage(){let e=this.dynamicStageListeners;for(let t=0;t<e.length;t++)e[t]();e.length=0,this.dynamicStagePromise.resolve()}getStagePromise(e){switch(e){case 3:return this.runtimeStagePromise.promise;case 4:return this.dynamicStagePromise.promise;default:throw Object.defineProperty(new i.InvariantError(`Invalid render stage: ${e}`),\"__NEXT_ERROR_CODE\",{value:\"E881\",enumerable:!1,configurable:!0})}}waitForStage(e){return this.getStagePromise(e)}delayUntilStage(e,t,r){var n,a,o;let i,s=(n=this.getStagePromise(e),a=t,o=r,i=new Promise((e,t)=>{n.then(e.bind(null,o),t)}),void 0!==a&&(i.displayName=a),i);return this.abortSignal&&s.catch(l),s}}function l(){}},78420,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={createPrerenderSearchParamsForClientPage:function(){return g},createSearchParamsFromClient:function(){return p},createServerSearchParamsForMetadata:function(){return h},createServerSearchParamsForServerPage:function(){return m},makeErroringSearchParamsForUseCache:function(){return S}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(37461),i=e.r(57119),s=e.r(73187),c=e.r(17421),u=e.r(20176),l=e.r(67190),d=e.r(10018),f=e.r(3937);function p(e,t){let r=s.workUnitAsyncStorage.getStore();if(r)switch(r.type){case\"prerender\":case\"prerender-client\":case\"prerender-ppr\":case\"prerender-legacy\":return y(t,r);case\"prerender-runtime\":throw Object.defineProperty(new c.InvariantError(\"createSearchParamsFromClient should not be called in a runtime prerender.\"),\"__NEXT_ERROR_CODE\",{value:\"E769\",enumerable:!1,configurable:!0});case\"cache\":case\"private-cache\":case\"unstable-cache\":throw Object.defineProperty(new c.InvariantError(\"createSearchParamsFromClient should not be called in cache contexts.\"),\"__NEXT_ERROR_CODE\",{value:\"E739\",enumerable:!1,configurable:!0});case\"request\":return b(e,t,r)}(0,s.throwInvariantForMissingStore)()}e.r(33006);let h=m;function m(e,t){let r=s.workUnitAsyncStorage.getStore();if(r)switch(r.type){case\"prerender\":case\"prerender-client\":case\"prerender-ppr\":case\"prerender-legacy\":return y(t,r);case\"cache\":case\"private-cache\":case\"unstable-cache\":throw Object.defineProperty(new c.InvariantError(\"createServerSearchParamsForServerPage should not be called in cache contexts.\"),\"__NEXT_ERROR_CODE\",{value:\"E747\",enumerable:!1,configurable:!0});case\"prerender-runtime\":var n,a;return n=e,a=r,(0,i.delayUntilRuntimeStage)(a,v(n));case\"request\":return b(e,t,r)}(0,s.throwInvariantForMissingStore)()}function g(e){if(e.forceStatic)return Promise.resolve({});let t=s.workUnitAsyncStorage.getStore();if(t)switch(t.type){case\"prerender\":case\"prerender-client\":return(0,u.makeHangingPromise)(t.renderSignal,e.route,\"`searchParams`\");case\"prerender-runtime\":throw Object.defineProperty(new c.InvariantError(\"createPrerenderSearchParamsForClientPage should not be called in a runtime prerender.\"),\"__NEXT_ERROR_CODE\",{value:\"E768\",enumerable:!1,configurable:!0});case\"cache\":case\"private-cache\":case\"unstable-cache\":throw Object.defineProperty(new c.InvariantError(\"createPrerenderSearchParamsForClientPage should not be called in cache contexts.\"),\"__NEXT_ERROR_CODE\",{value:\"E746\",enumerable:!1,configurable:!0});case\"prerender-ppr\":case\"prerender-legacy\":case\"request\":return Promise.resolve({})}(0,s.throwInvariantForMissingStore)()}function y(e,t){if(e.forceStatic)return Promise.resolve({});switch(t.type){case\"prerender\":case\"prerender-client\":var r=e,n=t;let a=P.get(n);if(a)return a;let s=(0,u.makeHangingPromise)(n.renderSignal,r.route,\"`searchParams`\"),c=new Proxy(s,{get(e,t,r){if(Object.hasOwn(s,t))return o.ReflectAdapter.get(e,t,r);switch(t){case\"then\":return(0,i.annotateDynamicAccess)(\"`await searchParams`, `searchParams.then`, or similar\",n),o.ReflectAdapter.get(e,t,r);case\"status\":return(0,i.annotateDynamicAccess)(\"`use(searchParams)`, `searchParams.status`, or similar\",n),o.ReflectAdapter.get(e,t,r);default:return o.ReflectAdapter.get(e,t,r)}}});return P.set(n,c),c;case\"prerender-ppr\":case\"prerender-legacy\":var l=e,d=t;let p=P.get(l);if(p)return p;let h=Promise.resolve({}),m=new Proxy(h,{get(e,t,r){if(Object.hasOwn(h,t))return o.ReflectAdapter.get(e,t,r);if(\"string\"==typeof t&&\"then\"===t){let e=\"`await searchParams`, `searchParams.then`, or similar\";l.dynamicShouldError?(0,f.throwWithStaticGenerationBailoutErrorWithDynamicError)(l.route,e):\"prerender-ppr\"===d.type?(0,i.postponeWithTracking)(l.route,e,d.dynamicTracking):(0,i.throwToInterruptStaticGeneration)(e,l,d)}return o.ReflectAdapter.get(e,t,r)}});return P.set(l,m),m;default:return t}}function b(e,t,r){return t.forceStatic?Promise.resolve({}):v(e)}let P=new WeakMap,_=new WeakMap;function S(e){let t=_.get(e);if(t)return t;let r=Promise.resolve({}),n=new Proxy(r,{get:function t(n,a,i){return Object.hasOwn(r,a)||\"string\"!=typeof a||\"then\"!==a&&d.wellKnownProperties.has(a)||(0,f.throwForSearchParamsAccessInUseCache)(e,t),o.ReflectAdapter.get(n,a,i)}});return _.set(e,n),n}function v(e){let t=P.get(e);if(t)return t;let r=Promise.resolve(e);return P.set(e,r),r}(0,l.createDedupedByCallsiteServerErrorLoggerDev)(function(e,t){let r=e?`Route \"${e}\" `:\"This route \";return Object.defineProperty(Error(`${r}used ${t}. \\`searchParams\\` is a Promise and must be unwrapped with \\`await\\` or \\`React.use()\\` before accessing its properties. Learn more: https://nextjs.org/docs/messages/sync-dynamic-apis`),\"__NEXT_ERROR_CODE\",{value:\"E848\",enumerable:!1,configurable:!0})})},38843,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"dynamicAccessAsyncStorageInstance\",{enumerable:!0,get:function(){return n}});let n=(0,e.r(44186).createAsyncLocalStorage)()},93746,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"dynamicAccessAsyncStorage\",{enumerable:!0,get:function(){return n.dynamicAccessAsyncStorageInstance}});let n=e.r(38843)},50633,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={createParamsFromClient:function(){return h},createPrerenderParamsForClientSegment:function(){return b},createServerParamsForMetadata:function(){return m},createServerParamsForRoute:function(){return g},createServerParamsForServerSegment:function(){return y}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(30946),i=e.r(37461),s=e.r(57119),c=e.r(73187),u=e.r(17421),l=e.r(10018),d=e.r(20176),f=e.r(67190),p=e.r(93746);function h(e,t){let r=c.workUnitAsyncStorage.getStore();if(r)switch(r.type){case\"prerender\":case\"prerender-client\":case\"prerender-ppr\":case\"prerender-legacy\":return P(e,t,r);case\"cache\":case\"private-cache\":case\"unstable-cache\":throw Object.defineProperty(new u.InvariantError(\"createParamsFromClient should not be called in cache contexts.\"),\"__NEXT_ERROR_CODE\",{value:\"E736\",enumerable:!1,configurable:!0});case\"prerender-runtime\":throw Object.defineProperty(new u.InvariantError(\"createParamsFromClient should not be called in a runtime prerender.\"),\"__NEXT_ERROR_CODE\",{value:\"E770\",enumerable:!1,configurable:!0});case\"request\":return O(e)}(0,c.throwInvariantForMissingStore)()}e.r(33006);let m=y;function g(e,t){let r=c.workUnitAsyncStorage.getStore();if(r)switch(r.type){case\"prerender\":case\"prerender-client\":case\"prerender-ppr\":case\"prerender-legacy\":return P(e,t,r);case\"cache\":case\"private-cache\":case\"unstable-cache\":throw Object.defineProperty(new u.InvariantError(\"createServerParamsForRoute should not be called in cache contexts.\"),\"__NEXT_ERROR_CODE\",{value:\"E738\",enumerable:!1,configurable:!0});case\"prerender-runtime\":return _(e,r);case\"request\":return O(e)}(0,c.throwInvariantForMissingStore)()}function y(e,t){let r=c.workUnitAsyncStorage.getStore();if(r)switch(r.type){case\"prerender\":case\"prerender-client\":case\"prerender-ppr\":case\"prerender-legacy\":return P(e,t,r);case\"cache\":case\"private-cache\":case\"unstable-cache\":throw Object.defineProperty(new u.InvariantError(\"createServerParamsForServerSegment should not be called in cache contexts.\"),\"__NEXT_ERROR_CODE\",{value:\"E743\",enumerable:!1,configurable:!0});case\"prerender-runtime\":return _(e,r);case\"request\":return O(e)}(0,c.throwInvariantForMissingStore)()}function b(e){let t=o.workAsyncStorage.getStore();if(!t)throw Object.defineProperty(new u.InvariantError(\"Missing workStore in createPrerenderParamsForClientSegment\"),\"__NEXT_ERROR_CODE\",{value:\"E773\",enumerable:!1,configurable:!0});let r=c.workUnitAsyncStorage.getStore();if(r)switch(r.type){case\"prerender\":case\"prerender-client\":let n=r.fallbackRouteParams;if(n){for(let a in e)if(n.has(a))return(0,d.makeHangingPromise)(r.renderSignal,t.route,\"`params`\")}break;case\"cache\":case\"private-cache\":case\"unstable-cache\":throw Object.defineProperty(new u.InvariantError(\"createPrerenderParamsForClientSegment should not be called in cache contexts.\"),\"__NEXT_ERROR_CODE\",{value:\"E734\",enumerable:!1,configurable:!0})}return Promise.resolve(e)}function P(e,t,r){switch(r.type){case\"prerender\":case\"prerender-client\":{let n=r.fallbackRouteParams;if(n){for(let a in e)if(n.has(a))return function(e,t,r){let n=S.get(e);if(n)return n;let a=new Proxy((0,d.makeHangingPromise)(r.renderSignal,t.route,\"`params`\"),v);return S.set(e,a),a}(e,t,r)}break}case\"prerender-ppr\":{let n=r.fallbackRouteParams;if(n){for(let a in e)if(n.has(a))return function(e,t,r,n){let a=S.get(e);if(a)return a;let o={...e},i=Promise.resolve(o);return S.set(e,i),Object.keys(e).forEach(e=>{l.wellKnownProperties.has(e)||t.has(e)&&Object.defineProperty(o,e,{get(){let t=(0,l.describeStringPropertyAccess)(\"params\",e);\"prerender-ppr\"===n.type?(0,s.postponeWithTracking)(r.route,t,n.dynamicTracking):(0,s.throwToInterruptStaticGeneration)(t,r,n)},enumerable:!0})}),i}(e,n,t,r)}}}return O(e)}function _(e,t){return(0,s.delayUntilRuntimeStage)(t,O(e))}let S=new WeakMap,v={get:function(e,t,r){if(\"then\"===t||\"catch\"===t||\"finally\"===t){let n=i.ReflectAdapter.get(e,t,r);return({[t]:(...t)=>{let r=p.dynamicAccessAsyncStorage.getStore();return r&&r.abortController.abort(Object.defineProperty(Error(\"Accessed fallback `params` during prerendering.\"),\"__NEXT_ERROR_CODE\",{value:\"E691\",enumerable:!1,configurable:!0})),new Proxy(n.apply(e,t),v)}})[t]}return i.ReflectAdapter.get(e,t,r)}};function O(e){let t=S.get(e);if(t)return t;let r=Promise.resolve(e);return S.set(e,r),r}(0,f.createDedupedByCallsiteServerErrorLoggerDev)(function(e,t){let r=e?`Route \"${e}\" `:\"This route \";return Object.defineProperty(Error(`${r}used ${t}. \\`params\\` is a Promise and must be unwrapped with \\`await\\` or \\`React.use()\\` before accessing its properties. Learn more: https://nextjs.org/docs/messages/sync-dynamic-apis`),\"__NEXT_ERROR_CODE\",{value:\"E834\",enumerable:!1,configurable:!0})})},42323,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"ClientPageRoot\",{enumerable:!0,get:function(){return u}});let n=e.r(964),a=e.r(17421),o=e.r(7e4),i=e.r(33664),s=e.r(29136),c=e.r(53675);function u({Component:t,serverProvidedParams:r}){let u,l;if(null!==r)u=r.searchParams,l=r.params;else{let e=(0,i.use)(o.LayoutRouterContext);l=null!==e?e.parentParams:{},u=(0,s.urlSearchParamsToParsedUrlQuery)((0,i.use)(c.SearchParamsContext))}if(\"u\"<typeof window){let r,o,{workAsyncStorage:i}=e.r(30946),s=i.getStore();if(!s)throw Object.defineProperty(new a.InvariantError(\"Expected workStore to exist when handling searchParams in a client Page.\"),\"__NEXT_ERROR_CODE\",{value:\"E564\",enumerable:!1,configurable:!0});let{createSearchParamsFromClient:c}=e.r(78420);r=c(u,s);let{createParamsFromClient:d}=e.r(50633);return o=d(l,s),(0,n.jsx)(t,{params:o,searchParams:r})}{let{createRenderSearchParamsFromClient:r}=e.r(77888),a=r(u),{createRenderParamsFromClient:o}=e.r(76850),i=o(l);return(0,n.jsx)(t,{params:i,searchParams:a})}}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},74292,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"ClientSegmentRoot\",{enumerable:!0,get:function(){return s}});let n=e.r(964),a=e.r(17421),o=e.r(7e4),i=e.r(33664);function s({Component:t,slots:r,serverProvidedParams:s}){let c;if(null!==s)c=s.params;else{let e=(0,i.use)(o.LayoutRouterContext);c=null!==e?e.parentParams:{}}if(\"u\"<typeof window){let o,{workAsyncStorage:i}=e.r(30946),s=i.getStore();if(!s)throw Object.defineProperty(new a.InvariantError(\"Expected workStore to exist when handling params in a client segment such as a Layout or Template.\"),\"__NEXT_ERROR_CODE\",{value:\"E600\",enumerable:!1,configurable:!0});let{createParamsFromClient:u}=e.r(50633);return o=u(c,s),(0,n.jsx)(t,{...r,params:o})}{let{createRenderParamsFromClient:a}=e.r(76850),o=a(c);return(0,n.jsx)(t,{...r,params:o})}}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},46886,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"IconMark\",{enumerable:!0,get:function(){return a}});let n=e.r(964),a=()=>\"u\">typeof window?null:(0,n.jsx)(\"meta\",{name:\"«nxt-icon»\"})}]);"
  },
  {
    "path": "docs/_next/static/chunks/543732a8392562b4.css",
    "content": "@font-face{font-family:Syne;font-style:normal;font-weight:400;font-display:swap;src:url(../media/ab624315db63c58d-s.028be875.woff2)format(\"woff2\");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:Syne;font-style:normal;font-weight:400;font-display:swap;src:url(../media/e94b8ab81811a983-s.399ca42d.woff2)format(\"woff2\");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Syne;font-style:normal;font-weight:400;font-display:swap;src:url(../media/0c795a286deabae8-s.p.b6c48e4e.woff2)format(\"woff2\");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Syne;font-style:normal;font-weight:600;font-display:swap;src:url(../media/ab624315db63c58d-s.028be875.woff2)format(\"woff2\");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:Syne;font-style:normal;font-weight:600;font-display:swap;src:url(../media/e94b8ab81811a983-s.399ca42d.woff2)format(\"woff2\");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Syne;font-style:normal;font-weight:600;font-display:swap;src:url(../media/0c795a286deabae8-s.p.b6c48e4e.woff2)format(\"woff2\");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Syne;font-style:normal;font-weight:700;font-display:swap;src:url(../media/ab624315db63c58d-s.028be875.woff2)format(\"woff2\");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:Syne;font-style:normal;font-weight:700;font-display:swap;src:url(../media/e94b8ab81811a983-s.399ca42d.woff2)format(\"woff2\");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Syne;font-style:normal;font-weight:700;font-display:swap;src:url(../media/0c795a286deabae8-s.p.b6c48e4e.woff2)format(\"woff2\");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Syne;font-style:normal;font-weight:800;font-display:swap;src:url(../media/ab624315db63c58d-s.028be875.woff2)format(\"woff2\");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:Syne;font-style:normal;font-weight:800;font-display:swap;src:url(../media/e94b8ab81811a983-s.399ca42d.woff2)format(\"woff2\");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Syne;font-style:normal;font-weight:800;font-display:swap;src:url(../media/0c795a286deabae8-s.p.b6c48e4e.woff2)format(\"woff2\");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Syne Fallback;src:local(Arial);ascent-override:93.93%;descent-override:27.93%;line-gap-override:0.0%;size-adjust:98.47%}.syne_d93b7706-module__Y_KGdq__className{font-family:Syne,Syne Fallback;font-style:normal}.syne_d93b7706-module__Y_KGdq__variable{--font-display:\"Syne\",\"Syne Fallback\"}\n@font-face{font-family:Space Grotesk;font-style:normal;font-weight:400;font-display:swap;src:url(../media/32687112bd2dd8db-s.cfdd66c2.woff2)format(\"woff2\");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Space Grotesk;font-style:normal;font-weight:400;font-display:swap;src:url(../media/28868e710e86be81-s.c30238d4.woff2)format(\"woff2\");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Space Grotesk;font-style:normal;font-weight:400;font-display:swap;src:url(../media/0c89a48fa5027cee-s.p.4564287c.woff2)format(\"woff2\");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Space Grotesk;font-style:normal;font-weight:500;font-display:swap;src:url(../media/32687112bd2dd8db-s.cfdd66c2.woff2)format(\"woff2\");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Space Grotesk;font-style:normal;font-weight:500;font-display:swap;src:url(../media/28868e710e86be81-s.c30238d4.woff2)format(\"woff2\");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Space Grotesk;font-style:normal;font-weight:500;font-display:swap;src:url(../media/0c89a48fa5027cee-s.p.4564287c.woff2)format(\"woff2\");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Space Grotesk;font-style:normal;font-weight:600;font-display:swap;src:url(../media/32687112bd2dd8db-s.cfdd66c2.woff2)format(\"woff2\");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Space Grotesk;font-style:normal;font-weight:600;font-display:swap;src:url(../media/28868e710e86be81-s.c30238d4.woff2)format(\"woff2\");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Space Grotesk;font-style:normal;font-weight:600;font-display:swap;src:url(../media/0c89a48fa5027cee-s.p.4564287c.woff2)format(\"woff2\");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Space Grotesk;font-style:normal;font-weight:700;font-display:swap;src:url(../media/32687112bd2dd8db-s.cfdd66c2.woff2)format(\"woff2\");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Space Grotesk;font-style:normal;font-weight:700;font-display:swap;src:url(../media/28868e710e86be81-s.c30238d4.woff2)format(\"woff2\");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Space Grotesk;font-style:normal;font-weight:700;font-display:swap;src:url(../media/0c89a48fa5027cee-s.p.4564287c.woff2)format(\"woff2\");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Space Grotesk Fallback;src:local(Arial);ascent-override:89.71%;descent-override:26.62%;line-gap-override:0.0%;size-adjust:109.69%}.space_grotesk_8677877b-module__OT3qGa__className{font-family:Space Grotesk,Space Grotesk Fallback;font-style:normal}.space_grotesk_8677877b-module__OT3qGa__variable{--font-body:\"Space Grotesk\",\"Space Grotesk Fallback\"}\n@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:400;font-display:swap;src:url(../media/e390973e931a41c5-s.a82ecf4e.woff2)format(\"woff2\");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:400;font-display:swap;src:url(../media/59b15b4bcd7b1eb5-s.afa48be3.woff2)format(\"woff2\");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:400;font-display:swap;src:url(../media/e532fa1b9921e1cd-s.764b43eb.woff2)format(\"woff2\");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:400;font-display:swap;src:url(../media/2fe89d53234c61d4-s.cb53f04b.woff2)format(\"woff2\");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:400;font-display:swap;src:url(../media/99e609270109b47d-s.p.64b9304e.woff2)format(\"woff2\");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:500;font-display:swap;src:url(../media/5e05ae5b48faa55e-s.6b5ea6af.woff2)format(\"woff2\");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:500;font-display:swap;src:url(../media/a7afbb44bec2bb18-s.1dcddae6.woff2)format(\"woff2\");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:500;font-display:swap;src:url(../media/02263ebadd758ea4-s.8da66e7f.woff2)format(\"woff2\");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:500;font-display:swap;src:url(../media/68757d6cddeff913-s.e6cd1753.woff2)format(\"woff2\");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:500;font-display:swap;src:url(../media/effe91970fc4db64-s.p.19510058.woff2)format(\"woff2\");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:600;font-display:swap;src:url(../media/6ff74e33ebd7bca3-s.140490a3.woff2)format(\"woff2\");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:600;font-display:swap;src:url(../media/1a69062cfe6f77f8-s.b36ae37c.woff2)format(\"woff2\");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:600;font-display:swap;src:url(../media/9a4838fcda0d1bca-s.bf5f8a12.woff2)format(\"woff2\");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:600;font-display:swap;src:url(../media/2e95a7d252b9825a-s.10086973.woff2)format(\"woff2\");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:600;font-display:swap;src:url(../media/23b7a97ae3b5c134-s.p.2902b61f.woff2)format(\"woff2\");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Mono Fallback;src:local(Arial);ascent-override:76.16%;descent-override:20.43%;line-gap-override:0.0%;size-adjust:134.59%}.ibm_plex_mono_e0f5f7ea-module__w-hdTq__className{font-family:IBM Plex Mono,IBM Plex Mono Fallback;font-style:normal}.ibm_plex_mono_e0f5f7ea-module__w-hdTq__variable{--font-mono:\"IBM Plex Mono\",\"IBM Plex Mono Fallback\"}\n*,:before,:after,::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border:0 solid #e5e7eb}:before,:after{--tw-content:\"\"}html,:host{-webkit-text-size-adjust:100%;tab-size:4;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}body{line-height:inherit;margin:0}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-feature-settings:normal;font-variation-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-feature-settings:inherit;font-variation-settings:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:#0000;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{margin:0;padding:0;list-style:none}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder{opacity:1;color:#9ca3af}textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.bottom-\\[-220px\\]{bottom:-220px}.left-0{left:0}.left-\\[-140px\\]{left:-140px}.left-\\[12vw\\]{left:12vw}.right-0{right:0}.right-\\[-180px\\]{right:-180px}.top-0{top:0}.top-\\[-120px\\]{top:-120px}.top-\\[10vh\\]{top:10vh}.-z-10{z-index:-10}.z-10{z-index:10}.z-50{z-index:50}.z-\\[80\\]{z-index:80}.mx-auto{margin-left:auto;margin-right:auto}.mb-4{margin-bottom:1rem}.mr-2{margin-right:.5rem}.mt-0\\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-10{margin-top:2.5rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-7{margin-top:1.75rem}.mt-8{margin-top:2rem}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.h-1\\.5{height:.375rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-2{height:.5rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-\\[1px\\]{height:1px}.h-\\[380px\\]{height:380px}.h-\\[420px\\]{height:420px}.h-\\[520px\\]{height:520px}.h-auto{height:auto}.h-full{height:100%}.max-h-\\[calc\\(100svh-3rem\\)\\]{max-height:calc(100svh - 3rem)}.max-h-\\[calc\\(100vh-3rem\\)\\]{max-height:calc(100vh - 3rem)}.min-h-\\[100dvh\\]{min-height:100dvh}.min-h-\\[360px\\]{min-height:360px}.w-1\\.5{width:.375rem}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-2{width:.5rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-\\[280px\\]{width:280px}.w-\\[380px\\]{width:380px}.w-\\[420px\\]{width:420px}.w-\\[520px\\]{width:520px}.w-fit{width:fit-content}.w-full{width:100%}.min-w-\\[150px\\]{min-width:150px}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-6xl{max-width:72rem}.max-w-lg{max-width:32rem}.max-w-sm{max-width:24rem}.flex-1{flex:1}.shrink-0{flex-shrink:0}.translate-x-0{--tw-translate-x:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}.translate-x-5{--tw-translate-x:1.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.resize{resize:both}.scroll-mt-28{scroll-margin-top:7rem}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-12{gap:3rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.self-start{align-self:flex-start}.self-center{align-self:center}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.rounded-2xl{border-radius:1rem}.rounded-\\[14px\\]{border-radius:14px}.rounded-\\[18px\\]{border-radius:18px}.rounded-\\[22px\\]{border-radius:22px}.rounded-\\[28px\\]{border-radius:28px}.rounded-\\[var\\(--radius-card\\)\\]{border-radius:var(--radius-card)}.rounded-\\[var\\(--radius-xl\\)\\]{border-radius:var(--radius-xl)}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-t{border-top-width:1px}.border-black\\/10{border-color:#0000001a}.border-white\\/10{border-color:#ffffff1a}.border-white\\/12{border-color:#ffffff1f}.border-white\\/30{border-color:#ffffff4d}.border-white\\/5{border-color:#ffffff0d}.border-white\\/8{border-color:#ffffff14}.bg-\\[color\\:var\\(--accent\\)\\]{background-color:var(--accent)}.bg-\\[color\\:var\\(--accent2\\)\\]{background-color:var(--accent2)}.bg-\\[color\\:var\\(--accent3\\)\\]{background-color:var(--accent3)}.bg-\\[rgba\\(10\\,11\\,16\\,0\\.72\\)\\]{background-color:#0a0b10b8}.bg-black\\/20{background-color:#0003}.bg-black\\/30{background-color:#0000004d}.bg-black\\/35{background-color:#00000059}.bg-black\\/40{background-color:#0006}.bg-black\\/70{background-color:#000000b3}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-white\\/10{background-color:#ffffff1a}.bg-white\\/28{background-color:#ffffff47}.bg-white\\/3{background-color:#ffffff08}.bg-white\\/40{background-color:#fff6}.bg-white\\/5{background-color:#ffffff0d}.bg-white\\/50{background-color:#ffffff80}.bg-white\\/60{background-color:#fff9}.bg-white\\/8{background-color:#ffffff14}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-\\[2px\\]{padding:2px}.px-1\\.5{padding-left:.375rem;padding-right:.375rem}.px-2\\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\\.5{padding-top:.125rem;padding-bottom:.125rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-3\\.5{padding-top:.875rem;padding-bottom:.875rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.pb-10{padding-bottom:2.5rem}.pb-16{padding-bottom:4rem}.pb-5{padding-bottom:1.25rem}.pt-0{padding-top:0}.pt-28{padding-top:7rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.text-left{text-align:left}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\\[10px\\]{font-size:10px}.text-\\[11px\\]{font-size:11px}.text-\\[15px\\]{font-size:15px}.text-\\[52px\\]{font-size:52px}.text-\\[9px\\]{font-size:9px}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-extrabold{font-weight:800}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal)var(--tw-slashed-zero)var(--tw-numeric-figure)var(--tw-numeric-spacing)var(--tw-numeric-fraction)}.leading-\\[0\\.95\\]{line-height:.95}.leading-\\[1\\.7\\]{line-height:1.7}.tracking-\\[-0\\.015em\\]{letter-spacing:-.015em}.tracking-\\[-0\\.01em\\]{letter-spacing:-.01em}.tracking-\\[-0\\.02em\\]{letter-spacing:-.02em}.tracking-\\[0\\.015em\\]{letter-spacing:.015em}.tracking-\\[0\\.18em\\]{letter-spacing:.18em}.tracking-\\[0\\.22em\\]{letter-spacing:.22em}.tracking-wide{letter-spacing:.025em}.text-\\[color\\:var\\(--fg0\\)\\]{color:var(--fg0)}.text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-white\\/30{color:#ffffff4d}.text-white\\/35{color:#ffffff59}.text-white\\/40{color:#fff6}.text-white\\/45{color:#ffffff73}.text-white\\/50{color:#ffffff80}.text-white\\/55{color:#ffffff8c}.text-white\\/60{color:#fff9}.text-white\\/62{color:#ffffff9e}.text-white\\/65{color:#ffffffa6}.text-white\\/68{color:#ffffffad}.text-white\\/70{color:#ffffffb3}.text-white\\/72{color:#ffffffb8}.text-white\\/75{color:#ffffffbf}.text-white\\/80{color:#fffc}.text-white\\/82{color:#ffffffd1}.text-white\\/85{color:#ffffffd9}.underline{text-decoration-line:underline}.decoration-white\\/15{text-decoration-color:#ffffff26}.underline-offset-4{text-underline-offset:4px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-0{opacity:0}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.shadow-\\[0_0_22px_rgba\\(255\\,255\\,255\\,0\\.35\\)\\]{--tw-shadow:0 0 22px #ffffff59;--tw-shadow-colored:0 0 22px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\\[0_6px_16px_rgba\\(0\\,0\\,0\\,0\\.45\\)\\]{--tw-shadow:0 6px 16px #00000073;--tw-shadow-colored:0 6px 16px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.blur{--tw-blur:blur(8px);filter:var(--tw-blur)var(--tw-brightness)var(--tw-contrast)var(--tw-grayscale)var(--tw-hue-rotate)var(--tw-invert)var(--tw-saturate)var(--tw-sepia)var(--tw-drop-shadow)}.filter{filter:var(--tw-blur)var(--tw-brightness)var(--tw-contrast)var(--tw-grayscale)var(--tw-hue-rotate)var(--tw-invert)var(--tw-saturate)var(--tw-sepia)var(--tw-drop-shadow)}.backdrop-blur-xl{--tw-backdrop-blur:blur(24px);-webkit-backdrop-filter:var(--tw-backdrop-blur)var(--tw-backdrop-brightness)var(--tw-backdrop-contrast)var(--tw-backdrop-grayscale)var(--tw-backdrop-hue-rotate)var(--tw-backdrop-invert)var(--tw-backdrop-opacity)var(--tw-backdrop-saturate)var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur)var(--tw-backdrop-brightness)var(--tw-backdrop-contrast)var(--tw-backdrop-grayscale)var(--tw-backdrop-hue-rotate)var(--tw-backdrop-invert)var(--tw-backdrop-opacity)var(--tw-backdrop-saturate)var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter,backdrop-filter;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-\\[transform\\,background-color\\]{transition-property:transform,background-color;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-opacity{transition-property:opacity;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-200{transition-duration:.2s}.duration-500{transition-duration:.5s}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.font-display{font-family:var(--font-display),var(--font-body),ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",Helvetica,Arial}.font-mono{font-family:var(--font-mono),ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace}.text-balance{text-wrap:balance}.glass{border:1px solid var(--border);-webkit-backdrop-filter:blur(16px);background:#08090e99;box-shadow:inset 0 0 0 1px #ffffff0f,inset 0 1px #ffffff1f,0 32px 120px #000c}.ring-accent{box-shadow:inset 0 0 0 1px #ffffff1a,0 0 0 1px #ffffff1f,0 24px 60px #0000008c}.shadow-elevated{box-shadow:0 32px 120px #000c,inset 0 1px #ffffff14}.orb{filter:blur(28px);opacity:.1;animation:float-slow 7s var(--ease-out)infinite alternate;border-radius:999px;position:absolute;transform:translateZ(0)}.hairline{background:linear-gradient(90deg,#0000,#ffffff2e,#0000)}.homebrew-highlight{isolation:isolate;will-change:box-shadow;animation:homebrew-pulse 1.2s var(--ease-out)both;position:relative}.homebrew-highlight:after{content:\"\";border-radius:inherit;pointer-events:none;mix-blend-mode:screen;opacity:0;animation:homebrew-sheen 1.2s var(--ease-out)both;background:radial-gradient(900px 260px at 28% 0,#ffffff29,#0000 60%),radial-gradient(720px 240px at 82% 10%,#ffffff1a,#0000 62%);position:absolute;inset:-2px}.range{appearance:none;background:#ffffff29;border-radius:999px;outline:none;height:2px}.range::-webkit-slider-thumb{appearance:none;cursor:pointer;background:#ffffffeb;border:1px solid #00000047;border-radius:999px;width:14px;height:14px;box-shadow:0 0 0 6px #ffffff14,0 14px 40px #0000008c}.range::-webkit-slider-thumb:active{transform:scale(.96)}.range::-moz-range-thumb{cursor:pointer;background:#ffffffeb;border:1px solid #00000047;border-radius:999px;width:14px;height:14px;box-shadow:0 0 0 6px #ffffff14,0 14px 40px #0000008c}.range::-moz-range-track{background:#ffffff29;border-radius:999px;height:2px}.text-flow{color:#0000;-webkit-text-fill-color:transparent;background-image:linear-gradient(90deg,#fffffffa 0%,#ffffffa3 38%,#fffffffa 86%);-webkit-background-clip:text;background-clip:text}.\\[animation-delay\\:-1\\.2s\\]{animation-delay:-1.2s}.\\[animation-delay\\:-2\\.1s\\]{animation-delay:-2.1s}.\\[background\\:radial-gradient\\(800px_240px_at_30\\%_0\\%\\,rgba\\(0\\,0\\,0\\,0\\.18\\)\\,transparent_55\\%\\)\\]{background:radial-gradient(800px 240px at 30% 0,#0000002e,#0000 55%)}.\\[background\\:radial-gradient\\(900px_260px_at_30\\%_0\\%\\,rgba\\(0\\,0\\,0\\,0\\.18\\)\\,transparent_55\\%\\)\\]{background:radial-gradient(900px 260px at 30% 0,#0000002e,#0000 55%)}:root{--bg0:#000;--bg1:#090909;--fg0:#ffffffeb;--fg1:#ffffffb8;--fg2:#ffffff85;--border:#ffffff1f;--accent:#fff;--accent2:#a1a1aa;--accent3:#52525b;--radius-xl:26px;--radius-card:32px;--ease-out:cubic-bezier(.16,1,.3,1);--noise-opacity:.065}html,body{height:100%}body{color:var(--fg0);background:radial-gradient(1100px 680px at 5% 8%,#ffffff1a,transparent 55%),radial-gradient(900px 620px at 88% 14%,#ffffff0f,transparent 55%),radial-gradient(1100px 820px at 45% 92%,#ffffff0b,transparent 60%),linear-gradient(180deg,var(--bg0),var(--bg1));font-family:var(--font-body),ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",Helvetica,Arial,\"Apple Color Emoji\",\"Segoe UI Emoji\";text-rendering:geometricPrecision;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}*{-webkit-tap-highlight-color:transparent}::selection{color:#fffffffa;background:#ffffff24}body:before{content:\"\";pointer-events:none;opacity:var(--noise-opacity);mix-blend-mode:overlay;background-image:repeating-linear-gradient(0deg,#ffffff0d 0 1px,#0000 2px 4px),repeating-linear-gradient(90deg,#ffffff09 0 1px,#0000 2px 5px);position:fixed;inset:0;transform:translateZ(0)}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background:#ffffff29 padding-box content-box;border:2px solid #0000;border-radius:999px}::-webkit-scrollbar-thumb:hover{background:#ffffff3d padding-box content-box;border:2px solid #0000}@keyframes modal-appear{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}@keyframes stroke-in{0%{stroke-dashoffset:1px;opacity:.2}to{stroke-dashoffset:0;opacity:1}}@keyframes float-slow{0%{transform:translate(0,0)}to{transform:translateY(-14px)}}@keyframes homebrew-pulse{0%{border-color:#ffffff1f;box-shadow:inset 0 0 0 1px #ffffff1a,0 0 #fff0,0 0 #0000}28%{border-color:#ffffff42;box-shadow:inset 0 0 0 1px #ffffff2e,0 0 0 1px #ffffff29,0 0 0 10px #ffffff0e,0 0 64px #ffffff14}to{border-color:#ffffff1f;box-shadow:inset 0 0 0 1px #ffffff1a,0 0 #fff0,0 0 #0000}}@keyframes homebrew-sheen{0%{opacity:0;transform:translateY(10px)scale(.985)}30%{opacity:1}to{opacity:0;transform:translate(0,0)scale(1)}}@media (prefers-reduced-motion:reduce){.homebrew-highlight{border-color:#ffffff38;animation:none;box-shadow:inset 0 0 0 1px #ffffff24,0 0 0 1px #ffffff1f,0 0 32px #ffffff0f}.homebrew-highlight:after{opacity:0;animation:none}.orb{animation:none}}.hover\\:border-white\\/14:hover{border-color:#ffffff24}.hover\\:border-white\\/9:hover{border-color:#ffffff17}.hover\\:bg-white\\/5:hover{background-color:#ffffff0d}.hover\\:bg-white\\/7:hover{background-color:#ffffff12}.hover\\:bg-white\\/8:hover{background-color:#ffffff14}.hover\\:text-white\\/75:hover{color:#ffffffbf}.hover\\:text-white\\/80:hover{color:#fffc}.hover\\:text-white\\/85:hover{color:#ffffffd9}.hover\\:text-white\\/90:hover{color:#ffffffe6}.hover\\:decoration-white\\/35:hover{text-decoration-color:#ffffff59}.focus\\:not-sr-only:focus{clip:auto;white-space:normal;width:auto;height:auto;margin:0;padding:0;position:static;overflow:visible}.focus\\:fixed:focus{position:fixed}.focus\\:left-4:focus{left:1rem}.focus\\:top-4:focus{top:1rem}.focus\\:z-\\[100\\]:focus{z-index:100}.focus\\:rounded-xl:focus{border-radius:.75rem}.focus\\:bg-black\\/70:focus{background-color:#000000b3}.focus\\:px-4:focus{padding-left:1rem;padding-right:1rem}.focus\\:py-2:focus{padding-top:.5rem;padding-bottom:.5rem}.focus\\:text-white:focus{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.focus\\:outline-none:focus{outline-offset:2px;outline:2px solid #0000}.focus-visible\\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\\:ring-white\\/20:focus-visible{--tw-ring-color:#fff3}.group:hover .group-hover\\:text-white\\/92{color:#ffffffeb}.group:hover .group-hover\\:opacity-100{opacity:1}@supports ((-webkit-backdrop-filter:blur(0))){.supports-\\[-webkit-backdrop-filter\\:blur\\(0\\)\\]\\:bg-black\\/45{background-color:#00000073}}@supports ((-webkit-backdrop-filter:blur(0)) or (backdrop-filter:blur(0))){.supports-\\[backdrop-filter\\:blur\\(0\\)\\]\\:bg-black\\/45{background-color:#00000073}}@media (prefers-reduced-motion:no-preference){.motion-safe\\:animate-\\[modal-appear_0\\.5s_var\\(--ease-out\\)\\]{animation:modal-appear .5s var(--ease-out)}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}.motion-safe\\:animate-ping{animation:1s cubic-bezier(0,0,.2,1) infinite ping}}@media (min-width:640px){.sm\\:ml-auto{margin-left:auto}.sm\\:mt-10{margin-top:2.5rem}.sm\\:mt-6{margin-top:1.5rem}.sm\\:inline{display:inline}.sm\\:flex-row{flex-direction:row}.sm\\:items-start{align-items:flex-start}.sm\\:items-center{align-items:center}.sm\\:gap-4{gap:1rem}.sm\\:self-auto{align-self:auto}.sm\\:self-center{align-self:center}.sm\\:p-6{padding:1.5rem}.sm\\:p-8{padding:2rem}.sm\\:px-10{padding-left:2.5rem;padding-right:2.5rem}.sm\\:px-5{padding-left:1.25rem;padding-right:1.25rem}.sm\\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\\:py-14{padding-top:3.5rem;padding-bottom:3.5rem}.sm\\:py-24{padding-top:6rem;padding-bottom:6rem}.sm\\:pb-12{padding-bottom:3rem}.sm\\:pb-24{padding-bottom:6rem}.sm\\:pb-6{padding-bottom:1.5rem}.sm\\:pt-36{padding-top:9rem}.sm\\:pt-6{padding-top:1.5rem}.sm\\:text-3xl{font-size:1.875rem;line-height:2.25rem}.sm\\:text-5xl{font-size:3rem;line-height:1}.sm\\:text-6xl{font-size:3.75rem;line-height:1}.sm\\:text-\\[88px\\]{font-size:88px}.sm\\:text-base{font-size:1rem;line-height:1.5rem}.sm\\:text-lg{font-size:1.125rem;line-height:1.75rem}.sm\\:text-xl{font-size:1.25rem;line-height:1.75rem}}@media (min-width:768px){.md\\:col-span-5{grid-column:span 5/span 5}.md\\:col-span-7{grid-column:span 7/span 7}.md\\:block{display:block}.md\\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.md\\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\\:grid-cols-\\[1fr_auto\\]{grid-template-columns:1fr auto}.md\\:text-\\[108px\\]{font-size:108px}}@media (min-width:1024px){.lg\\:w-\\[320px\\]{width:320px}.lg\\:gap-20{gap:5rem}.lg\\:text-\\[124px\\]{font-size:124px}}@media (min-width:1280px){.xl\\:w-\\[340px\\]{width:340px}}\n"
  },
  {
    "path": "docs/_next/static/chunks/a6dad97d9634a72d.js",
    "content": "!function(){var t=\"undefined\"!=typeof globalThis?globalThis:\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:{};function e(t){var e={exports:{}};return t(e,e.exports),e.exports}var r,n,o=function(t){return t&&t.Math===Math&&t},i=o(\"object\"==typeof globalThis&&globalThis)||o(\"object\"==typeof window&&window)||o(\"object\"==typeof self&&self)||o(\"object\"==typeof t&&t)||o(\"object\"==typeof t&&t)||function(){return this}()||Function(\"return this\")(),a=function(t){try{return!!t()}catch(t){return!0}},u=!a(function(){return 7!==Object.defineProperty({},1,{get:function(){return 7}})[1]}),s=!a(function(){var t=function(){}.bind();return\"function\"!=typeof t||t.hasOwnProperty(\"prototype\")}),c=Function.prototype.call,f=s?c.bind(c):function(){return c.apply(c,arguments)},l={}.propertyIsEnumerable,h=Object.getOwnPropertyDescriptor,p=h&&!l.call({1:2},1)?function(t){var e=h(this,t);return!!e&&e.enumerable}:l,v={f:p},d=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}},g=Function.prototype,y=g.call,m=s&&g.bind.bind(y,y),b=s?m:function(t){return function(){return y.apply(t,arguments)}},w=b({}.toString),S=b(\"\".slice),E=function(t){return S(w(t),8,-1)},O=Object,x=b(\"\".split),R=a(function(){return!O(\"z\").propertyIsEnumerable(0)})?function(t){return\"String\"===E(t)?x(t,\"\"):O(t)}:O,P=function(t){return null==t},A=TypeError,j=function(t){if(P(t))throw new A(\"Can't call method on \"+t);return t},k=function(t){return R(j(t))},I=\"object\"==typeof document&&document.all,T=void 0===I&&void 0!==I?function(t){return\"function\"==typeof t||t===I}:function(t){return\"function\"==typeof t},M=function(t){return\"object\"==typeof t?null!==t:T(t)},L=function(t,e){return arguments.length<2?T(r=i[t])?r:void 0:i[t]&&i[t][e];var r},U=b({}.isPrototypeOf),N=i.navigator,C=N&&N.userAgent,_=C?String(C):\"\",F=i.process,B=i.Deno,D=F&&F.versions||B&&B.version,z=D&&D.v8;z&&(n=(r=z.split(\".\"))[0]>0&&r[0]<4?1:+(r[0]+r[1])),!n&&_&&(!(r=_.match(/Edge\\/(\\d+)/))||r[1]>=74)&&(r=_.match(/Chrome\\/(\\d+)/))&&(n=+r[1]);var W=n,q=i.String,H=!!Object.getOwnPropertySymbols&&!a(function(){var t=Symbol(\"symbol detection\");return!q(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&W&&W<41}),$=H&&!Symbol.sham&&\"symbol\"==typeof Symbol.iterator,K=Object,G=$?function(t){return\"symbol\"==typeof t}:function(t){var e=L(\"Symbol\");return T(e)&&U(e.prototype,K(t))},V=String,Y=function(t){try{return V(t)}catch(t){return\"Object\"}},X=TypeError,J=function(t){if(T(t))return t;throw new X(Y(t)+\" is not a function\")},Q=function(t,e){var r=t[e];return P(r)?void 0:J(r)},Z=TypeError,tt=Object.defineProperty,et=function(t,e){try{tt(i,t,{value:e,configurable:!0,writable:!0})}catch(r){i[t]=e}return e},rt=e(function(t){var e=\"__core-js_shared__\",r=t.exports=i[e]||et(e,{});(r.versions||(r.versions=[])).push({version:\"3.38.1\",mode:\"global\",copyright:\"© 2014-2024 Denis Pushkarev (zloirock.ru)\",license:\"https://github.com/zloirock/core-js/blob/v3.38.1/LICENSE\",source:\"https://github.com/zloirock/core-js\"})}),nt=function(t,e){return rt[t]||(rt[t]=e||{})},ot=Object,it=function(t){return ot(j(t))},at=b({}.hasOwnProperty),ut=Object.hasOwn||function(t,e){return at(it(t),e)},st=0,ct=Math.random(),ft=b(1..toString),lt=function(t){return\"Symbol(\"+(void 0===t?\"\":t)+\")_\"+ft(++st+ct,36)},ht=i.Symbol,pt=nt(\"wks\"),vt=$?ht.for||ht:ht&&ht.withoutSetter||lt,dt=function(t){return ut(pt,t)||(pt[t]=H&&ut(ht,t)?ht[t]:vt(\"Symbol.\"+t)),pt[t]},gt=TypeError,yt=dt(\"toPrimitive\"),mt=function(t,e){if(!M(t)||G(t))return t;var r,n=Q(t,yt);if(n){if(void 0===e&&(e=\"default\"),r=f(n,t,e),!M(r)||G(r))return r;throw new gt(\"Can't convert object to primitive value\")}return void 0===e&&(e=\"number\"),function(t,e){var r,n;if(\"string\"===e&&T(r=t.toString)&&!M(n=f(r,t)))return n;if(T(r=t.valueOf)&&!M(n=f(r,t)))return n;if(\"string\"!==e&&T(r=t.toString)&&!M(n=f(r,t)))return n;throw new Z(\"Can't convert object to primitive value\")}(t,e)},bt=function(t){var e=mt(t,\"string\");return G(e)?e:e+\"\"},wt=i.document,St=M(wt)&&M(wt.createElement),Et=function(t){return St?wt.createElement(t):{}},Ot=!u&&!a(function(){return 7!==Object.defineProperty(Et(\"div\"),\"a\",{get:function(){return 7}}).a}),xt=Object.getOwnPropertyDescriptor,Rt={f:u?xt:function(t,e){if(t=k(t),e=bt(e),Ot)try{return xt(t,e)}catch(t){}if(ut(t,e))return d(!f(v.f,t,e),t[e])}},Pt=u&&a(function(){return 42!==Object.defineProperty(function(){},\"prototype\",{value:42,writable:!1}).prototype}),At=String,jt=TypeError,kt=function(t){if(M(t))return t;throw new jt(At(t)+\" is not an object\")},It=TypeError,Tt=Object.defineProperty,Mt=Object.getOwnPropertyDescriptor,Lt=\"enumerable\",Ut=\"configurable\",Nt=\"writable\",Ct={f:u?Pt?function(t,e,r){if(kt(t),e=bt(e),kt(r),\"function\"==typeof t&&\"prototype\"===e&&\"value\"in r&&Nt in r&&!r[Nt]){var n=Mt(t,e);n&&n[Nt]&&(t[e]=r.value,r={configurable:Ut in r?r[Ut]:n[Ut],enumerable:Lt in r?r[Lt]:n[Lt],writable:!1})}return Tt(t,e,r)}:Tt:function(t,e,r){if(kt(t),e=bt(e),kt(r),Ot)try{return Tt(t,e,r)}catch(t){}if(\"get\"in r||\"set\"in r)throw new It(\"Accessors not supported\");return\"value\"in r&&(t[e]=r.value),t}},_t=u?function(t,e,r){return Ct.f(t,e,d(1,r))}:function(t,e,r){return t[e]=r,t},Ft=Function.prototype,Bt=u&&Object.getOwnPropertyDescriptor,Dt=ut(Ft,\"name\"),zt={EXISTS:Dt,PROPER:Dt&&\"something\"===function(){}.name,CONFIGURABLE:Dt&&(!u||u&&Bt(Ft,\"name\").configurable)},Wt=b(Function.toString);T(rt.inspectSource)||(rt.inspectSource=function(t){return Wt(t)});var qt,Ht,$t,Kt=rt.inspectSource,Gt=i.WeakMap,Vt=T(Gt)&&/native code/.test(String(Gt)),Yt=nt(\"keys\"),Xt=function(t){return Yt[t]||(Yt[t]=lt(t))},Jt={},Qt=\"Object already initialized\",Zt=i.TypeError;if(Vt||rt.state){var te=rt.state||(rt.state=new(0,i.WeakMap));te.get=te.get,te.has=te.has,te.set=te.set,qt=function(t,e){if(te.has(t))throw new Zt(Qt);return e.facade=t,te.set(t,e),e},Ht=function(t){return te.get(t)||{}},$t=function(t){return te.has(t)}}else{var ee=Xt(\"state\");Jt[ee]=!0,qt=function(t,e){if(ut(t,ee))throw new Zt(Qt);return e.facade=t,_t(t,ee,e),e},Ht=function(t){return ut(t,ee)?t[ee]:{}},$t=function(t){return ut(t,ee)}}var re,ne={set:qt,get:Ht,has:$t,enforce:function(t){return $t(t)?Ht(t):qt(t,{})},getterFor:function(t){return function(e){var r;if(!M(e)||(r=Ht(e)).type!==t)throw new Zt(\"Incompatible receiver, \"+t+\" required\");return r}}},oe=e(function(t){var e=zt.CONFIGURABLE,r=ne.enforce,n=ne.get,o=String,i=Object.defineProperty,s=b(\"\".slice),c=b(\"\".replace),f=b([].join),l=u&&!a(function(){return 8!==i(function(){},\"length\",{value:8}).length}),h=String(String).split(\"String\"),p=t.exports=function(t,n,a){\"Symbol(\"===s(o(n),0,7)&&(n=\"[\"+c(o(n),/^Symbol\\(([^)]*)\\).*$/,\"$1\")+\"]\"),a&&a.getter&&(n=\"get \"+n),a&&a.setter&&(n=\"set \"+n),(!ut(t,\"name\")||e&&t.name!==n)&&(u?i(t,\"name\",{value:n,configurable:!0}):t.name=n),l&&a&&ut(a,\"arity\")&&t.length!==a.arity&&i(t,\"length\",{value:a.arity});try{a&&ut(a,\"constructor\")&&a.constructor?u&&i(t,\"prototype\",{writable:!1}):t.prototype&&(t.prototype=void 0)}catch(t){}var p=r(t);return ut(p,\"source\")||(p.source=f(h,\"string\"==typeof n?n:\"\")),t};Function.prototype.toString=p(function(){return T(this)&&n(this).source||Kt(this)},\"toString\")}),ie=function(t,e,r,n){n||(n={});var o=n.enumerable,i=void 0!==n.name?n.name:e;if(T(r)&&oe(r,i,n),n.global)o?t[e]=r:et(e,r);else{try{n.unsafe?t[e]&&(o=!0):delete t[e]}catch(t){}o?t[e]=r:Ct.f(t,e,{value:r,enumerable:!1,configurable:!n.nonConfigurable,writable:!n.nonWritable})}return t},ae=Math.ceil,ue=Math.floor,se=Math.trunc||function(t){var e=+t;return(e>0?ue:ae)(e)},ce=function(t){var e=+t;return e!=e||0===e?0:se(e)},fe=Math.max,le=Math.min,he=function(t,e){var r=ce(t);return r<0?fe(r+e,0):le(r,e)},pe=Math.min,ve=function(t){var e=ce(t);return e>0?pe(e,9007199254740991):0},de=function(t){return ve(t.length)},ge=function(t){return function(e,r,n){var o=k(e),i=de(o);if(0===i)return!t&&-1;var a,u=he(n,i);if(t&&r!=r){for(;i>u;)if((a=o[u++])!=a)return!0}else for(;i>u;u++)if((t||u in o)&&o[u]===r)return t||u||0;return!t&&-1}},ye={includes:ge(!0),indexOf:ge(!1)},me=ye.indexOf,be=b([].push),we=function(t,e){var r,n=k(t),o=0,i=[];for(r in n)!ut(Jt,r)&&ut(n,r)&&be(i,r);for(;e.length>o;)ut(n,r=e[o++])&&(~me(i,r)||be(i,r));return i},Se=[\"constructor\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"toLocaleString\",\"toString\",\"valueOf\"],Ee=Se.concat(\"length\",\"prototype\"),Oe={f:Object.getOwnPropertyNames||function(t){return we(t,Ee)}},xe={f:Object.getOwnPropertySymbols},Re=b([].concat),Pe=L(\"Reflect\",\"ownKeys\")||function(t){var e=Oe.f(kt(t)),r=xe.f;return r?Re(e,r(t)):e},Ae=function(t,e,r){for(var n=Pe(e),o=Ct.f,i=Rt.f,a=0;a<n.length;a++){var u=n[a];ut(t,u)||r&&ut(r,u)||o(t,u,i(e,u))}},je=/#|\\.prototype\\./,ke=function(t,e){var r=Te[Ie(t)];return r===Le||r!==Me&&(T(e)?a(e):!!e)},Ie=ke.normalize=function(t){return String(t).replace(je,\".\").toLowerCase()},Te=ke.data={},Me=ke.NATIVE=\"N\",Le=ke.POLYFILL=\"P\",Ue=ke,Ne=Rt.f,Ce=function(t,e){var r,n,o,a,u,s=t.target,c=t.global,f=t.stat;if(r=c?i:f?i[s]||et(s,{}):i[s]&&i[s].prototype)for(n in e){if(a=e[n],o=t.dontCallGetSet?(u=Ne(r,n))&&u.value:r[n],!Ue(c?n:s+(f?\".\":\"#\")+n,t.forced)&&void 0!==o){if(typeof a==typeof o)continue;Ae(a,o)}(t.sham||o&&o.sham)&&_t(a,\"sham\",!0),ie(r,n,a,t)}},_e=Object.keys||function(t){return we(t,Se)},Fe=u&&!Pt?Object.defineProperties:function(t,e){kt(t);for(var r,n=k(e),o=_e(e),i=o.length,a=0;i>a;)Ct.f(t,r=o[a++],n[r]);return t},Be={f:Fe},De=L(\"document\",\"documentElement\"),ze=\"prototype\",We=\"script\",qe=Xt(\"IE_PROTO\"),He=function(){},$e=function(t){return\"<\"+We+\">\"+t+\"</\"+We+\">\"},Ke=function(t){t.write($e(\"\")),t.close();var e=t.parentWindow.Object;return t=null,e},Ge=function(){try{re=new ActiveXObject(\"htmlfile\")}catch(t){}var t,e,r;Ge=\"undefined\"!=typeof document?document.domain&&re?Ke(re):(e=Et(\"iframe\"),r=\"java\"+We+\":\",e.style.display=\"none\",De.appendChild(e),e.src=String(r),(t=e.contentWindow.document).open(),t.write($e(\"document.F=Object\")),t.close(),t.F):Ke(re);for(var n=Se.length;n--;)delete Ge[ze][Se[n]];return Ge()};Jt[qe]=!0;var Ve=Object.create||function(t,e){var r;return null!==t?(He[ze]=kt(t),r=new He,He[ze]=null,r[qe]=t):r=Ge(),void 0===e?r:Be.f(r,e)},Ye=Ct.f,Xe=dt(\"unscopables\"),Je=Array.prototype;void 0===Je[Xe]&&Ye(Je,Xe,{configurable:!0,value:Ve(null)});var Qe=function(t){Je[Xe][t]=!0};Ce({target:\"Array\",proto:!0},{at:function(t){var e=it(this),r=de(e),n=ce(t),o=n>=0?n:r+n;return o<0||o>=r?void 0:e[o]}}),Qe(\"at\");var Ze=function(t,e){return b(i[t].prototype[e])},tr=(Ze(\"Array\",\"at\"),TypeError),er=function(t,e){if(!delete t[e])throw new tr(\"Cannot delete property \"+Y(e)+\" of \"+Y(t))},rr=Math.min,nr=[].copyWithin||function(t,e){var r=it(this),n=de(r),o=he(t,n),i=he(e,n),a=arguments.length>2?arguments[2]:void 0,u=rr((void 0===a?n:he(a,n))-i,n-o),s=1;for(i<o&&o<i+u&&(s=-1,i+=u-1,o+=u-1);u-- >0;)i in r?r[o]=r[i]:er(r,o),o+=s,i+=s;return r};Ce({target:\"Array\",proto:!0},{copyWithin:nr}),Qe(\"copyWithin\"),Ze(\"Array\",\"copyWithin\"),Ce({target:\"Array\",proto:!0},{fill:function(t){for(var e=it(this),r=de(e),n=arguments.length,o=he(n>1?arguments[1]:void 0,r),i=n>2?arguments[2]:void 0,a=void 0===i?r:he(i,r);a>o;)e[o++]=t;return e}}),Qe(\"fill\"),Ze(\"Array\",\"fill\");var or=function(t){if(\"Function\"===E(t))return b(t)},ir=or(or.bind),ar=function(t,e){return J(t),void 0===e?t:s?ir(t,e):function(){return t.apply(e,arguments)}},ur=Array.isArray||function(t){return\"Array\"===E(t)},sr={};sr[dt(\"toStringTag\")]=\"z\";var cr=\"[object z]\"===String(sr),fr=dt(\"toStringTag\"),lr=Object,hr=\"Arguments\"===E(function(){return arguments}()),pr=cr?E:function(t){var e,r,n;return void 0===t?\"Undefined\":null===t?\"Null\":\"string\"==typeof(r=function(t,e){try{return t[e]}catch(t){}}(e=lr(t),fr))?r:hr?E(e):\"Object\"===(n=E(e))&&T(e.callee)?\"Arguments\":n},vr=function(){},dr=L(\"Reflect\",\"construct\"),gr=/^\\s*(?:class|function)\\b/,yr=b(gr.exec),mr=!gr.test(vr),br=function(t){if(!T(t))return!1;try{return dr(vr,[],t),!0}catch(t){return!1}},wr=function(t){if(!T(t))return!1;switch(pr(t)){case\"AsyncFunction\":case\"GeneratorFunction\":case\"AsyncGeneratorFunction\":return!1}try{return mr||!!yr(gr,Kt(t))}catch(t){return!0}};wr.sham=!0;var Sr=!dr||a(function(){var t;return br(br.call)||!br(Object)||!br(function(){t=!0})||t})?wr:br,Er=dt(\"species\"),Or=Array,xr=function(t,e){return new(function(t){var e;return ur(t)&&(Sr(e=t.constructor)&&(e===Or||ur(e.prototype))||M(e)&&null===(e=e[Er]))&&(e=void 0),void 0===e?Or:e}(t))(0===e?0:e)},Rr=b([].push),Pr=function(t){var e=1===t,r=2===t,n=3===t,o=4===t,i=6===t,a=7===t,u=5===t||i;return function(s,c,f,l){for(var h,p,v=it(s),d=R(v),g=de(d),y=ar(c,f),m=0,b=l||xr,w=e?b(s,g):r||a?b(s,0):void 0;g>m;m++)if((u||m in d)&&(p=y(h=d[m],m,v),t))if(e)w[m]=p;else if(p)switch(t){case 3:return!0;case 5:return h;case 6:return m;case 2:Rr(w,h)}else switch(t){case 4:return!1;case 7:Rr(w,h)}return i?-1:n||o?o:w}},Ar={forEach:Pr(0),map:Pr(1),filter:Pr(2),some:Pr(3),every:Pr(4),find:Pr(5),findIndex:Pr(6),filterReject:Pr(7)},jr=Ar.find,kr=\"find\",Ir=!0;kr in[]&&Array(1)[kr](function(){Ir=!1}),Ce({target:\"Array\",proto:!0,forced:Ir},{find:function(t){return jr(this,t,arguments.length>1?arguments[1]:void 0)}}),Qe(kr),Ze(\"Array\",\"find\");var Tr=Ar.findIndex,Mr=\"findIndex\",Lr=!0;Mr in[]&&Array(1)[Mr](function(){Lr=!1}),Ce({target:\"Array\",proto:!0,forced:Lr},{findIndex:function(t){return Tr(this,t,arguments.length>1?arguments[1]:void 0)}}),Qe(Mr),Ze(\"Array\",\"findIndex\");var Ur=TypeError,Nr=function(t){if(t>9007199254740991)throw Ur(\"Maximum allowed index exceeded\");return t},Cr=function(t,e,r,n,o,i,a,u){for(var s,c,f=o,l=0,h=!!a&&ar(a,u);l<n;)l in r&&(s=h?h(r[l],l,e):r[l],i>0&&ur(s)?(c=de(s),f=Cr(t,e,s,c,f,i-1)-1):(Nr(f+1),t[f]=s),f++),l++;return f},_r=Cr;Ce({target:\"Array\",proto:!0},{flatMap:function(t){var e,r=it(this),n=de(r);return J(t),(e=xr(r,0)).length=_r(e,r,r,n,0,1,t,arguments.length>1?arguments[1]:void 0),e}}),Qe(\"flatMap\"),Ze(\"Array\",\"flatMap\"),Ce({target:\"Array\",proto:!0},{flat:function(){var t=arguments.length?arguments[0]:void 0,e=it(this),r=de(e),n=xr(e,0);return n.length=_r(n,e,e,r,0,void 0===t?1:ce(t)),n}}),Qe(\"flat\"),Ze(\"Array\",\"flat\");var Fr,Br,Dr,zr=String,Wr=function(t){if(\"Symbol\"===pr(t))throw new TypeError(\"Cannot convert a Symbol value to a string\");return zr(t)},qr=b(\"\".charAt),Hr=b(\"\".charCodeAt),$r=b(\"\".slice),Kr=function(t){return function(e,r){var n,o,i=Wr(j(e)),a=ce(r),u=i.length;return a<0||a>=u?t?\"\":void 0:(n=Hr(i,a))<55296||n>56319||a+1===u||(o=Hr(i,a+1))<56320||o>57343?t?qr(i,a):n:t?$r(i,a,a+2):o-56320+(n-55296<<10)+65536}},Gr={codeAt:Kr(!1),charAt:Kr(!0)},Vr=!a(function(){function t(){}return t.prototype.constructor=null,Object.getPrototypeOf(new t)!==t.prototype}),Yr=Xt(\"IE_PROTO\"),Xr=Object,Jr=Xr.prototype,Qr=Vr?Xr.getPrototypeOf:function(t){var e=it(t);if(ut(e,Yr))return e[Yr];var r=e.constructor;return T(r)&&e instanceof r?r.prototype:e instanceof Xr?Jr:null},Zr=dt(\"iterator\"),tn=!1;[].keys&&(\"next\"in(Dr=[].keys())?(Br=Qr(Qr(Dr)))!==Object.prototype&&(Fr=Br):tn=!0);var en=!M(Fr)||a(function(){var t={};return Fr[Zr].call(t)!==t});en&&(Fr={}),T(Fr[Zr])||ie(Fr,Zr,function(){return this});var rn={IteratorPrototype:Fr,BUGGY_SAFARI_ITERATORS:tn},nn=Ct.f,on=dt(\"toStringTag\"),an=function(t,e,r){t&&!r&&(t=t.prototype),t&&!ut(t,on)&&nn(t,on,{configurable:!0,value:e})},un={},sn=rn.IteratorPrototype,cn=function(){return this},fn=function(t,e,r,n){var o=e+\" Iterator\";return t.prototype=Ve(sn,{next:d(+!n,r)}),an(t,o,!1),un[o]=cn,t},ln=function(t,e,r){try{return b(J(Object.getOwnPropertyDescriptor(t,e)[r]))}catch(t){}},hn=String,pn=TypeError,vn=function(t){if(function(t){return M(t)||null===t}(t))return t;throw new pn(\"Can't set \"+hn(t)+\" as a prototype\")},dn=Object.setPrototypeOf||(\"__proto__\"in{}?function(){var t,e=!1,r={};try{(t=ln(Object.prototype,\"__proto__\",\"set\"))(r,[]),e=r instanceof Array}catch(t){}return function(r,n){return j(r),vn(n),M(r)?(e?t(r,n):r.__proto__=n,r):r}}():void 0),gn=zt.PROPER,yn=zt.CONFIGURABLE,mn=rn.IteratorPrototype,bn=rn.BUGGY_SAFARI_ITERATORS,wn=dt(\"iterator\"),Sn=\"keys\",En=\"values\",On=\"entries\",xn=function(){return this},Rn=function(t,e,r,n,o,i,a){fn(r,e,n);var u,s,c,l=function(t){if(t===o&&g)return g;if(!bn&&t&&t in v)return v[t];switch(t){case Sn:case En:case On:return function(){return new r(this,t)}}return function(){return new r(this)}},h=e+\" Iterator\",p=!1,v=t.prototype,d=v[wn]||v[\"@@iterator\"]||o&&v[o],g=!bn&&d||l(o),y=\"Array\"===e&&v.entries||d;if(y&&(u=Qr(y.call(new t)))!==Object.prototype&&u.next&&(Qr(u)!==mn&&(dn?dn(u,mn):T(u[wn])||ie(u,wn,xn)),an(u,h,!0)),gn&&o===En&&d&&d.name!==En&&(yn?_t(v,\"name\",En):(p=!0,g=function(){return f(d,this)})),o)if(s={values:l(En),keys:i?g:l(Sn),entries:l(On)},a)for(c in s)(bn||p||!(c in v))&&ie(v,c,s[c]);else Ce({target:e,proto:!0,forced:bn||p},s);return v[wn]!==g&&ie(v,wn,g,{name:o}),un[e]=g,s},Pn=function(t,e){return{value:t,done:e}},An=Gr.charAt,jn=\"String Iterator\",kn=ne.set,In=ne.getterFor(jn);Rn(String,\"String\",function(t){kn(this,{type:jn,string:Wr(t),index:0})},function(){var t,e=In(this),r=e.string,n=e.index;return n>=r.length?Pn(void 0,!0):(t=An(r,n),e.index+=t.length,Pn(t,!1))});var Tn=function(t,e,r){var n,o;kt(t);try{if(!(n=Q(t,\"return\"))){if(\"throw\"===e)throw r;return r}n=f(n,t)}catch(t){o=!0,n=t}if(\"throw\"===e)throw r;if(o)throw n;return kt(n),r},Mn=function(t,e,r,n){try{return n?e(kt(r)[0],r[1]):e(r)}catch(e){Tn(t,\"throw\",e)}},Ln=dt(\"iterator\"),Un=Array.prototype,Nn=function(t){return void 0!==t&&(un.Array===t||Un[Ln]===t)},Cn=function(t,e,r){u?Ct.f(t,e,d(0,r)):t[e]=r},_n=dt(\"iterator\"),Fn=function(t){if(!P(t))return Q(t,_n)||Q(t,\"@@iterator\")||un[pr(t)]},Bn=TypeError,Dn=function(t,e){var r=arguments.length<2?Fn(t):e;if(J(r))return kt(f(r,t));throw new Bn(Y(t)+\" is not iterable\")},zn=Array,Wn=function(t){var e=it(t),r=Sr(this),n=arguments.length,o=n>1?arguments[1]:void 0,i=void 0!==o;i&&(o=ar(o,n>2?arguments[2]:void 0));var a,u,s,c,l,h,p=Fn(e),v=0;if(!p||this===zn&&Nn(p))for(a=de(e),u=r?new this(a):zn(a);a>v;v++)h=i?o(e[v],v):e[v],Cn(u,v,h);else for(u=r?new this:[],l=(c=Dn(e,p)).next;!(s=f(l,c)).done;v++)h=i?Mn(c,o,[s.value,v],!0):s.value,Cn(u,v,h);return u.length=v,u},qn=dt(\"iterator\"),Hn=!1;try{var $n=0,Kn={next:function(){return{done:!!$n++}},return:function(){Hn=!0}};Kn[qn]=function(){return this},Array.from(Kn,function(){throw 2})}catch(t){}var Gn=function(t,e){try{if(!e&&!Hn)return!1}catch(t){return!1}var r=!1;try{var n={};n[qn]=function(){return{next:function(){return{done:r=!0}}}},t(n)}catch(t){}return r},Vn=!Gn(function(t){Array.from(t)});Ce({target:\"Array\",stat:!0,forced:Vn},{from:Wn});var Yn=i,Xn=ye.includes,Jn=a(function(){return!Array(1).includes()});Ce({target:\"Array\",proto:!0,forced:Jn},{includes:function(t){return Xn(this,t,arguments.length>1?arguments[1]:void 0)}}),Qe(\"includes\"),Ze(\"Array\",\"includes\");var Qn=Ct.f,Zn=\"Array Iterator\",to=ne.set,eo=ne.getterFor(Zn),ro=Rn(Array,\"Array\",function(t,e){to(this,{type:Zn,target:k(t),index:0,kind:e})},function(){var t=eo(this),e=t.target,r=t.index++;if(!e||r>=e.length)return t.target=null,Pn(void 0,!0);switch(t.kind){case\"keys\":return Pn(r,!1);case\"values\":return Pn(e[r],!1)}return Pn([r,e[r]],!1)},\"values\"),no=un.Arguments=un.Array;if(Qe(\"keys\"),Qe(\"values\"),Qe(\"entries\"),u&&\"values\"!==no.name)try{Qn(no,\"name\",{value:\"values\"})}catch(t){}cr||ie(Object.prototype,\"toString\",cr?{}.toString:function(){return\"[object \"+pr(this)+\"]\"},{unsafe:!0}),Ze(\"Array\",\"values\");var oo=Array,io=a(function(){function t(){}return!(oo.of.call(t)instanceof t)});Ce({target:\"Array\",stat:!0,forced:io},{of:function(){for(var t=0,e=arguments.length,r=new(Sr(this)?this:oo)(e);e>t;)Cn(r,t,arguments[t++]);return r.length=e,r}});var ao=dt(\"hasInstance\"),uo=Function.prototype;ao in uo||Ct.f(uo,ao,{value:oe(function(t){if(!T(this)||!M(t))return!1;var e=this.prototype;return M(e)?U(e,t):t instanceof this},ao)}),dt(\"hasInstance\");var so=function(t,e,r){return r.get&&oe(r.get,e,{getter:!0}),r.set&&oe(r.set,e,{setter:!0}),Ct.f(t,e,r)},co=zt.EXISTS,fo=Function.prototype,lo=b(fo.toString),ho=/function\\b(?:\\s|\\/\\*[\\S\\s]*?\\*\\/|\\/\\/[^\\n\\r]*[\\n\\r]+)*([^\\s(/]*)/,po=b(ho.exec);u&&!co&&so(fo,\"name\",{configurable:!0,get:function(){try{return po(ho,lo(this))[1]}catch(t){return\"\"}}});var vo=b([].slice),go=Oe.f,yo=\"object\"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],mo={f:function(t){return yo&&\"Window\"===E(t)?function(t){try{return go(t)}catch(t){return vo(yo)}}(t):go(k(t))}},bo=a(function(){if(\"function\"==typeof ArrayBuffer){var t=new ArrayBuffer(8);Object.isExtensible(t)&&Object.defineProperty(t,\"a\",{value:8})}}),wo=Object.isExtensible,So=a(function(){wo(1)})||bo?function(t){return!!M(t)&&(!bo||\"ArrayBuffer\"!==E(t))&&(!wo||wo(t))}:wo,Eo=!a(function(){return Object.isExtensible(Object.preventExtensions({}))}),Oo=e(function(t){var e=Ct.f,r=!1,n=lt(\"meta\"),o=0,i=function(t){e(t,n,{value:{objectID:\"O\"+o++,weakData:{}}})},a=t.exports={enable:function(){a.enable=function(){},r=!0;var t=Oe.f,e=b([].splice),o={};o[n]=1,t(o).length&&(Oe.f=function(r){for(var o=t(r),i=0,a=o.length;i<a;i++)if(o[i]===n){e(o,i,1);break}return o},Ce({target:\"Object\",stat:!0,forced:!0},{getOwnPropertyNames:mo.f}))},fastKey:function(t,e){if(!M(t))return\"symbol\"==typeof t?t:(\"string\"==typeof t?\"S\":\"P\")+t;if(!ut(t,n)){if(!So(t))return\"F\";if(!e)return\"E\";i(t)}return t[n].objectID},getWeakData:function(t,e){if(!ut(t,n)){if(!So(t))return!0;if(!e)return!1;i(t)}return t[n].weakData},onFreeze:function(t){return Eo&&r&&So(t)&&!ut(t,n)&&i(t),t}};Jt[n]=!0}),xo=TypeError,Ro=function(t,e){this.stopped=t,this.result=e},Po=Ro.prototype,Ao=function(t,e,r){var n,o,i,a,u,s,c,l=!(!r||!r.AS_ENTRIES),h=!(!r||!r.IS_RECORD),p=!(!r||!r.IS_ITERATOR),v=!(!r||!r.INTERRUPTED),d=ar(e,r&&r.that),g=function(t){return n&&Tn(n,\"normal\",t),new Ro(!0,t)},y=function(t){return l?(kt(t),v?d(t[0],t[1],g):d(t[0],t[1])):v?d(t,g):d(t)};if(h)n=t.iterator;else if(p)n=t;else{if(!(o=Fn(t)))throw new xo(Y(t)+\" is not iterable\");if(Nn(o)){for(i=0,a=de(t);a>i;i++)if((u=y(t[i]))&&U(Po,u))return u;return new Ro(!1)}n=Dn(t,o)}for(s=h?t.next:n.next;!(c=f(s,n)).done;){try{u=y(c.value)}catch(t){Tn(n,\"throw\",t)}if(\"object\"==typeof u&&u&&U(Po,u))return u}return new Ro(!1)},jo=TypeError,ko=function(t,e){if(U(e,t))return t;throw new jo(\"Incorrect invocation\")},Io=function(t,e,r){var n,o;return dn&&T(n=e.constructor)&&n!==r&&M(o=n.prototype)&&o!==r.prototype&&dn(t,o),t},To=function(t,e,r){var n=-1!==t.indexOf(\"Map\"),o=-1!==t.indexOf(\"Weak\"),u=n?\"set\":\"add\",s=i[t],c=s&&s.prototype,f=s,l={},h=function(t){var e=b(c[t]);ie(c,t,\"add\"===t?function(t){return e(this,0===t?0:t),this}:\"delete\"===t?function(t){return!(o&&!M(t))&&e(this,0===t?0:t)}:\"get\"===t?function(t){return o&&!M(t)?void 0:e(this,0===t?0:t)}:\"has\"===t?function(t){return!(o&&!M(t))&&e(this,0===t?0:t)}:function(t,r){return e(this,0===t?0:t,r),this})};if(Ue(t,!T(s)||!(o||c.forEach&&!a(function(){(new s).entries().next()}))))f=r.getConstructor(e,t,n,u),Oo.enable();else if(Ue(t,!0)){var p=new f,v=p[u](o?{}:-0,1)!==p,d=a(function(){p.has(1)}),g=Gn(function(t){new s(t)}),y=!o&&a(function(){for(var t=new s,e=5;e--;)t[u](e,e);return!t.has(-0)});g||((f=e(function(t,e){ko(t,c);var r=Io(new s,t,f);return P(e)||Ao(e,r[u],{that:r,AS_ENTRIES:n}),r})).prototype=c,c.constructor=f),(d||y)&&(h(\"delete\"),h(\"has\"),n&&h(\"get\")),(y||v)&&h(u),o&&c.clear&&delete c.clear}return l[t]=f,Ce({global:!0,constructor:!0,forced:f!==s},l),an(f,t),o||r.setStrong(f,t,n),f},Mo=function(t,e,r){for(var n in e)ie(t,n,e[n],r);return t},Lo=dt(\"species\"),Uo=function(t){var e=L(t);u&&e&&!e[Lo]&&so(e,Lo,{configurable:!0,get:function(){return this}})},No=Oo.fastKey,Co=ne.set,_o=ne.getterFor,Fo={getConstructor:function(t,e,r,n){var o=t(function(t,o){ko(t,i),Co(t,{type:e,index:Ve(null),first:null,last:null,size:0}),u||(t.size=0),P(o)||Ao(o,t[n],{that:t,AS_ENTRIES:r})}),i=o.prototype,a=_o(e),s=function(t,e,r){var n,o,i=a(t),s=c(t,e);return s?s.value=r:(i.last=s={index:o=No(e,!0),key:e,value:r,previous:n=i.last,next:null,removed:!1},i.first||(i.first=s),n&&(n.next=s),u?i.size++:t.size++,\"F\"!==o&&(i.index[o]=s)),t},c=function(t,e){var r,n=a(t),o=No(e);if(\"F\"!==o)return n.index[o];for(r=n.first;r;r=r.next)if(r.key===e)return r};return Mo(i,{clear:function(){for(var t=a(this),e=t.first;e;)e.removed=!0,e.previous&&(e.previous=e.previous.next=null),e=e.next;t.first=t.last=null,t.index=Ve(null),u?t.size=0:this.size=0},delete:function(t){var e=this,r=a(e),n=c(e,t);if(n){var o=n.next,i=n.previous;delete r.index[n.index],n.removed=!0,i&&(i.next=o),o&&(o.previous=i),r.first===n&&(r.first=o),r.last===n&&(r.last=i),u?r.size--:e.size--}return!!n},forEach:function(t){for(var e,r=a(this),n=ar(t,arguments.length>1?arguments[1]:void 0);e=e?e.next:r.first;)for(n(e.value,e.key,this);e&&e.removed;)e=e.previous},has:function(t){return!!c(this,t)}}),Mo(i,r?{get:function(t){var e=c(this,t);return e&&e.value},set:function(t,e){return s(this,0===t?0:t,e)}}:{add:function(t){return s(this,t=0===t?0:t,t)}}),u&&so(i,\"size\",{configurable:!0,get:function(){return a(this).size}}),o},setStrong:function(t,e,r){var n=e+\" Iterator\",o=_o(e),i=_o(n);Rn(t,e,function(t,e){Co(this,{type:n,target:t,state:o(t),kind:e,last:null})},function(){for(var t=i(this),e=t.kind,r=t.last;r&&r.removed;)r=r.previous;return t.target&&(t.last=r=r?r.next:t.state.first)?Pn(\"keys\"===e?r.key:\"values\"===e?r.value:[r.key,r.value],!1):(t.target=null,Pn(void 0,!0))},r?\"entries\":\"values\",!r,!0),Uo(e)}};To(\"Map\",function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}},Fo);var Bo=Map.prototype,Do={Map:Map,set:b(Bo.set),get:b(Bo.get),has:b(Bo.has),remove:b(Bo.delete),proto:Bo},zo=Do.Map,Wo=Do.has,qo=Do.get,Ho=Do.set,$o=b([].push),Ko=a(function(){return 1!==zo.groupBy(\"ab\",function(t){return t}).get(\"a\").length});Ce({target:\"Map\",stat:!0,forced:Ko},{groupBy:function(t,e){j(t),J(e);var r=new zo,n=0;return Ao(t,function(t){var o=e(t,n++);Wo(r,o)?$o(qo(r,o),t):Ho(r,o,[t])}),r}});var Go={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0},Vo=Et(\"span\").classList,Yo=Vo&&Vo.constructor&&Vo.constructor.prototype,Xo=Yo===Object.prototype?void 0:Yo,Jo=dt(\"iterator\"),Qo=ro.values,Zo=function(t,e){if(t){if(t[Jo]!==Qo)try{_t(t,Jo,Qo)}catch(e){t[Jo]=Qo}if(an(t,e,!0),Go[e])for(var r in ro)if(t[r]!==ro[r])try{_t(t,r,ro[r])}catch(e){t[r]=ro[r]}}};for(var ti in Go)Zo(i[ti]&&i[ti].prototype,ti);Zo(Xo,\"DOMTokenList\");var ei=function(t,e,r){return function(n){var o=it(n),i=arguments.length,a=i>1?arguments[1]:void 0,u=void 0!==a,s=u?ar(a,i>2?arguments[2]:void 0):void 0,c=new t,f=0;return Ao(o,function(t){var n=u?s(t,f++):t;r?e(c,kt(n)[0],n[1]):e(c,n)}),c}};Ce({target:\"Map\",stat:!0,forced:!0},{from:ei(Do.Map,Do.set,!0)});var ri=function(t,e,r){return function(){for(var n=new t,o=arguments.length,i=0;i<o;i++){var a=arguments[i];r?e(n,kt(a)[0],a[1]):e(n,a)}return n}};Ce({target:\"Map\",stat:!0,forced:!0},{of:ri(Do.Map,Do.set,!0)});var ni=Do.has,oi=function(t){return ni(t),t},ii=Do.remove;Ce({target:\"Map\",proto:!0,real:!0,forced:!0},{deleteAll:function(){for(var t,e=oi(this),r=!0,n=0,o=arguments.length;n<o;n++)t=ii(e,arguments[n]),r=r&&t;return!!r}});var ai=Do.get,ui=Do.has,si=Do.set;Ce({target:\"Map\",proto:!0,real:!0,forced:!0},{emplace:function(t,e){var r,n,o=oi(this);return ui(o,t)?(r=ai(o,t),\"update\"in e&&(r=e.update(r,t,o),si(o,t,r)),r):(n=e.insert(t,o),si(o,t,n),n)}});var ci=function(t,e,r){for(var n,o,i=r?t:t.iterator,a=t.next;!(n=f(a,i)).done;)if(void 0!==(o=e(n.value)))return o},fi=Do.Map,li=Do.proto,hi=b(li.forEach),pi=b(li.entries),vi=pi(new fi).next,di=function(t,e,r){return r?ci({iterator:pi(t),next:vi},function(t){return e(t[1],t[0])}):hi(t,e)};Ce({target:\"Map\",proto:!0,real:!0,forced:!0},{every:function(t){var e=oi(this),r=ar(t,arguments.length>1?arguments[1]:void 0);return!1!==di(e,function(t,n){if(!r(t,n,e))return!1},!0)}});var gi=Do.Map,yi=Do.set;Ce({target:\"Map\",proto:!0,real:!0,forced:!0},{filter:function(t){var e=oi(this),r=ar(t,arguments.length>1?arguments[1]:void 0),n=new gi;return di(e,function(t,o){r(t,o,e)&&yi(n,o,t)}),n}}),Ce({target:\"Map\",proto:!0,real:!0,forced:!0},{find:function(t){var e=oi(this),r=ar(t,arguments.length>1?arguments[1]:void 0),n=di(e,function(t,n){if(r(t,n,e))return{value:t}},!0);return n&&n.value}}),Ce({target:\"Map\",proto:!0,real:!0,forced:!0},{findKey:function(t){var e=oi(this),r=ar(t,arguments.length>1?arguments[1]:void 0),n=di(e,function(t,n){if(r(t,n,e))return{key:n}},!0);return n&&n.key}}),Ce({target:\"Map\",proto:!0,real:!0,forced:!0},{includes:function(t){return!0===di(oi(this),function(e){if((r=e)===(n=t)||r!=r&&n!=n)return!0;var r,n},!0)}});var mi=Do.Map;Ce({target:\"Map\",stat:!0,forced:!0},{keyBy:function(t,e){var r=new(T(this)?this:mi);J(e);var n=J(r.set);return Ao(t,function(t){f(n,r,e(t),t)}),r}}),Ce({target:\"Map\",proto:!0,real:!0,forced:!0},{keyOf:function(t){var e=di(oi(this),function(e,r){if(e===t)return{key:r}},!0);return e&&e.key}});var bi=Do.Map,wi=Do.set;Ce({target:\"Map\",proto:!0,real:!0,forced:!0},{mapKeys:function(t){var e=oi(this),r=ar(t,arguments.length>1?arguments[1]:void 0),n=new bi;return di(e,function(t,o){wi(n,r(t,o,e),t)}),n}});var Si=Do.Map,Ei=Do.set;Ce({target:\"Map\",proto:!0,real:!0,forced:!0},{mapValues:function(t){var e=oi(this),r=ar(t,arguments.length>1?arguments[1]:void 0),n=new Si;return di(e,function(t,o){Ei(n,o,r(t,o,e))}),n}});var Oi=Do.set;Ce({target:\"Map\",proto:!0,real:!0,arity:1,forced:!0},{merge:function(t){for(var e=oi(this),r=arguments.length,n=0;n<r;)Ao(arguments[n++],function(t,r){Oi(e,t,r)},{AS_ENTRIES:!0});return e}});var xi=TypeError;Ce({target:\"Map\",proto:!0,real:!0,forced:!0},{reduce:function(t){var e=oi(this),r=arguments.length<2,n=r?void 0:arguments[1];if(J(t),di(e,function(o,i){r?(r=!1,n=o):n=t(n,o,i,e)}),r)throw new xi(\"Reduce of empty map with no initial value\");return n}}),Ce({target:\"Map\",proto:!0,real:!0,forced:!0},{some:function(t){var e=oi(this),r=ar(t,arguments.length>1?arguments[1]:void 0);return!0===di(e,function(t,n){if(r(t,n,e))return!0},!0)}});var Ri=TypeError,Pi=Do.get,Ai=Do.has,ji=Do.set;Ce({target:\"Map\",proto:!0,real:!0,forced:!0},{update:function(t,e){var r=oi(this),n=arguments.length;J(e);var o=Ai(r,t);if(!o&&n<3)throw new Ri(\"Updating absent value\");var i=o?Pi(r,t):J(n>2?arguments[2]:void 0)(t,r);return ji(r,t,e(i,t,r)),r}});var ki=TypeError,Ii=function(t,e){var r,n=kt(this),o=J(n.get),i=J(n.has),a=J(n.set),u=arguments.length>2?arguments[2]:void 0;if(!T(e)&&!T(u))throw new ki(\"At least one callback required\");return f(i,n,t)?(r=f(o,n,t),T(e)&&(r=e(r),f(a,n,t,r))):T(u)&&(r=u(),f(a,n,t,r)),r};Ce({target:\"Map\",proto:!0,real:!0,forced:!0},{upsert:Ii}),Ce({target:\"Map\",proto:!0,real:!0,name:\"upsert\",forced:!0},{updateOrInsert:Ii});var Ti=b(1..valueOf),Mi=\"\\t\\n\\v\\f\\r                　\\u2028\\u2029\\ufeff\",Li=b(\"\".replace),Ui=RegExp(\"^[\"+Mi+\"]+\"),Ni=RegExp(\"(^|[^\"+Mi+\"])[\"+Mi+\"]+$\"),Ci=function(t){return function(e){var r=Wr(j(e));return 1&t&&(r=Li(r,Ui,\"\")),2&t&&(r=Li(r,Ni,\"$1\")),r}},_i={start:Ci(1),end:Ci(2),trim:Ci(3)},Fi=Oe.f,Bi=Rt.f,Di=Ct.f,zi=_i.trim,Wi=\"Number\",qi=i[Wi],Hi=qi.prototype,$i=i.TypeError,Ki=b(\"\".slice),Gi=b(\"\".charCodeAt),Vi=Ue(Wi,!qi(\" 0o1\")||!qi(\"0b1\")||qi(\"+0x1\")),Yi=function(t){var e,r=arguments.length<1?0:qi(function(t){var e=mt(t,\"number\");return\"bigint\"==typeof e?e:function(t){var e,r,n,o,i,a,u,s,c=mt(t,\"number\");if(G(c))throw new $i(\"Cannot convert a Symbol value to a number\");if(\"string\"==typeof c&&c.length>2)if(c=zi(c),43===(e=Gi(c,0))||45===e){if(88===(r=Gi(c,2))||120===r)return NaN}else if(48===e){switch(Gi(c,1)){case 66:case 98:n=2,o=49;break;case 79:case 111:n=8,o=55;break;default:return+c}for(a=(i=Ki(c,2)).length,u=0;u<a;u++)if((s=Gi(i,u))<48||s>o)return NaN;return parseInt(i,n)}return+c}(e)}(t));return U(Hi,e=this)&&a(function(){Ti(e)})?Io(Object(r),this,Yi):r};Yi.prototype=Hi,Vi&&(Hi.constructor=Yi),Ce({global:!0,constructor:!0,wrap:!0,forced:Vi},{Number:Yi}),Vi&&function(t,e){for(var r,n=u?Fi(e):\"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,isFinite,isInteger,isNaN,isSafeInteger,parseFloat,parseInt,fromString,range\".split(\",\"),o=0;n.length>o;o++)ut(e,r=n[o])&&!ut(t,r)&&Di(t,r,Bi(e,r))}(Yn[Wi],qi),Ce({target:\"Number\",stat:!0,nonConfigurable:!0,nonWritable:!0},{EPSILON:Math.pow(2,-52)});var Xi=i.isFinite;Ce({target:\"Number\",stat:!0},{isFinite:Number.isFinite||function(t){return\"number\"==typeof t&&Xi(t)}});var Ji=Math.floor,Qi=Number.isInteger||function(t){return!M(t)&&isFinite(t)&&Ji(t)===t};Ce({target:\"Number\",stat:!0},{isInteger:Qi}),Ce({target:\"Number\",stat:!0},{isNaN:function(t){return t!=t}});var Zi=Math.abs;Ce({target:\"Number\",stat:!0},{isSafeInteger:function(t){return Qi(t)&&Zi(t)<=9007199254740991}}),Ce({target:\"Number\",stat:!0,nonConfigurable:!0,nonWritable:!0},{MAX_SAFE_INTEGER:9007199254740991}),Ce({target:\"Number\",stat:!0,nonConfigurable:!0,nonWritable:!0},{MIN_SAFE_INTEGER:-9007199254740991});var ta=_i.trim,ea=b(\"\".charAt),ra=i.parseFloat,na=i.Symbol,oa=na&&na.iterator,ia=1/ra(Mi+\"-0\")!=-Infinity||oa&&!a(function(){ra(Object(oa))})?function(t){var e=ta(Wr(t)),r=ra(e);return 0===r&&\"-\"===ea(e,0)?-0:r}:ra;Ce({target:\"Number\",stat:!0,forced:Number.parseFloat!==ia},{parseFloat:ia});var aa=_i.trim,ua=i.parseInt,sa=i.Symbol,ca=sa&&sa.iterator,fa=/^[+-]?0x/i,la=b(fa.exec),ha=8!==ua(Mi+\"08\")||22!==ua(Mi+\"0x16\")||ca&&!a(function(){ua(Object(ca))})?function(t,e){var r=aa(Wr(t));return ua(r,e>>>0||(la(fa,r)?16:10))}:ua;Ce({target:\"Number\",stat:!0,forced:Number.parseInt!==ha},{parseInt:ha});var pa=b(v.f),va=b([].push),da=u&&a(function(){var t=Object.create(null);return t[2]=2,!pa(t,2)}),ga=function(t){return function(e){for(var r,n=k(e),o=_e(n),i=da&&null===Qr(n),a=o.length,s=0,c=[];a>s;)r=o[s++],u&&!(i?r in n:pa(n,r))||va(c,t?[r,n[r]]:n[r]);return c}},ya={entries:ga(!0),values:ga(!1)},ma=ya.entries;Ce({target:\"Object\",stat:!0},{entries:function(t){return ma(t)}}),Ce({target:\"Object\",stat:!0,sham:!u},{getOwnPropertyDescriptors:function(t){for(var e,r,n=k(t),o=Rt.f,i=Pe(n),a={},u=0;i.length>u;)void 0!==(r=o(n,e=i[u++]))&&Cn(a,e,r);return a}});var ba=a(function(){_e(1)});Ce({target:\"Object\",stat:!0,forced:ba},{keys:function(t){return _e(it(t))}});var wa=Object.is||function(t,e){return t===e?0!==t||1/t==1/e:t!=t&&e!=e};Ce({target:\"Object\",stat:!0},{is:wa});var Sa=ya.values;Ce({target:\"Object\",stat:!0},{values:function(t){return Sa(t)}}),Ce({target:\"Object\",stat:!0},{hasOwn:ut});var Ea=Function.prototype,Oa=Ea.apply,xa=Ea.call,Ra=\"object\"==typeof Reflect&&Reflect.apply||(s?xa.bind(Oa):function(){return xa.apply(Oa,arguments)}),Pa=!a(function(){Reflect.apply(function(){})});Ce({target:\"Reflect\",stat:!0,forced:Pa},{apply:function(t,e,r){return Ra(J(t),e,kt(r))}});var Aa=Function,ja=b([].concat),ka=b([].join),Ia={},Ta=s?Aa.bind:function(t){var e=J(this),r=e.prototype,n=vo(arguments,1),o=function(){var r=ja(n,vo(arguments));return this instanceof o?function(t,e,r){if(!ut(Ia,e)){for(var n=[],o=0;o<e;o++)n[o]=\"a[\"+o+\"]\";Ia[e]=Aa(\"C,a\",\"return new C(\"+ka(n,\",\")+\")\")}return Ia[e](t,r)}(e,r.length,r):e.apply(t,r)};return M(r)&&(o.prototype=r),o},Ma=TypeError,La=function(t){if(Sr(t))return t;throw new Ma(Y(t)+\" is not a constructor\")},Ua=L(\"Reflect\",\"construct\"),Na=Object.prototype,Ca=[].push,_a=a(function(){function t(){}return!(Ua(function(){},[],t)instanceof t)}),Fa=!a(function(){Ua(function(){})}),Ba=_a||Fa;Ce({target:\"Reflect\",stat:!0,forced:Ba,sham:Ba},{construct:function(t,e){La(t),kt(e);var r=arguments.length<3?t:La(arguments[2]);if(Fa&&!_a)return Ua(t,e,r);if(t===r){switch(e.length){case 0:return new t;case 1:return new t(e[0]);case 2:return new t(e[0],e[1]);case 3:return new t(e[0],e[1],e[2]);case 4:return new t(e[0],e[1],e[2],e[3])}var n=[null];return Ra(Ca,n,e),new(Ra(Ta,t,n))}var o=r.prototype,i=Ve(M(o)?o:Na),a=Ra(t,i,e);return M(a)?a:i}});var Da=a(function(){Reflect.defineProperty(Ct.f({},1,{value:1}),1,{value:2})});Ce({target:\"Reflect\",stat:!0,forced:Da,sham:!u},{defineProperty:function(t,e,r){kt(t);var n=bt(e);kt(r);try{return Ct.f(t,n,r),!0}catch(t){return!1}}});var za=Rt.f;Ce({target:\"Reflect\",stat:!0},{deleteProperty:function(t,e){var r=za(kt(t),e);return!(r&&!r.configurable)&&delete t[e]}});var Wa=function(t){return void 0!==t&&(ut(t,\"value\")||ut(t,\"writable\"))};Ce({target:\"Reflect\",stat:!0},{get:function t(e,r){var n,o,i=arguments.length<3?e:arguments[2];return kt(e)===i?e[r]:(n=Rt.f(e,r))?Wa(n)?n.value:void 0===n.get?void 0:f(n.get,i):M(o=Qr(e))?t(o,r,i):void 0}}),Ce({target:\"Reflect\",stat:!0,sham:!u},{getOwnPropertyDescriptor:function(t,e){return Rt.f(kt(t),e)}}),Ce({target:\"Reflect\",stat:!0,sham:!Vr},{getPrototypeOf:function(t){return Qr(kt(t))}}),Ce({target:\"Reflect\",stat:!0},{has:function(t,e){return e in t}}),Ce({target:\"Reflect\",stat:!0},{isExtensible:function(t){return kt(t),So(t)}}),Ce({target:\"Reflect\",stat:!0},{ownKeys:Pe}),Ce({target:\"Reflect\",stat:!0,sham:!Eo},{preventExtensions:function(t){kt(t);try{var e=L(\"Object\",\"preventExtensions\");return e&&e(t),!0}catch(t){return!1}}});var qa=a(function(){var t=function(){},e=Ct.f(new t,\"a\",{configurable:!0});return!1!==Reflect.set(t.prototype,\"a\",1,e)});Ce({target:\"Reflect\",stat:!0,forced:qa},{set:function t(e,r,n){var o,i,a,u=arguments.length<4?e:arguments[3],s=Rt.f(kt(e),r);if(!s){if(M(i=Qr(e)))return t(i,r,n,u);s=d(0)}if(Wa(s)){if(!1===s.writable||!M(u))return!1;if(o=Rt.f(u,r)){if(o.get||o.set||!1===o.writable)return!1;o.value=n,Ct.f(u,r,o)}else Ct.f(u,r,d(0,n))}else{if(void 0===(a=s.set))return!1;f(a,u,n)}return!0}}),dn&&Ce({target:\"Reflect\",stat:!0},{setPrototypeOf:function(t,e){kt(t),vn(e);try{return dn(t,e),!0}catch(t){return!1}}}),Ce({global:!0},{Reflect:{}}),an(i.Reflect,\"Reflect\",!0);var Ha=Oo.getWeakData,$a=ne.set,Ka=ne.getterFor,Ga=Ar.find,Va=Ar.findIndex,Ya=b([].splice),Xa=0,Ja=function(t){return t.frozen||(t.frozen=new Qa)},Qa=function(){this.entries=[]},Za=function(t,e){return Ga(t.entries,function(t){return t[0]===e})};Qa.prototype={get:function(t){var e=Za(this,t);if(e)return e[1]},has:function(t){return!!Za(this,t)},set:function(t,e){var r=Za(this,t);r?r[1]=e:this.entries.push([t,e])},delete:function(t){var e=Va(this.entries,function(e){return e[0]===t});return~e&&Ya(this.entries,e,1),!!~e}};var tu,eu={getConstructor:function(t,e,r,n){var o=t(function(t,o){ko(t,i),$a(t,{type:e,id:Xa++,frozen:null}),P(o)||Ao(o,t[n],{that:t,AS_ENTRIES:r})}),i=o.prototype,a=Ka(e),u=function(t,e,r){var n=a(t),o=Ha(kt(e),!0);return!0===o?Ja(n).set(e,r):o[n.id]=r,t};return Mo(i,{delete:function(t){var e=a(this);if(!M(t))return!1;var r=Ha(t);return!0===r?Ja(e).delete(t):r&&ut(r,e.id)&&delete r[e.id]},has:function(t){var e=a(this);if(!M(t))return!1;var r=Ha(t);return!0===r?Ja(e).has(t):r&&ut(r,e.id)}}),Mo(i,r?{get:function(t){var e=a(this);if(M(t)){var r=Ha(t);if(!0===r)return Ja(e).get(t);if(r)return r[e.id]}},set:function(t,e){return u(this,t,e)}}:{add:function(t){return u(this,t,!0)}}),o}},ru=ne.enforce,nu=Object,ou=Array.isArray,iu=nu.isExtensible,au=nu.isFrozen,uu=nu.isSealed,su=nu.freeze,cu=nu.seal,fu=!i.ActiveXObject&&\"ActiveXObject\"in i,lu=function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}},hu=To(\"WeakMap\",lu,eu),pu=hu.prototype,vu=b(pu.set);if(Vt)if(fu){tu=eu.getConstructor(lu,\"WeakMap\",!0),Oo.enable();var du=b(pu.delete),gu=b(pu.has),yu=b(pu.get);Mo(pu,{delete:function(t){if(M(t)&&!iu(t)){var e=ru(this);return e.frozen||(e.frozen=new tu),du(this,t)||e.frozen.delete(t)}return du(this,t)},has:function(t){if(M(t)&&!iu(t)){var e=ru(this);return e.frozen||(e.frozen=new tu),gu(this,t)||e.frozen.has(t)}return gu(this,t)},get:function(t){if(M(t)&&!iu(t)){var e=ru(this);return e.frozen||(e.frozen=new tu),gu(this,t)?yu(this,t):e.frozen.get(t)}return yu(this,t)},set:function(t,e){if(M(t)&&!iu(t)){var r=ru(this);r.frozen||(r.frozen=new tu),gu(this,t)?vu(this,t,e):r.frozen.set(t,e)}else vu(this,t,e);return this}})}else Eo&&a(function(){var t=su([]);return vu(new hu,t,1),!au(t)})&&Mo(pu,{set:function(t,e){var r;return ou(t)&&(au(t)?r=su:uu(t)&&(r=cu)),vu(this,t,e),r&&r(t),this}});var mu=L(\"Map\"),bu=L(\"WeakMap\"),wu=b([].push),Su=nt(\"metadata\"),Eu=Su.store||(Su.store=new bu),Ou=function(t,e,r){var n=Eu.get(t);if(!n){if(!r)return;Eu.set(t,n=new mu)}var o=n.get(e);if(!o){if(!r)return;n.set(e,o=new mu)}return o},xu={store:Eu,getMap:Ou,has:function(t,e,r){var n=Ou(e,r,!1);return void 0!==n&&n.has(t)},get:function(t,e,r){var n=Ou(e,r,!1);return void 0===n?void 0:n.get(t)},set:function(t,e,r,n){Ou(r,n,!0).set(t,e)},keys:function(t,e){var r=Ou(t,e,!1),n=[];return r&&r.forEach(function(t,e){wu(n,e)}),n},toKey:function(t){return void 0===t||\"symbol\"==typeof t?t:String(t)}},Ru=xu.toKey,Pu=xu.set;Ce({target:\"Reflect\",stat:!0},{defineMetadata:function(t,e,r){var n=arguments.length<4?void 0:Ru(arguments[3]);Pu(t,e,kt(r),n)}});var Au=xu.toKey,ju=xu.getMap,ku=xu.store;Ce({target:\"Reflect\",stat:!0},{deleteMetadata:function(t,e){var r=arguments.length<3?void 0:Au(arguments[2]),n=ju(kt(e),r,!1);if(void 0===n||!n.delete(t))return!1;if(n.size)return!0;var o=ku.get(e);return o.delete(r),!!o.size||ku.delete(e)}});var Iu=xu.has,Tu=xu.get,Mu=xu.toKey,Lu=function(t,e,r){if(Iu(t,e,r))return Tu(t,e,r);var n=Qr(e);return null!==n?Lu(t,n,r):void 0};Ce({target:\"Reflect\",stat:!0},{getMetadata:function(t,e){var r=arguments.length<3?void 0:Mu(arguments[2]);return Lu(t,kt(e),r)}});var Uu=Do.Map,Nu=Do.has,Cu=Do.set,_u=b([].push),Fu=b(function(t){var e,r,n,o=it(this),i=de(o),a=[],u=new Uu,s=P(t)?function(t){return t}:J(t);for(e=0;e<i;e++)n=s(r=o[e]),Nu(u,n)||Cu(u,n,r);return di(u,function(t){_u(a,t)}),a}),Bu=b([].concat),Du=xu.keys,zu=xu.toKey,Wu=function(t,e){var r=Du(t,e),n=Qr(t);if(null===n)return r;var o=Wu(n,e);return o.length?r.length?Fu(Bu(r,o)):o:r};Ce({target:\"Reflect\",stat:!0},{getMetadataKeys:function(t){var e=arguments.length<2?void 0:zu(arguments[1]);return Wu(kt(t),e)}});var qu=xu.get,Hu=xu.toKey;Ce({target:\"Reflect\",stat:!0},{getOwnMetadata:function(t,e){var r=arguments.length<3?void 0:Hu(arguments[2]);return qu(t,kt(e),r)}});var $u=xu.keys,Ku=xu.toKey;Ce({target:\"Reflect\",stat:!0},{getOwnMetadataKeys:function(t){var e=arguments.length<2?void 0:Ku(arguments[1]);return $u(kt(t),e)}});var Gu=xu.has,Vu=xu.toKey,Yu=function(t,e,r){if(Gu(t,e,r))return!0;var n=Qr(e);return null!==n&&Yu(t,n,r)};Ce({target:\"Reflect\",stat:!0},{hasMetadata:function(t,e){var r=arguments.length<3?void 0:Vu(arguments[2]);return Yu(t,kt(e),r)}});var Xu=xu.has,Ju=xu.toKey;Ce({target:\"Reflect\",stat:!0},{hasOwnMetadata:function(t,e){var r=arguments.length<3?void 0:Ju(arguments[2]);return Xu(t,kt(e),r)}});var Qu=xu.toKey,Zu=xu.set;Ce({target:\"Reflect\",stat:!0},{metadata:function(t,e){return function(r,n){Zu(t,e,kt(r),Qu(n))}}});var ts=dt(\"match\"),es=function(t){var e;return M(t)&&(void 0!==(e=t[ts])?!!e:\"RegExp\"===E(t))},rs=function(){var t=kt(this),e=\"\";return t.hasIndices&&(e+=\"d\"),t.global&&(e+=\"g\"),t.ignoreCase&&(e+=\"i\"),t.multiline&&(e+=\"m\"),t.dotAll&&(e+=\"s\"),t.unicode&&(e+=\"u\"),t.unicodeSets&&(e+=\"v\"),t.sticky&&(e+=\"y\"),e},ns=RegExp.prototype,os=function(t){var e=t.flags;return void 0!==e||\"flags\"in ns||ut(t,\"flags\")||!U(ns,t)?e:f(rs,t)},is=i.RegExp,as=a(function(){var t=is(\"a\",\"y\");return t.lastIndex=2,null!==t.exec(\"abcd\")}),us=as||a(function(){return!is(\"a\",\"y\").sticky}),ss=as||a(function(){var t=is(\"^r\",\"gy\");return t.lastIndex=2,null!==t.exec(\"str\")}),cs={BROKEN_CARET:ss,MISSED_STICKY:us,UNSUPPORTED_Y:as},fs=Ct.f,ls=function(t,e,r){r in t||fs(t,r,{configurable:!0,get:function(){return e[r]},set:function(t){e[r]=t}})},hs=i.RegExp,ps=a(function(){var t=hs(\".\",\"s\");return!(t.dotAll&&t.test(\"\\n\")&&\"s\"===t.flags)}),vs=i.RegExp,ds=a(function(){var t=vs(\"(?<a>b)\",\"g\");return\"b\"!==t.exec(\"b\").groups.a||\"bc\"!==\"b\".replace(t,\"$<a>c\")}),gs=Oe.f,ys=ne.enforce,ms=dt(\"match\"),bs=i.RegExp,ws=bs.prototype,Ss=i.SyntaxError,Es=b(ws.exec),Os=b(\"\".charAt),xs=b(\"\".replace),Rs=b(\"\".indexOf),Ps=b(\"\".slice),As=/^\\?<[^\\s\\d!#%&*+<=>@^][^\\s!#%&*+<=>@^]*>/,js=/a/g,ks=/a/g,Is=new bs(js)!==js,Ts=cs.MISSED_STICKY,Ms=cs.UNSUPPORTED_Y,Ls=u&&(!Is||Ts||ps||ds||a(function(){return ks[ms]=!1,bs(js)!==js||bs(ks)===ks||\"/a/i\"!==String(bs(js,\"i\"))}));if(Ue(\"RegExp\",Ls)){for(var Us=function(t,e){var r,n,o,i,a,u,s=U(ws,this),c=es(t),f=void 0===e,l=[],h=t;if(!s&&c&&f&&t.constructor===Us)return t;if((c||U(ws,t))&&(t=t.source,f&&(e=os(h))),t=void 0===t?\"\":Wr(t),e=void 0===e?\"\":Wr(e),h=t,ps&&\"dotAll\"in js&&(n=!!e&&Rs(e,\"s\")>-1)&&(e=xs(e,/s/g,\"\")),r=e,Ts&&\"sticky\"in js&&(o=!!e&&Rs(e,\"y\")>-1)&&Ms&&(e=xs(e,/y/g,\"\")),ds&&(i=function(t){for(var e,r=t.length,n=0,o=\"\",i=[],a=Ve(null),u=!1,s=!1,c=0,f=\"\";n<=r;n++){if(\"\\\\\"===(e=Os(t,n)))e+=Os(t,++n);else if(\"]\"===e)u=!1;else if(!u)switch(!0){case\"[\"===e:u=!0;break;case\"(\"===e:if(o+=e,\"?:\"===Ps(t,n+1,n+3))continue;Es(As,Ps(t,n+1))&&(n+=2,s=!0),c++;continue;case\">\"===e&&s:if(\"\"===f||ut(a,f))throw new Ss(\"Invalid capture group name\");a[f]=!0,i[i.length]=[f,c],s=!1,f=\"\";continue}s?f+=e:o+=e}return[o,i]}(t),t=i[0],l=i[1]),a=Io(bs(t,e),s?this:ws,Us),(n||o||l.length)&&(u=ys(a),n&&(u.dotAll=!0,u.raw=Us(function(t){for(var e,r=t.length,n=0,o=\"\",i=!1;n<=r;n++)\"\\\\\"!==(e=Os(t,n))?i||\".\"!==e?(\"[\"===e?i=!0:\"]\"===e&&(i=!1),o+=e):o+=\"[\\\\s\\\\S]\":o+=e+Os(t,++n);return o}(t),r)),o&&(u.sticky=!0),l.length&&(u.groups=l)),t!==h)try{_t(a,\"source\",\"\"===h?\"(?:)\":h)}catch(t){}return a},Ns=gs(bs),Cs=0;Ns.length>Cs;)ls(Us,bs,Ns[Cs++]);ws.constructor=Us,Us.prototype=ws,ie(i,\"RegExp\",Us,{constructor:!0})}Uo(\"RegExp\");var _s=zt.PROPER,Fs=\"toString\",Bs=RegExp.prototype,Ds=Bs[Fs];(a(function(){return\"/a/b\"!==Ds.call({source:\"a\",flags:\"b\"})})||_s&&Ds.name!==Fs)&&ie(Bs,Fs,function(){var t=kt(this);return\"/\"+Wr(t.source)+\"/\"+Wr(os(t))},{unsafe:!0});var zs=ne.get,Ws=RegExp.prototype,qs=TypeError;u&&ps&&so(Ws,\"dotAll\",{configurable:!0,get:function(){if(this!==Ws){if(\"RegExp\"===E(this))return!!zs(this).dotAll;throw new qs(\"Incompatible receiver, RegExp required\")}}});var Hs=ne.get,$s=nt(\"native-string-replace\",String.prototype.replace),Ks=RegExp.prototype.exec,Gs=Ks,Vs=b(\"\".charAt),Ys=b(\"\".indexOf),Xs=b(\"\".replace),Js=b(\"\".slice),Qs=function(){var t=/a/,e=/b*/g;return f(Ks,t,\"a\"),f(Ks,e,\"a\"),0!==t.lastIndex||0!==e.lastIndex}(),Zs=cs.BROKEN_CARET,tc=void 0!==/()??/.exec(\"\")[1];(Qs||tc||Zs||ps||ds)&&(Gs=function(t){var e,r,n,o,i,a,u,s=this,c=Hs(s),l=Wr(t),h=c.raw;if(h)return h.lastIndex=s.lastIndex,e=f(Gs,h,l),s.lastIndex=h.lastIndex,e;var p=c.groups,v=Zs&&s.sticky,d=f(rs,s),g=s.source,y=0,m=l;if(v&&(d=Xs(d,\"y\",\"\"),-1===Ys(d,\"g\")&&(d+=\"g\"),m=Js(l,s.lastIndex),s.lastIndex>0&&(!s.multiline||s.multiline&&\"\\n\"!==Vs(l,s.lastIndex-1))&&(g=\"(?: \"+g+\")\",m=\" \"+m,y++),r=new RegExp(\"^(?:\"+g+\")\",d)),tc&&(r=new RegExp(\"^\"+g+\"$(?!\\\\s)\",d)),Qs&&(n=s.lastIndex),o=f(Ks,v?r:s,m),v?o?(o.input=Js(o.input,y),o[0]=Js(o[0],y),o.index=s.lastIndex,s.lastIndex+=o[0].length):s.lastIndex=0:Qs&&o&&(s.lastIndex=s.global?o.index+o[0].length:n),tc&&o&&o.length>1&&f($s,o[0],r,function(){for(i=1;i<arguments.length-2;i++)void 0===arguments[i]&&(o[i]=void 0)}),o&&p)for(o.groups=a=Ve(null),i=0;i<p.length;i++)a[(u=p[i])[0]]=o[u[1]];return o});var ec=Gs;Ce({target:\"RegExp\",proto:!0,forced:/./.exec!==ec},{exec:ec});var rc=i.RegExp,nc=rc.prototype;u&&a(function(){var t=!0;try{rc(\".\",\"d\")}catch(e){t=!1}var e={},r=\"\",n=t?\"dgimsy\":\"gimsy\",o=function(t,n){Object.defineProperty(e,t,{get:function(){return r+=n,!0}})},i={dotAll:\"s\",global:\"g\",ignoreCase:\"i\",multiline:\"m\",sticky:\"y\"};for(var a in t&&(i.hasIndices=\"d\"),i)o(a,i[a]);return Object.getOwnPropertyDescriptor(nc,\"flags\").get.call(e)!==n||r!==n})&&so(nc,\"flags\",{configurable:!0,get:rs});var oc=ne.get,ic=RegExp.prototype,ac=TypeError;u&&cs.MISSED_STICKY&&so(ic,\"sticky\",{configurable:!0,get:function(){if(this!==ic){if(\"RegExp\"===E(this))return!!oc(this).sticky;throw new ac(\"Incompatible receiver, RegExp required\")}}});var uc,sc,cc=(uc=!1,(sc=/[ac]/).exec=function(){return uc=!0,/./.exec.apply(this,arguments)},!0===sc.test(\"abc\")&&uc),fc=/./.test;Ce({target:\"RegExp\",proto:!0,forced:!cc},{test:function(t){var e=kt(this),r=Wr(t),n=e.exec;if(!T(n))return f(fc,e,r);var o=f(n,e,r);return null!==o&&(kt(o),!0)}});var lc=dt(\"species\"),hc=RegExp.prototype,pc=function(t,e,r,n){var o=dt(t),i=!a(function(){var e={};return e[o]=function(){return 7},7!==\"\"[t](e)}),u=i&&!a(function(){var e=!1,r=/a/;return\"split\"===t&&((r={}).constructor={},r.constructor[lc]=function(){return r},r.flags=\"\",r[o]=/./[o]),r.exec=function(){return e=!0,null},r[o](\"\"),!e});if(!i||!u||r){var s=/./[o],c=e(o,\"\"[t],function(t,e,r,n,o){var a=e.exec;return a===ec||a===hc.exec?i&&!o?{done:!0,value:f(s,e,r,n)}:{done:!0,value:f(t,r,e,n)}:{done:!1}});ie(String.prototype,t,c[0]),ie(hc,o,c[1])}n&&_t(hc[o],\"sham\",!0)},vc=Gr.charAt,dc=function(t,e,r){return e+(r?vc(t,e).length:1)},gc=TypeError,yc=function(t,e){var r=t.exec;if(T(r)){var n=f(r,t,e);return null!==n&&kt(n),n}if(\"RegExp\"===E(t))return f(ec,t,e);throw new gc(\"RegExp#exec called on incompatible receiver\")};pc(\"match\",function(t,e,r){return[function(e){var r=j(this),n=P(e)?void 0:Q(e,t);return n?f(n,e,r):new RegExp(e)[t](Wr(r))},function(t){var n=kt(this),o=Wr(t),i=r(e,n,o);if(i.done)return i.value;if(!n.global)return yc(n,o);var a=n.unicode;n.lastIndex=0;for(var u,s=[],c=0;null!==(u=yc(n,o));){var f=Wr(u[0]);s[c]=f,\"\"===f&&(n.lastIndex=dc(o,ve(n.lastIndex),a)),c++}return 0===c?null:s}]});var mc=Math.floor,bc=b(\"\".charAt),wc=b(\"\".replace),Sc=b(\"\".slice),Ec=/\\$([$&'`]|\\d{1,2}|<[^>]*>)/g,Oc=/\\$([$&'`]|\\d{1,2})/g,xc=function(t,e,r,n,o,i){var a=r+t.length,u=n.length,s=Oc;return void 0!==o&&(o=it(o),s=Ec),wc(i,s,function(i,s){var c;switch(bc(s,0)){case\"$\":return\"$\";case\"&\":return t;case\"`\":return Sc(e,0,r);case\"'\":return Sc(e,a);case\"<\":c=o[Sc(s,1,-1)];break;default:var f=+s;if(0===f)return i;if(f>u){var l=mc(f/10);return 0===l?i:l<=u?void 0===n[l-1]?bc(s,1):n[l-1]+bc(s,1):i}c=n[f-1]}return void 0===c?\"\":c})},Rc=dt(\"replace\"),Pc=Math.max,Ac=Math.min,jc=b([].concat),kc=b([].push),Ic=b(\"\".indexOf),Tc=b(\"\".slice),Mc=\"$0\"===\"a\".replace(/./,\"$0\"),Lc=!!/./[Rc]&&\"\"===/./[Rc](\"a\",\"$0\"),Uc=!a(function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:\"7\"},t},\"7\"!==\"\".replace(t,\"$<a>\")});pc(\"replace\",function(t,e,r){var n=Lc?\"$\":\"$0\";return[function(t,r){var n=j(this),o=P(t)?void 0:Q(t,Rc);return o?f(o,t,n,r):f(e,Wr(n),t,r)},function(t,o){var i=kt(this),a=Wr(t);if(\"string\"==typeof o&&-1===Ic(o,n)&&-1===Ic(o,\"$<\")){var u=r(e,i,a,o);if(u.done)return u.value}var s=T(o);s||(o=Wr(o));var c,f=i.global;f&&(c=i.unicode,i.lastIndex=0);for(var l,h=[];null!==(l=yc(i,a))&&(kc(h,l),f);)\"\"===Wr(l[0])&&(i.lastIndex=dc(a,ve(i.lastIndex),c));for(var p,v=\"\",d=0,g=0;g<h.length;g++){for(var y,m=Wr((l=h[g])[0]),b=Pc(Ac(ce(l.index),a.length),0),w=[],S=1;S<l.length;S++)kc(w,void 0===(p=l[S])?p:String(p));var E=l.groups;if(s){var O=jc([m],w,b,a);void 0!==E&&kc(O,E),y=Wr(Ra(o,void 0,O))}else y=xc(m,a,b,w,E,o);b>=d&&(v+=Tc(a,d,b)+y,d=b+m.length)}return v+Tc(a,d)}]},!Uc||!Mc||Lc),pc(\"search\",function(t,e,r){return[function(e){var r=j(this),n=P(e)?void 0:Q(e,t);return n?f(n,e,r):new RegExp(e)[t](Wr(r))},function(t){var n=kt(this),o=Wr(t),i=r(e,n,o);if(i.done)return i.value;var a=n.lastIndex;wa(a,0)||(n.lastIndex=0);var u=yc(n,o);return wa(n.lastIndex,a)||(n.lastIndex=a),null===u?-1:u.index}]});var Nc=dt(\"species\"),Cc=function(t,e){var r,n=kt(t).constructor;return void 0===n||P(r=kt(n)[Nc])?e:La(r)},_c=cs.UNSUPPORTED_Y,Fc=Math.min,Bc=b([].push),Dc=b(\"\".slice),zc=!a(function(){var t=/(?:)/,e=t.exec;t.exec=function(){return e.apply(this,arguments)};var r=\"ab\".split(t);return 2!==r.length||\"a\"!==r[0]||\"b\"!==r[1]}),Wc=\"c\"===\"abbc\".split(/(b)*/)[1]||4!==\"test\".split(/(?:)/,-1).length||2!==\"ab\".split(/(?:ab)*/).length||4!==\".\".split(/(.?)(.?)/).length||\".\".split(/()()/).length>1||\"\".split(/.?/).length;pc(\"split\",function(t,e,r){var n=\"0\".split(void 0,0).length?function(t,r){return void 0===t&&0===r?[]:f(e,this,t,r)}:e;return[function(e,r){var o=j(this),i=P(e)?void 0:Q(e,t);return i?f(i,e,o,r):f(n,Wr(o),e,r)},function(t,o){var i=kt(this),a=Wr(t);if(!Wc){var u=r(n,i,a,o,n!==e);if(u.done)return u.value}var s=Cc(i,RegExp),c=i.unicode,f=new s(_c?\"^(?:\"+i.source+\")\":i,(i.ignoreCase?\"i\":\"\")+(i.multiline?\"m\":\"\")+(i.unicode?\"u\":\"\")+(_c?\"g\":\"y\")),l=void 0===o?4294967295:o>>>0;if(0===l)return[];if(0===a.length)return null===yc(f,a)?[a]:[];for(var h=0,p=0,v=[];p<a.length;){f.lastIndex=_c?0:p;var d,g=yc(f,_c?Dc(a,p):a);if(null===g||(d=Fc(ve(f.lastIndex+(_c?p:0)),a.length))===h)p=dc(a,p,c);else{if(Bc(v,Dc(a,h,p)),v.length===l)return v;for(var y=1;y<=g.length-1;y++)if(Bc(v,g[y]),v.length===l)return v;p=h=d}}return Bc(v,Dc(a,h)),v}]},Wc||!zc,_c);var qc=TypeError,Hc=RangeError,$c=function(t){var e=Wr(j(this)),r=\"\",n=ce(t);if(n<0||Infinity===n)throw new Hc(\"Wrong number of repetitions\");for(;n>0;(n>>>=1)&&(e+=e))1&n&&(r+=e);return r},Kc=b($c),Gc=b(\"\".slice),Vc=Math.ceil,Yc=function(t){return function(e,r,n){var o,i,a=Wr(j(e)),u=ve(r),s=a.length,c=void 0===n?\" \":Wr(n);return u<=s||\"\"===c?a:((i=Kc(c,Vc((o=u-s)/c.length))).length>o&&(i=Gc(i,0,o)),t?a+i:i+a)}},Xc={start:Yc(!1),end:Yc(!0)},Jc=Xc.start,Qc=Array,Zc=RegExp.escape,tf=b(\"\".charAt),ef=b(\"\".charCodeAt),rf=b(1.1.toString),nf=b([].join),of=/^[0-9a-z]/i,af=/^[$()*+./?[\\\\\\]^{|}]/,uf=RegExp(\"^[!\\\"#%&',\\\\-:;<=>@`~\"+Mi+\"]\"),sf=b(of.exec),cf={\"\\t\":\"t\",\"\\n\":\"n\",\"\\v\":\"v\",\"\\f\":\"f\",\"\\r\":\"r\"},ff=function(t){var e=rf(ef(t,0),16);return e.length<3?\"\\\\x\"+Jc(e,2,\"0\"):\"\\\\u\"+Jc(e,4,\"0\")},lf=!Zc||\"\\\\x61b\"!==Zc(\"ab\");Ce({target:\"RegExp\",stat:!0,forced:lf},{escape:function(t){!function(t){if(\"string\"==typeof t)return t;throw new qc(\"Argument is not a string\")}(t);for(var e=t.length,r=Qc(e),n=0;n<e;n++){var o=tf(t,n);if(0===n&&sf(of,o))r[n]=ff(o);else if(ut(cf,o))r[n]=\"\\\\\"+cf[o];else if(sf(af,o))r[n]=\"\\\\\"+o;else if(sf(uf,o))r[n]=ff(o);else{var i=ef(o,0);55296!=(63488&i)?r[n]=o:i>=56320||n+1>=e||56320!=(64512&ef(t,n+1))?r[n]=ff(o):(r[n]=o,r[++n]=tf(t,n))}}return nf(r,\"\")}}),To(\"Set\",function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}},Fo);var hf=Set.prototype,pf={Set:Set,add:b(hf.add),has:b(hf.has),remove:b(hf.delete),proto:hf},vf=pf.has,df=function(t){return vf(t),t},gf=pf.Set,yf=pf.proto,mf=b(yf.forEach),bf=b(yf.keys),wf=bf(new gf).next,Sf=function(t,e,r){return r?ci({iterator:bf(t),next:wf},e):mf(t,e)},Ef=pf.Set,Of=pf.add,xf=function(t){var e=new Ef;return Sf(t,function(t){Of(e,t)}),e},Rf=ln(pf.proto,\"size\",\"get\")||function(t){return t.size},Pf=\"Invalid size\",Af=RangeError,jf=TypeError,kf=Math.max,If=function(t,e){this.set=t,this.size=kf(e,0),this.has=J(t.has),this.keys=J(t.keys)};If.prototype={getIterator:function(){return{iterator:t=kt(f(this.keys,this.set)),next:t.next,done:!1};var t},includes:function(t){return f(this.has,this.set,t)}};var Tf=function(t){kt(t);var e=+t.size;if(e!=e)throw new jf(Pf);var r=ce(e);if(r<0)throw new Af(Pf);return new If(t,r)},Mf=pf.has,Lf=pf.remove,Uf=function(t){var e=df(this),r=Tf(t),n=xf(e);return Rf(e)<=r.size?Sf(e,function(t){r.includes(t)&&Lf(n,t)}):ci(r.getIterator(),function(t){Mf(e,t)&&Lf(n,t)}),n},Nf=function(t){return{size:t,has:function(){return!1},keys:function(){return{next:function(){return{done:!0}}}}}},Cf=function(t){var e=L(\"Set\");try{(new e)[t](Nf(0));try{return(new e)[t](Nf(-1)),!1}catch(t){return!0}}catch(t){return!1}};Ce({target:\"Set\",proto:!0,real:!0,forced:!Cf(\"difference\")},{difference:Uf});var _f=pf.Set,Ff=pf.add,Bf=pf.has,Df=function(t){var e=df(this),r=Tf(t),n=new _f;return Rf(e)>r.size?ci(r.getIterator(),function(t){Bf(e,t)&&Ff(n,t)}):Sf(e,function(t){r.includes(t)&&Ff(n,t)}),n},zf=!Cf(\"intersection\")||a(function(){return\"3,2\"!==String(Array.from(new Set([1,2,3]).intersection(new Set([3,2]))))});Ce({target:\"Set\",proto:!0,real:!0,forced:zf},{intersection:Df});var Wf=pf.has,qf=function(t){var e=df(this),r=Tf(t);if(Rf(e)<=r.size)return!1!==Sf(e,function(t){if(r.includes(t))return!1},!0);var n=r.getIterator();return!1!==ci(n,function(t){if(Wf(e,t))return Tn(n,\"normal\",!1)})};Ce({target:\"Set\",proto:!0,real:!0,forced:!Cf(\"isDisjointFrom\")},{isDisjointFrom:qf});var Hf=function(t){var e=df(this),r=Tf(t);return!(Rf(e)>r.size)&&!1!==Sf(e,function(t){if(!r.includes(t))return!1},!0)};Ce({target:\"Set\",proto:!0,real:!0,forced:!Cf(\"isSubsetOf\")},{isSubsetOf:Hf});var $f=pf.has,Kf=function(t){var e=df(this),r=Tf(t);if(Rf(e)<r.size)return!1;var n=r.getIterator();return!1!==ci(n,function(t){if(!$f(e,t))return Tn(n,\"normal\",!1)})};Ce({target:\"Set\",proto:!0,real:!0,forced:!Cf(\"isSupersetOf\")},{isSupersetOf:Kf});var Gf=pf.add,Vf=pf.has,Yf=pf.remove,Xf=function(t){var e=df(this),r=Tf(t).getIterator(),n=xf(e);return ci(r,function(t){Vf(e,t)?Yf(n,t):Gf(n,t)}),n};Ce({target:\"Set\",proto:!0,real:!0,forced:!Cf(\"symmetricDifference\")},{symmetricDifference:Xf});var Jf=pf.add,Qf=function(t){var e=df(this),r=Tf(t).getIterator(),n=xf(e);return ci(r,function(t){Jf(n,t)}),n};Ce({target:\"Set\",proto:!0,real:!0,forced:!Cf(\"union\")},{union:Qf}),Ce({target:\"Set\",stat:!0,forced:!0},{from:ei(pf.Set,pf.add,!1)}),Ce({target:\"Set\",stat:!0,forced:!0},{of:ri(pf.Set,pf.add,!1)});var Zf=pf.add;Ce({target:\"Set\",proto:!0,real:!0,forced:!0},{addAll:function(){for(var t=df(this),e=0,r=arguments.length;e<r;e++)Zf(t,arguments[e]);return t}});var tl=pf.remove;Ce({target:\"Set\",proto:!0,real:!0,forced:!0},{deleteAll:function(){for(var t,e=df(this),r=!0,n=0,o=arguments.length;n<o;n++)t=tl(e,arguments[n]),r=r&&t;return!!r}}),Ce({target:\"Set\",proto:!0,real:!0,forced:!0},{every:function(t){var e=df(this),r=ar(t,arguments.length>1?arguments[1]:void 0);return!1!==Sf(e,function(t){if(!r(t,t,e))return!1},!0)}});var el=dt(\"iterator\"),rl=Object,nl=L(\"Set\"),ol=function(t){return function(t){return M(t)&&\"number\"==typeof t.size&&T(t.has)&&T(t.keys)}(t)?t:function(t){if(P(t))return!1;var e=rl(t);return void 0!==e[el]||\"@@iterator\"in e||ut(un,pr(e))}(t)?new nl(t):t};Ce({target:\"Set\",proto:!0,real:!0,forced:!0},{difference:function(t){return f(Uf,this,ol(t))}});var il=pf.Set,al=pf.add;Ce({target:\"Set\",proto:!0,real:!0,forced:!0},{filter:function(t){var e=df(this),r=ar(t,arguments.length>1?arguments[1]:void 0),n=new il;return Sf(e,function(t){r(t,t,e)&&al(n,t)}),n}}),Ce({target:\"Set\",proto:!0,real:!0,forced:!0},{find:function(t){var e=df(this),r=ar(t,arguments.length>1?arguments[1]:void 0),n=Sf(e,function(t){if(r(t,t,e))return{value:t}},!0);return n&&n.value}}),Ce({target:\"Set\",proto:!0,real:!0,forced:!0},{intersection:function(t){return f(Df,this,ol(t))}}),Ce({target:\"Set\",proto:!0,real:!0,forced:!0},{isDisjointFrom:function(t){return f(qf,this,ol(t))}}),Ce({target:\"Set\",proto:!0,real:!0,forced:!0},{isSubsetOf:function(t){return f(Hf,this,ol(t))}}),Ce({target:\"Set\",proto:!0,real:!0,forced:!0},{isSupersetOf:function(t){return f(Kf,this,ol(t))}});var ul=b([].join),sl=b([].push);Ce({target:\"Set\",proto:!0,real:!0,forced:!0},{join:function(t){var e=df(this),r=void 0===t?\",\":Wr(t),n=[];return Sf(e,function(t){sl(n,t)}),ul(n,r)}});var cl=pf.Set,fl=pf.add;Ce({target:\"Set\",proto:!0,real:!0,forced:!0},{map:function(t){var e=df(this),r=ar(t,arguments.length>1?arguments[1]:void 0),n=new cl;return Sf(e,function(t){fl(n,r(t,t,e))}),n}});var ll=TypeError;Ce({target:\"Set\",proto:!0,real:!0,forced:!0},{reduce:function(t){var e=df(this),r=arguments.length<2,n=r?void 0:arguments[1];if(J(t),Sf(e,function(o){r?(r=!1,n=o):n=t(n,o,o,e)}),r)throw new ll(\"Reduce of empty set with no initial value\");return n}}),Ce({target:\"Set\",proto:!0,real:!0,forced:!0},{some:function(t){var e=df(this),r=ar(t,arguments.length>1?arguments[1]:void 0);return!0===Sf(e,function(t){if(r(t,t,e))return!0},!0)}}),Ce({target:\"Set\",proto:!0,real:!0,forced:!0},{symmetricDifference:function(t){return f(Xf,this,ol(t))}}),Ce({target:\"Set\",proto:!0,real:!0,forced:!0},{union:function(t){return f(Qf,this,ol(t))}});var hl=dt(\"species\"),pl=dt(\"isConcatSpreadable\"),vl=W>=51||!a(function(){var t=[];return t[pl]=!1,t.concat()[0]!==t}),dl=function(t){if(!M(t))return!1;var e=t[pl];return void 0!==e?!!e:ur(t)},gl=!(vl&&(W>=51||!a(function(){var t=[];return(t.constructor={})[hl]=function(){return{foo:1}},1!==t.concat(Boolean).foo})));Ce({target:\"Array\",proto:!0,arity:1,forced:gl},{concat:function(t){var e,r,n,o,i,a=it(this),u=xr(a,0),s=0;for(e=-1,n=arguments.length;e<n;e++)if(dl(i=-1===e?a:arguments[e]))for(o=de(i),Nr(s+o),r=0;r<o;r++,s++)r in i&&Cn(u,s,i[r]);else Nr(s+1),Cn(u,s++,i);return u.length=s,u}});var yl={f:dt},ml=Ct.f,bl=function(t){var e=Yn.Symbol||(Yn.Symbol={});ut(e,t)||ml(e,t,{value:yl.f(t)})},wl=function(){var t=L(\"Symbol\"),e=t&&t.prototype,r=e&&e.valueOf,n=dt(\"toPrimitive\");e&&!e[n]&&ie(e,n,function(t){return f(r,this)},{arity:1})},Sl=Ar.forEach,El=Xt(\"hidden\"),Ol=\"Symbol\",xl=\"prototype\",Rl=ne.set,Pl=ne.getterFor(Ol),Al=Object[xl],jl=i.Symbol,kl=jl&&jl[xl],Il=i.RangeError,Tl=i.TypeError,Ml=i.QObject,Ll=Rt.f,Ul=Ct.f,Nl=mo.f,Cl=v.f,_l=b([].push),Fl=nt(\"symbols\"),Bl=nt(\"op-symbols\"),Dl=nt(\"wks\"),zl=!Ml||!Ml[xl]||!Ml[xl].findChild,Wl=function(t,e,r){var n=Ll(Al,e);n&&delete Al[e],Ul(t,e,r),n&&t!==Al&&Ul(Al,e,n)},ql=u&&a(function(){return 7!==Ve(Ul({},\"a\",{get:function(){return Ul(this,\"a\",{value:7}).a}})).a})?Wl:Ul,Hl=function(t,e){var r=Fl[t]=Ve(kl);return Rl(r,{type:Ol,tag:t,description:e}),u||(r.description=e),r},$l=function(t,e,r){t===Al&&$l(Bl,e,r),kt(t);var n=bt(e);return kt(r),ut(Fl,n)?(r.enumerable?(ut(t,El)&&t[El][n]&&(t[El][n]=!1),r=Ve(r,{enumerable:d(0,!1)})):(ut(t,El)||Ul(t,El,d(1,Ve(null))),t[El][n]=!0),ql(t,n,r)):Ul(t,n,r)},Kl=function(t,e){kt(t);var r=k(e),n=_e(r).concat(Xl(r));return Sl(n,function(e){u&&!f(Gl,r,e)||$l(t,e,r[e])}),t},Gl=function(t){var e=bt(t),r=f(Cl,this,e);return!(this===Al&&ut(Fl,e)&&!ut(Bl,e))&&(!(r||!ut(this,e)||!ut(Fl,e)||ut(this,El)&&this[El][e])||r)},Vl=function(t,e){var r=k(t),n=bt(e);if(r!==Al||!ut(Fl,n)||ut(Bl,n)){var o=Ll(r,n);return!o||!ut(Fl,n)||ut(r,El)&&r[El][n]||(o.enumerable=!0),o}},Yl=function(t){var e=Nl(k(t)),r=[];return Sl(e,function(t){ut(Fl,t)||ut(Jt,t)||_l(r,t)}),r},Xl=function(t){var e=t===Al,r=Nl(e?Bl:k(t)),n=[];return Sl(r,function(t){!ut(Fl,t)||e&&!ut(Al,t)||_l(n,Fl[t])}),n};H||(jl=function(){if(U(kl,this))throw new Tl(\"Symbol is not a constructor\");var t=arguments.length&&void 0!==arguments[0]?Wr(arguments[0]):void 0,e=lt(t),r=function(t){var n=void 0===this?i:this;n===Al&&f(r,Bl,t),ut(n,El)&&ut(n[El],e)&&(n[El][e]=!1);var o=d(1,t);try{ql(n,e,o)}catch(t){if(!(t instanceof Il))throw t;Wl(n,e,o)}};return u&&zl&&ql(Al,e,{configurable:!0,set:r}),Hl(e,t)},ie(kl=jl[xl],\"toString\",function(){return Pl(this).tag}),ie(jl,\"withoutSetter\",function(t){return Hl(lt(t),t)}),v.f=Gl,Ct.f=$l,Be.f=Kl,Rt.f=Vl,Oe.f=mo.f=Yl,xe.f=Xl,yl.f=function(t){return Hl(dt(t),t)},u&&(so(kl,\"description\",{configurable:!0,get:function(){return Pl(this).description}}),ie(Al,\"propertyIsEnumerable\",Gl,{unsafe:!0}))),Ce({global:!0,constructor:!0,wrap:!0,forced:!H,sham:!H},{Symbol:jl}),Sl(_e(Dl),function(t){bl(t)}),Ce({target:Ol,stat:!0,forced:!H},{useSetter:function(){zl=!0},useSimple:function(){zl=!1}}),Ce({target:\"Object\",stat:!0,forced:!H,sham:!u},{create:function(t,e){return void 0===e?Ve(t):Kl(Ve(t),e)},defineProperty:$l,defineProperties:Kl,getOwnPropertyDescriptor:Vl}),Ce({target:\"Object\",stat:!0,forced:!H},{getOwnPropertyNames:Yl}),wl(),an(jl,Ol),Jt[El]=!0;var Jl=H&&!!Symbol.for&&!!Symbol.keyFor,Ql=nt(\"string-to-symbol-registry\"),Zl=nt(\"symbol-to-string-registry\");Ce({target:\"Symbol\",stat:!0,forced:!Jl},{for:function(t){var e=Wr(t);if(ut(Ql,e))return Ql[e];var r=L(\"Symbol\")(e);return Ql[e]=r,Zl[r]=e,r}});var th=nt(\"symbol-to-string-registry\");Ce({target:\"Symbol\",stat:!0,forced:!Jl},{keyFor:function(t){if(!G(t))throw new TypeError(Y(t)+\" is not a symbol\");if(ut(th,t))return th[t]}});var eh=b([].push),rh=String,nh=L(\"JSON\",\"stringify\"),oh=b(/./.exec),ih=b(\"\".charAt),ah=b(\"\".charCodeAt),uh=b(\"\".replace),sh=b(1..toString),ch=/[\\uD800-\\uDFFF]/g,fh=/^[\\uD800-\\uDBFF]$/,lh=/^[\\uDC00-\\uDFFF]$/,hh=!H||a(function(){var t=L(\"Symbol\")(\"stringify detection\");return\"[null]\"!==nh([t])||\"{}\"!==nh({a:t})||\"{}\"!==nh(Object(t))}),ph=a(function(){return'\"\\\\udf06\\\\ud834\"'!==nh(\"\\udf06\\ud834\")||'\"\\\\udead\"'!==nh(\"\\udead\")}),vh=function(t,e){var r=vo(arguments),n=function(t){if(T(t))return t;if(ur(t)){for(var e=t.length,r=[],n=0;n<e;n++){var o=t[n];\"string\"==typeof o?eh(r,o):\"number\"!=typeof o&&\"Number\"!==E(o)&&\"String\"!==E(o)||eh(r,Wr(o))}var i=r.length,a=!0;return function(t,e){if(a)return a=!1,e;if(ur(this))return e;for(var n=0;n<i;n++)if(r[n]===t)return e}}}(e);if(T(n)||void 0!==t&&!G(t))return r[1]=function(t,e){if(T(n)&&(e=f(n,this,rh(t),e)),!G(e))return e},Ra(nh,null,r)},dh=function(t,e,r){var n=ih(r,e-1),o=ih(r,e+1);return oh(fh,t)&&!oh(lh,o)||oh(lh,t)&&!oh(fh,n)?\"\\\\u\"+sh(ah(t,0),16):t};nh&&Ce({target:\"JSON\",stat:!0,arity:3,forced:hh||ph},{stringify:function(t,e,r){var n=vo(arguments),o=Ra(hh?vh:nh,null,n);return ph&&\"string\"==typeof o?uh(o,ch,dh):o}});var gh=!H||a(function(){xe.f(1)});Ce({target:\"Object\",stat:!0,forced:gh},{getOwnPropertySymbols:function(t){var e=xe.f;return e?e(it(t)):[]}}),bl(\"asyncIterator\");var yh=i.Symbol,mh=yh&&yh.prototype;if(u&&T(yh)&&(!(\"description\"in mh)||void 0!==yh().description)){var bh={},wh=function(){var t=arguments.length<1||void 0===arguments[0]?void 0:Wr(arguments[0]),e=U(mh,this)?new yh(t):void 0===t?yh():yh(t);return\"\"===t&&(bh[e]=!0),e};Ae(wh,yh),wh.prototype=mh,mh.constructor=wh;var Sh=\"Symbol(description detection)\"===String(yh(\"description detection\")),Eh=b(mh.valueOf),Oh=b(mh.toString),xh=/^Symbol\\((.*)\\)[^)]+$/,Rh=b(\"\".replace),Ph=b(\"\".slice);so(mh,\"description\",{configurable:!0,get:function(){var t=Eh(this);if(ut(bh,t))return\"\";var e=Oh(t),r=Sh?Ph(e,7,-1):Rh(e,xh,\"$1\");return\"\"===r?void 0:r}}),Ce({global:!0,constructor:!0,forced:!0},{Symbol:wh})}bl(\"hasInstance\"),bl(\"isConcatSpreadable\"),bl(\"iterator\"),bl(\"match\"),bl(\"matchAll\"),bl(\"replace\"),bl(\"search\"),bl(\"species\"),bl(\"split\"),bl(\"toPrimitive\"),wl(),bl(\"toStringTag\"),an(L(\"Symbol\"),\"Symbol\"),bl(\"unscopables\"),an(i.JSON,\"JSON\",!0),an(Math,\"Math\",!0);var Ah=Ct.f,jh=dt(\"metadata\"),kh=Function.prototype;void 0===kh[jh]&&Ah(kh,jh,{value:null});var Ih=Ct.f,Th=Rt.f,Mh=i.Symbol;if(bl(\"asyncDispose\"),Mh){var Lh=Th(Mh,\"asyncDispose\");Lh.enumerable&&Lh.configurable&&Lh.writable&&Ih(Mh,\"asyncDispose\",{value:Lh.value,enumerable:!1,configurable:!1,writable:!1})}var Uh=Ct.f,Nh=Rt.f,Ch=i.Symbol;if(bl(\"dispose\"),Ch){var _h=Nh(Ch,\"dispose\");_h.enumerable&&_h.configurable&&_h.writable&&Uh(Ch,\"dispose\",{value:_h.value,enumerable:!1,configurable:!1,writable:!1})}bl(\"metadata\");var Fh=L(\"Symbol\"),Bh=Fh.keyFor,Dh=b(Fh.prototype.valueOf),zh=Fh.isRegisteredSymbol||function(t){try{return void 0!==Bh(Dh(t))}catch(t){return!1}};Ce({target:\"Symbol\",stat:!0},{isRegisteredSymbol:zh});for(var Wh=L(\"Symbol\"),qh=Wh.isWellKnownSymbol,Hh=L(\"Object\",\"getOwnPropertyNames\"),$h=b(Wh.prototype.valueOf),Kh=nt(\"wks\"),Gh=0,Vh=Hh(Wh),Yh=Vh.length;Gh<Yh;Gh++)try{var Xh=Vh[Gh];G(Wh[Xh])&&dt(Xh)}catch(t){}var Jh=function(t){if(qh&&qh(t))return!0;try{for(var e=$h(t),r=0,n=Hh(Kh),o=n.length;r<o;r++)if(Kh[n[r]]==e)return!0}catch(t){}return!1};Ce({target:\"Symbol\",stat:!0,forced:!0},{isWellKnownSymbol:Jh}),bl(\"customMatcher\"),bl(\"observable\"),Ce({target:\"Symbol\",stat:!0,name:\"isRegisteredSymbol\"},{isRegistered:zh}),Ce({target:\"Symbol\",stat:!0,name:\"isWellKnownSymbol\",forced:!0},{isWellKnown:Jh}),bl(\"matcher\"),bl(\"metadataKey\"),bl(\"patternMatch\"),bl(\"replaceAll\"),yl.f(\"asyncIterator\");var Qh=Gr.codeAt;Ce({target:\"String\",proto:!0},{codePointAt:function(t){return Qh(this,t)}}),Ze(\"String\",\"codePointAt\");var Zh=TypeError,tp=function(t){if(es(t))throw new Zh(\"The method doesn't accept regular expressions\");return t},ep=dt(\"match\"),rp=function(t){var e=/./;try{\"/./\"[t](e)}catch(r){try{return e[ep]=!1,\"/./\"[t](e)}catch(t){}}return!1},np=Rt.f,op=or(\"\".slice),ip=Math.min,ap=rp(\"endsWith\"),up=!ap&&!!function(){var t=np(String.prototype,\"endsWith\");return t&&!t.writable}();Ce({target:\"String\",proto:!0,forced:!up&&!ap},{endsWith:function(t){var e=Wr(j(this));tp(t);var r=arguments.length>1?arguments[1]:void 0,n=e.length,o=void 0===r?n:ip(ve(r),n),i=Wr(t);return op(e,o-i.length,o)===i}}),Ze(\"String\",\"endsWith\");var sp=RangeError,cp=String.fromCharCode,fp=String.fromCodePoint,lp=b([].join);Ce({target:\"String\",stat:!0,arity:1,forced:!!fp&&1!==fp.length},{fromCodePoint:function(t){for(var e,r=[],n=arguments.length,o=0;n>o;){if(e=+arguments[o++],he(e,1114111)!==e)throw new sp(e+\" is not a valid code point\");r[o]=e<65536?cp(e):cp(55296+((e-=65536)>>10),e%1024+56320)}return lp(r,\"\")}});var hp=b(\"\".indexOf);Ce({target:\"String\",proto:!0,forced:!rp(\"includes\")},{includes:function(t){return!!~hp(Wr(j(this)),Wr(tp(t)),arguments.length>1?arguments[1]:void 0)}}),Ze(\"String\",\"includes\"),b(un.String);var pp=/Version\\/10(?:\\.\\d+){1,2}(?: [\\w./]+)?(?: Mobile\\/\\w+)? Safari\\//.test(_),vp=Xc.start;Ce({target:\"String\",proto:!0,forced:pp},{padStart:function(t){return vp(this,t,arguments.length>1?arguments[1]:void 0)}}),Ze(\"String\",\"padStart\");var dp=Xc.end;Ce({target:\"String\",proto:!0,forced:pp},{padEnd:function(t){return dp(this,t,arguments.length>1?arguments[1]:void 0)}}),Ze(\"String\",\"padEnd\");var gp=b([].push),yp=b([].join);Ce({target:\"String\",stat:!0},{raw:function(t){var e=k(it(t).raw),r=de(e);if(!r)return\"\";for(var n=arguments.length,o=[],i=0;;){if(gp(o,Wr(e[i++])),i===r)return yp(o,\"\");i<n&&gp(o,Wr(arguments[i]))}}}),Ce({target:\"String\",proto:!0},{repeat:$c}),Ze(\"String\",\"repeat\");var mp=Rt.f,bp=or(\"\".slice),wp=Math.min,Sp=rp(\"startsWith\"),Ep=!Sp&&!!function(){var t=mp(String.prototype,\"startsWith\");return t&&!t.writable}();Ce({target:\"String\",proto:!0,forced:!Ep&&!Sp},{startsWith:function(t){var e=Wr(j(this));tp(t);var r=ve(wp(arguments.length>1?arguments[1]:void 0,e.length)),n=Wr(t);return bp(e,r,r+n.length)===n}}),Ze(\"String\",\"startsWith\");var Op=zt.PROPER,xp=function(t){return a(function(){return!!Mi[t]()||\"​᠎\"!==\"​᠎\"[t]()||Op&&Mi[t].name!==t})},Rp=_i.start,Pp=xp(\"trimStart\")?function(){return Rp(this)}:\"\".trimStart;Ce({target:\"String\",proto:!0,name:\"trimStart\",forced:\"\".trimLeft!==Pp},{trimLeft:Pp}),Ce({target:\"String\",proto:!0,name:\"trimStart\",forced:\"\".trimStart!==Pp},{trimStart:Pp}),Ze(\"String\",\"trimLeft\");var Ap=_i.end,jp=xp(\"trimEnd\")?function(){return Ap(this)}:\"\".trimEnd;Ce({target:\"String\",proto:!0,name:\"trimEnd\",forced:\"\".trimRight!==jp},{trimRight:jp}),Ce({target:\"String\",proto:!0,name:\"trimEnd\",forced:\"\".trimEnd!==jp},{trimEnd:jp}),Ze(\"String\",\"trimRight\");var kp=Object.getOwnPropertyDescriptor,Ip=function(t){if(!u)return i[t];var e=kp(i,t);return e&&e.value},Tp=dt(\"iterator\"),Mp=!a(function(){var t=new URL(\"b?a=1&b=2&c=3\",\"https://a\"),e=t.searchParams,r=new URLSearchParams(\"a=1&a=2&b=3\"),n=\"\";return t.pathname=\"c%20d\",e.forEach(function(t,r){e.delete(\"b\"),n+=r+t}),r.delete(\"a\",2),r.delete(\"b\",void 0),!e.size&&!u||!e.sort||\"https://a/c%20d?a=1&c=3\"!==t.href||\"3\"!==e.get(\"c\")||\"a=1\"!==String(new URLSearchParams(\"?a=1\"))||!e[Tp]||\"a\"!==new URL(\"https://a@b\").username||\"b\"!==new URLSearchParams(new URLSearchParams(\"a=b\")).get(\"a\")||\"xn--e1aybc\"!==new URL(\"https://тест\").host||\"#%D0%B1\"!==new URL(\"https://a#б\").hash||\"a1c3\"!==n||\"x\"!==new URL(\"https://x\",void 0).host}),Lp=TypeError,Up=function(t,e){if(t<e)throw new Lp(\"Not enough arguments\");return t},Np=Math.floor,Cp=function(t,e){var r=t.length;if(r<8)for(var n,o,i=1;i<r;){for(o=i,n=t[i];o&&e(t[o-1],n)>0;)t[o]=t[--o];o!==i++&&(t[o]=n)}else for(var a=Np(r/2),u=Cp(vo(t,0,a),e),s=Cp(vo(t,a),e),c=u.length,f=s.length,l=0,h=0;l<c||h<f;)t[l+h]=l<c&&h<f?e(u[l],s[h])<=0?u[l++]:s[h++]:l<c?u[l++]:s[h++];return t},_p=Cp,Fp=dt(\"iterator\"),Bp=\"URLSearchParams\",Dp=Bp+\"Iterator\",zp=ne.set,Wp=ne.getterFor(Bp),qp=ne.getterFor(Dp),Hp=Ip(\"fetch\"),$p=Ip(\"Request\"),Kp=Ip(\"Headers\"),Gp=$p&&$p.prototype,Vp=Kp&&Kp.prototype,Yp=i.TypeError,Xp=i.encodeURIComponent,Jp=String.fromCharCode,Qp=L(\"String\",\"fromCodePoint\"),Zp=parseInt,tv=b(\"\".charAt),ev=b([].join),rv=b([].push),nv=b(\"\".replace),ov=b([].shift),iv=b([].splice),av=b(\"\".split),uv=b(\"\".slice),sv=b(/./.exec),cv=/\\+/g,fv=/^[0-9a-f]+$/i,lv=function(t,e){var r=uv(t,e,e+2);return sv(fv,r)?Zp(r,16):NaN},hv=function(t){for(var e=0,r=128;r>0&&0!=(t&r);r>>=1)e++;return e},pv=function(t){var e=null;switch(t.length){case 1:e=t[0];break;case 2:e=(31&t[0])<<6|63&t[1];break;case 3:e=(15&t[0])<<12|(63&t[1])<<6|63&t[2];break;case 4:e=(7&t[0])<<18|(63&t[1])<<12|(63&t[2])<<6|63&t[3]}return e>1114111?null:e},vv=function(t){for(var e=(t=nv(t,cv,\" \")).length,r=\"\",n=0;n<e;){var o=tv(t,n);if(\"%\"===o){if(\"%\"===tv(t,n+1)||n+3>e){r+=\"%\",n++;continue}var i=lv(t,n+1);if(i!=i){r+=o,n++;continue}n+=2;var a=hv(i);if(0===a)o=Jp(i);else{if(1===a||a>4){r+=\"�\",n++;continue}for(var u=[i],s=1;s<a&&!(3+ ++n>e||\"%\"!==tv(t,n));){var c=lv(t,n+1);if(c!=c){n+=3;break}if(c>191||c<128)break;rv(u,c),n+=2,s++}if(u.length!==a){r+=\"�\";continue}var f=pv(u);null===f?r+=\"�\":o=Qp(f)}}r+=o,n++}return r},dv=/[!'()~]|%20/g,gv={\"!\":\"%21\",\"'\":\"%27\",\"(\":\"%28\",\")\":\"%29\",\"~\":\"%7E\",\"%20\":\"+\"},yv=function(t){return gv[t]},mv=function(t){return nv(Xp(t),dv,yv)},bv=fn(function(t,e){zp(this,{type:Dp,target:Wp(t).entries,index:0,kind:e})},Bp,function(){var t=qp(this),e=t.target,r=t.index++;if(!e||r>=e.length)return t.target=null,Pn(void 0,!0);var n=e[r];switch(t.kind){case\"keys\":return Pn(n.key,!1);case\"values\":return Pn(n.value,!1)}return Pn([n.key,n.value],!1)},!0),wv=function(t){this.entries=[],this.url=null,void 0!==t&&(M(t)?this.parseObject(t):this.parseQuery(\"string\"==typeof t?\"?\"===tv(t,0)?uv(t,1):t:Wr(t)))};wv.prototype={type:Bp,bindURL:function(t){this.url=t,this.update()},parseObject:function(t){var e,r,n,o,i,a,u,s=this.entries,c=Fn(t);if(c)for(r=(e=Dn(t,c)).next;!(n=f(r,e)).done;){if(o=Dn(kt(n.value)),(a=f(i=o.next,o)).done||(u=f(i,o)).done||!f(i,o).done)throw new Yp(\"Expected sequence with length 2\");rv(s,{key:Wr(a.value),value:Wr(u.value)})}else for(var l in t)ut(t,l)&&rv(s,{key:l,value:Wr(t[l])})},parseQuery:function(t){if(t)for(var e,r,n=this.entries,o=av(t,\"&\"),i=0;i<o.length;)(e=o[i++]).length&&(r=av(e,\"=\"),rv(n,{key:vv(ov(r)),value:vv(ev(r,\"=\"))}))},serialize:function(){for(var t,e=this.entries,r=[],n=0;n<e.length;)t=e[n++],rv(r,mv(t.key)+\"=\"+mv(t.value));return ev(r,\"&\")},update:function(){this.entries.length=0,this.parseQuery(this.url.query)},updateURL:function(){this.url&&this.url.update()}};var Sv=function(){ko(this,Ev);var t=zp(this,new wv(arguments.length>0?arguments[0]:void 0));u||(this.size=t.entries.length)},Ev=Sv.prototype;if(Mo(Ev,{append:function(t,e){var r=Wp(this);Up(arguments.length,2),rv(r.entries,{key:Wr(t),value:Wr(e)}),u||this.length++,r.updateURL()},delete:function(t){for(var e=Wp(this),r=Up(arguments.length,1),n=e.entries,o=Wr(t),i=r<2?void 0:arguments[1],a=void 0===i?i:Wr(i),s=0;s<n.length;){var c=n[s];if(c.key!==o||void 0!==a&&c.value!==a)s++;else if(iv(n,s,1),void 0!==a)break}u||(this.size=n.length),e.updateURL()},get:function(t){var e=Wp(this).entries;Up(arguments.length,1);for(var r=Wr(t),n=0;n<e.length;n++)if(e[n].key===r)return e[n].value;return null},getAll:function(t){var e=Wp(this).entries;Up(arguments.length,1);for(var r=Wr(t),n=[],o=0;o<e.length;o++)e[o].key===r&&rv(n,e[o].value);return n},has:function(t){for(var e=Wp(this).entries,r=Up(arguments.length,1),n=Wr(t),o=r<2?void 0:arguments[1],i=void 0===o?o:Wr(o),a=0;a<e.length;){var u=e[a++];if(u.key===n&&(void 0===i||u.value===i))return!0}return!1},set:function(t,e){var r=Wp(this);Up(arguments.length,1);for(var n,o=r.entries,i=!1,a=Wr(t),s=Wr(e),c=0;c<o.length;c++)(n=o[c]).key===a&&(i?iv(o,c--,1):(i=!0,n.value=s));i||rv(o,{key:a,value:s}),u||(this.size=o.length),r.updateURL()},sort:function(){var t=Wp(this);_p(t.entries,function(t,e){return t.key>e.key?1:-1}),t.updateURL()},forEach:function(t){for(var e,r=Wp(this).entries,n=ar(t,arguments.length>1?arguments[1]:void 0),o=0;o<r.length;)n((e=r[o++]).value,e.key,this)},keys:function(){return new bv(this,\"keys\")},values:function(){return new bv(this,\"values\")},entries:function(){return new bv(this,\"entries\")}},{enumerable:!0}),ie(Ev,Fp,Ev.entries,{name:\"entries\"}),ie(Ev,\"toString\",function(){return Wp(this).serialize()},{enumerable:!0}),u&&so(Ev,\"size\",{get:function(){return Wp(this).entries.length},configurable:!0,enumerable:!0}),an(Sv,Bp),Ce({global:!0,constructor:!0,forced:!Mp},{URLSearchParams:Sv}),!Mp&&T(Kp)){var Ov=b(Vp.has),xv=b(Vp.set),Rv=function(t){if(M(t)){var e,r=t.body;if(pr(r)===Bp)return e=t.headers?new Kp(t.headers):new Kp,Ov(e,\"content-type\")||xv(e,\"content-type\",\"application/x-www-form-urlencoded;charset=UTF-8\"),Ve(t,{body:d(0,Wr(r)),headers:d(0,e)})}return t};if(T(Hp)&&Ce({global:!0,enumerable:!0,dontCallGetSet:!0,forced:!0},{fetch:function(t){return Hp(t,arguments.length>1?Rv(arguments[1]):{})}}),T($p)){var Pv=function(t){return ko(this,Gp),new $p(t,arguments.length>1?Rv(arguments[1]):{})};Gp.constructor=Pv,Pv.prototype=Gp,Ce({global:!0,constructor:!0,dontCallGetSet:!0,forced:!0},{Request:Pv})}}var Av={URLSearchParams:Sv,getState:Wp},jv=URLSearchParams,kv=jv.prototype,Iv=b(kv.append),Tv=b(kv.delete),Mv=b(kv.forEach),Lv=b([].push),Uv=new jv(\"a=1&a=2&b=3\");Uv.delete(\"a\",1),Uv.delete(\"b\",void 0),Uv+\"\"!=\"a=2\"&&ie(kv,\"delete\",function(t){var e=arguments.length,r=e<2?void 0:arguments[1];if(e&&void 0===r)return Tv(this,t);var n=[];Mv(this,function(t,e){Lv(n,{key:e,value:t})}),Up(e,1);for(var o,i=Wr(t),a=Wr(r),u=0,s=0,c=!1,f=n.length;u<f;)o=n[u++],c||o.key===i?(c=!0,Tv(this,o.key)):s++;for(;s<f;)(o=n[s++]).key===i&&o.value===a||Iv(this,o.key,o.value)},{enumerable:!0,unsafe:!0});var Nv=URLSearchParams,Cv=Nv.prototype,_v=b(Cv.getAll),Fv=b(Cv.has),Bv=new Nv(\"a=1\");!Bv.has(\"a\",2)&&Bv.has(\"a\",void 0)||ie(Cv,\"has\",function(t){var e=arguments.length,r=e<2?void 0:arguments[1];if(e&&void 0===r)return Fv(this,t);var n=_v(this,t);Up(e,1);for(var o=Wr(r),i=0;i<n.length;)if(n[i++]===o)return!0;return!1},{enumerable:!0,unsafe:!0});var Dv=URLSearchParams.prototype,zv=b(Dv.forEach);u&&!(\"size\"in Dv)&&so(Dv,\"size\",{get:function(){var t=0;return zv(this,function(){t++}),t},configurable:!0,enumerable:!0});var Wv,qv=Object.assign,Hv=Object.defineProperty,$v=b([].concat),Kv=!qv||a(function(){if(u&&1!==qv({b:1},qv(Hv({},\"a\",{enumerable:!0,get:function(){Hv(this,\"b\",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var t={},e={},r=Symbol(\"assign detection\"),n=\"abcdefghijklmnopqrst\";return t[r]=7,n.split(\"\").forEach(function(t){e[t]=t}),7!==qv({},t)[r]||_e(qv({},e)).join(\"\")!==n})?function(t,e){for(var r=it(t),n=arguments.length,o=1,i=xe.f,a=v.f;n>o;)for(var s,c=R(arguments[o++]),l=i?$v(_e(c),i(c)):_e(c),h=l.length,p=0;h>p;)s=l[p++],u&&!f(a,c,s)||(r[s]=c[s]);return r}:qv,Gv=2147483647,Vv=/[^\\0-\\u007E]/,Yv=/[.\\u3002\\uFF0E\\uFF61]/g,Xv=\"Overflow: input needs wider integers to process\",Jv=RangeError,Qv=b(Yv.exec),Zv=Math.floor,td=String.fromCharCode,ed=b(\"\".charCodeAt),rd=b([].join),nd=b([].push),od=b(\"\".replace),id=b(\"\".split),ad=b(\"\".toLowerCase),ud=function(t){return t+22+75*(t<26)},sd=function(t,e,r){var n=0;for(t=r?Zv(t/700):t>>1,t+=Zv(t/e);t>455;)t=Zv(t/35),n+=36;return Zv(n+36*t/(t+38))},cd=function(t){var e=[];t=function(t){for(var e=[],r=0,n=t.length;r<n;){var o=ed(t,r++);if(o>=55296&&o<=56319&&r<n){var i=ed(t,r++);56320==(64512&i)?nd(e,((1023&o)<<10)+(1023&i)+65536):(nd(e,o),r--)}else nd(e,o)}return e}(t);var r,n,o=t.length,i=128,a=0,u=72;for(r=0;r<t.length;r++)(n=t[r])<128&&nd(e,td(n));var s=e.length,c=s;for(s&&nd(e,\"-\");c<o;){var f=Gv;for(r=0;r<t.length;r++)(n=t[r])>=i&&n<f&&(f=n);var l=c+1;if(f-i>Zv((Gv-a)/l))throw new Jv(Xv);for(a+=(f-i)*l,i=f,r=0;r<t.length;r++){if((n=t[r])<i&&++a>Gv)throw new Jv(Xv);if(n===i){for(var h=a,p=36;;){var v=p<=u?1:p>=u+26?26:p-u;if(h<v)break;var d=h-v,g=36-v;nd(e,td(ud(v+d%g))),h=Zv(d/g),p+=36}nd(e,td(ud(h))),u=sd(a,l,c===s),a=0,c++}}a++,i++}return rd(e,\"\")},fd=Gr.codeAt,ld=ne.set,hd=ne.getterFor(\"URL\"),pd=Av.URLSearchParams,vd=Av.getState,dd=i.URL,gd=i.TypeError,yd=i.parseInt,md=Math.floor,bd=Math.pow,wd=b(\"\".charAt),Sd=b(/./.exec),Ed=b([].join),Od=b(1..toString),xd=b([].pop),Rd=b([].push),Pd=b(\"\".replace),Ad=b([].shift),jd=b(\"\".split),kd=b(\"\".slice),Id=b(\"\".toLowerCase),Td=b([].unshift),Md=\"Invalid scheme\",Ld=\"Invalid host\",Ud=\"Invalid port\",Nd=/[a-z]/i,Cd=/[\\d+-.a-z]/i,_d=/\\d/,Fd=/^0x/i,Bd=/^[0-7]+$/,Dd=/^\\d+$/,zd=/^[\\da-f]+$/i,Wd=/[\\0\\t\\n\\r #%/:<>?@[\\\\\\]^|]/,qd=/[\\0\\t\\n\\r #/:<>?@[\\\\\\]^|]/,Hd=/^[\\u0000-\\u0020]+/,$d=/(^|[^\\u0000-\\u0020])[\\u0000-\\u0020]+$/,Kd=/[\\t\\n\\r]/g,Gd=function(t){var e,r,n,o;if(\"number\"==typeof t){for(e=[],r=0;r<4;r++)Td(e,t%256),t=md(t/256);return Ed(e,\".\")}if(\"object\"==typeof t){for(e=\"\",n=function(t){for(var e=null,r=1,n=null,o=0,i=0;i<8;i++)0!==t[i]?(o>r&&(e=n,r=o),n=null,o=0):(null===n&&(n=i),++o);return o>r?n:e}(t),r=0;r<8;r++)o&&0===t[r]||(o&&(o=!1),n===r?(e+=r?\":\":\"::\",o=!0):(e+=Od(t[r],16),r<7&&(e+=\":\")));return\"[\"+e+\"]\"}return t},Vd={},Yd=Kv({},Vd,{\" \":1,'\"':1,\"<\":1,\">\":1,\"`\":1}),Xd=Kv({},Yd,{\"#\":1,\"?\":1,\"{\":1,\"}\":1}),Jd=Kv({},Xd,{\"/\":1,\":\":1,\";\":1,\"=\":1,\"@\":1,\"[\":1,\"\\\\\":1,\"]\":1,\"^\":1,\"|\":1}),Qd=function(t,e){var r=fd(t,0);return r>32&&r<127&&!ut(e,t)?t:encodeURIComponent(t)},Zd={ftp:21,file:null,http:80,https:443,ws:80,wss:443},tg=function(t,e){var r;return 2===t.length&&Sd(Nd,wd(t,0))&&(\":\"===(r=wd(t,1))||!e&&\"|\"===r)},eg=function(t){var e;return t.length>1&&tg(kd(t,0,2))&&(2===t.length||\"/\"===(e=wd(t,2))||\"\\\\\"===e||\"?\"===e||\"#\"===e)},rg=function(t){return\".\"===t||\"%2e\"===Id(t)},ng={},og={},ig={},ag={},ug={},sg={},cg={},fg={},lg={},hg={},pg={},vg={},dg={},gg={},yg={},mg={},bg={},wg={},Sg={},Eg={},Og={},xg=function(t,e,r){var n,o,i,a=Wr(t);if(e){if(o=this.parse(a))throw new gd(o);this.searchParams=null}else{if(void 0!==r&&(n=new xg(r,!0)),o=this.parse(a,null,n))throw new gd(o);(i=vd(new pd)).bindURL(this),this.searchParams=i}};xg.prototype={type:\"URL\",parse:function(t,e,r){var n,o,i,a,u,s=this,c=e||ng,f=0,l=\"\",h=!1,p=!1,v=!1;for(t=Wr(t),e||(s.scheme=\"\",s.username=\"\",s.password=\"\",s.host=null,s.port=null,s.path=[],s.query=null,s.fragment=null,s.cannotBeABaseURL=!1,t=Pd(t,Hd,\"\"),t=Pd(t,$d,\"$1\")),t=Pd(t,Kd,\"\"),n=Wn(t);f<=n.length;){switch(o=n[f],c){case ng:if(!o||!Sd(Nd,o)){if(e)return Md;c=ig;continue}l+=Id(o),c=og;break;case og:if(o&&(Sd(Cd,o)||\"+\"===o||\"-\"===o||\".\"===o))l+=Id(o);else{if(\":\"!==o){if(e)return Md;l=\"\",c=ig,f=0;continue}if(e&&(s.isSpecial()!==ut(Zd,l)||\"file\"===l&&(s.includesCredentials()||null!==s.port)||\"file\"===s.scheme&&!s.host))return;if(s.scheme=l,e)return void(s.isSpecial()&&Zd[s.scheme]===s.port&&(s.port=null));l=\"\",\"file\"===s.scheme?c=gg:s.isSpecial()&&r&&r.scheme===s.scheme?c=ag:s.isSpecial()?c=fg:\"/\"===n[f+1]?(c=ug,f++):(s.cannotBeABaseURL=!0,Rd(s.path,\"\"),c=Sg)}break;case ig:if(!r||r.cannotBeABaseURL&&\"#\"!==o)return Md;if(r.cannotBeABaseURL&&\"#\"===o){s.scheme=r.scheme,s.path=vo(r.path),s.query=r.query,s.fragment=\"\",s.cannotBeABaseURL=!0,c=Og;break}c=\"file\"===r.scheme?gg:sg;continue;case ag:if(\"/\"!==o||\"/\"!==n[f+1]){c=sg;continue}c=lg,f++;break;case ug:if(\"/\"===o){c=hg;break}c=wg;continue;case sg:if(s.scheme=r.scheme,o===Wv)s.username=r.username,s.password=r.password,s.host=r.host,s.port=r.port,s.path=vo(r.path),s.query=r.query;else if(\"/\"===o||\"\\\\\"===o&&s.isSpecial())c=cg;else if(\"?\"===o)s.username=r.username,s.password=r.password,s.host=r.host,s.port=r.port,s.path=vo(r.path),s.query=\"\",c=Eg;else{if(\"#\"!==o){s.username=r.username,s.password=r.password,s.host=r.host,s.port=r.port,s.path=vo(r.path),s.path.length--,c=wg;continue}s.username=r.username,s.password=r.password,s.host=r.host,s.port=r.port,s.path=vo(r.path),s.query=r.query,s.fragment=\"\",c=Og}break;case cg:if(!s.isSpecial()||\"/\"!==o&&\"\\\\\"!==o){if(\"/\"!==o){s.username=r.username,s.password=r.password,s.host=r.host,s.port=r.port,c=wg;continue}c=hg}else c=lg;break;case fg:if(c=lg,\"/\"!==o||\"/\"!==wd(l,f+1))continue;f++;break;case lg:if(\"/\"!==o&&\"\\\\\"!==o){c=hg;continue}break;case hg:if(\"@\"===o){h&&(l=\"%40\"+l),h=!0,i=Wn(l);for(var d=0;d<i.length;d++){var g=i[d];if(\":\"!==g||v){var y=Qd(g,Jd);v?s.password+=y:s.username+=y}else v=!0}l=\"\"}else if(o===Wv||\"/\"===o||\"?\"===o||\"#\"===o||\"\\\\\"===o&&s.isSpecial()){if(h&&\"\"===l)return\"Invalid authority\";f-=Wn(l).length+1,l=\"\",c=pg}else l+=o;break;case pg:case vg:if(e&&\"file\"===s.scheme){c=mg;continue}if(\":\"!==o||p){if(o===Wv||\"/\"===o||\"?\"===o||\"#\"===o||\"\\\\\"===o&&s.isSpecial()){if(s.isSpecial()&&\"\"===l)return Ld;if(e&&\"\"===l&&(s.includesCredentials()||null!==s.port))return;if(a=s.parseHost(l))return a;if(l=\"\",c=bg,e)return;continue}\"[\"===o?p=!0:\"]\"===o&&(p=!1),l+=o}else{if(\"\"===l)return Ld;if(a=s.parseHost(l))return a;if(l=\"\",c=dg,e===vg)return}break;case dg:if(!Sd(_d,o)){if(o===Wv||\"/\"===o||\"?\"===o||\"#\"===o||\"\\\\\"===o&&s.isSpecial()||e){if(\"\"!==l){var m=yd(l,10);if(m>65535)return Ud;s.port=s.isSpecial()&&m===Zd[s.scheme]?null:m,l=\"\"}if(e)return;c=bg;continue}return Ud}l+=o;break;case gg:if(s.scheme=\"file\",\"/\"===o||\"\\\\\"===o)c=yg;else{if(!r||\"file\"!==r.scheme){c=wg;continue}switch(o){case Wv:s.host=r.host,s.path=vo(r.path),s.query=r.query;break;case\"?\":s.host=r.host,s.path=vo(r.path),s.query=\"\",c=Eg;break;case\"#\":s.host=r.host,s.path=vo(r.path),s.query=r.query,s.fragment=\"\",c=Og;break;default:eg(Ed(vo(n,f),\"\"))||(s.host=r.host,s.path=vo(r.path),s.shortenPath()),c=wg;continue}}break;case yg:if(\"/\"===o||\"\\\\\"===o){c=mg;break}r&&\"file\"===r.scheme&&!eg(Ed(vo(n,f),\"\"))&&(tg(r.path[0],!0)?Rd(s.path,r.path[0]):s.host=r.host),c=wg;continue;case mg:if(o===Wv||\"/\"===o||\"\\\\\"===o||\"?\"===o||\"#\"===o){if(!e&&tg(l))c=wg;else if(\"\"===l){if(s.host=\"\",e)return;c=bg}else{if(a=s.parseHost(l))return a;if(\"localhost\"===s.host&&(s.host=\"\"),e)return;l=\"\",c=bg}continue}l+=o;break;case bg:if(s.isSpecial()){if(c=wg,\"/\"!==o&&\"\\\\\"!==o)continue}else if(e||\"?\"!==o)if(e||\"#\"!==o){if(o!==Wv&&(c=wg,\"/\"!==o))continue}else s.fragment=\"\",c=Og;else s.query=\"\",c=Eg;break;case wg:if(o===Wv||\"/\"===o||\"\\\\\"===o&&s.isSpecial()||!e&&(\"?\"===o||\"#\"===o)){if(\"..\"===(u=Id(u=l))||\"%2e.\"===u||\".%2e\"===u||\"%2e%2e\"===u?(s.shortenPath(),\"/\"===o||\"\\\\\"===o&&s.isSpecial()||Rd(s.path,\"\")):rg(l)?\"/\"===o||\"\\\\\"===o&&s.isSpecial()||Rd(s.path,\"\"):(\"file\"===s.scheme&&!s.path.length&&tg(l)&&(s.host&&(s.host=\"\"),l=wd(l,0)+\":\"),Rd(s.path,l)),l=\"\",\"file\"===s.scheme&&(o===Wv||\"?\"===o||\"#\"===o))for(;s.path.length>1&&\"\"===s.path[0];)Ad(s.path);\"?\"===o?(s.query=\"\",c=Eg):\"#\"===o&&(s.fragment=\"\",c=Og)}else l+=Qd(o,Xd);break;case Sg:\"?\"===o?(s.query=\"\",c=Eg):\"#\"===o?(s.fragment=\"\",c=Og):o!==Wv&&(s.path[0]+=Qd(o,Vd));break;case Eg:e||\"#\"!==o?o!==Wv&&(\"'\"===o&&s.isSpecial()?s.query+=\"%27\":s.query+=\"#\"===o?\"%23\":Qd(o,Vd)):(s.fragment=\"\",c=Og);break;case Og:o!==Wv&&(s.fragment+=Qd(o,Yd))}f++}},parseHost:function(t){var e,r,n;if(\"[\"===wd(t,0)){if(\"]\"!==wd(t,t.length-1))return Ld;if(e=function(t){var e,r,n,o,i,a,u,s=[0,0,0,0,0,0,0,0],c=0,f=null,l=0,h=function(){return wd(t,l)};if(\":\"===h()){if(\":\"!==wd(t,1))return;l+=2,f=++c}for(;h();){if(8===c)return;if(\":\"!==h()){for(e=r=0;r<4&&Sd(zd,h());)e=16*e+yd(h(),16),l++,r++;if(\".\"===h()){if(0===r)return;if(l-=r,c>6)return;for(n=0;h();){if(o=null,n>0){if(!(\".\"===h()&&n<4))return;l++}if(!Sd(_d,h()))return;for(;Sd(_d,h());){if(i=yd(h(),10),null===o)o=i;else{if(0===o)return;o=10*o+i}if(o>255)return;l++}s[c]=256*s[c]+o,2!=++n&&4!==n||c++}if(4!==n)return;break}if(\":\"===h()){if(l++,!h())return}else if(h())return;s[c++]=e}else{if(null!==f)return;l++,f=++c}}if(null!==f)for(a=c-f,c=7;0!==c&&a>0;)u=s[c],s[c--]=s[f+a-1],s[f+--a]=u;else if(8!==c)return;return s}(kd(t,1,-1)),!e)return Ld;this.host=e}else if(this.isSpecial()){if(t=function(t){var e,r,n=[],o=id(od(ad(t),Yv,\".\"),\".\");for(e=0;e<o.length;e++)nd(n,Qv(Vv,r=o[e])?\"xn--\"+cd(r):r);return rd(n,\".\")}(t),Sd(Wd,t))return Ld;if(e=function(t){var e,r,n,o,i,a,u,s=jd(t,\".\");if(s.length&&\"\"===s[s.length-1]&&s.length--,(e=s.length)>4)return t;for(r=[],n=0;n<e;n++){if(\"\"===(o=s[n]))return t;if(i=10,o.length>1&&\"0\"===wd(o,0)&&(i=Sd(Fd,o)?16:8,o=kd(o,8===i?1:2)),\"\"===o)a=0;else{if(!Sd(10===i?Dd:8===i?Bd:zd,o))return t;a=yd(o,i)}Rd(r,a)}for(n=0;n<e;n++)if(a=r[n],n===e-1){if(a>=bd(256,5-e))return null}else if(a>255)return null;for(u=xd(r),n=0;n<r.length;n++)u+=r[n]*bd(256,3-n);return u}(t),null===e)return Ld;this.host=e}else{if(Sd(qd,t))return Ld;for(e=\"\",r=Wn(t),n=0;n<r.length;n++)e+=Qd(r[n],Vd);this.host=e}},cannotHaveUsernamePasswordPort:function(){return!this.host||this.cannotBeABaseURL||\"file\"===this.scheme},includesCredentials:function(){return\"\"!==this.username||\"\"!==this.password},isSpecial:function(){return ut(Zd,this.scheme)},shortenPath:function(){var t=this.path,e=t.length;!e||\"file\"===this.scheme&&1===e&&tg(t[0],!0)||t.length--},serialize:function(){var t=this,e=t.scheme,r=t.username,n=t.password,o=t.host,i=t.port,a=t.path,u=t.query,s=t.fragment,c=e+\":\";return null!==o?(c+=\"//\",t.includesCredentials()&&(c+=r+(n?\":\"+n:\"\")+\"@\"),c+=Gd(o),null!==i&&(c+=\":\"+i)):\"file\"===e&&(c+=\"//\"),c+=t.cannotBeABaseURL?a[0]:a.length?\"/\"+Ed(a,\"/\"):\"\",null!==u&&(c+=\"?\"+u),null!==s&&(c+=\"#\"+s),c},setHref:function(t){var e=this.parse(t);if(e)throw new gd(e);this.searchParams.update()},getOrigin:function(){var t=this.scheme,e=this.port;if(\"blob\"===t)try{return new Rg(t.path[0]).origin}catch(t){return\"null\"}return\"file\"!==t&&this.isSpecial()?t+\"://\"+Gd(this.host)+(null!==e?\":\"+e:\"\"):\"null\"},getProtocol:function(){return this.scheme+\":\"},setProtocol:function(t){this.parse(Wr(t)+\":\",ng)},getUsername:function(){return this.username},setUsername:function(t){var e=Wn(Wr(t));if(!this.cannotHaveUsernamePasswordPort()){this.username=\"\";for(var r=0;r<e.length;r++)this.username+=Qd(e[r],Jd)}},getPassword:function(){return this.password},setPassword:function(t){var e=Wn(Wr(t));if(!this.cannotHaveUsernamePasswordPort()){this.password=\"\";for(var r=0;r<e.length;r++)this.password+=Qd(e[r],Jd)}},getHost:function(){var t=this.host,e=this.port;return null===t?\"\":null===e?Gd(t):Gd(t)+\":\"+e},setHost:function(t){this.cannotBeABaseURL||this.parse(t,pg)},getHostname:function(){var t=this.host;return null===t?\"\":Gd(t)},setHostname:function(t){this.cannotBeABaseURL||this.parse(t,vg)},getPort:function(){var t=this.port;return null===t?\"\":Wr(t)},setPort:function(t){this.cannotHaveUsernamePasswordPort()||(\"\"===(t=Wr(t))?this.port=null:this.parse(t,dg))},getPathname:function(){var t=this.path;return this.cannotBeABaseURL?t[0]:t.length?\"/\"+Ed(t,\"/\"):\"\"},setPathname:function(t){this.cannotBeABaseURL||(this.path=[],this.parse(t,bg))},getSearch:function(){var t=this.query;return t?\"?\"+t:\"\"},setSearch:function(t){\"\"===(t=Wr(t))?this.query=null:(\"?\"===wd(t,0)&&(t=kd(t,1)),this.query=\"\",this.parse(t,Eg)),this.searchParams.update()},getSearchParams:function(){return this.searchParams.facade},getHash:function(){var t=this.fragment;return t?\"#\"+t:\"\"},setHash:function(t){\"\"!==(t=Wr(t))?(\"#\"===wd(t,0)&&(t=kd(t,1)),this.fragment=\"\",this.parse(t,Og)):this.fragment=null},update:function(){this.query=this.searchParams.serialize()||null}};var Rg=function(t){var e=ko(this,Pg),r=Up(arguments.length,1)>1?arguments[1]:void 0,n=ld(e,new xg(t,!1,r));u||(e.href=n.serialize(),e.origin=n.getOrigin(),e.protocol=n.getProtocol(),e.username=n.getUsername(),e.password=n.getPassword(),e.host=n.getHost(),e.hostname=n.getHostname(),e.port=n.getPort(),e.pathname=n.getPathname(),e.search=n.getSearch(),e.searchParams=n.getSearchParams(),e.hash=n.getHash())},Pg=Rg.prototype,Ag=function(t,e){return{get:function(){return hd(this)[t]()},set:e&&function(t){return hd(this)[e](t)},configurable:!0,enumerable:!0}};if(u&&(so(Pg,\"href\",Ag(\"serialize\",\"setHref\")),so(Pg,\"origin\",Ag(\"getOrigin\")),so(Pg,\"protocol\",Ag(\"getProtocol\",\"setProtocol\")),so(Pg,\"username\",Ag(\"getUsername\",\"setUsername\")),so(Pg,\"password\",Ag(\"getPassword\",\"setPassword\")),so(Pg,\"host\",Ag(\"getHost\",\"setHost\")),so(Pg,\"hostname\",Ag(\"getHostname\",\"setHostname\")),so(Pg,\"port\",Ag(\"getPort\",\"setPort\")),so(Pg,\"pathname\",Ag(\"getPathname\",\"setPathname\")),so(Pg,\"search\",Ag(\"getSearch\",\"setSearch\")),so(Pg,\"searchParams\",Ag(\"getSearchParams\")),so(Pg,\"hash\",Ag(\"getHash\",\"setHash\"))),ie(Pg,\"toJSON\",function(){return hd(this).serialize()},{enumerable:!0}),ie(Pg,\"toString\",function(){return hd(this).serialize()},{enumerable:!0}),dd){var jg=dd.createObjectURL,kg=dd.revokeObjectURL;jg&&ie(Rg,\"createObjectURL\",ar(jg,dd)),kg&&ie(Rg,\"revokeObjectURL\",ar(kg,dd))}an(Rg,\"URL\"),Ce({global:!0,constructor:!0,forced:!Mp,sham:!u},{URL:Rg});var Ig=L(\"URL\"),Tg=Mp&&a(function(){Ig.canParse()}),Mg=a(function(){return 1!==Ig.canParse.length});Ce({target:\"URL\",stat:!0,forced:!Tg||Mg},{canParse:function(t){var e=Up(arguments.length,1),r=Wr(t),n=e<2||void 0===arguments[1]?void 0:Wr(arguments[1]);try{return!!new Ig(r,n)}catch(t){return!1}}});var Lg=L(\"URL\");Ce({target:\"URL\",stat:!0,forced:!Mp},{parse:function(t){var e=Up(arguments.length,1),r=Wr(t),n=e<2||void 0===arguments[1]?void 0:Wr(arguments[1]);try{return new Lg(r,n)}catch(t){return null}}}),Ce({target:\"URL\",proto:!0,enumerable:!0},{toJSON:function(){return f(URL.prototype.toString,this)}});var Ug=WeakMap.prototype,Ng={WeakMap:WeakMap,set:b(Ug.set),get:b(Ug.get),has:b(Ug.has),remove:b(Ug.delete)},Cg=Ng.has,_g=function(t){return Cg(t),t},Fg=Ng.get,Bg=Ng.has,Dg=Ng.set;Ce({target:\"WeakMap\",proto:!0,real:!0,forced:!0},{emplace:function(t,e){var r,n,o=_g(this);return Bg(o,t)?(r=Fg(o,t),\"update\"in e&&(r=e.update(r,t,o),Dg(o,t,r)),r):(n=e.insert(t,o),Dg(o,t,n),n)}}),Ce({target:\"WeakMap\",stat:!0,forced:!0},{from:ei(Ng.WeakMap,Ng.set,!0)}),Ce({target:\"WeakMap\",stat:!0,forced:!0},{of:ri(Ng.WeakMap,Ng.set,!0)});var zg=Ng.remove;Ce({target:\"WeakMap\",proto:!0,real:!0,forced:!0},{deleteAll:function(){for(var t,e=_g(this),r=!0,n=0,o=arguments.length;n<o;n++)t=zg(e,arguments[n]),r=r&&t;return!!r}}),Ce({target:\"WeakMap\",proto:!0,real:!0,forced:!0},{upsert:Ii}),To(\"WeakSet\",function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}},eu);var Wg=WeakSet.prototype,qg={WeakSet:WeakSet,add:b(Wg.add),has:b(Wg.has),remove:b(Wg.delete)},Hg=qg.has,$g=function(t){return Hg(t),t},Kg=qg.add;Ce({target:\"WeakSet\",proto:!0,real:!0,forced:!0},{addAll:function(){for(var t=$g(this),e=0,r=arguments.length;e<r;e++)Kg(t,arguments[e]);return t}});var Gg=qg.remove;Ce({target:\"WeakSet\",proto:!0,real:!0,forced:!0},{deleteAll:function(){for(var t,e=$g(this),r=!0,n=0,o=arguments.length;n<o;n++)t=Gg(e,arguments[n]),r=r&&t;return!!r}}),Ce({target:\"WeakSet\",stat:!0,forced:!0},{from:ei(qg.WeakSet,qg.add,!1)}),Ce({target:\"WeakSet\",stat:!0,forced:!0},{of:ri(qg.WeakSet,qg.add,!1)});var Vg=Error,Yg=b(\"\".replace),Xg=String(new Vg(\"zxcasd\").stack),Jg=/\\n\\s*at [^:]*:[^\\n]*/,Qg=Jg.test(Xg),Zg=!a(function(){var t=new Error(\"a\");return!(\"stack\"in t)||(Object.defineProperty(t,\"stack\",d(1,7)),7!==t.stack)}),ty=Error.captureStackTrace,ey=dt(\"toStringTag\"),ry=Error,ny=[].push,oy=function(t,e){var r,n,o,i,a,u=U(iy,this);dn?r=dn(new ry,u?Qr(this):iy):(r=u?this:Ve(iy),_t(r,ey,\"Error\")),void 0!==e&&_t(r,\"message\",function(t,e){return void 0===t?arguments.length<2?\"\":e:Wr(t)}(e)),i=r,a=r.stack,Zg&&(ty?ty(i,oy):_t(i,\"stack\",function(t,e){if(Qg&&\"string\"==typeof t&&!Vg.prepareStackTrace)for(;e--;)t=Yg(t,Jg,\"\");return t}(a,1))),arguments.length>2&&(n=r,M(o=arguments[2])&&\"cause\"in o&&_t(n,\"cause\",o.cause));var s=[];return Ao(t,ny,{that:s}),_t(r,\"errors\",s),r};dn?dn(oy,ry):Ae(oy,ry,{name:!0});var iy=oy.prototype=Ve(ry.prototype,{constructor:d(1,oy),message:d(1,\"\"),name:d(1,\"AggregateError\")});Ce({global:!0,constructor:!0,arity:2},{AggregateError:oy});var ay,uy,sy,cy,fy=function(t){return _.slice(0,t.length)===t},ly=fy(\"Bun/\")?\"BUN\":fy(\"Cloudflare-Workers\")?\"CLOUDFLARE\":fy(\"Deno/\")?\"DENO\":fy(\"Node.js/\")?\"NODE\":i.Bun&&\"string\"==typeof Bun.version?\"BUN\":i.Deno&&\"object\"==typeof Deno.version?\"DENO\":\"process\"===E(i.process)?\"NODE\":i.window&&i.document?\"BROWSER\":\"REST\",hy=\"NODE\"===ly,py=/(?:ipad|iphone|ipod).*applewebkit/i.test(_),vy=i.setImmediate,dy=i.clearImmediate,gy=i.process,yy=i.Dispatch,my=i.Function,by=i.MessageChannel,wy=i.String,Sy=0,Ey={},Oy=\"onreadystatechange\";a(function(){ay=i.location});var xy=function(t){if(ut(Ey,t)){var e=Ey[t];delete Ey[t],e()}},Ry=function(t){return function(){xy(t)}},Py=function(t){xy(t.data)},Ay=function(t){i.postMessage(wy(t),ay.protocol+\"//\"+ay.host)};vy&&dy||(vy=function(t){Up(arguments.length,1);var e=T(t)?t:my(t),r=vo(arguments,1);return Ey[++Sy]=function(){Ra(e,void 0,r)},uy(Sy),Sy},dy=function(t){delete Ey[t]},hy?uy=function(t){gy.nextTick(Ry(t))}:yy&&yy.now?uy=function(t){yy.now(Ry(t))}:by&&!py?(cy=(sy=new by).port2,sy.port1.onmessage=Py,uy=ar(cy.postMessage,cy)):i.addEventListener&&T(i.postMessage)&&!i.importScripts&&ay&&\"file:\"!==ay.protocol&&!a(Ay)?(uy=Ay,i.addEventListener(\"message\",Py,!1)):uy=Oy in Et(\"script\")?function(t){De.appendChild(Et(\"script\"))[Oy]=function(){De.removeChild(this),xy(t)}}:function(t){setTimeout(Ry(t),0)});var jy={set:vy,clear:dy},ky=function(){this.head=null,this.tail=null};ky.prototype={add:function(t){var e={item:t,next:null},r=this.tail;r?r.next=e:this.head=e,this.tail=e},get:function(){var t=this.head;if(t)return null===(this.head=t.next)&&(this.tail=null),t.item}};var Iy,Ty,My,Ly,Uy,Ny=ky,Cy=/ipad|iphone|ipod/i.test(_)&&\"undefined\"!=typeof Pebble,_y=/web0s(?!.*chrome)/i.test(_),Fy=jy.set,By=i.MutationObserver||i.WebKitMutationObserver,Dy=i.document,zy=i.process,Wy=i.Promise,qy=Ip(\"queueMicrotask\");if(!qy){var Hy=new Ny,$y=function(){var t,e;for(hy&&(t=zy.domain)&&t.exit();e=Hy.get();)try{e()}catch(t){throw Hy.head&&Iy(),t}t&&t.enter()};py||hy||_y||!By||!Dy?!Cy&&Wy&&Wy.resolve?((Ly=Wy.resolve(void 0)).constructor=Wy,Uy=ar(Ly.then,Ly),Iy=function(){Uy($y)}):hy?Iy=function(){zy.nextTick($y)}:(Fy=ar(Fy,i),Iy=function(){Fy($y)}):(Ty=!0,My=Dy.createTextNode(\"\"),new By($y).observe(My,{characterData:!0}),Iy=function(){My.data=Ty=!Ty}),qy=function(t){Hy.head||Iy(),Hy.add(t)}}var Ky,Gy,Vy,Yy=qy,Xy=function(t){try{return{error:!1,value:t()}}catch(t){return{error:!0,value:t}}},Jy=i.Promise,Qy=dt(\"species\"),Zy=!1,tm=T(i.PromiseRejectionEvent),em=Ue(\"Promise\",function(){var t=Kt(Jy),e=t!==String(Jy);if(!e&&66===W)return!0;if(!W||W<51||!/native code/.test(t)){var r=new Jy(function(t){t(1)}),n=function(t){t(function(){},function(){})};if((r.constructor={})[Qy]=n,!(Zy=r.then(function(){})instanceof n))return!0}return!(e||\"BROWSER\"!==ly&&\"DENO\"!==ly||tm)}),rm={CONSTRUCTOR:em,REJECTION_EVENT:tm,SUBCLASSING:Zy},nm=TypeError,om=function(t){var e,r;this.promise=new t(function(t,n){if(void 0!==e||void 0!==r)throw new nm(\"Bad Promise constructor\");e=t,r=n}),this.resolve=J(e),this.reject=J(r)},im={f:function(t){return new om(t)}},am=jy.set,um=\"Promise\",sm=rm.CONSTRUCTOR,cm=rm.REJECTION_EVENT,fm=rm.SUBCLASSING,lm=ne.getterFor(um),hm=ne.set,pm=Jy&&Jy.prototype,vm=Jy,dm=pm,gm=i.TypeError,ym=i.document,mm=i.process,bm=im.f,wm=bm,Sm=!!(ym&&ym.createEvent&&i.dispatchEvent),Em=\"unhandledrejection\",Om=function(t){var e;return!(!M(t)||!T(e=t.then))&&e},xm=function(t,e){var r,n,o,i=e.value,a=1===e.state,u=a?t.ok:t.fail,s=t.resolve,c=t.reject,l=t.domain;try{u?(a||(2===e.rejection&&km(e),e.rejection=1),!0===u?r=i:(l&&l.enter(),r=u(i),l&&(l.exit(),o=!0)),r===t.promise?c(new gm(\"Promise-chain cycle\")):(n=Om(r))?f(n,r,s,c):s(r)):c(i)}catch(t){l&&!o&&l.exit(),c(t)}},Rm=function(t,e){t.notified||(t.notified=!0,Yy(function(){for(var r,n=t.reactions;r=n.get();)xm(r,t);t.notified=!1,e&&!t.rejection&&Am(t)}))},Pm=function(t,e,r){var n,o;Sm?((n=ym.createEvent(\"Event\")).promise=e,n.reason=r,n.initEvent(t,!1,!0),i.dispatchEvent(n)):n={promise:e,reason:r},!cm&&(o=i[\"on\"+t])?o(n):t===Em&&function(t,e){try{1===arguments.length?console.error(t):console.error(t,e)}catch(t){}}(\"Unhandled promise rejection\",r)},Am=function(t){f(am,i,function(){var e,r=t.facade,n=t.value;if(jm(t)&&(e=Xy(function(){hy?mm.emit(\"unhandledRejection\",n,r):Pm(Em,r,n)}),t.rejection=hy||jm(t)?2:1,e.error))throw e.value})},jm=function(t){return 1!==t.rejection&&!t.parent},km=function(t){f(am,i,function(){var e=t.facade;hy?mm.emit(\"rejectionHandled\",e):Pm(\"rejectionhandled\",e,t.value)})},Im=function(t,e,r){return function(n){t(e,n,r)}},Tm=function(t,e,r){t.done||(t.done=!0,r&&(t=r),t.value=e,t.state=2,Rm(t,!0))},Mm=function(t,e,r){if(!t.done){t.done=!0,r&&(t=r);try{if(t.facade===e)throw new gm(\"Promise can't be resolved itself\");var n=Om(e);n?Yy(function(){var r={done:!1};try{f(n,e,Im(Mm,r,t),Im(Tm,r,t))}catch(e){Tm(r,e,t)}}):(t.value=e,t.state=1,Rm(t,!1))}catch(e){Tm({done:!1},e,t)}}};if(sm&&(vm=function(t){ko(this,dm),J(t),f(Ky,this);var e=lm(this);try{t(Im(Mm,e),Im(Tm,e))}catch(t){Tm(e,t)}},(Ky=function(t){hm(this,{type:um,done:!1,notified:!1,parent:!1,reactions:new Ny,rejection:!1,state:0,value:null})}).prototype=ie(dm=vm.prototype,\"then\",function(t,e){var r=lm(this),n=bm(Cc(this,vm));return r.parent=!0,n.ok=!T(t)||t,n.fail=T(e)&&e,n.domain=hy?mm.domain:void 0,0===r.state?r.reactions.add(n):Yy(function(){xm(n,r)}),n.promise}),Gy=function(){var t=new Ky,e=lm(t);this.promise=t,this.resolve=Im(Mm,e),this.reject=Im(Tm,e)},im.f=bm=function(t){return t===vm||void 0===t?new Gy(t):wm(t)},T(Jy)&&pm!==Object.prototype)){Vy=pm.then,fm||ie(pm,\"then\",function(t,e){var r=this;return new vm(function(t,e){f(Vy,r,t,e)}).then(t,e)},{unsafe:!0});try{delete pm.constructor}catch(t){}dn&&dn(pm,dm)}Ce({global:!0,constructor:!0,wrap:!0,forced:sm},{Promise:vm}),an(vm,um,!1),Uo(um);var Lm=rm.CONSTRUCTOR||!Gn(function(t){Jy.all(t).then(void 0,function(){})});Ce({target:\"Promise\",stat:!0,forced:Lm},{all:function(t){var e=this,r=im.f(e),n=r.resolve,o=r.reject,i=Xy(function(){var r=J(e.resolve),i=[],a=0,u=1;Ao(t,function(t){var s=a++,c=!1;u++,f(r,e,t).then(function(t){c||(c=!0,i[s]=t,--u||n(i))},o)}),--u||n(i)});return i.error&&o(i.value),r.promise}});var Um=Jy&&Jy.prototype;if(Ce({target:\"Promise\",proto:!0,forced:rm.CONSTRUCTOR,real:!0},{catch:function(t){return this.then(void 0,t)}}),T(Jy)){var Nm=L(\"Promise\").prototype.catch;Um.catch!==Nm&&ie(Um,\"catch\",Nm,{unsafe:!0})}Ce({target:\"Promise\",stat:!0,forced:Lm},{race:function(t){var e=this,r=im.f(e),n=r.reject,o=Xy(function(){var o=J(e.resolve);Ao(t,function(t){f(o,e,t).then(r.resolve,n)})});return o.error&&n(o.value),r.promise}}),Ce({target:\"Promise\",stat:!0,forced:rm.CONSTRUCTOR},{reject:function(t){var e=im.f(this);return(0,e.reject)(t),e.promise}});var Cm=function(t,e){if(kt(t),M(e)&&e.constructor===t)return e;var r=im.f(t);return(0,r.resolve)(e),r.promise};Ce({target:\"Promise\",stat:!0,forced:rm.CONSTRUCTOR},{resolve:function(t){return Cm(this,t)}}),Ce({target:\"Promise\",stat:!0,forced:Lm},{allSettled:function(t){var e=this,r=im.f(e),n=r.resolve,o=r.reject,i=Xy(function(){var r=J(e.resolve),o=[],i=0,a=1;Ao(t,function(t){var u=i++,s=!1;a++,f(r,e,t).then(function(t){s||(s=!0,o[u]={status:\"fulfilled\",value:t},--a||n(o))},function(t){s||(s=!0,o[u]={status:\"rejected\",reason:t},--a||n(o))})}),--a||n(o)});return i.error&&o(i.value),r.promise}});var _m=\"No one promise resolved\";Ce({target:\"Promise\",stat:!0,forced:Lm},{any:function(t){var e=this,r=L(\"AggregateError\"),n=im.f(e),o=n.resolve,i=n.reject,a=Xy(function(){var n=J(e.resolve),a=[],u=0,s=1,c=!1;Ao(t,function(t){var l=u++,h=!1;s++,f(n,e,t).then(function(t){h||c||(c=!0,o(t))},function(t){h||c||(h=!0,a[l]=t,--s||i(new r(a,_m)))})}),--s||i(new r(a,_m))});return a.error&&i(a.value),n.promise}}),Ce({target:\"Promise\",stat:!0},{withResolvers:function(){var t=im.f(this);return{promise:t.promise,resolve:t.resolve,reject:t.reject}}});var Fm=Jy&&Jy.prototype,Bm=!!Jy&&a(function(){Fm.finally.call({then:function(){}},function(){})});if(Ce({target:\"Promise\",proto:!0,real:!0,forced:Bm},{finally:function(t){var e=Cc(this,L(\"Promise\")),r=T(t);return this.then(r?function(r){return Cm(e,t()).then(function(){return r})}:t,r?function(r){return Cm(e,t()).then(function(){throw r})}:t)}}),T(Jy)){var Dm=L(\"Promise\").prototype.finally;Fm.finally!==Dm&&ie(Fm,\"finally\",Dm,{unsafe:!0})}var zm=i.Promise,Wm=!1,qm=!zm||!zm.try||Xy(function(){zm.try(function(t){Wm=8===t},8)}).error||!Wm;Ce({target:\"Promise\",stat:!0,forced:qm},{try:function(t){var e=arguments.length>1?vo(arguments,1):[],r=im.f(this),n=Xy(function(){return Ra(J(t),void 0,e)});return(n.error?r.reject:r.resolve)(n.value),r.promise}}),Ze(\"Promise\",\"finally\");var Hm=\"URLSearchParams\"in self,$m=\"Symbol\"in self&&\"iterator\"in Symbol,Km=\"FileReader\"in self&&\"Blob\"in self&&function(){try{return new Blob,!0}catch(t){return!1}}(),Gm=\"FormData\"in self,Vm=\"ArrayBuffer\"in self;if(Vm)var Ym=[\"[object Int8Array]\",\"[object Uint8Array]\",\"[object Uint8ClampedArray]\",\"[object Int16Array]\",\"[object Uint16Array]\",\"[object Int32Array]\",\"[object Uint32Array]\",\"[object Float32Array]\",\"[object Float64Array]\"],Xm=ArrayBuffer.isView||function(t){return t&&Ym.indexOf(Object.prototype.toString.call(t))>-1};function Jm(t){if(\"string\"!=typeof t&&(t=String(t)),/[^a-z0-9\\-#$%&'*+.^_`|~]/i.test(t))throw new TypeError(\"Invalid character in header field name\");return t.toLowerCase()}function Qm(t){return\"string\"!=typeof t&&(t=String(t)),t}function Zm(t){var e={next:function(){var e=t.shift();return{done:void 0===e,value:e}}};return $m&&(e[Symbol.iterator]=function(){return e}),e}function tb(t){this.map={},t instanceof tb?t.forEach(function(t,e){this.append(e,t)},this):Array.isArray(t)?t.forEach(function(t){this.append(t[0],t[1])},this):t&&Object.getOwnPropertyNames(t).forEach(function(e){this.append(e,t[e])},this)}function eb(t){if(t.bodyUsed)return Promise.reject(new TypeError(\"Already read\"));t.bodyUsed=!0}function rb(t){return new Promise(function(e,r){t.onload=function(){e(t.result)},t.onerror=function(){r(t.error)}})}function nb(t){var e=new FileReader,r=rb(e);return e.readAsArrayBuffer(t),r}function ob(t){if(t.slice)return t.slice(0);var e=new Uint8Array(t.byteLength);return e.set(new Uint8Array(t)),e.buffer}function ib(){return this.bodyUsed=!1,this._initBody=function(t){var e;this._bodyInit=t,t?\"string\"==typeof t?this._bodyText=t:Km&&Blob.prototype.isPrototypeOf(t)?this._bodyBlob=t:Gm&&FormData.prototype.isPrototypeOf(t)?this._bodyFormData=t:Hm&&URLSearchParams.prototype.isPrototypeOf(t)?this._bodyText=t.toString():Vm&&Km&&(e=t)&&DataView.prototype.isPrototypeOf(e)?(this._bodyArrayBuffer=ob(t.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):Vm&&(ArrayBuffer.prototype.isPrototypeOf(t)||Xm(t))?this._bodyArrayBuffer=ob(t):this._bodyText=t=Object.prototype.toString.call(t):this._bodyText=\"\",this.headers.get(\"content-type\")||(\"string\"==typeof t?this.headers.set(\"content-type\",\"text/plain;charset=UTF-8\"):this._bodyBlob&&this._bodyBlob.type?this.headers.set(\"content-type\",this._bodyBlob.type):Hm&&URLSearchParams.prototype.isPrototypeOf(t)&&this.headers.set(\"content-type\",\"application/x-www-form-urlencoded;charset=UTF-8\"))},Km&&(this.blob=function(){var t=eb(this);if(t)return t;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error(\"could not read FormData body as blob\");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this._bodyArrayBuffer?eb(this)||Promise.resolve(this._bodyArrayBuffer):this.blob().then(nb)}),this.text=function(){var t=eb(this);if(t)return t;if(this._bodyBlob)return function(t){var e=new FileReader,r=rb(e);return e.readAsText(t),r}(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(function(t){for(var e=new Uint8Array(t),r=new Array(e.length),n=0;n<e.length;n++)r[n]=String.fromCharCode(e[n]);return r.join(\"\")}(this._bodyArrayBuffer));if(this._bodyFormData)throw new Error(\"could not read FormData body as text\");return Promise.resolve(this._bodyText)},Gm&&(this.formData=function(){return this.text().then(sb)}),this.json=function(){return this.text().then(JSON.parse)},this}tb.prototype.append=function(t,e){t=Jm(t),e=Qm(e);var r=this.map[t];this.map[t]=r?r+\", \"+e:e},tb.prototype.delete=function(t){delete this.map[Jm(t)]},tb.prototype.get=function(t){return t=Jm(t),this.has(t)?this.map[t]:null},tb.prototype.has=function(t){return this.map.hasOwnProperty(Jm(t))},tb.prototype.set=function(t,e){this.map[Jm(t)]=Qm(e)},tb.prototype.forEach=function(t,e){for(var r in this.map)this.map.hasOwnProperty(r)&&t.call(e,this.map[r],r,this)},tb.prototype.keys=function(){var t=[];return this.forEach(function(e,r){t.push(r)}),Zm(t)},tb.prototype.values=function(){var t=[];return this.forEach(function(e){t.push(e)}),Zm(t)},tb.prototype.entries=function(){var t=[];return this.forEach(function(e,r){t.push([r,e])}),Zm(t)},$m&&(tb.prototype[Symbol.iterator]=tb.prototype.entries);var ab=[\"DELETE\",\"GET\",\"HEAD\",\"OPTIONS\",\"POST\",\"PUT\"];function ub(t,e){var r=(e=e||{}).body;if(t instanceof ub){if(t.bodyUsed)throw new TypeError(\"Already read\");this.url=t.url,this.credentials=t.credentials,e.headers||(this.headers=new tb(t.headers)),this.method=t.method,this.mode=t.mode,this.signal=t.signal,r||null==t._bodyInit||(r=t._bodyInit,t.bodyUsed=!0)}else this.url=String(t);if(this.credentials=e.credentials||this.credentials||\"same-origin\",!e.headers&&this.headers||(this.headers=new tb(e.headers)),this.method=function(t){var e=t.toUpperCase();return ab.indexOf(e)>-1?e:t}(e.method||this.method||\"GET\"),this.mode=e.mode||this.mode||null,this.signal=e.signal||this.signal,this.referrer=null,(\"GET\"===this.method||\"HEAD\"===this.method)&&r)throw new TypeError(\"Body not allowed for GET or HEAD requests\");this._initBody(r)}function sb(t){var e=new FormData;return t.trim().split(\"&\").forEach(function(t){if(t){var r=t.split(\"=\"),n=r.shift().replace(/\\+/g,\" \"),o=r.join(\"=\").replace(/\\+/g,\" \");e.append(decodeURIComponent(n),decodeURIComponent(o))}}),e}function cb(t,e){e||(e={}),this.type=\"default\",this.status=void 0===e.status?200:e.status,this.ok=this.status>=200&&this.status<300,this.statusText=\"statusText\"in e?e.statusText:\"OK\",this.headers=new tb(e.headers),this.url=e.url||\"\",this._initBody(t)}ub.prototype.clone=function(){return new ub(this,{body:this._bodyInit})},ib.call(ub.prototype),ib.call(cb.prototype),cb.prototype.clone=function(){return new cb(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new tb(this.headers),url:this.url})},cb.error=function(){var t=new cb(null,{status:0,statusText:\"\"});return t.type=\"error\",t};var fb=[301,302,303,307,308];cb.redirect=function(t,e){if(-1===fb.indexOf(e))throw new RangeError(\"Invalid status code\");return new cb(null,{status:e,headers:{location:t}})};var lb=self.DOMException;try{new lb}catch(t){(lb=function(t,e){this.message=t,this.name=e;var r=Error(t);this.stack=r.stack}).prototype=Object.create(Error.prototype),lb.prototype.constructor=lb}function hb(t,e){return new Promise(function(r,n){var o=new ub(t,e);if(o.signal&&o.signal.aborted)return n(new lb(\"Aborted\",\"AbortError\"));var i=new XMLHttpRequest;function a(){i.abort()}i.onload=function(){var t,e,n={status:i.status,statusText:i.statusText,headers:(t=i.getAllResponseHeaders()||\"\",e=new tb,t.replace(/\\r?\\n[\\t ]+/g,\" \").split(/\\r?\\n/).forEach(function(t){var r=t.split(\":\"),n=r.shift().trim();if(n){var o=r.join(\":\").trim();e.append(n,o)}}),e)};n.url=\"responseURL\"in i?i.responseURL:n.headers.get(\"X-Request-URL\"),r(new cb(\"response\"in i?i.response:i.responseText,n))},i.onerror=function(){n(new TypeError(\"Network request failed\"))},i.ontimeout=function(){n(new TypeError(\"Network request failed\"))},i.onabort=function(){n(new lb(\"Aborted\",\"AbortError\"))},i.open(o.method,o.url,!0),\"include\"===o.credentials?i.withCredentials=!0:\"omit\"===o.credentials&&(i.withCredentials=!1),\"responseType\"in i&&Km&&(i.responseType=\"blob\"),o.headers.forEach(function(t,e){i.setRequestHeader(e,t)}),o.signal&&(o.signal.addEventListener(\"abort\",a),i.onreadystatechange=function(){4===i.readyState&&o.signal.removeEventListener(\"abort\",a)}),i.send(void 0===o._bodyInit?null:o._bodyInit)})}hb.polyfill=!0,self.fetch||(self.fetch=hb,self.Headers=tb,self.Request=ub,self.Response=cb);var pb=Object.getOwnPropertySymbols,vb=Object.prototype.hasOwnProperty,db=Object.prototype.propertyIsEnumerable,gb=function(){try{if(!Object.assign)return!1;var t=new String(\"abc\");if(t[5]=\"de\",\"5\"===Object.getOwnPropertyNames(t)[0])return!1;for(var e={},r=0;r<10;r++)e[\"_\"+String.fromCharCode(r)]=r;if(\"0123456789\"!==Object.getOwnPropertyNames(e).map(function(t){return e[t]}).join(\"\"))return!1;var n={};return\"abcdefghijklmnopqrst\".split(\"\").forEach(function(t){n[t]=t}),\"abcdefghijklmnopqrst\"===Object.keys(Object.assign({},n)).join(\"\")}catch(t){return!1}}()?Object.assign:function(t,e){for(var r,n,o=function(t){if(null==t)throw new TypeError(\"Object.assign cannot be called with null or undefined\");return Object(t)}(t),i=1;i<arguments.length;i++){for(var a in r=Object(arguments[i]))vb.call(r,a)&&(o[a]=r[a]);if(pb){n=pb(r);for(var u=0;u<n.length;u++)db.call(r,n[u])&&(o[n[u]]=r[n[u]])}}return o};Object.assign=gb}();\n"
  },
  {
    "path": "docs/_next/static/chunks/b4611851359555bd.js",
    "content": "(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push([\"object\"==typeof document?document.currentScript:void 0,11725,(e,t,n)=>{\"use strict\";Object.defineProperty(n,\"__esModule\",{value:!0}),Object.defineProperty(n,\"getAssetPrefix\",{enumerable:!0,get:function(){return l}});let r=e.r(17421);function l(){let e=document.currentScript;if(!(e instanceof HTMLScriptElement))throw Object.defineProperty(new r.InvariantError(`Expected document.currentScript to be a <script> element. Received ${e} instead.`),\"__NEXT_ERROR_CODE\",{value:\"E783\",enumerable:!1,configurable:!0});let{pathname:t}=new URL(e.src),n=t.indexOf(\"/_next/\");if(-1===n)throw Object.defineProperty(new r.InvariantError(`Expected document.currentScript src to contain '/_next/'. Received ${e.src} instead.`),\"__NEXT_ERROR_CODE\",{value:\"E784\",enumerable:!1,configurable:!0});return t.slice(0,n)}(\"function\"==typeof n.default||\"object\"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,\"__esModule\",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},34921,(e,t,n)=>{\"use strict\";Object.defineProperty(n,\"__esModule\",{value:!0}),Object.defineProperty(n,\"appBootstrap\",{enumerable:!0,get:function(){return a}});let r=e.r(11725),l=e.r(1042);function a(e){var t,n;let a=(0,r.getAssetPrefix)();t=self.__next_s,n=()=>{e(a)},t&&t.length?t.reduce((e,[t,n])=>e.then(()=>new Promise((e,r)=>{let a=document.createElement(\"script\");n&&(0,l.setAttributesFromProps)(a,n),t?(a.src=t,a.onload=()=>e(),a.onerror=r):n&&(a.innerHTML=n.children,setTimeout(e)),document.head.appendChild(a)})),Promise.resolve()).catch(e=>{console.error(e)}).then(()=>{n()}):n()}window.next={version:\"16.1.6\",appDir:!0},(\"function\"==typeof n.default||\"object\"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,\"__esModule\",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},62054,(e,t,n)=>{\"use strict\";Object.defineProperty(n,\"__esModule\",{value:!0});var r={getObjectClassLabel:function(){return a},isPlainObject:function(){return o}};for(var l in r)Object.defineProperty(n,l,{enumerable:!0,get:r[l]});function a(e){return Object.prototype.toString.call(e)}function o(e){if(\"[object Object]\"!==a(e))return!1;let t=Object.getPrototypeOf(e);return null===t||t.hasOwnProperty(\"isPrototypeOf\")}},31460,(e,t,n)=>{\"use strict\";Object.defineProperty(n,\"__esModule\",{value:!0});var r={default:function(){return o},getProperError:function(){return i}};for(var l in r)Object.defineProperty(n,l,{enumerable:!0,get:r[l]});let a=e.r(62054);function o(e){return\"object\"==typeof e&&null!==e&&\"name\"in e&&\"message\"in e}function i(e){let t;return o(e)?e:Object.defineProperty(Error((0,a.isPlainObject)(e)?(t=new WeakSet,JSON.stringify(e,(e,n)=>{if(\"object\"==typeof n&&null!==n){if(t.has(n))return\"[Circular]\";t.add(n)}return n})):e+\"\"),\"__NEXT_ERROR_CODE\",{value:\"E394\",enumerable:!1,configurable:!0})}},44893,(e,t,n)=>{\"use strict\";Object.defineProperty(n,\"__esModule\",{value:!0}),Object.defineProperty(n,\"reportGlobalError\",{enumerable:!0,get:function(){return r}});let r=\"function\"==typeof reportError?reportError:e=>{globalThis.console.error(e)};(\"function\"==typeof n.default||\"object\"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,\"__esModule\",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},43492,(e,t,n)=>{\"use strict\";Object.defineProperty(n,\"__esModule\",{value:!0});var r={isRecoverableError:function(){return c},onRecoverableError:function(){return f}};for(var l in r)Object.defineProperty(n,l,{enumerable:!0,get:r[l]});let a=e.r(81258),o=e.r(83025),i=a._(e.r(31460)),u=e.r(44893),s=new WeakSet;function c(e){return s.has(e)}let f=e=>{let t=(0,i.default)(e)&&\"cause\"in e?e.cause:e;(0,o.isBailoutToCSRError)(t)||(0,u.reportGlobalError)(t)};(\"function\"==typeof n.default||\"object\"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,\"__esModule\",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},6557,(e,t,n)=>{\"use strict\";t.exports={}},21903,(e,t,n)=>{\"trimStart\"in String.prototype||(String.prototype.trimStart=String.prototype.trimLeft),\"trimEnd\"in String.prototype||(String.prototype.trimEnd=String.prototype.trimRight),\"description\"in Symbol.prototype||Object.defineProperty(Symbol.prototype,\"description\",{configurable:!0,get:function(){var e=/\\((.*)\\)/.exec(this.toString());return e?e[1]:void 0}}),Array.prototype.flat||(Array.prototype.flat=function(e,t){return t=this.concat.apply([],this),e>1&&t.some(Array.isArray)?t.flat(e-1):t},Array.prototype.flatMap=function(e,t){return this.map(e,t).flat()}),Promise.prototype.finally||(Promise.prototype.finally=function(e){if(\"function\"!=typeof e)return this.then(e,e);var t=this.constructor||Promise;return this.then(function(n){return t.resolve(e()).then(function(){return n})},function(n){return t.resolve(e()).then(function(){throw n})})}),Object.fromEntries||(Object.fromEntries=function(e){return Array.from(e).reduce(function(e,t){return e[t[0]]=t[1],e},{})}),Array.prototype.at||(Array.prototype.at=function(e){var t=Math.trunc(e)||0;if(t<0&&(t+=this.length),!(t<0||t>=this.length))return this[t]}),Object.hasOwn||(Object.hasOwn=function(e,t){if(null==e)throw TypeError(\"Cannot convert undefined or null to object\");return Object.prototype.hasOwnProperty.call(Object(e),t)}),\"canParse\"in URL||(URL.canParse=function(e,t){try{return new URL(e,t),!0}catch(e){return!1}})},13734,(e,t,n)=>{\"use strict\";Object.defineProperty(n,\"__esModule\",{value:!0}),e.r(21903),(\"function\"==typeof n.default||\"object\"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,\"__esModule\",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},23979,(e,t,n)=>{\"use strict\";function r(e,t){var n=e.length;for(e.push(t);0<n;){var r=n-1>>>1,l=e[r];if(0<o(l,t))e[r]=t,e[n]=l,n=r;else break}}function l(e){return 0===e.length?null:e[0]}function a(e){if(0===e.length)return null;var t=e[0],n=e.pop();if(n!==t){e[0]=n;for(var r=0,l=e.length,a=l>>>1;r<a;){var i=2*(r+1)-1,u=e[i],s=i+1,c=e[s];if(0>o(u,n))s<l&&0>o(c,u)?(e[r]=c,e[s]=n,r=s):(e[r]=u,e[i]=n,r=i);else if(s<l&&0>o(c,n))e[r]=c,e[s]=n,r=s;else break}}return t}function o(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}if(n.unstable_now=void 0,\"object\"==typeof performance&&\"function\"==typeof performance.now){var i,u=performance;n.unstable_now=function(){return u.now()}}else{var s=Date,c=s.now();n.unstable_now=function(){return s.now()-c}}var f=[],d=[],p=1,m=null,h=3,g=!1,v=!1,y=!1,b=!1,w=\"function\"==typeof setTimeout?setTimeout:null,k=\"function\"==typeof clearTimeout?clearTimeout:null,S=\"u\">typeof setImmediate?setImmediate:null;function E(e){for(var t=l(d);null!==t;){if(null===t.callback)a(d);else if(t.startTime<=e)a(d),t.sortIndex=t.expirationTime,r(f,t);else break;t=l(d)}}function x(e){if(y=!1,E(e),!v)if(null!==l(f))v=!0,_||(_=!0,i());else{var t=l(d);null!==t&&R(x,t.startTime-e)}}var _=!1,N=-1,P=5,C=-1;function T(){return!!b||!(n.unstable_now()-C<P)}function O(){if(b=!1,_){var e=n.unstable_now();C=e;var t=!0;try{e:{v=!1,y&&(y=!1,k(N),N=-1),g=!0;var r=h;try{t:{for(E(e),m=l(f);null!==m&&!(m.expirationTime>e&&T());){var o=m.callback;if(\"function\"==typeof o){m.callback=null,h=m.priorityLevel;var u=o(m.expirationTime<=e);if(e=n.unstable_now(),\"function\"==typeof u){m.callback=u,E(e),t=!0;break t}m===l(f)&&a(f),E(e)}else a(f);m=l(f)}if(null!==m)t=!0;else{var s=l(d);null!==s&&R(x,s.startTime-e),t=!1}}break e}finally{m=null,h=r,g=!1}}}finally{t?i():_=!1}}}if(\"function\"==typeof S)i=function(){S(O)};else if(\"u\">typeof MessageChannel){var z=new MessageChannel,L=z.port2;z.port1.onmessage=O,i=function(){L.postMessage(null)}}else i=function(){w(O,0)};function R(e,t){N=w(function(){e(n.unstable_now())},t)}n.unstable_IdlePriority=5,n.unstable_ImmediatePriority=1,n.unstable_LowPriority=4,n.unstable_NormalPriority=3,n.unstable_Profiling=null,n.unstable_UserBlockingPriority=2,n.unstable_cancelCallback=function(e){e.callback=null},n.unstable_forceFrameRate=function(e){0>e||125<e?console.error(\"forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported\"):P=0<e?Math.floor(1e3/e):5},n.unstable_getCurrentPriorityLevel=function(){return h},n.unstable_next=function(e){switch(h){case 1:case 2:case 3:var t=3;break;default:t=h}var n=h;h=t;try{return e()}finally{h=n}},n.unstable_requestPaint=function(){b=!0},n.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=h;h=e;try{return t()}finally{h=n}},n.unstable_scheduleCallback=function(e,t,a){var o=n.unstable_now();switch(a=\"object\"==typeof a&&null!==a&&\"number\"==typeof(a=a.delay)&&0<a?o+a:o,e){case 1:var u=-1;break;case 2:u=250;break;case 5:u=0x3fffffff;break;case 4:u=1e4;break;default:u=5e3}return u=a+u,e={id:p++,callback:t,priorityLevel:e,startTime:a,expirationTime:u,sortIndex:-1},a>o?(e.sortIndex=a,r(d,e),null===l(f)&&e===l(d)&&(y?(k(N),N=-1):y=!0,R(x,a-o))):(e.sortIndex=u,r(f,e),v||g||(v=!0,_||(_=!0,i()))),e},n.unstable_shouldYield=T,n.unstable_wrapCallback=function(e){var t=h;return function(){var n=h;h=t;try{return e.apply(this,arguments)}finally{h=n}}}},79454,(e,t,n)=>{\"use strict\";t.exports=e.r(23979)},17615,(e,t,n)=>{\"use strict\";var r,l=e.i(96171),a=e.r(79454),o=e.r(33664),i=e.r(72491);function u(e){var t=\"https://react.dev/errors/\"+e;if(1<arguments.length){t+=\"?args[]=\"+encodeURIComponent(arguments[1]);for(var n=2;n<arguments.length;n++)t+=\"&args[]=\"+encodeURIComponent(arguments[n])}return\"Minified React error #\"+e+\"; visit \"+t+\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"}function s(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType)}function c(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do 0!=(4098&(t=e).flags)&&(n=t.return),e=t.return;while(e)}return 3===t.tag?n:null}function f(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&null!==(e=e.alternate)&&(t=e.memoizedState),null!==t)return t.dehydrated}return null}function d(e){if(31===e.tag){var t=e.memoizedState;if(null===t&&null!==(e=e.alternate)&&(t=e.memoizedState),null!==t)return t.dehydrated}return null}function p(e){if(c(e)!==e)throw Error(u(188))}function m(e,t,n,r,l,a){for(;null!==e;){if(5===e.tag&&n(e,r,l,a)||(22!==e.tag||null===e.memoizedState)&&(t||5!==e.tag)&&m(e.child,t,n,r,l,a))return!0;e=e.sibling}return!1}function h(e){for(e=e.return;null!==e;){if(3===e.tag||5===e.tag)return e;e=e.return}return null}function g(e){switch(e.tag){case 5:return e.stateNode;case 3:return e.stateNode.containerInfo;default:throw Error(u(559))}}var v=null,y=null;function b(e){return v=e,!0}function w(e,t,n){return e===n||e===t&&(v=e,!0)}function k(e,t,n){return e===n?(y=e,!1):e===t&&(null!==y&&(v=e),!0)}function S(e){if(null===e)return null;do e=null===e?null:e.return;while(e&&5!==e.tag&&27!==e.tag&&3!==e.tag)return e||null}function E(e,t,n){for(var r=0,l=e;l;l=n(l))r++;l=0;for(var a=t;a;a=n(a))l++;for(;0<r-l;)e=n(e),r--;for(;0<l-r;)t=n(t),l--;for(;r--;){if(e===t||null!==t&&e===t.alternate)return e;e=n(e),t=n(t)}return null}var x=Object.assign,_=Symbol.for(\"react.element\"),N=Symbol.for(\"react.transitional.element\"),P=Symbol.for(\"react.portal\"),C=Symbol.for(\"react.fragment\"),T=Symbol.for(\"react.strict_mode\"),O=Symbol.for(\"react.profiler\"),z=Symbol.for(\"react.consumer\"),L=Symbol.for(\"react.context\"),R=Symbol.for(\"react.forward_ref\"),M=Symbol.for(\"react.suspense\"),I=Symbol.for(\"react.suspense_list\"),D=Symbol.for(\"react.memo\"),F=Symbol.for(\"react.lazy\");Symbol.for(\"react.scope\");var A=Symbol.for(\"react.activity\"),j=Symbol.for(\"react.legacy_hidden\");Symbol.for(\"react.tracing_marker\");var U=Symbol.for(\"react.memo_cache_sentinel\"),B=Symbol.for(\"react.view_transition\"),V=Symbol.iterator;function H(e){return null===e||\"object\"!=typeof e?null:\"function\"==typeof(e=V&&e[V]||e[\"@@iterator\"])?e:null}var $=Symbol.for(\"react.client.reference\"),Q=Array.isArray,W=o.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,q=i.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,K={pending:!1,data:null,method:null,action:null},X=[],G=-1;function Y(e){return{current:e}}function J(e){0>G||(e.current=X[G],X[G]=null,G--)}function Z(e,t){X[++G]=e.current,e.current=t}var ee=Y(null),et=Y(null),en=Y(null),er=Y(null);function el(e,t){switch(Z(en,t),Z(et,e),Z(ee,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?cs(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)e=cc(t=cs(t),e);else switch(e){case\"svg\":e=1;break;case\"math\":e=2;break;default:e=0}}J(ee),Z(ee,e)}function ea(){J(ee),J(et),J(en)}function eo(e){var t=e.memoizedState;null!==t&&(fv._currentValue=t.memoizedState,Z(er,e));var n=cc(t=ee.current,e.type);t!==n&&(Z(et,e),Z(ee,n))}function ei(e){et.current===e&&(J(ee),J(et)),er.current===e&&(J(er),fv._currentValue=K)}function eu(e){if(void 0===tX)try{throw Error()}catch(e){var t=e.stack.trim().match(/\\n( *(at )?)/);tX=t&&t[1]||\"\",tG=-1<e.stack.indexOf(\"\\n    at\")?\" (<anonymous>)\":-1<e.stack.indexOf(\"@\")?\"@unknown:0:0\":\"\"}return\"\\n\"+tX+e+tG}var es=!1;function ec(e,t){if(!e||es)return\"\";es=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var r={DetermineComponentFrameRoot:function(){try{if(t){var n=function(){throw Error()};if(Object.defineProperty(n.prototype,\"props\",{set:function(){throw Error()}}),\"object\"==typeof Reflect&&Reflect.construct){try{Reflect.construct(n,[])}catch(e){var r=e}Reflect.construct(e,[],n)}else{try{n.call()}catch(e){r=e}e.call(n.prototype)}}else{try{throw Error()}catch(e){r=e}(n=e())&&\"function\"==typeof n.catch&&n.catch(function(){})}}catch(e){if(e&&r&&\"string\"==typeof e.stack)return[e.stack,r.stack]}return[null,null]}};r.DetermineComponentFrameRoot.displayName=\"DetermineComponentFrameRoot\";var l=Object.getOwnPropertyDescriptor(r.DetermineComponentFrameRoot,\"name\");l&&l.configurable&&Object.defineProperty(r.DetermineComponentFrameRoot,\"name\",{value:\"DetermineComponentFrameRoot\"});var a=r.DetermineComponentFrameRoot(),o=a[0],i=a[1];if(o&&i){var u=o.split(\"\\n\"),s=i.split(\"\\n\");for(l=r=0;r<u.length&&!u[r].includes(\"DetermineComponentFrameRoot\");)r++;for(;l<s.length&&!s[l].includes(\"DetermineComponentFrameRoot\");)l++;if(r===u.length||l===s.length)for(r=u.length-1,l=s.length-1;1<=r&&0<=l&&u[r]!==s[l];)l--;for(;1<=r&&0<=l;r--,l--)if(u[r]!==s[l]){if(1!==r||1!==l)do if(r--,l--,0>l||u[r]!==s[l]){var c=\"\\n\"+u[r].replace(\" at new \",\" at \");return e.displayName&&c.includes(\"<anonymous>\")&&(c=c.replace(\"<anonymous>\",e.displayName)),c}while(1<=r&&0<=l)break}}}finally{es=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:\"\")?eu(n):\"\"}function ef(e){try{var t=\"\",n=null;do t+=function(e,t){switch(e.tag){case 26:case 27:case 5:return eu(e.type);case 16:return eu(\"Lazy\");case 13:return e.child!==t&&null!==t?eu(\"Suspense Fallback\"):eu(\"Suspense\");case 19:return eu(\"SuspenseList\");case 0:case 15:return ec(e.type,!1);case 11:return ec(e.type.render,!1);case 1:return ec(e.type,!0);case 31:return eu(\"Activity\");case 30:return eu(\"ViewTransition\");default:return\"\"}}(e,n),n=e,e=e.return;while(e)return t}catch(e){return\"\\nError generating stack: \"+e.message+\"\\n\"+e.stack}}var ed=Object.prototype.hasOwnProperty,ep=a.unstable_scheduleCallback,em=a.unstable_cancelCallback,eh=a.unstable_shouldYield,eg=a.unstable_requestPaint,ev=a.unstable_now,ey=a.unstable_getCurrentPriorityLevel,eb=a.unstable_ImmediatePriority,ew=a.unstable_UserBlockingPriority,ek=a.unstable_NormalPriority,eS=a.unstable_LowPriority,eE=a.unstable_IdlePriority,ex=(a.log,a.unstable_setDisableYieldValue,null),e_=null,eN=Math.clz32?Math.clz32:function(e){return 0==(e>>>=0)?32:31-(eP(e)/eC|0)|0},eP=Math.log,eC=Math.LN2,eT=256,eO=262144,ez=4194304;function eL(e){var t=42&e;if(0!==t)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return 261888&e;case 262144:case 524288:case 1048576:case 2097152:return 3932160&e;case 4194304:case 8388608:case 0x1000000:case 0x2000000:return 0x3c00000&e;case 0x4000000:return 0x4000000;case 0x8000000:return 0x8000000;case 0x10000000:return 0x10000000;case 0x20000000:return 0x20000000;case 0x40000000:return 0;default:return e}}function eR(e,t,n){var r=e.pendingLanes;if(0===r)return 0;var l=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var i=0x7ffffff&r;return 0!==i?0!=(r=i&~a)?l=eL(r):0!=(o&=i)?l=eL(o):n||0!=(n=i&~e)&&(l=eL(n)):0!=(i=r&~a)?l=eL(i):0!==o?l=eL(o):n||0!=(n=r&~e)&&(l=eL(n)),0===l?0:0!==t&&t!==l&&0==(t&a)&&((a=l&-l)>=(n=t&-t)||32===a&&0!=(4194048&n))?t:l}function eM(e,t){return 0==(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)}function eI(){var e=ez;return 0==(0x3c00000&(ez<<=1))&&(ez=4194304),e}function eD(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function eF(e,t){e.pendingLanes|=t,0x10000000!==t&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function eA(e,t,n){e.pendingLanes|=t,e.suspendedLanes&=~t;var r=31-eN(t);e.entangledLanes|=t,e.entanglements[r]=0x40000000|e.entanglements[r]|261930&n}function ej(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var r=31-eN(n),l=1<<r;l&t|e[r]&t&&(e[r]|=t),n&=~l}}function eU(e,t){var n=t&-t;return 0!=((n=0!=(42&n)?1:eB(n))&(e.suspendedLanes|t))?0:n}function eB(e){switch(e){case 2:e=1;break;case 8:e=4;break;case 32:e=16;break;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 0x1000000:case 0x2000000:e=128;break;case 0x10000000:e=0x8000000;break;default:e=0}return e}function eV(e){return 2<(e&=-e)?8<e?0!=(0x7ffffff&e)?32:0x10000000:8:2}function eH(){var e=q.p;return 0!==e?e:void 0===(e=window.event)?32:fL(e.type)}function e$(e,t){var n=q.p;try{return q.p=e,t()}finally{q.p=n}}var eQ=Math.random().toString(36).slice(2),eW=\"__reactFiber$\"+eQ,eq=\"__reactProps$\"+eQ,eK=\"__reactContainer$\"+eQ,eX=\"__reactEvents$\"+eQ,eG=\"__reactListeners$\"+eQ,eY=\"__reactHandles$\"+eQ,eJ=\"__reactResources$\"+eQ,eZ=\"__reactMarker$\"+eQ;function e0(e){delete e[eW],delete e[eq],delete e[eX],delete e[eG],delete e[eY]}function e1(e){var t;if(t=e[eW])return t;for(var n=e.parentNode;n;){if(t=n[eK]||n[eW]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=cK(e);null!==e;){if(n=e[eW])return n;e=cK(e)}return t}n=(e=n).parentNode}return null}function e2(e){if(e=e[eW]||e[eK]){var t=e.tag;if(5===t||6===t||13===t||31===t||26===t||27===t||3===t)return e}return null}function e3(e){var t=e.tag;if(5===t||26===t||27===t||6===t)return e.stateNode;throw Error(u(33))}function e4(e){var t=e[eJ];return t||(t=e[eJ]={hoistableStyles:new Map,hoistableScripts:new Map}),t}function e5(e){e[eZ]=!0}var e8=new Set,e6={};function e9(e,t){e7(e,t),e7(e+\"Capture\",t)}function e7(e,t){for(e6[e]=t,e=0;e<t.length;e++)e8.add(t[e])}var te=RegExp(\"^[:A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD][:A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD\\\\-.0-9\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040]*$\"),tt={},tn={},tr=!1;function tl(){var e=tr;return tr=!1,e}function ta(e,t,n){if(ed.call(tn,t)||!ed.call(tt,t)&&(te.test(t)?tn[t]=!0:(tt[t]=!0,!1)))if(null===n)e.removeAttribute(t);else{switch(typeof n){case\"undefined\":case\"function\":case\"symbol\":e.removeAttribute(t);return;case\"boolean\":var r=t.toLowerCase().slice(0,5);if(\"data-\"!==r&&\"aria-\"!==r)return void e.removeAttribute(t)}e.setAttribute(t,\"\"+n)}}function to(e,t,n){if(null===n)e.removeAttribute(t);else{switch(typeof n){case\"undefined\":case\"function\":case\"symbol\":case\"boolean\":e.removeAttribute(t);return}e.setAttribute(t,\"\"+n)}}function ti(e,t,n,r){if(null===r)e.removeAttribute(n);else{switch(typeof r){case\"undefined\":case\"function\":case\"symbol\":case\"boolean\":e.removeAttribute(n);return}e.setAttributeNS(t,n,\"\"+r)}}function tu(e){switch(typeof e){case\"bigint\":case\"boolean\":case\"number\":case\"string\":case\"undefined\":case\"object\":return e;default:return\"\"}}function ts(e){var t=e.type;return(e=e.nodeName)&&\"input\"===e.toLowerCase()&&(\"checkbox\"===t||\"radio\"===t)}function tc(e){if(!e._valueTracker){var t=ts(e)?\"checked\":\"value\";e._valueTracker=function(e,t,n){var r=Object.getOwnPropertyDescriptor(e.constructor.prototype,t);if(!e.hasOwnProperty(t)&&void 0!==r&&\"function\"==typeof r.get&&\"function\"==typeof r.set){var l=r.get,a=r.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return l.call(this)},set:function(e){n=\"\"+e,a.call(this,e)}}),Object.defineProperty(e,t,{enumerable:r.enumerable}),{getValue:function(){return n},setValue:function(e){n=\"\"+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}(e,t,\"\"+e[t])}}function tf(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r=\"\";return e&&(r=ts(e)?e.checked?\"true\":\"false\":e.value),(e=r)!==n&&(t.setValue(e),!0)}function td(e){if(void 0===(e=e||(\"u\">typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}var tp=/[\\n\"\\\\]/g;function tm(e){return e.replace(tp,function(e){return\"\\\\\"+e.charCodeAt(0).toString(16)+\" \"})}function th(e,t,n,r,l,a,o,i){e.name=\"\",null!=o&&\"function\"!=typeof o&&\"symbol\"!=typeof o&&\"boolean\"!=typeof o?e.type=o:e.removeAttribute(\"type\"),null!=t?\"number\"===o?(0===t&&\"\"===e.value||e.value!=t)&&(e.value=\"\"+tu(t)):e.value!==\"\"+tu(t)&&(e.value=\"\"+tu(t)):\"submit\"!==o&&\"reset\"!==o||e.removeAttribute(\"value\"),null!=t?tv(e,o,tu(t)):null!=n?tv(e,o,tu(n)):null!=r&&e.removeAttribute(\"value\"),null==l&&null!=a&&(e.defaultChecked=!!a),null!=l&&(e.checked=l&&\"function\"!=typeof l&&\"symbol\"!=typeof l),null!=i&&\"function\"!=typeof i&&\"symbol\"!=typeof i&&\"boolean\"!=typeof i?e.name=\"\"+tu(i):e.removeAttribute(\"name\")}function tg(e,t,n,r,l,a,o,i){if(null!=a&&\"function\"!=typeof a&&\"symbol\"!=typeof a&&\"boolean\"!=typeof a&&(e.type=a),null!=t||null!=n){if((\"submit\"===a||\"reset\"===a)&&null==t)return void tc(e);n=null!=n?\"\"+tu(n):\"\",t=null!=t?\"\"+tu(t):n,i||t===e.value||(e.value=t),e.defaultValue=t}r=\"function\"!=typeof(r=null!=r?r:l)&&\"symbol\"!=typeof r&&!!r,e.checked=i?e.checked:!!r,e.defaultChecked=!!r,null!=o&&\"function\"!=typeof o&&\"symbol\"!=typeof o&&\"boolean\"!=typeof o&&(e.name=o),tc(e)}function tv(e,t,n){\"number\"===t&&td(e.ownerDocument)===e||e.defaultValue===\"\"+n||(e.defaultValue=\"\"+n)}function ty(e,t,n,r){if(e=e.options,t){t={};for(var l=0;l<n.length;l++)t[\"$\"+n[l]]=!0;for(n=0;n<e.length;n++)l=t.hasOwnProperty(\"$\"+e[n].value),e[n].selected!==l&&(e[n].selected=l),l&&r&&(e[n].defaultSelected=!0)}else{for(l=0,n=\"\"+tu(n),t=null;l<e.length;l++){if(e[l].value===n){e[l].selected=!0,r&&(e[l].defaultSelected=!0);return}null!==t||e[l].disabled||(t=e[l])}null!==t&&(t.selected=!0)}}function tb(e,t,n){if(null!=t&&((t=\"\"+tu(t))!==e.value&&(e.value=t),null==n)){e.defaultValue!==t&&(e.defaultValue=t);return}e.defaultValue=null!=n?\"\"+tu(n):\"\"}function tw(e,t,n,r){if(null==t){if(null!=r){if(null!=n)throw Error(u(92));if(Q(r)){if(1<r.length)throw Error(u(93));r=r[0]}n=r}null==n&&(n=\"\"),t=n}e.defaultValue=n=tu(t),(r=e.textContent)===n&&\"\"!==r&&null!==r&&(e.value=r),tc(e)}function tk(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType){n.nodeValue=t;return}}e.textContent=t}var tS=new Set(\"animationIterationCount aspectRatio borderImageOutset borderImageSlice borderImageWidth boxFlex boxFlexGroup boxOrdinalGroup columnCount columns flex flexGrow flexPositive flexShrink flexNegative flexOrder gridArea gridRow gridRowEnd gridRowSpan gridRowStart gridColumn gridColumnEnd gridColumnSpan gridColumnStart fontWeight lineClamp lineHeight opacity order orphans scale tabSize widows zIndex zoom fillOpacity floodOpacity stopOpacity strokeDasharray strokeDashoffset strokeMiterlimit strokeOpacity strokeWidth MozAnimationIterationCount MozBoxFlex MozBoxFlexGroup MozLineClamp msAnimationIterationCount msFlex msZoom msFlexGrow msFlexNegative msFlexOrder msFlexPositive msFlexShrink msGridColumn msGridColumnSpan msGridRow msGridRowSpan WebkitAnimationIterationCount WebkitBoxFlex WebKitBoxFlexGroup WebkitBoxOrdinalGroup WebkitColumnCount WebkitColumns WebkitFlex WebkitFlexGrow WebkitFlexPositive WebkitFlexShrink WebkitLineClamp\".split(\" \"));function tE(e,t,n){var r=0===t.indexOf(\"--\");null==n||\"boolean\"==typeof n||\"\"===n?r?e.setProperty(t,\"\"):\"float\"===t?e.cssFloat=\"\":e[t]=\"\":r?e.setProperty(t,n):\"number\"!=typeof n||0===n||tS.has(t)?\"float\"===t?e.cssFloat=n:e[t]=(\"\"+n).trim():e[t]=n+\"px\"}function tx(e,t,n){if(null!=t&&\"object\"!=typeof t)throw Error(u(62));if(e=e.style,null!=n){for(var r in n)!n.hasOwnProperty(r)||null!=t&&t.hasOwnProperty(r)||(0===r.indexOf(\"--\")?e.setProperty(r,\"\"):\"float\"===r?e.cssFloat=\"\":e[r]=\"\",tr=!0);for(var l in t)r=t[l],t.hasOwnProperty(l)&&n[l]!==r&&(tE(e,l,r),tr=!0)}else for(var a in t)t.hasOwnProperty(a)&&tE(e,a,t[a])}function t_(e){if(-1===e.indexOf(\"-\"))return!1;switch(e){case\"annotation-xml\":case\"color-profile\":case\"font-face\":case\"font-face-src\":case\"font-face-uri\":case\"font-face-format\":case\"font-face-name\":case\"missing-glyph\":return!1;default:return!0}}var tN=new Map([[\"acceptCharset\",\"accept-charset\"],[\"htmlFor\",\"for\"],[\"httpEquiv\",\"http-equiv\"],[\"crossOrigin\",\"crossorigin\"],[\"accentHeight\",\"accent-height\"],[\"alignmentBaseline\",\"alignment-baseline\"],[\"arabicForm\",\"arabic-form\"],[\"baselineShift\",\"baseline-shift\"],[\"capHeight\",\"cap-height\"],[\"clipPath\",\"clip-path\"],[\"clipRule\",\"clip-rule\"],[\"colorInterpolation\",\"color-interpolation\"],[\"colorInterpolationFilters\",\"color-interpolation-filters\"],[\"colorProfile\",\"color-profile\"],[\"colorRendering\",\"color-rendering\"],[\"dominantBaseline\",\"dominant-baseline\"],[\"enableBackground\",\"enable-background\"],[\"fillOpacity\",\"fill-opacity\"],[\"fillRule\",\"fill-rule\"],[\"floodColor\",\"flood-color\"],[\"floodOpacity\",\"flood-opacity\"],[\"fontFamily\",\"font-family\"],[\"fontSize\",\"font-size\"],[\"fontSizeAdjust\",\"font-size-adjust\"],[\"fontStretch\",\"font-stretch\"],[\"fontStyle\",\"font-style\"],[\"fontVariant\",\"font-variant\"],[\"fontWeight\",\"font-weight\"],[\"glyphName\",\"glyph-name\"],[\"glyphOrientationHorizontal\",\"glyph-orientation-horizontal\"],[\"glyphOrientationVertical\",\"glyph-orientation-vertical\"],[\"horizAdvX\",\"horiz-adv-x\"],[\"horizOriginX\",\"horiz-origin-x\"],[\"imageRendering\",\"image-rendering\"],[\"letterSpacing\",\"letter-spacing\"],[\"lightingColor\",\"lighting-color\"],[\"markerEnd\",\"marker-end\"],[\"markerMid\",\"marker-mid\"],[\"markerStart\",\"marker-start\"],[\"overlinePosition\",\"overline-position\"],[\"overlineThickness\",\"overline-thickness\"],[\"paintOrder\",\"paint-order\"],[\"panose-1\",\"panose-1\"],[\"pointerEvents\",\"pointer-events\"],[\"renderingIntent\",\"rendering-intent\"],[\"shapeRendering\",\"shape-rendering\"],[\"stopColor\",\"stop-color\"],[\"stopOpacity\",\"stop-opacity\"],[\"strikethroughPosition\",\"strikethrough-position\"],[\"strikethroughThickness\",\"strikethrough-thickness\"],[\"strokeDasharray\",\"stroke-dasharray\"],[\"strokeDashoffset\",\"stroke-dashoffset\"],[\"strokeLinecap\",\"stroke-linecap\"],[\"strokeLinejoin\",\"stroke-linejoin\"],[\"strokeMiterlimit\",\"stroke-miterlimit\"],[\"strokeOpacity\",\"stroke-opacity\"],[\"strokeWidth\",\"stroke-width\"],[\"textAnchor\",\"text-anchor\"],[\"textDecoration\",\"text-decoration\"],[\"textRendering\",\"text-rendering\"],[\"transformOrigin\",\"transform-origin\"],[\"underlinePosition\",\"underline-position\"],[\"underlineThickness\",\"underline-thickness\"],[\"unicodeBidi\",\"unicode-bidi\"],[\"unicodeRange\",\"unicode-range\"],[\"unitsPerEm\",\"units-per-em\"],[\"vAlphabetic\",\"v-alphabetic\"],[\"vHanging\",\"v-hanging\"],[\"vIdeographic\",\"v-ideographic\"],[\"vMathematical\",\"v-mathematical\"],[\"vectorEffect\",\"vector-effect\"],[\"vertAdvY\",\"vert-adv-y\"],[\"vertOriginX\",\"vert-origin-x\"],[\"vertOriginY\",\"vert-origin-y\"],[\"wordSpacing\",\"word-spacing\"],[\"writingMode\",\"writing-mode\"],[\"xmlnsXlink\",\"xmlns:xlink\"],[\"xHeight\",\"x-height\"]]),tP=/^[\\u0000-\\u001F ]*j[\\r\\n\\t]*a[\\r\\n\\t]*v[\\r\\n\\t]*a[\\r\\n\\t]*s[\\r\\n\\t]*c[\\r\\n\\t]*r[\\r\\n\\t]*i[\\r\\n\\t]*p[\\r\\n\\t]*t[\\r\\n\\t]*:/i;function tC(e){return tP.test(\"\"+e)?\"javascript:throw new Error('React has blocked a javascript: URL as a security precaution.')\":e}function tT(){}var tO=null;function tz(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var tL=null,tR=null;function tM(e){var t=e2(e);if(t&&(e=t.stateNode)){var n=e[eq]||null;switch(e=t.stateNode,t.type){case\"input\":if(th(e,n.value,n.defaultValue,n.defaultValue,n.checked,n.defaultChecked,n.type,n.name),t=n.name,\"radio\"===n.type&&null!=t){for(n=e;n.parentNode;)n=n.parentNode;for(n=n.querySelectorAll('input[name=\"'+tm(\"\"+t)+'\"][type=\"radio\"]'),t=0;t<n.length;t++){var r=n[t];if(r!==e&&r.form===e.form){var l=r[eq]||null;if(!l)throw Error(u(90));th(r,l.value,l.defaultValue,l.defaultValue,l.checked,l.defaultChecked,l.type,l.name)}}for(t=0;t<n.length;t++)(r=n[t]).form===e.form&&tf(r)}break;case\"textarea\":tb(e,n.value,n.defaultValue);break;case\"select\":null!=(t=n.value)&&ty(e,!!n.multiple,t,!1)}}}var tI=!1;function tD(e,t,n){if(tI)return e(t,n);tI=!0;try{return e(t)}finally{if(tI=!1,(null!==tL||null!==tR)&&(st(),tL&&(t=tL,e=tR,tR=tL=null,tM(t),e)))for(t=0;t<e.length;t++)tM(e[t])}}function tF(e,t){var n=e.stateNode;if(null===n)return null;var r=n[eq]||null;if(null===r)return null;switch(n=r[t],t){case\"onClick\":case\"onClickCapture\":case\"onDoubleClick\":case\"onDoubleClickCapture\":case\"onMouseDown\":case\"onMouseDownCapture\":case\"onMouseMove\":case\"onMouseMoveCapture\":case\"onMouseUp\":case\"onMouseUpCapture\":case\"onMouseEnter\":(r=!r.disabled)||(r=\"button\"!==(e=e.type)&&\"input\"!==e&&\"select\"!==e&&\"textarea\"!==e),e=!r;break;default:e=!1}if(e)return null;if(n&&\"function\"!=typeof n)throw Error(u(231,t,typeof n));return n}var tA=\"u\">typeof window&&void 0!==window.document&&void 0!==window.document.createElement,tj=!1;if(tA)try{var tU={};Object.defineProperty(tU,\"passive\",{get:function(){tj=!0}}),window.addEventListener(\"test\",tU,tU),window.removeEventListener(\"test\",tU,tU)}catch(e){tj=!1}var tB=null,tV=null,tH=null;function t$(){if(tH)return tH;var e,t,n=tV,r=n.length,l=\"value\"in tB?tB.value:tB.textContent,a=l.length;for(e=0;e<r&&n[e]===l[e];e++);var o=r-e;for(t=1;t<=o&&n[r-t]===l[a-t];t++);return tH=l.slice(e,1<t?1-t:void 0)}function tQ(e){var t=e.keyCode;return\"charCode\"in e?0===(e=e.charCode)&&13===t&&(e=13):e=t,10===e&&(e=13),32<=e||13===e?e:0}function tW(){return!0}function tq(){return!1}function tK(e){function t(t,n,r,l,a){for(var o in this._reactName=t,this._targetInst=r,this.type=n,this.nativeEvent=l,this.target=a,this.currentTarget=null,e)e.hasOwnProperty(o)&&(t=e[o],this[o]=t?t(l):l[o]);return this.isDefaultPrevented=(null!=l.defaultPrevented?l.defaultPrevented:!1===l.returnValue)?tW:tq,this.isPropagationStopped=tq,this}return x(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():\"unknown\"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=tW)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():\"unknown\"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=tW)},persist:function(){},isPersistent:tW}),t}var tX,tG,tY,tJ,tZ,t0={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},t1=tK(t0),t2=x({},t0,{view:0,detail:0}),t3=tK(t2),t4=x({},t2,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:na,button:0,buttons:0,relatedTarget:function(e){return void 0===e.relatedTarget?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return\"movementX\"in e?e.movementX:(e!==tZ&&(tZ&&\"mousemove\"===e.type?(tY=e.screenX-tZ.screenX,tJ=e.screenY-tZ.screenY):tJ=tY=0,tZ=e),tY)},movementY:function(e){return\"movementY\"in e?e.movementY:tJ}}),t5=tK(t4),t8=tK(x({},t4,{dataTransfer:0})),t6=tK(x({},t2,{relatedTarget:0})),t9=tK(x({},t0,{animationName:0,elapsedTime:0,pseudoElement:0})),t7=tK(x({},t0,{clipboardData:function(e){return\"clipboardData\"in e?e.clipboardData:window.clipboardData}})),ne=tK(x({},t0,{data:0})),nt={Esc:\"Escape\",Spacebar:\" \",Left:\"ArrowLeft\",Up:\"ArrowUp\",Right:\"ArrowRight\",Down:\"ArrowDown\",Del:\"Delete\",Win:\"OS\",Menu:\"ContextMenu\",Apps:\"ContextMenu\",Scroll:\"ScrollLock\",MozPrintableKey:\"Unidentified\"},nn={8:\"Backspace\",9:\"Tab\",12:\"Clear\",13:\"Enter\",16:\"Shift\",17:\"Control\",18:\"Alt\",19:\"Pause\",20:\"CapsLock\",27:\"Escape\",32:\" \",33:\"PageUp\",34:\"PageDown\",35:\"End\",36:\"Home\",37:\"ArrowLeft\",38:\"ArrowUp\",39:\"ArrowRight\",40:\"ArrowDown\",45:\"Insert\",46:\"Delete\",112:\"F1\",113:\"F2\",114:\"F3\",115:\"F4\",116:\"F5\",117:\"F6\",118:\"F7\",119:\"F8\",120:\"F9\",121:\"F10\",122:\"F11\",123:\"F12\",144:\"NumLock\",145:\"ScrollLock\",224:\"Meta\"},nr={Alt:\"altKey\",Control:\"ctrlKey\",Meta:\"metaKey\",Shift:\"shiftKey\"};function nl(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=nr[e])&&!!t[e]}function na(){return nl}var no=tK(x({},t2,{key:function(e){if(e.key){var t=nt[e.key]||e.key;if(\"Unidentified\"!==t)return t}return\"keypress\"===e.type?13===(e=tQ(e))?\"Enter\":String.fromCharCode(e):\"keydown\"===e.type||\"keyup\"===e.type?nn[e.keyCode]||\"Unidentified\":\"\"},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:na,charCode:function(e){return\"keypress\"===e.type?tQ(e):0},keyCode:function(e){return\"keydown\"===e.type||\"keyup\"===e.type?e.keyCode:0},which:function(e){return\"keypress\"===e.type?tQ(e):\"keydown\"===e.type||\"keyup\"===e.type?e.keyCode:0}})),ni=tK(x({},t4,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),nu=tK(x({},t2,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:na})),ns=tK(x({},t0,{propertyName:0,elapsedTime:0,pseudoElement:0})),nc=tK(x({},t4,{deltaX:function(e){return\"deltaX\"in e?e.deltaX:\"wheelDeltaX\"in e?-e.wheelDeltaX:0},deltaY:function(e){return\"deltaY\"in e?e.deltaY:\"wheelDeltaY\"in e?-e.wheelDeltaY:\"wheelDelta\"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0})),nf=tK(x({},t0,{newState:0,oldState:0})),nd=[9,13,27,32],np=tA&&\"CompositionEvent\"in window,nm=null;tA&&\"documentMode\"in document&&(nm=document.documentMode);var nh=tA&&\"TextEvent\"in window&&!nm,ng=tA&&(!np||nm&&8<nm&&11>=nm),nv=!1;function ny(e,t){switch(e){case\"keyup\":return -1!==nd.indexOf(t.keyCode);case\"keydown\":return 229!==t.keyCode;case\"keypress\":case\"mousedown\":case\"focusout\":return!0;default:return!1}}function nb(e){return\"object\"==typeof(e=e.detail)&&\"data\"in e?e.data:null}var nw=!1,nk={color:!0,date:!0,datetime:!0,\"datetime-local\":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function nS(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return\"input\"===t?!!nk[e.type]:\"textarea\"===t}function nE(e,t,n,r){tL?tR?tR.push(r):tR=[r]:tL=r,0<(t=s5(t,\"onChange\")).length&&(n=new t1(\"onChange\",\"change\",null,n,r),e.push({event:n,listeners:t}))}var nx=null,n_=null;function nN(e){sY(e,0)}function nP(e){if(tf(e3(e)))return e}function nC(e,t){if(\"change\"===e)return t}var nT=!1;if(tA){if(tA){var nO=\"oninput\"in document;if(!nO){var nz=document.createElement(\"div\");nz.setAttribute(\"oninput\",\"return;\"),nO=\"function\"==typeof nz.oninput}r=nO}else r=!1;nT=r&&(!document.documentMode||9<document.documentMode)}function nL(){nx&&(nx.detachEvent(\"onpropertychange\",nR),n_=nx=null)}function nR(e){if(\"value\"===e.propertyName&&nP(n_)){var t=[];nE(t,n_,e,tz(e)),tD(nN,t)}}function nM(e,t,n){\"focusin\"===e?(nL(),nx=t,n_=n,nx.attachEvent(\"onpropertychange\",nR)):\"focusout\"===e&&nL()}function nI(e){if(\"selectionchange\"===e||\"keyup\"===e||\"keydown\"===e)return nP(n_)}function nD(e,t){if(\"click\"===e)return nP(t)}function nF(e,t){if(\"input\"===e||\"change\"===e)return nP(t)}var nA=\"function\"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t};function nj(e,t){if(nA(e,t))return!0;if(\"object\"!=typeof e||null===e||\"object\"!=typeof t||null===t)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(r=0;r<n.length;r++){var l=n[r];if(!ed.call(t,l)||!nA(e[l],t[l]))return!1}return!0}function nU(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function nB(e,t){var n,r=nU(e);for(e=0;r;){if(3===r.nodeType){if(n=e+r.textContent.length,e<=t&&n>=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=nU(r)}}function nV(e){e=null!=e&&null!=e.ownerDocument&&null!=e.ownerDocument.defaultView?e.ownerDocument.defaultView:window;for(var t=td(e.document);t instanceof e.HTMLIFrameElement;){try{var n=\"string\"==typeof t.contentWindow.location.href}catch(e){n=!1}if(n)e=t.contentWindow;else break;t=td(e.document)}return t}function nH(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(\"input\"===t&&(\"text\"===e.type||\"search\"===e.type||\"tel\"===e.type||\"url\"===e.type||\"password\"===e.type)||\"textarea\"===t||\"true\"===e.contentEditable)}var n$=tA&&\"documentMode\"in document&&11>=document.documentMode,nQ=null,nW=null,nq=null,nK=!1;function nX(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;nK||null==nQ||nQ!==td(r)||(r=\"selectionStart\"in(r=nQ)&&nH(r)?{start:r.selectionStart,end:r.selectionEnd}:{anchorNode:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset},nq&&nj(nq,r)||(nq=r,0<(r=s5(nW,\"onSelect\")).length&&(t=new t1(\"onSelect\",\"select\",null,t,n),e.push({event:t,listeners:r}),t.target=nQ)))}function nG(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n[\"Webkit\"+e]=\"webkit\"+t,n[\"Moz\"+e]=\"moz\"+t,n}var nY={animationend:nG(\"Animation\",\"AnimationEnd\"),animationiteration:nG(\"Animation\",\"AnimationIteration\"),animationstart:nG(\"Animation\",\"AnimationStart\"),transitionrun:nG(\"Transition\",\"TransitionRun\"),transitionstart:nG(\"Transition\",\"TransitionStart\"),transitioncancel:nG(\"Transition\",\"TransitionCancel\"),transitionend:nG(\"Transition\",\"TransitionEnd\")},nJ={},nZ={};function n0(e){if(nJ[e])return nJ[e];if(!nY[e])return e;var t,n=nY[e];for(t in n)if(n.hasOwnProperty(t)&&t in nZ)return nJ[e]=n[t];return e}tA&&(nZ=document.createElement(\"div\").style,\"AnimationEvent\"in window||(delete nY.animationend.animation,delete nY.animationiteration.animation,delete nY.animationstart.animation),\"TransitionEvent\"in window||delete nY.transitionend.transition);var n1=n0(\"animationend\"),n2=n0(\"animationiteration\"),n3=n0(\"animationstart\"),n4=n0(\"transitionrun\"),n5=n0(\"transitionstart\"),n8=n0(\"transitioncancel\"),n6=n0(\"transitionend\"),n9=new Map,n7=\"abort auxClick beforeToggle cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel\".split(\" \");function re(e,t){n9.set(e,t),e9(t,[e])}n7.push(\"scrollEnd\");var rt=0;function rn(e,t){return null!=e.name&&\"auto\"!==e.name?e.name:null!==t.autoName?t.autoName:t.autoName=e=\"_\"+(e=uq.identifierPrefix)+\"t_\"+(rt++).toString(32)+\"_\"}function rr(e){if(null==e||\"string\"==typeof e)return e;var t=null,n=u1;if(null!==n)for(var r=0;r<n.length;r++){var l=e[n[r]];if(null!=l){if(\"none\"===l)return\"none\";t=null==t?l:t+\" \"+l}}return null==t?e.default:t}function rl(e,t){return e=rr(e),null==(t=rr(t))?\"auto\"===e?null:e:\"auto\"===t?null:t}var ra=\"function\"==typeof reportError?reportError:function(e){if(\"object\"==typeof window&&\"function\"==typeof window.ErrorEvent){var t=new window.ErrorEvent(\"error\",{bubbles:!0,cancelable:!0,message:\"object\"==typeof e&&null!==e&&\"string\"==typeof e.message?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if(\"object\"==typeof l.default&&\"function\"==typeof l.default.emit)return void l.default.emit(\"uncaughtException\",e);console.error(e)},ro=[],ri=0,ru=0;function rs(){for(var e=ri,t=ru=ri=0;t<e;){var n=ro[t];ro[t++]=null;var r=ro[t];ro[t++]=null;var l=ro[t];ro[t++]=null;var a=ro[t];if(ro[t++]=null,null!==r&&null!==l){var o=r.pending;null===o?l.next=l:(l.next=o.next,o.next=l),r.pending=l}0!==a&&rp(n,l,a)}}function rc(e,t,n,r){ro[ri++]=e,ro[ri++]=t,ro[ri++]=n,ro[ri++]=r,ru|=r,e.lanes|=r,null!==(e=e.alternate)&&(e.lanes|=r)}function rf(e,t,n,r){return rc(e,t,n,r),rm(e)}function rd(e,t){return rc(e,null,null,t),rm(e)}function rp(e,t,n){e.lanes|=n;var r=e.alternate;null!==r&&(r.lanes|=n);for(var l=!1,a=e.return;null!==a;)a.childLanes|=n,null!==(r=a.alternate)&&(r.childLanes|=n),22===a.tag&&(null===(e=a.stateNode)||1&e._visibility||(l=!0)),e=a,a=a.return;return 3===e.tag?(a=e.stateNode,l&&null!==t&&(l=31-eN(n),null===(r=(e=a.hiddenUpdates)[l])?e[l]=[t]:r.push(t),t.lane=0x20000000|n),a):null}function rm(e){if(50<u2)throw u2=0,u3=null,Error(u(185));for(var t=e.return;null!==t;)t=(e=t).return;return 3===e.tag?e.stateNode:null}var rh={};function rg(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.refCleanup=this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function rv(e,t,n,r){return new rg(e,t,n,r)}function ry(e){return!(!(e=e.prototype)||!e.isReactComponent)}function rb(e,t){var n=e.alternate;return null===n?((n=rv(e.tag,t,e.key,e.mode)).elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=0x7e00000&e.flags,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=null===t?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n.refCleanup=e.refCleanup,n}function rw(e,t){e.flags&=0x7e00002;var n=e.alternate;return null===n?(e.childLanes=0,e.lanes=t,e.child=null,e.subtreeFlags=0,e.memoizedProps=null,e.memoizedState=null,e.updateQueue=null,e.dependencies=null,e.stateNode=null):(e.childLanes=n.childLanes,e.lanes=n.lanes,e.child=n.child,e.subtreeFlags=0,e.deletions=null,e.memoizedProps=n.memoizedProps,e.memoizedState=n.memoizedState,e.updateQueue=n.updateQueue,e.type=n.type,e.dependencies=null===(t=n.dependencies)?null:{lanes:t.lanes,firstContext:t.firstContext}),e}function rk(e,t,n,r,l,a){var o=0;if(r=e,\"function\"==typeof e)ry(e)&&(o=1);else if(\"string\"==typeof e)o=!function(e,t,n){if(1===n||null!=t.itemProp)return!1;switch(e){case\"meta\":case\"title\":return!0;case\"style\":if(\"string\"!=typeof t.precedence||\"string\"!=typeof t.href||\"\"===t.href)break;return!0;case\"link\":if(\"string\"!=typeof t.rel||\"string\"!=typeof t.href||\"\"===t.href||t.onLoad||t.onError)break;if(\"stylesheet\"===t.rel)return e=t.disabled,\"string\"==typeof t.precedence&&null==e;return!0;case\"script\":if(t.async&&\"function\"!=typeof t.async&&\"symbol\"!=typeof t.async&&!t.onLoad&&!t.onError&&t.src&&\"string\"==typeof t.src)return!0}return!1}(e,n,ee.current)?\"html\"===e||\"head\"===e||\"body\"===e?27:5:26;else e:switch(e){case A:return(e=rv(31,n,t,l)).elementType=A,e.lanes=a,e;case C:return rS(n.children,l,a,t);case T:o=8,l|=24;break;case O:return(e=rv(12,n,t,2|l)).elementType=O,e.lanes=a,e;case M:return(e=rv(13,n,t,l)).elementType=M,e.lanes=a,e;case I:return(e=rv(19,n,t,l)).elementType=I,e.lanes=a,e;case j:case B:return(e=rv(30,n,t,e=32|l)).elementType=B,e.lanes=a,e.stateNode={autoName:null,paired:null,clones:null,ref:null},e;default:if(\"object\"==typeof e&&null!==e)switch(e.$$typeof){case L:o=10;break e;case z:o=9;break e;case R:o=11;break e;case D:o=14;break e;case F:o=16,r=null;break e}o=29,n=Error(u(130,null===e?\"null\":typeof e,\"\")),r=null}return(t=rv(o,n,t,l)).elementType=e,t.type=r,t.lanes=a,t}function rS(e,t,n,r){return(e=rv(7,e,r,t)).lanes=n,e}function rE(e,t,n){return(e=rv(6,e,null,t)).lanes=n,e}function rx(e){var t=rv(18,null,null,0);return t.stateNode=e,t}function r_(e,t,n){return(t=rv(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}var rN=new WeakMap;function rP(e,t){if(\"object\"==typeof e&&null!==e){var n=rN.get(e);return void 0!==n?n:(t={value:e,source:t,stack:ef(t)},rN.set(e,t),t)}return{value:e,source:t,stack:ef(t)}}var rC=[],rT=0,rO=null,rz=0,rL=[],rR=0,rM=null,rI=1,rD=\"\";function rF(e,t){rC[rT++]=rz,rC[rT++]=rO,rO=e,rz=t}function rA(e,t,n){rL[rR++]=rI,rL[rR++]=rD,rL[rR++]=rM,rM=e;var r=rI;e=rD;var l=32-eN(r)-1;r&=~(1<<l),n+=1;var a=32-eN(t)+l;if(30<a){var o=l-l%5;a=(r&(1<<o)-1).toString(32),r>>=o,l-=o,rI=1<<32-eN(t)+l|n<<l|r,rD=a+e}else rI=1<<a|n<<l|r,rD=e}function rj(e){null!==e.return&&(rF(e,1),rA(e,1,0))}function rU(e){for(;e===rO;)rO=rC[--rT],rC[rT]=null,rz=rC[--rT],rC[rT]=null;for(;e===rM;)rM=rL[--rR],rL[rR]=null,rD=rL[--rR],rL[rR]=null,rI=rL[--rR],rL[rR]=null}function rB(e,t){rL[rR++]=rI,rL[rR++]=rD,rL[rR++]=rM,rI=t.id,rD=t.overflow,rM=e}var rV=null,rH=null,r$=!1,rQ=null,rW=!1,rq=Error(u(519));function rK(e){var t=Error(u(418,1<arguments.length&&void 0!==arguments[1]&&arguments[1]?\"text\":\"HTML\",\"\"));throw r0(rP(t,e)),rq}function rX(e){var t=e.stateNode,n=e.type,r=e.memoizedProps;switch(t[eW]=e,t[eq]=r,n){case\"dialog\":sJ(\"cancel\",t),sJ(\"close\",t);break;case\"iframe\":case\"object\":case\"embed\":sJ(\"load\",t);break;case\"video\":case\"audio\":for(n=0;n<sX.length;n++)sJ(sX[n],t);break;case\"source\":sJ(\"error\",t);break;case\"img\":case\"image\":case\"link\":sJ(\"error\",t),sJ(\"load\",t);break;case\"details\":sJ(\"toggle\",t);break;case\"input\":sJ(\"invalid\",t),tg(t,r.value,r.defaultValue,r.checked,r.defaultChecked,r.type,r.name,!0);break;case\"select\":sJ(\"invalid\",t);break;case\"textarea\":sJ(\"invalid\",t),tw(t,r.value,r.defaultValue,r.children)}\"string\"!=typeof(n=r.children)&&\"number\"!=typeof n&&\"bigint\"!=typeof n||t.textContent===\"\"+n||!0===r.suppressHydrationWarning||ct(t.textContent,n)?(null!=r.popover&&(sJ(\"beforetoggle\",t),sJ(\"toggle\",t)),null!=r.onScroll&&sJ(\"scroll\",t),null!=r.onScrollEnd&&sJ(\"scrollend\",t),null!=r.onClick&&(t.onclick=tT),t=!0):t=!1,t||rK(e,!0)}function rG(e){for(rV=e.return;rV;)switch(rV.tag){case 5:case 31:case 13:rW=!1;return;case 27:case 3:rW=!0;return;default:rV=rV.return}}function rY(e){if(e!==rV)return!1;if(!r$)return rG(e),r$=!0,!1;var t,n=e.tag;if((t=3!==n&&27!==n)&&((t=5===n)&&(t=\"form\"===(t=e.type)||\"button\"===t||cf(e.type,e.memoizedProps)),t=!t),t&&rH&&rK(e),rG(e),13===n){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(u(317));rH=cq(e)}else if(31===n){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(u(317));rH=cq(e)}else 27===n?(n=rH,cy(e.type)?(e=cW,cW=null,rH=e):rH=n):rH=rV?cQ(e.stateNode.nextSibling):null;return!0}function rJ(){rH=rV=null,r$=!1}function rZ(){var e=rQ;return null!==e&&(null===uj?uj=e:uj.push.apply(uj,e),rQ=null),e}function r0(e){null===rQ?rQ=[e]:rQ.push(e)}var r1=Y(null),r2=null,r3=null;function r4(e,t,n){Z(r1,t._currentValue),t._currentValue=n}function r5(e){e._currentValue=r1.current,J(r1)}function r8(e,t,n){for(;null!==e;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,null!==r&&(r.childLanes|=t)):null!==r&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function r6(e,t,n,r){var l=e.child;for(null!==l&&(l.return=e);null!==l;){var a=l.dependencies;if(null!==a){var o=l.child;a=a.firstContext;e:for(;null!==a;){var i=a;a=l;for(var s=0;s<t.length;s++)if(i.context===t[s]){a.lanes|=n,null!==(i=a.alternate)&&(i.lanes|=n),r8(a.return,n,e),r||(o=null);break e}a=i.next}}else if(18===l.tag){if(null===(o=l.return))throw Error(u(341));o.lanes|=n,null!==(a=o.alternate)&&(a.lanes|=n),r8(o,n,e),o=null}else o=l.child;if(null!==o)o.return=l;else for(o=l;null!==o;){if(o===e){o=null;break}if(null!==(l=o.sibling)){l.return=o.return,o=l;break}o=o.return}l=o}}function r9(e,t,n,r){e=null;for(var l=t,a=!1;null!==l;){if(!a){if(0!=(524288&l.flags))a=!0;else if(0!=(262144&l.flags))break}if(10===l.tag){var o=l.alternate;if(null===o)throw Error(u(387));if(null!==(o=o.memoizedProps)){var i=l.type;nA(l.pendingProps.value,o.value)||(null!==e?e.push(i):e=[i])}}else if(l===er.current){if(null===(o=l.alternate))throw Error(u(387));o.memoizedState.memoizedState!==l.memoizedState.memoizedState&&(null!==e?e.push(fv):e=[fv])}l=l.return}null!==e&&r6(t,e,n,r),t.flags|=262144}function r7(e){for(e=e.firstContext;null!==e;){if(!nA(e.context._currentValue,e.memoizedValue))return!0;e=e.next}return!1}function le(e){r2=e,r3=null,null!==(e=e.dependencies)&&(e.firstContext=null)}function lt(e){return lr(r2,e)}function ln(e,t){return null===r2&&le(e),lr(e,t)}function lr(e,t){var n=t._currentValue;if(t={context:t,memoizedValue:n,next:null},null===r3){if(null===e)throw Error(u(308));r3=t,e.dependencies={lanes:0,firstContext:t},e.flags|=524288}else r3=r3.next=t;return n}var ll=\"u\">typeof AbortController?AbortController:function(){var e=[],t=this.signal={aborted:!1,addEventListener:function(t,n){e.push(n)}};this.abort=function(){t.aborted=!0,e.forEach(function(e){return e()})}},la=a.unstable_scheduleCallback,lo=a.unstable_NormalPriority,li={$$typeof:L,Consumer:null,Provider:null,_currentValue:null,_currentValue2:null,_threadCount:0};function lu(){return{controller:new ll,data:new Map,refCount:0}}function ls(e){e.refCount--,0===e.refCount&&la(lo,function(){e.controller.abort()})}function lc(e,t){if(0!=(4194048&e.pendingLanes)){var n=e.transitionTypes;for(null===n&&(n=e.transitionTypes=[]),e=0;e<t.length;e++){var r=t[e];-1===n.indexOf(r)&&n.push(r)}}}var lf=null,ld=null,lp=0,lm=0,lh=null;function lg(){if(0==--lp&&(lf=null,null!==ld)){null!==lh&&(lh.status=\"fulfilled\");var e=ld;ld=null,lm=0,lh=null;for(var t=0;t<e.length;t++)(0,e[t])()}}var lv=W.S;W.S=function(e,t){if(uV=ev(),\"object\"==typeof t&&null!==t&&\"function\"==typeof t.then&&function(e,t){if(null===ld){var n=ld=[];lp=0,lm=s$(),lh={status:\"pending\",value:void 0,then:function(e){n.push(e)}}}lp++,t.then(lg,lg)}(0,t),null!==lf)for(var n=sz;null!==n;)lc(n,lf),n=n.next;if(null!==(n=e.types)){for(var r=sz;null!==r;)lc(r,n),r=r.next;if(0!==lm){null===(r=lf)&&(r=lf=[]);for(var l=0;l<n.length;l++){var a=n[l];-1===r.indexOf(a)&&r.push(a)}}}null!==lv&&lv(e,t)};var ly=Y(null);function lb(){var e=ly.current;return null!==e?e:uE.pooledCache}function lw(e,t){null===t?Z(ly,ly.current):Z(ly,t.pool)}function lk(){var e=lb();return null===e?null:{parent:li._currentValue,pool:e}}var lS=Error(u(460)),lE=Error(u(474)),lx=Error(u(542)),l_={then:function(){}};function lN(e){return\"fulfilled\"===(e=e.status)||\"rejected\"===e}function lP(e,t,n){switch(void 0===(n=e[n])?e.push(t):n!==t&&(t.then(tT,tT),t=n),t.status){case\"fulfilled\":return t.value;case\"rejected\":throw lz(e=t.reason),e;default:if(\"string\"==typeof t.status)t.then(tT,tT);else{if(null!==(e=uE)&&100<e.shellSuspendCounter)throw Error(u(482));(e=t).status=\"pending\",e.then(function(e){if(\"pending\"===t.status){var n=t;n.status=\"fulfilled\",n.value=e}},function(e){if(\"pending\"===t.status){var n=t;n.status=\"rejected\",n.reason=e}})}switch(t.status){case\"fulfilled\":return t.value;case\"rejected\":throw lz(e=t.reason),e}throw lT=t,lS}}function lC(e){try{return(0,e._init)(e._payload)}catch(e){if(null!==e&&\"object\"==typeof e&&\"function\"==typeof e.then)throw lT=e,lS;throw e}}var lT=null;function lO(){if(null===lT)throw Error(u(459));var e=lT;return lT=null,e}function lz(e){if(e===lS||e===lx)throw Error(u(483))}var lL=null,lR=0;function lM(e){var t=lR;return lR+=1,null===lL&&(lL=[]),lP(lL,e,t)}function lI(e,t){e.ref=void 0!==(t=t.props.ref)?t:null}function lD(e,t){if(t.$$typeof===_)throw Error(u(525));throw Error(u(31,\"[object Object]\"===(e=Object.prototype.toString.call(t))?\"object with keys {\"+Object.keys(t).join(\", \")+\"}\":e))}function lF(e){function t(t,n){if(e){var r=t.deletions;null===r?(t.deletions=[n],t.flags|=16):r.push(n)}}function n(n,r){if(!e)return null;for(;null!==r;)t(n,r),r=r.sibling;return null}function r(e){for(var t=new Map;null!==e;)null===e.key?t.set(e.index,e):t.set(e.key,e),e=e.sibling;return t}function l(e,t){return(e=rb(e,t)).index=0,e.sibling=null,e}function a(t,n,r){return(t.index=r,e)?null!==(r=t.alternate)?(r=r.index)<n?(t.flags|=0x8000002,n):r:(t.flags|=0x8000002,n):(t.flags|=1048576,n)}function o(t){return e&&null===t.alternate&&(t.flags|=0x8000002),t}function i(e,t,n,r){return null===t||6!==t.tag?(t=rE(n,e.mode,r)).return=e:(t=l(t,n)).return=e,t}function s(e,t,n,r){var a=n.type;return a===C?(lI(e=f(e,t,n.props.children,r,n.key),n),e):(null!==t&&(t.elementType===a||\"object\"==typeof a&&null!==a&&a.$$typeof===F&&lC(a)===t.type)?lI(t=l(t,n.props),n):lI(t=rk(n.type,n.key,n.props,null,e.mode,r),n),t.return=e,t)}function c(e,t,n,r){return null===t||4!==t.tag||t.stateNode.containerInfo!==n.containerInfo||t.stateNode.implementation!==n.implementation?(t=r_(n,e.mode,r)).return=e:(t=l(t,n.children||[])).return=e,t}function f(e,t,n,r,a){return null===t||7!==t.tag?(t=rS(n,e.mode,r,a)).return=e:(t=l(t,n)).return=e,t}function d(e,t,n){if(\"string\"==typeof t&&\"\"!==t||\"number\"==typeof t||\"bigint\"==typeof t)return(t=rE(\"\"+t,e.mode,n)).return=e,t;if(\"object\"==typeof t&&null!==t){switch(t.$$typeof){case N:return lI(n=rk(t.type,t.key,t.props,null,e.mode,n),t),n.return=e,n;case P:return(t=r_(t,e.mode,n)).return=e,t;case F:return d(e,t=lC(t),n)}if(Q(t)||H(t))return(t=rS(t,e.mode,n,null)).return=e,t;if(\"function\"==typeof t.then)return d(e,lM(t),n);if(t.$$typeof===L)return d(e,ln(e,t),n);lD(e,t)}return null}function p(e,t,n,r){var l=null!==t?t.key:null;if(\"string\"==typeof n&&\"\"!==n||\"number\"==typeof n||\"bigint\"==typeof n)return null!==l?null:i(e,t,\"\"+n,r);if(\"object\"==typeof n&&null!==n){switch(n.$$typeof){case N:return n.key===l?s(e,t,n,r):null;case P:return n.key===l?c(e,t,n,r):null;case F:return p(e,t,n=lC(n),r)}if(Q(n)||H(n))return null!==l?null:f(e,t,n,r,null);if(\"function\"==typeof n.then)return p(e,t,lM(n),r);if(n.$$typeof===L)return p(e,t,ln(e,n),r);lD(e,n)}return null}function m(e,t,n,r,l){if(\"string\"==typeof r&&\"\"!==r||\"number\"==typeof r||\"bigint\"==typeof r)return i(t,e=e.get(n)||null,\"\"+r,l);if(\"object\"==typeof r&&null!==r){switch(r.$$typeof){case N:return s(t,e=e.get(null===r.key?n:r.key)||null,r,l);case P:return c(t,e=e.get(null===r.key?n:r.key)||null,r,l);case F:return m(e,t,n,r=lC(r),l)}if(Q(r)||H(r))return f(t,e=e.get(n)||null,r,l,null);if(\"function\"==typeof r.then)return m(e,t,n,lM(r),l);if(r.$$typeof===L)return m(e,t,n,ln(t,r),l);lD(t,r)}return null}return function(i,s,c,f){try{lR=0;var h=function i(s,c,f,h){if(\"object\"==typeof f&&null!==f&&f.type===C&&null===f.key&&void 0===f.props.ref&&(f=f.props.children),\"object\"==typeof f&&null!==f){switch(f.$$typeof){case N:e:{for(var g=f.key;null!==c;){if(c.key===g){if((g=f.type)===C){if(7===c.tag){n(s,c.sibling),lI(h=l(c,f.props.children),f),h.return=s,s=h;break e}}else if(c.elementType===g||\"object\"==typeof g&&null!==g&&g.$$typeof===F&&lC(g)===c.type){n(s,c.sibling),lI(h=l(c,f.props),f),h.return=s,s=h;break e}n(s,c);break}t(s,c),c=c.sibling}f.type===C?lI(h=rS(f.props.children,s.mode,h,f.key),f):lI(h=rk(f.type,f.key,f.props,null,s.mode,h),f),h.return=s,s=h}return o(s);case P:e:{for(g=f.key;null!==c;){if(c.key===g)if(4===c.tag&&c.stateNode.containerInfo===f.containerInfo&&c.stateNode.implementation===f.implementation){n(s,c.sibling),(h=l(c,f.children||[])).return=s,s=h;break e}else{n(s,c);break}t(s,c),c=c.sibling}(h=r_(f,s.mode,h)).return=s,s=h}return o(s);case F:return i(s,c,f=lC(f),h)}if(Q(f))return function(l,o,i,u){for(var s=null,c=null,f=o,h=o=0,g=null;null!==f&&h<i.length;h++){f.index>h?(g=f,f=null):g=f.sibling;var v=p(l,f,i[h],u);if(null===v){null===f&&(f=g);break}e&&f&&null===v.alternate&&t(l,f),o=a(v,o,h),null===c?s=v:c.sibling=v,c=v,f=g}if(h===i.length)return n(l,f),r$&&rF(l,h),s;if(null===f){for(;h<i.length;h++)null!==(f=d(l,i[h],u))&&(o=a(f,o,h),null===c?s=f:c.sibling=f,c=f);return r$&&rF(l,h),s}for(f=r(f);h<i.length;h++)null!==(g=m(f,l,h,i[h],u))&&(e&&null!==(v=g.alternate)&&f.delete(null===v.key?h:v.key),o=a(g,o,h),null===c?s=g:c.sibling=g,c=g);return e&&f.forEach(function(e){return t(l,e)}),r$&&rF(l,h),s}(s,c,f,h);if(H(f)){if(\"function\"!=typeof(g=H(f)))throw Error(u(150));return function(l,o,i,s){if(null==i)throw Error(u(151));for(var c=null,f=null,h=o,g=o=0,v=null,y=i.next();null!==h&&!y.done;g++,y=i.next()){h.index>g?(v=h,h=null):v=h.sibling;var b=p(l,h,y.value,s);if(null===b){null===h&&(h=v);break}e&&h&&null===b.alternate&&t(l,h),o=a(b,o,g),null===f?c=b:f.sibling=b,f=b,h=v}if(y.done)return n(l,h),r$&&rF(l,g),c;if(null===h){for(;!y.done;g++,y=i.next())null!==(y=d(l,y.value,s))&&(o=a(y,o,g),null===f?c=y:f.sibling=y,f=y);return r$&&rF(l,g),c}for(h=r(h);!y.done;g++,y=i.next())null!==(y=m(h,l,g,y.value,s))&&(e&&null!==(v=y.alternate)&&h.delete(null===v.key?g:v.key),o=a(y,o,g),null===f?c=y:f.sibling=y,f=y);return e&&h.forEach(function(e){return t(l,e)}),r$&&rF(l,g),c}(s,c,f=g.call(f),h)}if(\"function\"==typeof f.then)return i(s,c,lM(f),h);if(f.$$typeof===L)return i(s,c,ln(s,f),h);lD(s,f)}return\"string\"==typeof f&&\"\"!==f||\"number\"==typeof f||\"bigint\"==typeof f?(f=\"\"+f,null!==c&&6===c.tag?(n(s,c.sibling),(h=l(c,f)).return=s):(n(s,c),(h=rE(f,s.mode,h)).return=s),o(s=h)):n(s,c)}(i,s,c,f);return lL=null,h}catch(e){if(e===lS||e===lx)throw e;var g=rv(29,e,null,i.mode);return g.lanes=f,g.return=i,g}finally{}}}var lA=lF(!0),lj=lF(!1),lU=!1;function lB(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function lV(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function lH(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function l$(e,t,n){var r=e.updateQueue;if(null===r)return null;if(r=r.shared,0!=(2&uS)){var l=r.pending;return null===l?t.next=t:(t.next=l.next,l.next=t),r.pending=t,t=rm(e),rp(e,null,n),t}return rc(e,r,t,n),rm(e)}function lQ(e,t,n){if(null!==(t=t.updateQueue)&&(t=t.shared,0!=(4194048&n))){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,ej(e,n)}}function lW(e,t){var n=e.updateQueue,r=e.alternate;if(null!==r&&n===(r=r.updateQueue)){var l=null,a=null;if(null!==(n=n.firstBaseUpdate)){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};null===a?l=a=o:a=a.next=o,n=n.next}while(null!==n)null===a?l=a=t:a=a.next=t}else l=a=t;n={baseState:r.baseState,firstBaseUpdate:l,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n;return}null===(e=n.lastBaseUpdate)?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var lq=!1;function lK(){if(lq){var e=lh;if(null!==e)throw e}}function lX(e,t,n,r){lq=!1;var l=e.updateQueue;lU=!1;var a=l.firstBaseUpdate,o=l.lastBaseUpdate,i=l.shared.pending;if(null!==i){l.shared.pending=null;var u=i,s=u.next;u.next=null,null===o?a=s:o.next=s,o=u;var c=e.alternate;null!==c&&(i=(c=c.updateQueue).lastBaseUpdate)!==o&&(null===i?c.firstBaseUpdate=s:i.next=s,c.lastBaseUpdate=u)}if(null!==a){var f=l.baseState;for(o=0,c=s=u=null,i=a;;){var d=-0x20000001&i.lane,p=d!==i.lane;if(p?(u_&d)===d:(r&d)===d){0!==d&&d===lm&&(lq=!0),null!==c&&(c=c.next={lane:0,tag:i.tag,payload:i.payload,callback:null,next:null});e:{var m=e,h=i;switch(d=t,h.tag){case 1:if(\"function\"==typeof(m=h.payload)){f=m.call(n,f,d);break e}f=m;break e;case 3:m.flags=-65537&m.flags|128;case 0:if(null==(d=\"function\"==typeof(m=h.payload)?m.call(n,f,d):m))break e;f=x({},f,d);break e;case 2:lU=!0}}null!==(d=i.callback)&&(e.flags|=64,p&&(e.flags|=8192),null===(p=l.callbacks)?l.callbacks=[d]:p.push(d))}else p={lane:d,tag:i.tag,payload:i.payload,callback:i.callback,next:null},null===c?(s=c=p,u=f):c=c.next=p,o|=d;if(null===(i=i.next))if(null===(i=l.shared.pending))break;else i=(p=i).next,p.next=null,l.lastBaseUpdate=p,l.shared.pending=null}null===c&&(u=f),l.baseState=u,l.firstBaseUpdate=s,l.lastBaseUpdate=c,null===a&&(l.shared.lanes=0),uR|=o,e.lanes=o,e.memoizedState=f}}function lG(e,t){if(\"function\"!=typeof e)throw Error(u(191,e));e.call(t)}function lY(e,t){var n=e.callbacks;if(null!==n)for(e.callbacks=null,e=0;e<n.length;e++)lG(n[e],t)}var lJ=Y(null),lZ=Y(0);function l0(e,t){Z(lZ,e=uz),Z(lJ,t),uz=e|t.baseLanes}function l1(){Z(lZ,uz),Z(lJ,lJ.current)}function l2(){uz=lZ.current,J(lJ),J(lZ)}var l3=Y(null),l4=null;function l5(e){var t=e.alternate;Z(ae,1&ae.current),Z(l3,e),null===l4&&(null===t||null!==lJ.current?l4=e:null!==t.memoizedState&&(l4=e))}function l8(e){Z(ae,ae.current),Z(l3,e),null===l4&&(l4=e)}function l6(e){22===e.tag?(Z(ae,ae.current),Z(l3,e),null===l4&&(l4=e)):l9()}function l9(){Z(ae,ae.current),Z(l3,l3.current)}function l7(e){J(l3),l4===e&&(l4=null),J(ae)}var ae=Y(0);function at(e,t){Z(l3,l3.current),Z(ae,t)}function an(e){J(ae),J(l3),l4===e&&(l4=null)}function ar(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedState;if(null!==n&&(null===(n=n.dehydrated)||cH(n)||c$(n)))return t}else if(19===t.tag&&\"independent\"!==t.memoizedProps.revealOrder){if(0!=(128&t.flags))return t}else if(null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var al=0,aa=null,ao=null,ai=null,au=!1,as=!1,ac=!1,af=0,ad=0,ap=null,am=0;function ah(){throw Error(u(321))}function ag(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!nA(e[n],t[n]))return!1;return!0}function av(e,t,n,r,l,a){return al=a,aa=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,W.H=null===e||null===e.memoizedState?oE:ox,ac=!1,a=n(r,l),ac=!1,as&&(a=ab(t,n,r,l)),ay(e),a}function ay(e){W.H=oS;var t=null!==ao&&null!==ao.next;if(al=0,ai=ao=aa=null,au=!1,ad=0,ap=null,t)throw Error(u(300));null===e||oU||null!==(e=e.dependencies)&&r7(e)&&(oU=!0)}function ab(e,t,n,r){aa=e;var l=0;do{if(as&&(ap=null),ad=0,as=!1,25<=l)throw Error(u(301));if(l+=1,ai=ao=null,null!=e.updateQueue){var a=e.updateQueue;a.lastEffect=null,a.events=null,a.stores=null,null!=a.memoCache&&(a.memoCache.index=0)}W.H=o_,a=t(n,r)}while(as)return a}function aw(){var e=W.H,t=e.useState()[0];return t=\"function\"==typeof t.then?aP(t):t,e=e.useState()[0],(null!==ao?ao.memoizedState:null)!==e&&(aa.flags|=1024),t}function ak(){var e=0!==af;return af=0,e}function aS(e,t,n){t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~n}function aE(e){if(au){for(e=e.memoizedState;null!==e;){var t=e.queue;null!==t&&(t.pending=null),e=e.next}au=!1}al=0,ai=ao=aa=null,as=!1,ad=af=0,ap=null}function ax(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===ai?aa.memoizedState=ai=e:ai=ai.next=e,ai}function a_(){if(null===ao){var e=aa.alternate;e=null!==e?e.memoizedState:null}else e=ao.next;var t=null===ai?aa.memoizedState:ai.next;if(null!==t)ai=t,ao=e;else{if(null===e){if(null===aa.alternate)throw Error(u(467));throw Error(u(310))}e={memoizedState:(ao=e).memoizedState,baseState:ao.baseState,baseQueue:ao.baseQueue,queue:ao.queue,next:null},null===ai?aa.memoizedState=ai=e:ai=ai.next=e}return ai}function aN(){return{lastEffect:null,events:null,stores:null,memoCache:null}}function aP(e){var t=ad;return ad+=1,null===ap&&(ap=[]),e=lP(ap,e,t),t=aa,null===(null===ai?t.memoizedState:ai.next)&&(W.H=null===(t=t.alternate)||null===t.memoizedState?oE:ox),e}function aC(e){if(null!==e&&\"object\"==typeof e){if(\"function\"==typeof e.then)return aP(e);if(e.$$typeof===L)return lt(e)}throw Error(u(438,String(e)))}function aT(e){var t=null,n=aa.updateQueue;if(null!==n&&(t=n.memoCache),null==t){var r=aa.alternate;null!==r&&null!==(r=r.updateQueue)&&null!=(r=r.memoCache)&&(t={data:r.data.map(function(e){return e.slice()}),index:0})}if(null==t&&(t={data:[],index:0}),null===n&&(n=aN(),aa.updateQueue=n),n.memoCache=t,void 0===(n=t.data[t.index]))for(n=t.data[t.index]=Array(e),r=0;r<e;r++)n[r]=U;return t.index++,n}function aO(e,t){return\"function\"==typeof t?t(e):t}function az(e){return aL(a_(),ao,e)}function aL(e,t,n){var r=e.queue;if(null===r)throw Error(u(311));r.lastRenderedReducer=n;var l=e.baseQueue,a=r.pending;if(null!==a){if(null!==l){var o=l.next;l.next=a.next,a.next=o}t.baseQueue=l=a,r.pending=null}if(a=e.baseState,null===l)e.memoizedState=a;else{t=l.next;var i=o=null,s=null,c=t,f=!1;do{var d=-0x20000001&c.lane;if(d!==c.lane?(u_&d)===d:(al&d)===d){var p=c.revertLane;if(0===p)null!==s&&(s=s.next={lane:0,revertLane:0,gesture:null,action:c.action,hasEagerState:c.hasEagerState,eagerState:c.eagerState,next:null}),d===lm&&(f=!0);else if((al&p)===p){c=c.next,p===lm&&(f=!0);continue}else d={lane:0,revertLane:c.revertLane,gesture:null,action:c.action,hasEagerState:c.hasEagerState,eagerState:c.eagerState,next:null},null===s?(i=s=d,o=a):s=s.next=d,aa.lanes|=p,uR|=p;d=c.action,ac&&n(a,d),a=c.hasEagerState?c.eagerState:n(a,d)}else p={lane:d,revertLane:c.revertLane,gesture:c.gesture,action:c.action,hasEagerState:c.hasEagerState,eagerState:c.eagerState,next:null},null===s?(i=s=p,o=a):s=s.next=p,aa.lanes|=d,uR|=d;c=c.next}while(null!==c&&c!==t)if(null===s?o=a:s.next=i,!nA(a,e.memoizedState)&&(oU=!0,f&&null!==(n=lh)))throw n;e.memoizedState=a,e.baseState=o,e.baseQueue=s,r.lastRenderedState=a}return null===l&&(r.lanes=0),[e.memoizedState,r.dispatch]}function aR(e){var t=a_(),n=t.queue;if(null===n)throw Error(u(311));n.lastRenderedReducer=e;var r=n.dispatch,l=n.pending,a=t.memoizedState;if(null!==l){n.pending=null;var o=l=l.next;do a=e(a,o.action),o=o.next;while(o!==l)nA(a,t.memoizedState)||(oU=!0),t.memoizedState=a,null===t.baseQueue&&(t.baseState=a),n.lastRenderedState=a}return[a,r]}function aM(e,t,n){var r=aa,l=a_(),a=r$;if(a){if(void 0===n)throw Error(u(407));n=n()}else n=t();var o=!nA((ao||l).memoizedState,n);if(o&&(l.memoizedState=n,oU=!0),l=l.queue,a5(aF.bind(null,r,l,e),[e]),l.getSnapshot!==t||o||null!==ai&&1&ai.memoizedState.tag){if(r.flags|=2048,a0(9,{destroy:void 0},aD.bind(null,r,l,n,t),null),null===uE)throw Error(u(349));a||0!=(127&al)||aI(r,t,n)}return n}function aI(e,t,n){e.flags|=16384,e={getSnapshot:t,value:n},null===(t=aa.updateQueue)?(t=aN(),aa.updateQueue=t,t.stores=[e]):null===(n=t.stores)?t.stores=[e]:n.push(e)}function aD(e,t,n,r){t.value=n,t.getSnapshot=r,aA(t)&&aj(e)}function aF(e,t,n){return n(function(){aA(t)&&aj(e)})}function aA(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!nA(e,n)}catch(e){return!0}}function aj(e){var t=rd(e,2);null!==t&&u6(t,e,2)}function aU(e){var t=ax();return\"function\"==typeof e&&(e=e()),t.memoizedState=t.baseState=e,t.queue={pending:null,lanes:0,dispatch:null,lastRenderedReducer:aO,lastRenderedState:e},t}function aB(e,t,n,r){return e.baseState=n,aL(e,ao,\"function\"==typeof r?r:aO)}function aV(e,t,n,r,l){if(ob(e))throw Error(u(485));if(null!==(e=t.action)){var a={payload:l,action:e,next:null,isTransition:!0,status:\"pending\",value:null,reason:null,listeners:[],then:function(e){a.listeners.push(e)}};null!==W.T?n(!0):a.isTransition=!1,r(a),null===(n=t.pending)?(a.next=t.pending=a,aH(t,a)):(a.next=n.next,t.pending=n.next=a)}}function aH(e,t){var n=t.action,r=t.payload,l=e.state;if(t.isTransition){var a=W.T,o={};o.types=null!==a?a.types:null,W.T=o;try{var i=n(l,r),u=W.S;null!==u&&u(o,i),a$(e,t,i)}catch(n){aW(e,t,n)}finally{null!==a&&null!==o.types&&(a.types=o.types),W.T=a}}else try{a=n(l,r),a$(e,t,a)}catch(n){aW(e,t,n)}}function a$(e,t,n){null!==n&&\"object\"==typeof n&&\"function\"==typeof n.then?n.then(function(n){aQ(e,t,n)},function(n){return aW(e,t,n)}):aQ(e,t,n)}function aQ(e,t,n){t.status=\"fulfilled\",t.value=n,aq(t),e.state=n,null!==(t=e.pending)&&((n=t.next)===t?e.pending=null:(n=n.next,t.next=n,aH(e,n)))}function aW(e,t,n){var r=e.pending;if(e.pending=null,null!==r){r=r.next;do t.status=\"rejected\",t.reason=n,aq(t),t=t.next;while(t!==r)}e.action=null}function aq(e){e=e.listeners;for(var t=0;t<e.length;t++)(0,e[t])()}function aK(e,t){return t}function aX(e,t){if(r$){var n=uE.formState;if(null!==n){e:{var r=aa;if(r$){if(rH){t:{for(var l=rH,a=rW;8!==l.nodeType;)if(!a||null===(l=cQ(l.nextSibling))){l=null;break t}l=\"F!\"===(a=l.data)||\"F\"===a?l:null}if(l){rH=cQ(l.nextSibling),r=\"F!\"===l.data;break e}}rK(r)}r=!1}r&&(t=n[0])}}return(n=ax()).memoizedState=n.baseState=t,r={pending:null,lanes:0,dispatch:null,lastRenderedReducer:aK,lastRenderedState:t},n.queue=r,n=og.bind(null,aa,r),r.dispatch=n,r=aU(!1),a=oy.bind(null,aa,!1,r.queue),r=ax(),l={state:t,dispatch:null,action:e,pending:null},r.queue=l,n=aV.bind(null,aa,l,a,n),l.dispatch=n,r.memoizedState=e,[t,n,!1]}function aG(e){return aY(a_(),ao,e)}function aY(e,t,n){if(t=aL(e,t,aK)[0],e=az(aO)[0],\"object\"==typeof t&&null!==t&&\"function\"==typeof t.then)try{var r=aP(t)}catch(e){if(e===lS)throw lx;throw e}else r=t;var l=(t=a_()).queue,a=l.dispatch;return n!==t.memoizedState&&(aa.flags|=2048,a0(9,{destroy:void 0},aJ.bind(null,l,n),null)),[r,a,e]}function aJ(e,t){e.action=t}function aZ(e){var t=a_(),n=ao;if(null!==n)return aY(t,n,e);a_(),t=t.memoizedState;var r=(n=a_()).queue.dispatch;return n.memoizedState=e,[t,r,!1]}function a0(e,t,n,r){return e={tag:e,create:n,deps:r,inst:t,next:null},null===(t=aa.updateQueue)&&(t=aN(),aa.updateQueue=t),null===(n=t.lastEffect)?t.lastEffect=e.next=e:(r=n.next,n.next=e,e.next=r,t.lastEffect=e),e}function a1(){return a_().memoizedState}function a2(e,t,n,r){var l=ax();aa.flags|=e,l.memoizedState=a0(1|t,{destroy:void 0},n,void 0===r?null:r)}function a3(e,t,n,r){var l=a_();r=void 0===r?null:r;var a=l.memoizedState.inst;null!==ao&&null!==r&&ag(r,ao.memoizedState.deps)?l.memoizedState=a0(t,a,n,r):(aa.flags|=e,l.memoizedState=a0(1|t,a,n,r))}function a4(e,t){a2(8390656,8,e,t)}function a5(e,t){a3(2048,8,e,t)}function a8(e){var t=a_().memoizedState,n={ref:t,nextImpl:e};aa.flags|=4;var r=aa.updateQueue;if(null===r)r=aN(),aa.updateQueue=r,r.events=[n];else{var l=r.events;null===l?r.events=[n]:l.push(n)}return function(){if(0!=(2&uS))throw Error(u(440));return t.impl.apply(void 0,arguments)}}function a6(e,t){return a3(4,2,e,t)}function a9(e,t){return a3(4,4,e,t)}function a7(e,t){if(\"function\"==typeof t){var n=t(e=e());return function(){\"function\"==typeof n?n():t(null)}}if(null!=t)return t.current=e=e(),function(){t.current=null}}function oe(e,t,n){n=null!=n?n.concat([e]):null,a3(4,4,a7.bind(null,t,e),n)}function ot(){}function on(e,t){var n=a_();t=void 0===t?null:t;var r=n.memoizedState;return null!==t&&ag(t,r[1])?r[0]:(n.memoizedState=[e,t],e)}function or(e,t){var n=a_();t=void 0===t?null:t;var r=n.memoizedState;return null!==t&&ag(t,r[1])?r[0]:(n.memoizedState=[r=e(),t],r)}function ol(e,t,n){return void 0===n||0!=(0x40000000&al)&&0==(261930&u_)?e.memoizedState=t:(e.memoizedState=n,e=u5(),aa.lanes|=e,uR|=e,n)}function oa(e,t,n,r){return nA(n,t)?n:null!==lJ.current?(nA(e=ol(e,n,r),t)||(oU=!0),e):0==(42&al)||0!=(0x40000000&al)&&0==(261930&u_)?(oU=!0,e.memoizedState=n):(e=u5(),aa.lanes|=e,uR|=e,t)}function oo(e,t,n,r,l){var a=q.p;q.p=0!==a&&8>a?a:8;var o=W.T,i={};i.types=null!==o?o.types:null,W.T=i,oy(e,!1,t,n);try{var u=l(),s=W.S;if(null!==s&&s(i,u),null!==u&&\"object\"==typeof u&&\"function\"==typeof u.then){var c,f,d=(c=[],f={status:\"pending\",value:null,reason:null,then:function(e){c.push(e)}},u.then(function(){f.status=\"fulfilled\",f.value=r;for(var e=0;e<c.length;e++)(0,c[e])(r)},function(e){for(f.status=\"rejected\",f.reason=e,e=0;e<c.length;e++)(0,c[e])(void 0)}),f);ov(e,t,d,u4(e))}else ov(e,t,r,u4(e))}catch(n){ov(e,t,{then:function(){},status:\"rejected\",reason:n},u4())}finally{q.p=a,null!==o&&null!==i.types&&(o.types=i.types),W.T=o}}function oi(){}function ou(e,t,n,r){if(5!==e.tag)throw Error(u(476));var l=os(e).queue;oo(e,l,t,K,null===n?oi:function(){return oc(e),n(r)})}function os(e){var t=e.memoizedState;if(null!==t)return t;var n={};return(t={memoizedState:K,baseState:K,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:aO,lastRenderedState:K},next:null}).next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:aO,lastRenderedState:n},next:null},e.memoizedState=t,null!==(e=e.alternate)&&(e.memoizedState=t),t}function oc(e){var t=os(e);null===t.next&&(t=e.alternate.memoizedState),ov(e,t.next.queue,{},u4())}function of(){return lt(fv)}function od(){return a_().memoizedState}function op(){return a_().memoizedState}function om(e){for(var t=e.return;null!==t;){switch(t.tag){case 24:case 3:var n=u4(),r=l$(t,e=lH(n),n);null!==r&&(u6(r,t,n),lQ(r,t,n)),t={cache:lu()},e.payload=t;return}t=t.return}}function oh(e,t,n){var r=u4();n={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},ob(e)?ow(t,n):null!==(n=rf(e,t,n,r))&&(u6(n,e,r),ok(n,t,r))}function og(e,t,n){ov(e,t,n,u4())}function ov(e,t,n,r){var l={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(ob(e))ow(t,l);else{var a=e.alternate;if(0===e.lanes&&(null===a||0===a.lanes)&&null!==(a=t.lastRenderedReducer))try{var o=t.lastRenderedState,i=a(o,n);if(l.hasEagerState=!0,l.eagerState=i,nA(i,o))return rc(e,t,l,0),null===uE&&rs(),!1}catch(e){}finally{}if(null!==(n=rf(e,t,l,r)))return u6(n,e,r),ok(n,t,r),!0}return!1}function oy(e,t,n,r){if(r={lane:2,revertLane:s$(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},ob(e)){if(t)throw Error(u(479))}else null!==(t=rf(e,n,r,2))&&u6(t,e,2)}function ob(e){var t=e.alternate;return e===aa||null!==t&&t===aa}function ow(e,t){as=au=!0;var n=e.pending;null===n?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function ok(e,t,n){if(0!=(4194048&n)){var r=t.lanes;r&=e.pendingLanes,t.lanes=n|=r,ej(e,n)}}var oS={readContext:lt,use:aC,useCallback:ah,useContext:ah,useEffect:ah,useImperativeHandle:ah,useLayoutEffect:ah,useInsertionEffect:ah,useMemo:ah,useReducer:ah,useRef:ah,useState:ah,useDebugValue:ah,useDeferredValue:ah,useTransition:ah,useSyncExternalStore:ah,useId:ah,useHostTransitionStatus:ah,useFormState:ah,useActionState:ah,useOptimistic:ah,useMemoCache:ah,useCacheRefresh:ah};oS.useEffectEvent=ah;var oE={readContext:lt,use:aC,useCallback:function(e,t){return ax().memoizedState=[e,void 0===t?null:t],e},useContext:lt,useEffect:a4,useImperativeHandle:function(e,t,n){n=null!=n?n.concat([e]):null,a2(4194308,4,a7.bind(null,t,e),n)},useLayoutEffect:function(e,t){return a2(4194308,4,e,t)},useInsertionEffect:function(e,t){a2(4,2,e,t)},useMemo:function(e,t){var n=ax();t=void 0===t?null:t;var r=e();return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=ax();if(void 0!==n)var l=n(t);else l=t;return r.memoizedState=r.baseState=l,r.queue=e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:l},e=e.dispatch=oh.bind(null,aa,e),[r.memoizedState,e]},useRef:function(e){return ax().memoizedState={current:e}},useState:function(e){var t=(e=aU(e)).queue,n=og.bind(null,aa,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:ot,useDeferredValue:function(e,t){return ol(ax(),e,t)},useTransition:function(){var e=aU(!1);return e=oo.bind(null,aa,e.queue,!0,!1),ax().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=aa,l=ax();if(r$){if(void 0===n)throw Error(u(407));n=n()}else{if(n=t(),null===uE)throw Error(u(349));0!=(127&u_)||aI(r,t,n)}l.memoizedState=n;var a={value:n,getSnapshot:t};return l.queue=a,a4(aF.bind(null,r,a,e),[e]),r.flags|=2048,a0(9,{destroy:void 0},aD.bind(null,r,a,n,t),null),n},useId:function(){var e=ax(),t=uE.identifierPrefix;if(r$){var n=rD,r=rI;t=\"_\"+t+\"R_\"+(n=(r&~(1<<32-eN(r)-1)).toString(32)+n),0<(n=af++)&&(t+=\"H\"+n.toString(32)),t+=\"_\"}else t=\"_\"+t+\"r_\"+(n=am++).toString(32)+\"_\";return e.memoizedState=t},useHostTransitionStatus:of,useFormState:aX,useActionState:aX,useOptimistic:function(e){var t=ax();t.memoizedState=t.baseState=e;var n={pending:null,lanes:0,dispatch:null,lastRenderedReducer:null,lastRenderedState:null};return t.queue=n,t=oy.bind(null,aa,!0,n),n.dispatch=t,[e,t]},useMemoCache:aT,useCacheRefresh:function(){return ax().memoizedState=om.bind(null,aa)},useEffectEvent:function(e){var t=ax(),n={impl:e};return t.memoizedState=n,function(){if(0!=(2&uS))throw Error(u(440));return n.impl.apply(void 0,arguments)}}},ox={readContext:lt,use:aC,useCallback:on,useContext:lt,useEffect:a5,useImperativeHandle:oe,useInsertionEffect:a6,useLayoutEffect:a9,useMemo:or,useReducer:az,useRef:a1,useState:function(){return az(aO)},useDebugValue:ot,useDeferredValue:function(e,t){return oa(a_(),ao.memoizedState,e,t)},useTransition:function(){var e=az(aO)[0],t=a_().memoizedState;return[\"boolean\"==typeof e?e:aP(e),t]},useSyncExternalStore:aM,useId:od,useHostTransitionStatus:of,useFormState:aG,useActionState:aG,useOptimistic:function(e,t){return aB(a_(),ao,e,t)},useMemoCache:aT,useCacheRefresh:op};ox.useEffectEvent=a8;var o_={readContext:lt,use:aC,useCallback:on,useContext:lt,useEffect:a5,useImperativeHandle:oe,useInsertionEffect:a6,useLayoutEffect:a9,useMemo:or,useReducer:aR,useRef:a1,useState:function(){return aR(aO)},useDebugValue:ot,useDeferredValue:function(e,t){var n=a_();return null===ao?ol(n,e,t):oa(n,ao.memoizedState,e,t)},useTransition:function(){var e=aR(aO)[0],t=a_().memoizedState;return[\"boolean\"==typeof e?e:aP(e),t]},useSyncExternalStore:aM,useId:od,useHostTransitionStatus:of,useFormState:aZ,useActionState:aZ,useOptimistic:function(e,t){var n=a_();return null!==ao?aB(n,ao,e,t):(n.baseState=e,[e,n.queue.dispatch])},useMemoCache:aT,useCacheRefresh:op};function oN(e,t,n,r){n=null==(n=n(r,t=e.memoizedState))?t:x({},t,n),e.memoizedState=n,0===e.lanes&&(e.updateQueue.baseState=n)}o_.useEffectEvent=a8;var oP={enqueueSetState:function(e,t,n){e=e._reactInternals;var r=u4(),l=lH(r);l.payload=t,null!=n&&(l.callback=n),null!==(t=l$(e,l,r))&&(u6(t,e,r),lQ(t,e,r))},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=u4(),l=lH(r);l.tag=1,l.payload=t,null!=n&&(l.callback=n),null!==(t=l$(e,l,r))&&(u6(t,e,r),lQ(t,e,r))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=u4(),r=lH(n);r.tag=2,null!=t&&(r.callback=t),null!==(t=l$(e,r,n))&&(u6(t,e,n),lQ(t,e,n))}};function oC(e,t,n,r,l,a,o){return\"function\"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(r,a,o):!t.prototype||!t.prototype.isPureReactComponent||!nj(n,r)||!nj(l,a)}function oT(e,t,n,r){e=t.state,\"function\"==typeof t.componentWillReceiveProps&&t.componentWillReceiveProps(n,r),\"function\"==typeof t.UNSAFE_componentWillReceiveProps&&t.UNSAFE_componentWillReceiveProps(n,r),t.state!==e&&oP.enqueueReplaceState(t,t.state,null)}function oO(e,t){var n=t;if(\"ref\"in t)for(var r in n={},t)\"ref\"!==r&&(n[r]=t[r]);if(e=e.defaultProps)for(var l in n===t&&(n=x({},n)),e)void 0===n[l]&&(n[l]=e[l]);return n}function oz(e){ra(e)}function oL(e){console.error(e)}function oR(e){ra(e)}function oM(e,t){try{(0,e.onUncaughtError)(t.value,{componentStack:t.stack})}catch(e){setTimeout(function(){throw e})}}function oI(e,t,n){try{(0,e.onCaughtError)(n.value,{componentStack:n.stack,errorBoundary:1===t.tag?t.stateNode:null})}catch(e){setTimeout(function(){throw e})}}function oD(e,t,n){return(n=lH(n)).tag=3,n.payload={element:null},n.callback=function(){oM(e,t)},n}function oF(e){return(e=lH(e)).tag=3,e}function oA(e,t,n,r){var l=n.type.getDerivedStateFromError;if(\"function\"==typeof l){var a=r.value;e.payload=function(){return l(a)},e.callback=function(){oI(t,n,r)}}var o=n.stateNode;null!==o&&\"function\"==typeof o.componentDidCatch&&(e.callback=function(){oI(t,n,r),\"function\"!=typeof l&&(null===uQ?uQ=new Set([this]):uQ.add(this));var e=r.stack;this.componentDidCatch(r.value,{componentStack:null!==e?e:\"\"})})}var oj=Error(u(461)),oU=!1;function oB(e,t,n,r){t.child=null===e?lj(t,null,n,r):lA(t,e.child,n,r)}function oV(e,t,n,r,l){n=n.render;var a=t.ref;if(\"ref\"in r){var o={};for(var i in r)\"ref\"!==i&&(o[i]=r[i])}else o=r;return(le(t),r=av(e,t,n,o,a,l),i=ak(),null===e||oU)?(r$&&i&&rj(t),t.flags|=1,oB(e,t,r,l),t.child):(aS(e,t,l),il(e,t,l))}function oH(e,t,n,r,l){if(null===e){var a=n.type;return\"function\"!=typeof a||ry(a)||void 0!==a.defaultProps||null!==n.compare?((e=rk(n.type,null,r,t,t.mode,l)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=a,o$(e,t,a,r,l))}if(a=e.child,!ia(e,l)){var o=a.memoizedProps;if((n=null!==(n=n.compare)?n:nj)(o,r)&&e.ref===t.ref)return il(e,t,l)}return t.flags|=1,(e=rb(a,r)).ref=t.ref,e.return=t,t.child=e}function o$(e,t,n,r,l){if(null!==e){var a=e.memoizedProps;if(nj(a,r)&&e.ref===t.ref)if(oU=!1,t.pendingProps=r=a,!ia(e,l))return t.lanes=e.lanes,il(e,t,l);else 0!=(131072&e.flags)&&(oU=!0)}return oY(e,t,n,r,l)}function oQ(e,t,n,r){var l=r.children,a=null!==e?e.memoizedState:null;if(null===e&&null===t.stateNode&&(t.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null}),\"hidden\"===r.mode){if(0!=(128&t.flags)){if(a=null!==a?a.baseLanes|n:n,null!==e){for(l=0,r=t.child=e.child;null!==r;)l=l|r.lanes|r.childLanes,r=r.sibling;r=l&~a}else r=0,t.child=null;return oq(e,t,a,n,r)}if(0==(0x20000000&n))return r=t.lanes=0x20000000,oq(e,t,null!==a?a.baseLanes|n:n,n,r);t.memoizedState={baseLanes:0,cachePool:null},null!==e&&lw(t,null!==a?a.cachePool:null),null!==a?l0(t,a):l1(),l6(t)}else null!==a?(lw(t,a.cachePool),l0(t,a),l9(),t.memoizedState=null):(null!==e&&lw(t,null),l1(),l9());return oB(e,t,l,n),t.child}function oW(e,t){return null!==e&&22===e.tag||null!==t.stateNode||(t.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null}),t.sibling}function oq(e,t,n,r,l){var a=lb();return t.memoizedState={baseLanes:n,cachePool:a=null===a?null:{parent:li._currentValue,pool:a}},null!==e&&lw(t,null),l1(),l6(t),null!==e&&r9(e,t,r,!0),t.childLanes=l,null}function oK(e,t){return(t=o8({mode:t.mode,children:t.children},e.mode)).ref=e.ref,e.child=t,t.return=e,t}function oX(e,t,n){return lA(t,e.child,null,n),e=oK(t,t.pendingProps),e.flags|=2,l7(t),t.memoizedState=null,e}function oG(e,t){var n=t.ref;if(null===n)null!==e&&null!==e.ref&&(t.flags|=4194816);else{if(\"function\"!=typeof n&&\"object\"!=typeof n)throw Error(u(284));(null===e||e.ref!==n)&&(t.flags|=4194816)}}function oY(e,t,n,r,l){return(le(t),n=av(e,t,n,r,void 0,l),r=ak(),null===e||oU)?(r$&&r&&rj(t),t.flags|=1,oB(e,t,n,l),t.child):(aS(e,t,l),il(e,t,l))}function oJ(e,t,n,r,l,a){return(le(t),t.updateQueue=null,n=ab(t,r,n,l),ay(e),r=ak(),null===e||oU)?(r$&&r&&rj(t),t.flags|=1,oB(e,t,n,a),t.child):(aS(e,t,a),il(e,t,a))}function oZ(e,t,n,r,l){if(le(t),null===t.stateNode){var a=rh,o=n.contextType;\"object\"==typeof o&&null!==o&&(a=lt(o)),t.memoizedState=null!==(a=new n(r,a)).state&&void 0!==a.state?a.state:null,a.updater=oP,t.stateNode=a,a._reactInternals=t,(a=t.stateNode).props=r,a.state=t.memoizedState,a.refs={},lB(t),o=n.contextType,a.context=\"object\"==typeof o&&null!==o?lt(o):rh,a.state=t.memoizedState,\"function\"==typeof(o=n.getDerivedStateFromProps)&&(oN(t,n,o,r),a.state=t.memoizedState),\"function\"==typeof n.getDerivedStateFromProps||\"function\"==typeof a.getSnapshotBeforeUpdate||\"function\"!=typeof a.UNSAFE_componentWillMount&&\"function\"!=typeof a.componentWillMount||(o=a.state,\"function\"==typeof a.componentWillMount&&a.componentWillMount(),\"function\"==typeof a.UNSAFE_componentWillMount&&a.UNSAFE_componentWillMount(),o!==a.state&&oP.enqueueReplaceState(a,a.state,null),lX(t,r,a,l),lK(),a.state=t.memoizedState),\"function\"==typeof a.componentDidMount&&(t.flags|=4194308),r=!0}else if(null===e){a=t.stateNode;var i=t.memoizedProps,u=oO(n,i);a.props=u;var s=a.context,c=n.contextType;o=rh,\"object\"==typeof c&&null!==c&&(o=lt(c));var f=n.getDerivedStateFromProps;c=\"function\"==typeof f||\"function\"==typeof a.getSnapshotBeforeUpdate,i=t.pendingProps!==i,c||\"function\"!=typeof a.UNSAFE_componentWillReceiveProps&&\"function\"!=typeof a.componentWillReceiveProps||(i||s!==o)&&oT(t,a,r,o),lU=!1;var d=t.memoizedState;a.state=d,lX(t,r,a,l),lK(),s=t.memoizedState,i||d!==s||lU?(\"function\"==typeof f&&(oN(t,n,f,r),s=t.memoizedState),(u=lU||oC(t,n,u,r,d,s,o))?(c||\"function\"!=typeof a.UNSAFE_componentWillMount&&\"function\"!=typeof a.componentWillMount||(\"function\"==typeof a.componentWillMount&&a.componentWillMount(),\"function\"==typeof a.UNSAFE_componentWillMount&&a.UNSAFE_componentWillMount()),\"function\"==typeof a.componentDidMount&&(t.flags|=4194308)):(\"function\"==typeof a.componentDidMount&&(t.flags|=4194308),t.memoizedProps=r,t.memoizedState=s),a.props=r,a.state=s,a.context=o,r=u):(\"function\"==typeof a.componentDidMount&&(t.flags|=4194308),r=!1)}else{a=t.stateNode,lV(e,t),c=oO(n,o=t.memoizedProps),a.props=c,f=t.pendingProps,d=a.context,s=n.contextType,u=rh,\"object\"==typeof s&&null!==s&&(u=lt(s)),(s=\"function\"==typeof(i=n.getDerivedStateFromProps)||\"function\"==typeof a.getSnapshotBeforeUpdate)||\"function\"!=typeof a.UNSAFE_componentWillReceiveProps&&\"function\"!=typeof a.componentWillReceiveProps||(o!==f||d!==u)&&oT(t,a,r,u),lU=!1,d=t.memoizedState,a.state=d,lX(t,r,a,l),lK();var p=t.memoizedState;o!==f||d!==p||lU||null!==e&&null!==e.dependencies&&r7(e.dependencies)?(\"function\"==typeof i&&(oN(t,n,i,r),p=t.memoizedState),(c=lU||oC(t,n,c,r,d,p,u)||null!==e&&null!==e.dependencies&&r7(e.dependencies))?(s||\"function\"!=typeof a.UNSAFE_componentWillUpdate&&\"function\"!=typeof a.componentWillUpdate||(\"function\"==typeof a.componentWillUpdate&&a.componentWillUpdate(r,p,u),\"function\"==typeof a.UNSAFE_componentWillUpdate&&a.UNSAFE_componentWillUpdate(r,p,u)),\"function\"==typeof a.componentDidUpdate&&(t.flags|=4),\"function\"==typeof a.getSnapshotBeforeUpdate&&(t.flags|=1024)):(\"function\"!=typeof a.componentDidUpdate||o===e.memoizedProps&&d===e.memoizedState||(t.flags|=4),\"function\"!=typeof a.getSnapshotBeforeUpdate||o===e.memoizedProps&&d===e.memoizedState||(t.flags|=1024),t.memoizedProps=r,t.memoizedState=p),a.props=r,a.state=p,a.context=u,r=c):(\"function\"!=typeof a.componentDidUpdate||o===e.memoizedProps&&d===e.memoizedState||(t.flags|=4),\"function\"!=typeof a.getSnapshotBeforeUpdate||o===e.memoizedProps&&d===e.memoizedState||(t.flags|=1024),r=!1)}return a=r,oG(e,t),r=0!=(128&t.flags),a||r?(a=t.stateNode,n=r&&\"function\"!=typeof n.getDerivedStateFromError?null:a.render(),t.flags|=1,null!==e&&r?(t.child=lA(t,e.child,null,l),t.child=lA(t,null,n,l)):oB(e,t,n,l),t.memoizedState=a.state,e=t.child):e=il(e,t,l),e}function o0(e,t,n,r){return rJ(),t.flags|=256,oB(e,t,n,r),t.child}var o1={dehydrated:null,treeContext:null,retryLane:0,hydrationErrors:null};function o2(e){return{baseLanes:e,cachePool:lk()}}function o3(e,t,n){return e=null!==e?e.childLanes&~n:0,t&&(e|=uD),e}function o4(e,t,n){var r,l=t.pendingProps,a=!1,o=0!=(128&t.flags);if((r=o)||(r=(null===e||null!==e.memoizedState)&&0!=(2&ae.current)),r&&(a=!0,t.flags&=-129),r=0!=(32&t.flags),t.flags&=-33,null===e){if(r$){if(a?l5(t):l9(),(e=rH)?null!==(e=null!==(e=cV(e,rW))&&\"&\"!==e.data?e:null)&&(t.memoizedState={dehydrated:e,treeContext:null!==rM?{id:rI,overflow:rD}:null,retryLane:0x20000000,hydrationErrors:null},(n=rx(e)).return=t,t.child=n,rV=t,rH=null):e=null,null===e)throw rK(t);return c$(e)?t.lanes=32:t.lanes=0x20000000,null}var i=l.children;return(l=l.fallback,a)?(l9(),i=o8({mode:\"hidden\",children:i},a=t.mode),l=rS(l,a,n,null),i.return=t,l.return=t,i.sibling=l,t.child=i,(l=t.child).memoizedState=o2(n),l.childLanes=o3(e,r,n),t.memoizedState=o1,oW(null,l)):(l5(t),o5(t,i))}var s=e.memoizedState;if(null!==s&&null!==(i=s.dehydrated)){if(o)256&t.flags?(l5(t),t.flags&=-257,t=o6(e,t,n)):null!==t.memoizedState?(l9(),t.child=e.child,t.flags|=128,t=null):(l9(),i=l.fallback,a=t.mode,l=o8({mode:\"visible\",children:l.children},a),i=rS(i,a,n,null),i.flags|=2,l.return=t,i.return=t,l.sibling=i,t.child=l,lA(t,e.child,null,n),(l=t.child).memoizedState=o2(n),l.childLanes=o3(e,r,n),t.memoizedState=o1,t=oW(null,l));else if(l5(t),c$(i)){if(r=i.nextSibling&&i.nextSibling.dataset)var c=r.dgst;r=c,(l=Error(u(419))).stack=\"\",l.digest=r,r0({value:l,source:null,stack:null}),t=o6(e,t,n)}else if(oU||r9(e,t,n,!1),r=0!=(n&e.childLanes),oU||r){if(null!==(r=uE)&&0!==(l=eU(r,n))&&l!==s.retryLane)throw s.retryLane=l,rd(e,l),u6(r,e,l),oj;cH(i)||su(),t=o6(e,t,n)}else cH(i)?(t.flags|=192,t.child=e.child,t=null):(e=s.treeContext,rH=cQ(i.nextSibling),rV=t,r$=!0,rQ=null,rW=!1,null!==e&&rB(t,e),t=o5(t,l.children),t.flags|=4096);return t}return a?(l9(),i=l.fallback,a=t.mode,c=(s=e.child).sibling,(l=rb(s,{mode:\"hidden\",children:l.children})).subtreeFlags=0x7e00000&s.subtreeFlags,null!==c?i=rb(c,i):(i=rS(i,a,n,null),i.flags|=2),i.return=t,l.return=t,l.sibling=i,t.child=l,oW(null,l),l=t.child,null===(i=e.child.memoizedState)?i=o2(n):(null!==(a=i.cachePool)?(s=li._currentValue,a=a.parent!==s?{parent:s,pool:s}:a):a=lk(),i={baseLanes:i.baseLanes|n,cachePool:a}),l.memoizedState=i,l.childLanes=o3(e,r,n),t.memoizedState=o1,oW(e.child,l)):(l5(t),e=(n=e.child).sibling,(n=rb(n,{mode:\"visible\",children:l.children})).return=t,n.sibling=null,null!==e&&(null===(r=t.deletions)?(t.deletions=[e],t.flags|=16):r.push(e)),t.child=n,t.memoizedState=null,n)}function o5(e,t){return(t=o8({mode:\"visible\",children:t},e.mode)).return=e,e.child=t}function o8(e,t){return(e=rv(22,e,null,t)).lanes=0,e}function o6(e,t,n){return lA(t,e.child,null,n),e=o5(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function o9(e,t,n){e.lanes|=t;var r=e.alternate;null!==r&&(r.lanes|=t),r8(e.return,t,n)}function o7(e){for(var t=null;null!==e;){var n=e.alternate;null!==n&&null===ar(n)&&(t=e),e=e.sibling}return t}function ie(e,t,n,r,l,a){var o=e.memoizedState;null===o?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:l,treeForkCount:a}:(o.isBackwards=t,o.rendering=null,o.renderingStartTime=0,o.last=r,o.tail=n,o.tailMode=l,o.treeForkCount=a)}function it(e){var t=e.child;for(e.child=null;null!==t;){var n=t.sibling;t.sibling=e.child,e.child=t,t=n}}function ir(e,t,n){var r=t.pendingProps,l=r.revealOrder,a=r.tail;r=r.children;var o=ae.current;if(128&t.flags)return at(t,o),null;var i=0!=(2&o);if(i?(o=1&o|2,t.flags|=128):o&=1,at(t,o),\"backwards\"===l&&null!==e?(it(e),oB(e,t,r,n),it(e)):oB(e,t,r,n),r=r$?rz:0,!i&&null!==e&&0!=(128&e.flags))e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&o9(e,n,t);else if(19===e.tag)o9(e,n,t);else if(null!==e.child){e.child.return=e,e=e.child;continue}if(e===t)break;for(;null===e.sibling;){if(null===e.return||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}switch(l){case\"backwards\":null===(n=o7(t.child))?(l=t.child,t.child=null):(l=n.sibling,n.sibling=null,it(t)),ie(t,!0,l,null,a,r);break;case\"unstable_legacy-backwards\":for(n=null,l=t.child,t.child=null;null!==l;){if(null!==(e=l.alternate)&&null===ar(e)){t.child=l;break}e=l.sibling,l.sibling=n,n=l,l=e}ie(t,!0,n,null,a,r);break;case\"together\":ie(t,!1,null,null,void 0,r);break;case\"independent\":t.memoizedState=null;break;default:null===(n=o7(t.child))?(l=t.child,t.child=null):(l=n.sibling,n.sibling=null),ie(t,!1,l,n,a,r)}return t.child}function il(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),uR|=t.lanes,0==(n&t.childLanes)){if(null===e)return null;else if(r9(e,t,n,!1),0==(n&t.childLanes))return null}if(null!==e&&t.child!==e.child)throw Error(u(153));if(null!==t.child){for(n=rb(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=rb(e,e.pendingProps)).return=t;n.sibling=null}return t.child}function ia(e,t){return 0!=(e.lanes&t)||!!(null!==(e=e.dependencies)&&r7(e))}function io(e,t,n){if(null!==e)if(e.memoizedProps!==t.pendingProps)oU=!0;else{if(!ia(e,n)&&0==(128&t.flags))return oU=!1,function(e,t,n){switch(t.tag){case 3:el(t,t.stateNode.containerInfo),r4(t,li,e.memoizedState.cache),rJ();break;case 27:case 5:eo(t);break;case 4:el(t,t.stateNode.containerInfo);break;case 10:r4(t,t.type,t.memoizedProps.value);break;case 31:if(null!==t.memoizedState)return t.flags|=128,l8(t),null;break;case 13:var r=t.memoizedState;if(null!==r){if(null!==r.dehydrated)return l5(t),t.flags|=128,null;if(0!=(n&t.child.childLanes))return o4(e,t,n);return l5(t),null!==(e=il(e,t,n))?e.sibling:null}l5(t);break;case 19:if(128&t.flags)return ir(e,t,n);var l=0!=(128&e.flags);if((r=0!=(n&t.childLanes))||(r9(e,t,n,!1),r=0!=(n&t.childLanes)),l){if(r)return ir(e,t,n);t.flags|=128}if(null!==(l=t.memoizedState)&&(l.rendering=null,l.tail=null,l.lastEffect=null),at(t,ae.current),!r)return null;break;case 22:return t.lanes=0,oQ(e,t,n,t.pendingProps);case 24:r4(t,li,e.memoizedState.cache)}return il(e,t,n)}(e,t,n);oU=0!=(131072&e.flags)}else oU=!1,r$&&0!=(1048576&t.flags)&&rA(t,rz,t.index);switch(t.lanes=0,t.tag){case 16:e:{var r=t.pendingProps;if(e=lC(t.elementType),t.type=e,\"function\"==typeof e)ry(e)?(r=oO(e,r),t.tag=1,t=oZ(null,t,e,r,n)):(t.tag=0,t=oY(null,t,e,r,n));else{if(null!=e){var l=e.$$typeof;if(l===R){t.tag=11,t=oV(null,t,e,r,n);break e}if(l===D){t.tag=14,t=oH(null,t,e,r,n);break e}}throw Error(u(306,t=function e(t){if(null==t)return null;if(\"function\"==typeof t)return t.$$typeof===$?null:t.displayName||t.name||null;if(\"string\"==typeof t)return t;switch(t){case C:return\"Fragment\";case O:return\"Profiler\";case T:return\"StrictMode\";case M:return\"Suspense\";case I:return\"SuspenseList\";case A:return\"Activity\";case B:return\"ViewTransition\"}if(\"object\"==typeof t)switch(t.$$typeof){case P:return\"Portal\";case L:return t.displayName||\"Context\";case z:return(t._context.displayName||\"Context\")+\".Consumer\";case R:var n=t.render;return(t=t.displayName)||(t=\"\"!==(t=n.displayName||n.name||\"\")?\"ForwardRef(\"+t+\")\":\"ForwardRef\"),t;case D:return null!==(n=t.displayName||null)?n:e(t.type)||\"Memo\";case F:n=t._payload,t=t._init;try{return e(t(n))}catch(e){}}return null}(e)||e,\"\"))}}return t;case 0:return oY(e,t,t.type,t.pendingProps,n);case 1:return l=oO(r=t.type,t.pendingProps),oZ(e,t,r,l,n);case 3:e:{if(el(t,t.stateNode.containerInfo),null===e)throw Error(u(387));r=t.pendingProps;var a=t.memoizedState;l=a.element,lV(e,t),lX(t,r,null,n);var o=t.memoizedState;if(r4(t,li,r=o.cache),r!==a.cache&&r6(t,[li],n,!0),lK(),r=o.element,a.isDehydrated)if(a={element:r,isDehydrated:!1,cache:o.cache},t.updateQueue.baseState=a,t.memoizedState=a,256&t.flags){t=o0(e,t,r,n);break e}else if(r!==l){r0(l=rP(Error(u(424)),t)),t=o0(e,t,r,n);break e}else for(rH=cQ((e=9===(e=t.stateNode.containerInfo).nodeType?e.body:\"HTML\"===e.nodeName?e.ownerDocument.body:e).firstChild),rV=t,r$=!0,rQ=null,rW=!0,n=lj(t,null,r,n),t.child=n;n;)n.flags=-3&n.flags|4096,n=n.sibling;else{if(rJ(),r===l){t=il(e,t,n);break e}oB(e,t,r,n)}t=t.child}return t;case 26:return oG(e,t),null===e?(n=c3(t.type,null,t.pendingProps,null))?t.memoizedState=n:r$||(n=t.type,e=t.pendingProps,(r=cu(en.current).createElement(n))[eW]=t,r[eq]=e,cl(r,n,e),e5(r),t.stateNode=r):t.memoizedState=c3(t.type,e.memoizedProps,t.pendingProps,e.memoizedState),null;case 27:return eo(t),null===e&&r$&&(r=t.stateNode=cX(t.type,t.pendingProps,en.current),rV=t,rW=!0,l=rH,cy(t.type)?(cW=l,rH=cQ(r.firstChild)):rH=l),oB(e,t,t.pendingProps.children,n),oG(e,t),null===e&&(t.flags|=4194304),t.child;case 5:return null===e&&r$&&((l=r=rH)&&(null!==(r=function(e,t,n,r){for(;1===e.nodeType;){if(e.nodeName.toLowerCase()!==t.toLowerCase()){if(!r&&(\"INPUT\"!==e.nodeName||\"hidden\"!==e.type))break}else if(r){if(!e[eZ])switch(t){case\"meta\":if(!e.hasAttribute(\"itemprop\"))break;return e;case\"link\":if(\"stylesheet\"===(l=e.getAttribute(\"rel\"))&&e.hasAttribute(\"data-precedence\")||l!==n.rel||e.getAttribute(\"href\")!==(null==n.href||\"\"===n.href?null:n.href)||e.getAttribute(\"crossorigin\")!==(null==n.crossOrigin?null:n.crossOrigin)||e.getAttribute(\"title\")!==(null==n.title?null:n.title))break;return e;case\"style\":if(e.hasAttribute(\"data-precedence\"))break;return e;case\"script\":if(((l=e.getAttribute(\"src\"))!==(null==n.src?null:n.src)||e.getAttribute(\"type\")!==(null==n.type?null:n.type)||e.getAttribute(\"crossorigin\")!==(null==n.crossOrigin?null:n.crossOrigin))&&l&&e.hasAttribute(\"async\")&&!e.hasAttribute(\"itemprop\"))break;return e;default:return e}}else{if(\"input\"!==t||\"hidden\"!==e.type)return e;var l=null==n.name?null:\"\"+n.name;if(\"hidden\"===n.type&&e.getAttribute(\"name\")===l)return e}if(null===(e=cQ(e.nextSibling)))break}return null}(r,t.type,t.pendingProps,rW))?(t.stateNode=r,rV=t,rH=cQ(r.firstChild),rW=!1,l=!0):l=!1),l||rK(t)),eo(t),l=t.type,a=t.pendingProps,o=null!==e?e.memoizedProps:null,r=a.children,cf(l,a)?r=null:null!==o&&cf(l,o)&&(t.flags|=32),null!==t.memoizedState&&(fv._currentValue=l=av(e,t,aw,null,null,n)),oG(e,t),oB(e,t,r,n),t.child;case 6:return null===e&&r$&&((e=n=rH)&&(null!==(n=function(e,t,n){if(\"\"===t)return null;for(;3!==e.nodeType;)if((1!==e.nodeType||\"INPUT\"!==e.nodeName||\"hidden\"!==e.type)&&!n||null===(e=cQ(e.nextSibling)))return null;return e}(n,t.pendingProps,rW))?(t.stateNode=n,rV=t,rH=null,e=!0):e=!1),e||rK(t)),null;case 13:return o4(e,t,n);case 4:return el(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=lA(t,null,r,n):oB(e,t,r,n),t.child;case 11:return oV(e,t,t.type,t.pendingProps,n);case 7:return r=t.pendingProps,oG(e,t),oB(e,t,r,n),t.child;case 8:case 12:return oB(e,t,t.pendingProps.children,n),t.child;case 10:return r=t.pendingProps,r4(t,t.type,r.value),oB(e,t,r.children,n),t.child;case 9:return l=t.type._context,r=t.pendingProps.children,le(t),r=r(l=lt(l)),t.flags|=1,oB(e,t,r,n),t.child;case 14:return oH(e,t,t.type,t.pendingProps,n);case 15:return o$(e,t,t.type,t.pendingProps,n);case 19:return ir(e,t,n);case 31:var i=e,s=t,c=n,f=s.pendingProps,d=0!=(128&s.flags);if(s.flags&=-129,null===i){if(r$){if(\"hidden\"===f.mode)return i=oK(s,f),s.lanes=0x20000000,oW(null,i);if(l8(s),(i=rH)?null!==(i=null!==(i=cV(i,rW))&&\"&\"===i.data?i:null)&&(s.memoizedState={dehydrated:i,treeContext:null!==rM?{id:rI,overflow:rD}:null,retryLane:0x20000000,hydrationErrors:null},(c=rx(i)).return=s,s.child=c,rV=s,rH=null):i=null,null===i)throw rK(s);return s.lanes=0x20000000,null}return oK(s,f)}var p=i.memoizedState;if(null!==p){var m=p.dehydrated;if(l8(s),d)if(256&s.flags)s.flags&=-257,s=oX(i,s,c);else if(null!==s.memoizedState)s.child=i.child,s.flags|=128,s=null;else throw Error(u(558));else if(oU||r9(i,s,c,!1),d=0!=(c&i.childLanes),oU||d){if(null!==(f=uE)&&0!==(m=eU(f,c))&&m!==p.retryLane)throw p.retryLane=m,rd(i,m),u6(f,i,m),oj;su(),s=oX(i,s,c)}else i=p.treeContext,rH=cQ(m.nextSibling),rV=s,r$=!0,rQ=null,rW=!1,null!==i&&rB(s,i),s=oK(s,f),s.flags|=4096;return s}return(i=rb(i.child,{mode:f.mode,children:f.children})).ref=s.ref,s.child=i,i.return=s,i;case 22:return oQ(e,t,n,t.pendingProps);case 24:return le(t),r=lt(li),null===e?(null===(l=lb())&&(l=uE,a=lu(),l.pooledCache=a,a.refCount++,null!==a&&(l.pooledCacheLanes|=n),l=a),t.memoizedState={parent:r,cache:l},lB(t),r4(t,li,l)):(0!=(e.lanes&n)&&(lV(e,t),lX(t,null,null,n),lK()),l=e.memoizedState,a=t.memoizedState,l.parent!==r?(l={parent:r,cache:r},t.memoizedState=l,0===t.lanes&&(t.memoizedState=t.updateQueue.baseState=l),r4(t,li,r)):(r4(t,li,r=a.cache),r!==l.cache&&r6(t,[li],n,!0))),oB(e,t,t.pendingProps.children,n),t.child;case 30:return null!=(r=t.pendingProps).name&&\"auto\"!==r.name?t.flags|=null===e?0x1202000:0x1200000:r$&&rj(t),null!==e&&e.memoizedProps.name!==r.name?t.flags|=4194816:oG(e,t),oB(e,t,r.children,n),t.child;case 29:throw t.pendingProps}throw Error(u(156,t.tag))}function ii(e){e.flags|=4}function iu(e,t,n,r,l){var a;if((a=0!=(32&e.mode))&&(a=null===n?fo(t,r):fo(t,r)&&(r.src!==n.src||r.srcSet!==n.srcSet)),a){if(e.flags|=0x1000000,(0x13ffff40&l)===l)if(e.stateNode.complete)e.flags|=8192;else if(sa())e.flags|=8192;else throw lT=l_,lE}else e.flags&=-0x1000001}function is(e,t){if(\"stylesheet\"!==t.type||0!=(4&t.state.loading))e.flags&=-0x1000001;else if(e.flags|=0x1000000,!fi(t))if(sa())e.flags|=8192;else throw lT=l_,lE}function ic(e,t){null!==t&&(e.flags|=4),16384&e.flags&&(t=22!==e.tag?eI():0x20000000,e.lanes|=t,uF|=t)}function id(e,t){if(!r$)switch(e.tailMode){case\"visible\":break;case\"collapsed\":for(var n=e.tail,r=null;null!==n;)null!==n.alternate&&(r=n),n=n.sibling;null===r?t||null===e.tail?e.tail=null:e.tail.sibling=null:r.sibling=null;break;default:for(n=null,t=e.tail;null!==t;)null!==t.alternate&&(n=t),t=t.sibling;null===n?e.tail=null:n.sibling=null}}function ip(e){var t=null!==e.alternate&&e.alternate.child===e.child,n=0,r=0;if(t)for(var l=e.child;null!==l;)n|=l.lanes|l.childLanes,r|=0x7e00000&l.subtreeFlags,r|=0x7e00000&l.flags,l.return=e,l=l.sibling;else for(l=e.child;null!==l;)n|=l.lanes|l.childLanes,r|=l.subtreeFlags,r|=l.flags,l.return=e,l=l.sibling;return e.subtreeFlags|=r,e.childLanes=n,t}function im(e,t){switch(rU(t),t.tag){case 3:r5(li),ea();break;case 26:case 27:case 5:ei(t);break;case 4:ea();break;case 31:null!==t.memoizedState&&l7(t);break;case 13:l7(t);break;case 19:an(t);break;case 10:r5(t.type);break;case 22:case 23:l7(t),l2(),null!==e&&J(ly);break;case 24:r5(li)}}function ih(e,t){try{var n=t.updateQueue,r=null!==n?n.lastEffect:null;if(null!==r){var l=r.next;n=l;do{if((n.tag&e)===e){r=void 0;var a=n.create;n.inst.destroy=r=a()}n=n.next}while(n!==l)}}catch(e){s_(t,t.return,e)}}function ig(e,t,n){try{var r=t.updateQueue,l=null!==r?r.lastEffect:null;if(null!==l){var a=l.next;r=a;do{if((r.tag&e)===e){var o=r.inst,i=o.destroy;if(void 0!==i){o.destroy=void 0,l=t;try{i()}catch(e){s_(l,n,e)}}}r=r.next}while(r!==a)}}catch(e){s_(t,t.return,e)}}function iv(e){var t=e.updateQueue;if(null!==t){var n=e.stateNode;try{lY(t,n)}catch(t){s_(e,e.return,t)}}}function iy(e,t,n){n.props=oO(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){s_(e,t,n)}}function ib(e,t){try{var n=e.ref;if(null!==n){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;case 30:var l=e.stateNode,a=rn(e.memoizedProps,l);(null===l.ref||l.ref.name!==a)&&(l.ref=cC(a)),r=l.ref;break;case 7:null===e.stateNode&&(e.stateNode=new cT(e)),r=e.stateNode;break;default:r=e.stateNode}\"function\"==typeof n?e.refCleanup=n(r):n.current=r}}catch(n){s_(e,t,n)}}function iw(e,t){var n=e.ref,r=e.refCleanup;if(null!==n)if(\"function\"==typeof r)try{r()}catch(n){s_(e,t,n)}finally{e.refCleanup=null,null!=(e=e.alternate)&&(e.refCleanup=null)}else if(\"function\"==typeof n)try{n(null)}catch(n){s_(e,t,n)}else n.current=null}function ik(e){var t=e.type,n=e.memoizedProps,r=e.stateNode;try{switch(t){case\"button\":case\"input\":case\"select\":case\"textarea\":n.autoFocus&&r.focus();break;case\"img\":n.src?r.src=n.src:n.srcSet&&(r.srcset=n.srcSet)}}catch(t){s_(e,e.return,t)}}function iS(e,t,n){try{var r=e.stateNode;(function(e,t,n,r){switch(t){case\"div\":case\"span\":case\"svg\":case\"path\":case\"a\":case\"g\":case\"p\":case\"li\":break;case\"input\":var l=null,a=null,o=null,i=null,s=null,c=null,f=null;for(m in n){var d=n[m];if(n.hasOwnProperty(m)&&null!=d)switch(m){case\"checked\":case\"value\":break;case\"defaultValue\":s=d;default:r.hasOwnProperty(m)||cn(e,t,m,null,r,d)}}for(var p in r){var m=r[p];if(d=n[p],r.hasOwnProperty(p)&&(null!=m||null!=d))switch(p){case\"type\":m!==d&&(tr=!0),a=m;break;case\"name\":m!==d&&(tr=!0),l=m;break;case\"checked\":m!==d&&(tr=!0),c=m;break;case\"defaultChecked\":m!==d&&(tr=!0),f=m;break;case\"value\":m!==d&&(tr=!0),o=m;break;case\"defaultValue\":m!==d&&(tr=!0),i=m;break;case\"children\":case\"dangerouslySetInnerHTML\":if(null!=m)throw Error(u(137,t));break;default:m!==d&&cn(e,t,p,m,r,d)}}th(e,o,i,s,c,f,a,l);return;case\"select\":for(a in m=o=i=p=null,n)if(s=n[a],n.hasOwnProperty(a)&&null!=s)switch(a){case\"value\":break;case\"multiple\":m=s;default:r.hasOwnProperty(a)||cn(e,t,a,null,r,s)}for(l in r)if(a=r[l],s=n[l],r.hasOwnProperty(l)&&(null!=a||null!=s))switch(l){case\"value\":a!==s&&(tr=!0),p=a;break;case\"defaultValue\":a!==s&&(tr=!0),i=a;break;case\"multiple\":a!==s&&(tr=!0),o=a;default:a!==s&&cn(e,t,l,a,r,s)}t=i,n=o,r=m,null!=p?ty(e,!!n,p,!1):!!r!=!!n&&(null!=t?ty(e,!!n,t,!0):ty(e,!!n,n?[]:\"\",!1));return;case\"textarea\":for(i in m=p=null,n)if(l=n[i],n.hasOwnProperty(i)&&null!=l&&!r.hasOwnProperty(i))switch(i){case\"value\":case\"children\":break;default:cn(e,t,i,null,r,l)}for(o in r)if(l=r[o],a=n[o],r.hasOwnProperty(o)&&(null!=l||null!=a))switch(o){case\"value\":l!==a&&(tr=!0),p=l;break;case\"defaultValue\":l!==a&&(tr=!0),m=l;break;case\"children\":break;case\"dangerouslySetInnerHTML\":if(null!=l)throw Error(u(91));break;default:l!==a&&cn(e,t,o,l,r,a)}tb(e,p,m);return;case\"option\":for(var h in n)p=n[h],n.hasOwnProperty(h)&&null!=p&&!r.hasOwnProperty(h)&&(\"selected\"===h?e.selected=!1:cn(e,t,h,null,r,p));for(s in r)p=r[s],m=n[s],r.hasOwnProperty(s)&&p!==m&&(null!=p||null!=m)&&(\"selected\"===s?(p!==m&&(tr=!0),e.selected=p&&\"function\"!=typeof p&&\"symbol\"!=typeof p):cn(e,t,s,p,r,m));return;case\"img\":case\"link\":case\"area\":case\"base\":case\"br\":case\"col\":case\"embed\":case\"hr\":case\"keygen\":case\"meta\":case\"param\":case\"source\":case\"track\":case\"wbr\":case\"menuitem\":for(var g in n)p=n[g],n.hasOwnProperty(g)&&null!=p&&!r.hasOwnProperty(g)&&cn(e,t,g,null,r,p);for(c in r)if(p=r[c],m=n[c],r.hasOwnProperty(c)&&p!==m&&(null!=p||null!=m))switch(c){case\"children\":case\"dangerouslySetInnerHTML\":if(null!=p)throw Error(u(137,t));break;default:cn(e,t,c,p,r,m)}return;default:if(t_(t)){for(var v in n)p=n[v],n.hasOwnProperty(v)&&void 0!==p&&!r.hasOwnProperty(v)&&cr(e,t,v,void 0,r,p);for(f in r)p=r[f],m=n[f],r.hasOwnProperty(f)&&p!==m&&(void 0!==p||void 0!==m)&&cr(e,t,f,p,r,m);return}}for(var y in n)p=n[y],n.hasOwnProperty(y)&&null!=p&&!r.hasOwnProperty(y)&&cn(e,t,y,null,r,p);for(d in r)p=r[d],m=n[d],r.hasOwnProperty(d)&&p!==m&&(null!=p||null!=m)&&cn(e,t,d,p,r,m)})(r,e.type,n,t),r[eq]=t}catch(t){s_(e,e.return,t)}}function iE(e,t){if(5===e.tag&&null===e.alternate&&null!==t)for(var n=0;n<t.length;n++)cU(e.stateNode,t[n])}function ix(e){for(var t=e.return;null!==t;){if(iN(t)){var n=e.stateNode,r=t.stateNode._eventListeners;if(null!==r)for(var l=0;l<r.length;l++){var a=r[l];n.removeEventListener(a.type,a.listener,a.optionsOrUseCapture)}}if(i_(t))break;t=t.return}}function i_(e){return 5===e.tag||3===e.tag||26===e.tag||27===e.tag&&cy(e.type)||4===e.tag}function iN(e){return e&&7===e.tag&&null!==e.stateNode}function iP(e){e:for(;;){for(;null===e.sibling;){if(null===e.return||i_(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;5!==e.tag&&6!==e.tag&&18!==e.tag;){if(27===e.tag&&cy(e.type)||2&e.flags||null===e.child||4===e.tag)continue e;e.child.return=e,e=e.child}if(!(2&e.flags))return e.stateNode}}function iC(e,t,n,r){var l=e.tag;if(5===l||6===l)l=e.stateNode,t?n.insertBefore(l,t):n.appendChild(l),iE(e,r),tr=!0;else if(4!==l&&(27===l&&cy(e.type)&&(n=e.stateNode),null!==(e=e.child)))for(iC(e,t,n,r),e=e.sibling;null!==e;)iC(e,t,n,r),e=e.sibling}function iT(e){var t=e.stateNode,n=e.memoizedProps;try{for(var r=e.type,l=t.attributes;l.length;)t.removeAttributeNode(l[0]);cl(t,r,n),t[eW]=e,t[eq]=n}catch(t){s_(e,e.return,t)}}var iO=!1,iz=null;function iL(e){(30===e.tag||0!=(0x2000000&e.subtreeFlags))&&(iO=!0)}var iR=null;function iM(){var e=iR;return iR=null,e}var iI=0;function iD(e,t,n,r,l){return iI=0,function e(t,n,r,l,a){for(var o=!1;null!==t;){if(5===t.tag){var i=t.stateNode;if(null!==l){var u=cx(i);l.push(u),u.view&&(o=!0)}else o||cx(i).view&&(o=!0);iO=!0,ck(i,0===iI?n:n+\"_\"+iI,r),iI++}else(22!==t.tag||null===t.memoizedState)&&(30===t.tag&&a||e(t.child,n,r,l,a)&&(o=!0));t=t.sibling}return o}(e.child,t,n,r,l)}function iF(e,t){for(;null!==e;)5===e.tag?cS(e.stateNode,e.memoizedProps):(22!==e.tag||null===e.memoizedState)&&(30===e.tag&&t||iF(e.child,t)),e=e.sibling}function iA(e){if(0!=(0x1200000&e.subtreeFlags))for(e=e.child;null!==e;){if((22!==e.tag||null===e.memoizedState)&&(iA(e),30===e.tag&&0!=(0x1200000&e.flags)&&e.stateNode.paired)){var t=e.memoizedProps;if(null==t.name||\"auto\"===t.name)throw Error(u(544));var n=t.name;\"none\"!==(t=rl(t.default,t.share))&&(iD(e,n,t,null,!1)||iF(e.child,!1))}e=e.sibling}}function ij(e,t){if(30===e.tag){var n=e.stateNode,r=e.memoizedProps,l=rn(r,n),a=rl(r.default,n.paired?r.share:r.enter);\"none\"!==a?iD(e,l,a,null,!1)?(iA(e),n.paired||t||u8(e,r.onEnter)):iF(e.child,!1):iA(e)}else if(0!=(0x2000000&e.subtreeFlags))for(e=e.child;null!==e;)ij(e,t),e=e.sibling;else iA(e)}function iU(e){if(null!==iz&&0!==iz.size){var t=iz;if(0!=(0x1200000&e.subtreeFlags))for(e=e.child;null!==e;){if(22!==e.tag||null===e.memoizedState){if(30===e.tag&&0!=(0x1200000&e.flags)){var n=e.memoizedProps,r=n.name;if(null!=r&&\"auto\"!==r){var l=t.get(r);if(void 0!==l){var a=rl(n.default,n.share);if(\"none\"!==a&&(iD(e,r,a,null,!1)?(l.paired=a=e.stateNode,a.paired=l,u8(e,n.onShare)):iF(e.child,!1)),t.delete(r),0===t.size)break}}}iU(e)}e=e.sibling}}}function iB(e){if(30===e.tag){var t=e.memoizedProps,n=rn(t,e.stateNode),r=null!==iz?iz.get(n):void 0,l=rl(t.default,void 0!==r?t.share:t.exit);\"none\"!==l&&(iD(e,n,l,null,!1)?void 0!==r?(r.paired=l=e.stateNode,l.paired=r,iz.delete(n),u8(e,t.onShare)):u8(e,t.onExit):iF(e.child,!1)),null!==iz&&iU(e)}else if(0!=(0x2000000&e.subtreeFlags))for(e=e.child;null!==e;)iB(e),e=e.sibling;else null!==iz&&iU(e)}function iV(e){if(0!=(0x1200000&e.subtreeFlags))for(e=e.child;null!==e;){if(22!==e.tag||null===e.memoizedState){if(30===e.tag&&0!=(0x1200000&e.flags)){var t=e.stateNode;null!==t.paired&&(t.paired=null,iF(e.child,!1))}iV(e)}e=e.sibling}}function iH(e){if(30===e.tag)e.stateNode.paired=null,iF(e.child,!1),iV(e);else if(0!=(0x2000000&e.subtreeFlags))for(e=e.child;null!==e;)iH(e),e=e.sibling;else iV(e)}function i$(e,t,n,r,l,a,o){for(var i=!1;null!==t;){if(5===t.tag){var u=t.stateNode;if(null!==a&&iI<a.length){var s,c=a[iI],f=cx(u);if((c.view||f.view)&&(i=!0),s=0==(4&e.flags))if(f.clip)s=!0;else{s=c.rect;var d=f.rect;s=s.y!==d.y||s.x!==d.x||s.height!==d.height||s.width!==d.width}s&&(e.flags|=4),f.abs?f=!c.abs:(c=c.rect,f=f.rect,f=c.height!==f.height||c.width!==f.width),f&&(e.flags|=32)}else e.flags|=32;0!=(4&e.flags)&&ck(u,0===iI?n:n+\"_\"+iI,l),i&&0!=(4&e.flags)||(null===iR&&(iR=[]),iR.push(u,r,t.memoizedProps)),iI++}else(22!==t.tag||null===t.memoizedState)&&(30===t.tag&&o?e.flags|=32&t.flags:i$(e,t.child,n,r,l,a,o)&&(i=!0));t=t.sibling}return i}var iQ=!1,iW=!1,iq=!1,iK=!1,iX=\"function\"==typeof WeakSet?WeakSet:Set,iG=null,iY=!1,iJ=!1,iZ=!1,i0=!1;function i1(e){for(;null!==iG;){var t=iG,n=e,r=t.alternate,l=t.flags;switch(t.tag){case 0:case 11:case 15:if(0!=(4&l)&&null!==(r=null!==(r=t.updateQueue)?r.events:null))for(n=0;n<r.length;n++)(l=r[n]).ref.impl=l.nextImpl;break;case 1:if(0!=(1024&l)&&null!==r){n=void 0,l=r.memoizedProps,r=r.memoizedState;var a=t.stateNode;try{var o=oO(t.type,l);n=a.getSnapshotBeforeUpdate(o,r),a.__reactInternalSnapshotBeforeUpdate=n}catch(e){s_(t,t.return,e)}}break;case 3:if(0!=(1024&l)){if(9===(n=(r=t.stateNode.containerInfo).nodeType))cB(r);else if(1===n)switch(r.nodeName){case\"HEAD\":case\"HTML\":case\"BODY\":cB(r);break;default:r.textContent=\"\"}}break;case 5:case 26:case 27:case 6:case 4:case 17:break;case 30:n&&null!==r&&(n=rn(r.memoizedProps,r.stateNode),\"none\"!==(l=rl((l=t.memoizedProps).default,l.update))&&iD(r,n,l,r.memoizedState=[],!0));break;default:if(0!=(1024&l))throw Error(u(163))}if(null!==(r=t.sibling)){r.return=t.return,iG=r;break}iG=t.return}}function i2(e,t,n){var r=n.flags;switch(n.tag){case 0:case 11:case 15:ui(e,n),4&r&&ih(5,n);break;case 1:if(ui(e,n),4&r)if(e=n.stateNode,null===t)try{e.componentDidMount()}catch(e){s_(n,n.return,e)}else{var l=oO(n.type,t.memoizedProps);t=t.memoizedState;try{e.componentDidUpdate(l,t,e.__reactInternalSnapshotBeforeUpdate)}catch(e){s_(n,n.return,e)}}64&r&&iv(n),512&r&&ib(n,n.return);break;case 3:if(ui(e,n),64&r&&null!==(e=n.updateQueue)){if(t=null,null!==n.child)switch(n.child.tag){case 27:case 5:case 1:t=n.child.stateNode}try{lY(e,t)}catch(e){s_(n,n.return,e)}}break;case 27:null===t&&4&r&&iT(n);case 26:case 5:ui(e,n),null===t&&4&r&&ik(n),512&r&&ib(n,n.return);break;case 12:ui(e,n);break;case 31:ui(e,n),4&r&&i9(e,n);break;case 13:ui(e,n),4&r&&i7(e,n),64&r&&null!==(e=n.memoizedState)&&null!==(e=e.dehydrated)&&function(e,t){var n=e.ownerDocument;if(\"$~\"===e.data)e._reactRetry=t;else if(\"$?\"!==e.data||\"loading\"!==n.readyState)t();else{var r=function(){t(),n.removeEventListener(\"DOMContentLoaded\",r)};n.addEventListener(\"DOMContentLoaded\",r),e._reactRetry=r}}(e,n=sT.bind(null,n));break;case 22:if(!(r=null!==n.memoizedState||iQ)){t=null!==t&&null!==t.memoizedState||iW,l=iQ;var a=iW;iQ=r,(iW=t)&&!a?function e(t,n,r){for(r=r&&0!=(8772&n.subtreeFlags),n=n.child;null!==n;){var l=n.alternate,a=t,o=n,i=o.flags;switch(o.tag){case 0:case 11:case 15:e(a,o,r),ih(4,o);break;case 1:if(e(a,o,r),\"function\"==typeof(a=(l=o).stateNode).componentDidMount)try{a.componentDidMount()}catch(e){s_(l,l.return,e)}if(null!==(a=(l=o).updateQueue)){var u=l.stateNode;try{var s=a.shared.hiddenCallbacks;if(null!==s)for(a.shared.hiddenCallbacks=null,a=0;a<s.length;a++)lG(s[a],u)}catch(e){s_(l,l.return,e)}}r&&64&i&&iv(o),ib(o,o.return);break;case 27:iT(o);case 26:case 5:if(5===o.tag){u=o;for(var c=u.return;null!==c&&(iN(c)&&cU(u.stateNode,c.stateNode),!i_(c));)c=c.return}e(a,o,r),r&&null===l&&4&i&&ik(o),ib(o,o.return);break;case 12:e(a,o,r);break;case 31:e(a,o,r),r&&4&i&&i9(a,o);break;case 13:e(a,o,r),r&&4&i&&i7(a,o);break;case 22:null===o.memoizedState&&e(a,o,r),ib(o,o.return);break;case 30:e(a,o,r),ib(o,o.return);break;case 7:ib(o,o.return);default:e(a,o,r)}n=n.sibling}}(e,n,0!=(8772&n.subtreeFlags)):ui(e,n),iQ=l,iW=a}break;case 30:ui(e,n),512&r&&ib(n,n.return);break;case 7:512&r&&ib(n,n.return);default:ui(e,n)}}function i3(e,t){for(e=e.child;null!==e;)(function e(t,n){switch(t.tag){case 5:case 26:try{var r=t.stateNode;if(n){var l=r.style;\"function\"==typeof l.setProperty?l.setProperty(\"display\",\"none\",\"important\"):l.display=\"none\"}else{var a=t.stateNode,o=t.memoizedProps.style,i=null!=o&&o.hasOwnProperty(\"display\")?o.display:null;a.style.display=null==i||\"boolean\"==typeof i?\"\":(\"\"+i).trim()}}catch(e){s_(t,t.return,e)}!function t(n,r){if(0x4000000&n.subtreeFlags)for(n=n.child;null!==n;){e:{var l=n;switch(l.tag){case 4:e(l,r);break e;case 22:null===l.memoizedState&&t(l,r);break e;default:t(l,r)}}n=n.sibling}}(t,n);break;case 6:try{t.stateNode.nodeValue=n?\"\":t.memoizedProps,tr=!0}catch(e){s_(t,t.return,e)}break;case 18:try{var u=t.stateNode;n?cw(u,!0):cw(t.stateNode,!1)}catch(e){s_(t,t.return,e)}break;case 22:case 23:null===t.memoizedState&&i3(t,n);break;default:i3(t,n)}})(e,t),e=e.sibling}var i4=null,i5=!1;function i8(e,t,n){for(n=n.child;null!==n;)i6(e,t,n),n=n.sibling}function i6(e,t,n){if(e_&&\"function\"==typeof e_.onCommitFiberUnmount)try{e_.onCommitFiberUnmount(ex,n)}catch(e){}switch(n.tag){case 26:iW||iw(n,t),i8(e,t,n),n.memoizedState?n.memoizedState.count--:n.stateNode&&(n=n.stateNode).parentNode.removeChild(n);break;case 27:iW||iw(n,t);var r=i4,l=i5;cy(n.type)&&(i4=n.stateNode,i5=!1),i8(e,t,n),cG(n.stateNode),i4=r,i5=l;break;case 5:iW||iw(n,t),5===n.tag&&ix(n);case 6:if(r=i4,l=i5,i4=null,i8(e,t,n),i4=r,i5=l,null!==i4)if(i5)try{(9===i4.nodeType?i4.body:\"HTML\"===i4.nodeName?i4.ownerDocument.body:i4).removeChild(n.stateNode),tr=!0}catch(e){s_(n,t,e)}else try{i4.removeChild(n.stateNode),tr=!0}catch(e){s_(n,t,e)}break;case 18:null!==i4&&(i5?(cb(9===(e=i4).nodeType?e.body:\"HTML\"===e.nodeName?e.ownerDocument.body:e,n.stateNode),fG(e)):cb(i4,n.stateNode));break;case 4:r=i4,l=i5,i4=n.stateNode.containerInfo,i5=!0,i8(e,t,n),i4=r,i5=l;break;case 0:case 11:case 14:case 15:ig(2,n,t),iW||ig(4,n,t),i8(e,t,n);break;case 1:iW||(iw(n,t),\"function\"==typeof(r=n.stateNode).componentWillUnmount&&iy(n,t,r)),i8(e,t,n);break;case 21:default:i8(e,t,n);break;case 22:iW=(r=iW)||null!==n.memoizedState,i8(e,t,n),iW=r;break;case 30:iw(n,t),i8(e,t,n);break;case 7:iW||iw(n,t),i8(e,t,n)}}function i9(e,t){if(null===t.memoizedState&&null!==(e=t.alternate)&&null!==(e=e.memoizedState)){e=e.dehydrated;try{fG(e)}catch(e){s_(t,t.return,e)}}}function i7(e,t){if(null===t.memoizedState&&null!==(e=t.alternate)&&null!==(e=e.memoizedState)&&null!==(e=e.dehydrated))try{fG(e)}catch(e){s_(t,t.return,e)}}function ue(e,t){var n=function(e){switch(e.tag){case 31:case 13:case 19:var t=e.stateNode;return null===t&&(t=e.stateNode=new iX),t;case 22:return null===(t=(e=e.stateNode)._retryCache)&&(t=e._retryCache=new iX),t;default:throw Error(u(435,e.tag))}}(e);t.forEach(function(t){if(!n.has(t)){n.add(t);var r=sO.bind(null,e,t);t.then(r,r)}})}function ut(e,t,n){var r=t.deletions;if(null!==r)for(var l=0;l<r.length;l++){var a=r[l],o=e,i=t,s=i;e:for(;null!==s;){switch(s.tag){case 27:if(cy(s.type)){i4=s.stateNode,i5=!1;break e}break;case 5:i4=s.stateNode,i5=!1;break e;case 3:case 4:i4=s.stateNode.containerInfo,i5=!0;break e}s=s.return}if(null===i4)throw Error(u(160));i6(o,i,a),i4=null,i5=!1,null!==(o=a.alternate)&&(o.return=null),a.return=null}if(13886&t.subtreeFlags)for(t=t.child;null!==t;)ur(t,e,n),t=t.sibling}var un=null;function ur(e,t,n){var r=e.alternate,l=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:ut(t,e,n),ul(e),4&l&&(ig(3,e,e.return),ih(3,e),ig(5,e,e.return));break;case 1:ut(t,e,n),ul(e),512&l&&(iW||null===r||iw(r,r.return)),64&l&&iQ&&null!==(e=e.updateQueue)&&null!==(r=e.callbacks)&&(t=e.shared.hiddenCallbacks,e.shared.hiddenCallbacks=null===t?r:t.concat(r));break;case 26:var a=un;if(ut(t,e,n),ul(e),512&l&&(iW||null===r||iw(r,r.return)),4&l)if(n=null!==r?r.memoizedState:null,t=e.memoizedState,null===r)if(null===t)if(null===e.stateNode){e:{r=e.type,t=e.memoizedProps,n=a.ownerDocument||a;t:switch(r){case\"title\":(!(l=n.getElementsByTagName(\"title\")[0])||l[eZ]||l[eW]||\"http://www.w3.org/2000/svg\"===l.namespaceURI||l.hasAttribute(\"itemprop\"))&&(l=n.createElement(r),n.head.insertBefore(l,n.querySelector(\"head > title\"))),cl(l,r,t),l[eW]=e,e5(l),r=l;break e;case\"link\":if(a=fl(\"link\",\"href\",n).get(r+(t.href||\"\"))){for(var o=0;o<a.length;o++)if((l=a[o]).getAttribute(\"href\")===(null==t.href||\"\"===t.href?null:t.href)&&l.getAttribute(\"rel\")===(null==t.rel?null:t.rel)&&l.getAttribute(\"title\")===(null==t.title?null:t.title)&&l.getAttribute(\"crossorigin\")===(null==t.crossOrigin?null:t.crossOrigin)){a.splice(o,1);break t}}cl(l=n.createElement(r),r,t),n.head.appendChild(l);break;case\"meta\":if(a=fl(\"meta\",\"content\",n).get(r+(t.content||\"\"))){for(o=0;o<a.length;o++)if((l=a[o]).getAttribute(\"content\")===(null==t.content?null:\"\"+t.content)&&l.getAttribute(\"name\")===(null==t.name?null:t.name)&&l.getAttribute(\"property\")===(null==t.property?null:t.property)&&l.getAttribute(\"http-equiv\")===(null==t.httpEquiv?null:t.httpEquiv)&&l.getAttribute(\"charset\")===(null==t.charSet?null:t.charSet)){a.splice(o,1);break t}}cl(l=n.createElement(r),r,t),n.head.appendChild(l);break;default:throw Error(u(468,r))}l[eW]=e,e5(l),r=l}e.stateNode=r}else fa(a,e.type,e.stateNode);else e.stateNode=c7(a,t,e.memoizedProps);else n!==t?(null===n?null!==r.stateNode&&(r=r.stateNode).parentNode.removeChild(r):n.count--,null===t?fa(a,e.type,e.stateNode):c7(a,t,e.memoizedProps)):null===t&&null!==e.stateNode&&iS(e,e.memoizedProps,r.memoizedProps);break;case 27:ut(t,e,n),ul(e),512&l&&(iW||null===r||iw(r,r.return)),null!==r&&4&l&&iS(e,e.memoizedProps,r.memoizedProps);break;case 5:if(a=iq,iq=!1,ut(t,e,n),iq=a,ul(e),512&l&&(iW||null===r||iw(r,r.return)),32&e.flags){t=e.stateNode;try{tk(t,\"\"),tr=!0}catch(t){s_(e,e.return,t)}}4&l&&null!=e.stateNode&&(t=e.memoizedProps,iS(e,t,null!==r?r.memoizedProps:t)),1024&l&&(iK=!0);break;case 6:if(ut(t,e,n),ul(e),4&l){if(null===e.stateNode)throw Error(u(162));r=e.memoizedProps,t=e.stateNode;try{t.nodeValue=r,tr=!0}catch(t){s_(e,e.return,t)}}break;case 3:if(tr=!1,fr=null,a=un,un=cZ(t.containerInfo),ut(t,e,n),un=a,ul(e),4&l&&null!==r&&r.memoizedState.isDehydrated)try{fG(t.containerInfo)}catch(t){s_(e,e.return,t)}iK&&(iK=!1,function e(t){if(1024&t.subtreeFlags)for(t=t.child;null!==t;){var n=t;e(n),5===n.tag&&1024&n.flags&&n.stateNode.reset(),t=t.sibling}}(e)),tr=!1;break;case 4:r=iq,iq=iQ,l=tl(),a=un,un=cZ(e.stateNode.containerInfo),ut(t,e,n),ul(e),un=a,tr&&iJ&&(iZ=!0),tr=l,iq=r;break;case 12:ut(t,e,n),ul(e);break;case 31:case 19:ut(t,e,n),ul(e),4&l&&null!==(r=e.updateQueue)&&(e.updateQueue=null,ue(e,r));break;case 13:ut(t,e,n),ul(e),8192&e.child.flags&&null!==e.memoizedState!=(null!==r&&null!==r.memoizedState)&&(uB=ev()),4&l&&null!==(r=e.updateQueue)&&(e.updateQueue=null,ue(e,r));break;case 22:a=null!==e.memoizedState,o=null!==r&&null!==r.memoizedState;var i=iQ,s=iW,c=iq;iQ=i||a,iq=c||a,iW=s||o,ut(t,e,n),iW=s,iq=c,iQ=i,ul(e),8192&l&&((t=e.stateNode)._visibility=a?-2&t._visibility:1|t._visibility,a&&(null===r||o||iQ||iW||function e(t){for(t=t.child;null!==t;){var n=t;switch(n.tag){case 0:case 11:case 14:case 15:ig(4,n,n.return),e(n);break;case 1:iw(n,n.return);var r=n.stateNode;\"function\"==typeof r.componentWillUnmount&&iy(n,n.return,r),e(n);break;case 27:cG(n.stateNode);case 26:case 5:iw(n,n.return),5===n.tag&&ix(n),e(n);break;case 22:null===n.memoizedState&&e(n);break;case 30:iw(n,n.return),e(n);break;case 7:iw(n,n.return);default:e(n)}t=t.sibling}}(e)),!a&&iq||i3(e,a)),4&l&&null!==(r=e.updateQueue)&&null!==(t=r.retryQueue)&&(r.retryQueue=null,ue(e,t));break;case 30:512&l&&(iW||null===r||iw(r,r.return)),l=tl(),a=iJ,o=(0x13ffff00&n)===n,i=e.memoizedProps,iJ=o&&\"none\"!==rl(i.default,i.update),ut(t,e,n),ul(e),o&&null!==r&&tr&&(e.flags|=4),iJ=a,tr=l;break;case 21:break;case 7:r&&null!==r.stateNode&&(r.stateNode._fragmentFiber=e);default:ut(t,e,n),ul(e)}}function ul(e){var t=e.flags;if(2&t){try{for(var n,r=null,l=e.return;null!==l;){if(iN(l)){var a=l.stateNode;null===r?r=[a]:r.push(a)}if(i_(l)){n=l;break}l=l.return}if(null==n)throw Error(u(160));switch(n.tag){case 27:var o=n.stateNode,i=iP(e);iC(e,i,o,r);break;case 5:var s=n.stateNode;32&n.flags&&(tk(s,\"\"),n.flags&=-33);var c=iP(e);iC(e,c,s,r);break;case 3:case 4:var f=n.stateNode.containerInfo,d=iP(e);!function e(t,n,r,l){var a=t.tag;if(5===a||6===a)a=t.stateNode,n?(9===r.nodeType?r.body:\"HTML\"===r.nodeName?r.ownerDocument.body:r).insertBefore(a,n):((n=9===r.nodeType?r.body:\"HTML\"===r.nodeName?r.ownerDocument.body:r).appendChild(a),null!=(r=r._reactRootContainer)||null!==n.onclick||(n.onclick=tT)),iE(t,l),tr=!0;else if(4!==a&&(27===a&&cy(t.type)&&(r=t.stateNode,n=null),null!==(t=t.child)))for(e(t,n,r,l),t=t.sibling;null!==t;)e(t,n,r,l),t=t.sibling}(e,d,f,r);break;default:throw Error(u(161))}}catch(t){s_(e,e.return,t)}e.flags&=-3}4096&t&&(e.flags&=-4097)}function ua(e,t){if(9270&t.subtreeFlags)for(t=t.child;null!==t;)uo(t,e),t=t.sibling;else!function e(t,n){for(t=t.child;null!==t;){if(30===t.tag){var r=t.memoizedProps,l=t.stateNode,a=rn(r,l),o=rl(r.default,r.update);if(n)var i=null===(l=l.clones)?null:l.map(c_);else i=t.memoizedState,t.memoizedState=null;l=t;var u=t.child;iI=0,a=i$(l,u,a,a,o,i,!1),0!=(4&t.flags)&&a&&(n||u8(t,r.onUpdate))}else 0!=(0x2000000&t.subtreeFlags)&&e(t,n);t=t.sibling}}(t,!1)}function uo(e,t){var n=e.alternate;if(null===n)ij(e,!1);else switch(e.tag){case 3:if(i0=iY=!1,iM(),ua(t,e),!iY&&!iZ){if(null!==(e=iR))for(var r=0;r<e.length;r+=3){n=e[r];var l=e[r+1];cS(n,e[r+2]),null!==(n=n.ownerDocument.documentElement)&&n.animate({opacity:[0,0],pointerEvents:[\"none\",\"none\"]},{duration:0,fill:\"forwards\",pseudoElement:\"::view-transition-group(\"+l+\")\"})}null!==(e=9===(e=t.containerInfo).nodeType?e.documentElement:e.ownerDocument.documentElement)&&\"\"===e.style.viewTransitionName&&(e.style.viewTransitionName=\"none\",e.animate({opacity:[0,0],pointerEvents:[\"none\",\"none\"]},{duration:0,fill:\"forwards\",pseudoElement:\"::view-transition-group(root)\"}),e.animate({width:[0,0],height:[0,0]},{duration:0,fill:\"forwards\",pseudoElement:\"::view-transition\"})),i0=!0}iR=null;break;case 5:default:ua(t,e);break;case 4:r=iY,iY=!1,ua(t,e),iY&&(iZ=!0),iY=r;break;case 22:null===e.memoizedState&&(null!==n.memoizedState?ij(e,!1):ua(t,e));break;case 30:r=iY,l=iM(),iY=!1,ua(t,e),iY&&(e.flags|=4);var a=e.memoizedProps,o=e.stateNode;t=rn(a,o),o=rn(n.memoizedProps,o);var i=rl(a.default,a.update);\"none\"===i?t=!1:(a=n.memoizedState,n.memoizedState=null,n=e.child,iI=0,t=i$(e,n,t,o,i,a,!0),iI!==(null===a?0:a.length)&&(e.flags|=32)),0!=(4&e.flags)&&t?(u8(e,e.memoizedProps.onUpdate),iR=l):null!==l&&(l.push.apply(l,iR),iR=l),iY=0!=(32&e.flags)||r}}function ui(e,t){if(8772&t.subtreeFlags)for(t=t.child;null!==t;)i2(e,t.alternate,t),t=t.sibling}function uu(e,t){var n=null;null!==e&&null!==e.memoizedState&&null!==e.memoizedState.cachePool&&(n=e.memoizedState.cachePool.pool),e=null,null!==t.memoizedState&&null!==t.memoizedState.cachePool&&(e=t.memoizedState.cachePool.pool),e!==n&&(null!=e&&e.refCount++,null!=n&&ls(n))}function us(e,t){e=null,null!==t.alternate&&(e=t.alternate.memoizedState.cache),(t=t.memoizedState.cache)!==e&&(t.refCount++,null!=e&&ls(e))}function uc(e,t,n,r){var l=(0x13ffff00&n)===n;if(t.subtreeFlags&(l?10262:10256))for(t=t.child;null!==t;)uf(e,t,n,r),t=t.sibling;else l&&function e(t){for(t=t.child;null!==t;)30===t.tag?iF(t.child,!1):0!=(0x2000000&t.subtreeFlags)&&e(t),t=t.sibling}(t)}function uf(e,t,n,r){var l=(0x13ffff00&n)===n;l&&null===t.alternate&&null!==t.return&&null!==t.return.alternate&&iH(t);var a=t.flags;switch(t.tag){case 0:case 11:case 15:uc(e,t,n,r),2048&a&&ih(9,t);break;case 1:case 31:case 13:default:uc(e,t,n,r);break;case 3:uc(e,t,n,r),l&&i0&&(\"root\"===(e=9===(e=e.containerInfo).nodeType?e.body:\"HTML\"===e.nodeName?e.ownerDocument.body:e).style.viewTransitionName&&(e.style.viewTransitionName=\"\"),null!==(e=e.ownerDocument.documentElement)&&\"none\"===e.style.viewTransitionName&&(e.style.viewTransitionName=\"\")),2048&a&&(a=null,null!==t.alternate&&(a=t.alternate.memoizedState.cache),(t=t.memoizedState.cache)!==a&&(t.refCount++,null!=a&&ls(a)));break;case 12:if(2048&a){uc(e,t,n,r),a=t.stateNode;try{var o=t.memoizedProps,i=o.id,u=o.onPostCommit;\"function\"==typeof u&&u(i,null===t.alternate?\"mount\":\"update\",a.passiveEffectDuration,-0)}catch(e){s_(t,t.return,e)}}else uc(e,t,n,r);break;case 23:break;case 22:o=t.stateNode,i=t.alternate,null!==t.memoizedState?(l&&null!==i&&null===i.memoizedState&&iH(i),2&o._visibility?uc(e,t,n,r):ud(e,t)):(l&&null!==i&&null!==i.memoizedState&&iH(t),2&o._visibility?uc(e,t,n,r):(o._visibility|=2,function e(t,n,r,l,a){for(a=a&&0!=(10256&n.subtreeFlags),n=n.child;null!==n;){var o=n,i=o.flags;switch(o.tag){case 0:case 11:case 15:e(t,o,r,l,a),ih(8,o);break;case 23:break;case 22:var u=o.stateNode;null!==o.memoizedState?2&u._visibility?e(t,o,r,l,a):ud(t,o):(u._visibility|=2,e(t,o,r,l,a)),a&&2048&i&&uu(o.alternate,o);break;case 24:e(t,o,r,l,a),a&&2048&i&&us(o.alternate,o);break;default:e(t,o,r,l,a)}n=n.sibling}}(e,t,n,r,0!=(10256&t.subtreeFlags)))),2048&a&&uu(i,t);break;case 24:uc(e,t,n,r),2048&a&&us(t.alternate,t);break;case 30:l&&null!==(a=t.alternate)&&(iF(a.child,!0),iF(t.child,!0)),uc(e,t,n,r)}}function ud(e,t){if(10256&t.subtreeFlags)for(t=t.child;null!==t;){var n=t,r=n.flags;switch(n.tag){case 22:ud(e,n),2048&r&&uu(n.alternate,n);break;case 24:ud(e,n),2048&r&&us(n.alternate,n);break;default:ud(e,n)}t=t.sibling}}var up=8192;function um(e,t,n){if(e.subtreeFlags&up)for(e=e.child;null!==e;)uh(e,t,n),e=e.sibling}function uh(e,t,n){switch(e.tag){case 26:um(e,t,n),e.flags&up&&(null!==e.memoizedState?function(e,t,n,r){if(\"stylesheet\"===n.type&&(\"string\"!=typeof r.media||!1!==matchMedia(r.media).matches)&&0==(4&n.state.loading)){if(null===n.instance){var l=c4(r.href),a=t.querySelector(c5(l));if(a){null!==(t=a._p)&&\"object\"==typeof t&&\"function\"==typeof t.then&&(e.count++,e=fd.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,e5(a);return}a=t.ownerDocument||t,r=c8(r),(l=cY.get(l))&&ft(r,l),e5(a=a.createElement(\"link\"));var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),cl(a,\"link\",r),n.instance=a}null===e.stylesheets&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&0==(3&n.state.loading)&&(e.count++,n=fd.bind(e),t.addEventListener(\"load\",n),t.addEventListener(\"error\",n))}}(n,un,e.memoizedState,e.memoizedProps):(e=e.stateNode,(0x13ffff40&t)===t&&fs(n,e)));break;case 5:um(e,t,n),e.flags&up&&(e=e.stateNode,(0x13ffff40&t)===t&&fs(n,e));break;case 3:case 4:var r=un;un=cZ(e.stateNode.containerInfo),um(e,t,n),un=r;break;case 22:null===e.memoizedState&&(null!==(r=e.alternate)&&null!==r.memoizedState?(r=up,up=0x1000000,um(e,t,n),up=r):um(e,t,n));break;case 30:if(0!=(e.flags&up)&&null!=(r=e.memoizedProps.name)&&\"auto\"!==r){var l=e.stateNode;l.paired=null,null===iz&&(iz=new Map),iz.set(r,l)}um(e,t,n);break;default:um(e,t,n)}}function ug(e){var t=e.alternate;if(null!==t&&null!==(e=t.child)){t.child=null;do t=e.sibling,e.sibling=null,e=t;while(null!==e)}}function uv(e){var t=e.deletions;if(0!=(16&e.flags)){if(null!==t)for(var n=0;n<t.length;n++){var r=t[n];iG=r,ub(r,e)}ug(e)}if(10256&e.subtreeFlags)for(e=e.child;null!==e;)uy(e),e=e.sibling}function uy(e){switch(e.tag){case 0:case 11:case 15:uv(e),2048&e.flags&&ig(9,e,e.return);break;case 3:case 12:default:uv(e);break;case 22:var t=e.stateNode;null!==e.memoizedState&&2&t._visibility&&(null===e.return||13!==e.return.tag)?(t._visibility&=-3,function e(t){var n=t.deletions;if(0!=(16&t.flags)){if(null!==n)for(var r=0;r<n.length;r++){var l=n[r];iG=l,ub(l,t)}ug(t)}for(t=t.child;null!==t;){switch((n=t).tag){case 0:case 11:case 15:ig(8,n,n.return),e(n);break;case 22:2&(r=n.stateNode)._visibility&&(r._visibility&=-3,e(n));break;default:e(n)}t=t.sibling}}(e)):uv(e)}}function ub(e,t){for(;null!==iG;){var n=iG;switch(n.tag){case 0:case 11:case 15:ig(8,n,t);break;case 23:case 22:if(null!==n.memoizedState&&null!==n.memoizedState.cachePool){var r=n.memoizedState.cachePool.pool;null!=r&&r.refCount++}break;case 24:ls(n.memoizedState.cache)}if(null!==(r=n.child))r.return=n,iG=r;else for(n=e;null!==iG;){var l=(r=iG).sibling,a=r.return;if(!function e(t){var n=t.alternate;null!==n&&(t.alternate=null,e(n)),t.child=null,t.deletions=null,t.sibling=null,5===t.tag&&null!==(n=t.stateNode)&&e0(n),t.stateNode=null,t.return=null,t.dependencies=null,t.memoizedProps=null,t.memoizedState=null,t.pendingProps=null,t.stateNode=null,t.updateQueue=null}(r),r===n){iG=null;break}if(null!==l){l.return=a,iG=l;break}iG=a}}}var uw={getCacheForType:function(e){var t=lt(li),n=t.data.get(e);return void 0===n&&(n=e(),t.data.set(e,n)),n},cacheSignal:function(){return lt(li).controller.signal}},uk=\"function\"==typeof WeakMap?WeakMap:Map,uS=0,uE=null,ux=null,u_=0,uN=0,uP=null,uC=!1,uT=!1,uO=!1,uz=0,uL=0,uR=0,uM=0,uI=0,uD=0,uF=0,uA=null,uj=null,uU=!1,uB=0,uV=0,uH=1/0,u$=null,uQ=null,uW=0,uq=null,uK=null,uX=0,uG=0,uY=null,uJ=null,uZ=null,u0=null,u1=null,u2=0,u3=null;function u4(){return 0!=(2&uS)&&0!==u_?u_&-u_:null!==W.T?s$():eH()}function u5(){if(0===uD)if(0==(0x20000000&u_)||r$){var e=eO;0==(3932160&(eO<<=1))&&(eO=262144),uD=e}else uD=0x20000000;return null!==(e=l3.current)&&(e.flags|=32),uD}function u8(e,t){if(null!=t){var n=e.stateNode,r=n.ref;null===r&&(r=n.ref=cC(rn(e.memoizedProps,n))),null===u0&&(u0=[]),u0.push(t.bind(null,r))}}function u6(e,t,n){(e===uE&&(2===uN||9===uN)||null!==e.cancelPendingCommit)&&(sr(e,0),se(e,u_,uD,!1)),eF(e,n),(0==(2&uS)||e!==uE)&&(e===uE&&(0==(2&uS)&&(uM|=n),4===uL&&se(e,u_,uD,!1)),sF(e))}function u9(e,t,n){if(0!=(6&uS))throw Error(u(327));for(var r=!n&&0==(127&t)&&0==(t&e.expiredLanes)||eM(e,t),l=r?function(e,t){var n=uS;uS|=2;var r=so(),l=si();uE!==e||u_!==t?(u$=null,uH=ev()+500,sr(e,t)):uT=eM(e,t);e:for(;;)try{if(0!==uN&&null!==ux){t=ux;var a=uP;t:switch(uN){case 1:uN=0,uP=null,sd(e,t,a,1);break;case 2:case 9:if(lN(a)){uN=0,uP=null,sf(t);break}t=function(){2!==uN&&9!==uN||uE!==e||(uN=7),sF(e)},a.then(t,t);break e;case 3:uN=7;break e;case 4:uN=5;break e;case 7:lN(a)?(uN=0,uP=null,sf(t)):(uN=0,uP=null,sd(e,t,a,7));break;case 5:var o=null;switch(ux.tag){case 26:o=ux.memoizedState;case 5:case 27:var i=ux;if(o?fi(o):i.stateNode.complete){uN=0,uP=null;var s=i.sibling;if(null!==s)ux=s;else{var c=i.return;null!==c?(ux=c,sp(c)):ux=null}break t}}uN=0,uP=null,sd(e,t,a,5);break;case 6:uN=0,uP=null,sd(e,t,a,6);break;case 8:sn(),uL=6;break e;default:throw Error(u(462))}}for(;null!==ux&&!eh();)sc(ux);break}catch(t){sl(e,t)}return(r3=r2=null,W.H=r,W.A=l,uS=n,null!==ux)?0:(uE=null,u_=0,rs(),uL)}(e,t):ss(e,t,!0),a=r;;){if(0===l)uT&&!r&&se(e,t,0,!1);else{if(n=e.current.alternate,a&&!function(e){for(var t=e;;){var n=t.tag;if((0===n||11===n||15===n)&&16384&t.flags&&null!==(n=t.updateQueue)&&null!==(n=n.stores))for(var r=0;r<n.length;r++){var l=n[r],a=l.getSnapshot;l=l.value;try{if(!nA(a(),l))return!1}catch(e){return!1}}if(n=t.child,16384&t.subtreeFlags&&null!==n)n.return=t,t=n;else{if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return!0;t=t.return}t.sibling.return=t.return,t=t.sibling}}return!0}(n)){l=ss(e,t,!1),a=!1;continue}if(2===l){if(a=t,e.errorRecoveryDisabledLanes&a)var o=0;else o=0!=(o=-0x20000001&e.pendingLanes)?o:0x20000000&o?0x20000000:0;if(0!==o){t=o;e:{l=uA;var i=e.current.memoizedState.isDehydrated;if(i&&(sr(e,o).flags|=256),2!==(o=ss(e,o,!1))){if(uO&&!i){e.errorRecoveryDisabledLanes|=a,uM|=a,l=4;break e}a=uj,uj=l,null!==a&&(null===uj?uj=a:uj.push.apply(uj,a))}l=o}if(a=!1,2!==l)continue}}if(1===l){sr(e,0),se(e,t,0,!0);break}e:{switch(r=e,a=l){case 0:case 1:throw Error(u(345));case 4:if((4194048&t)!==t&&(0x3c00000&t)!==t)break;case 6:se(r,t,uD,!uC);break e;case 2:uj=null;break;case 3:case 5:break;default:throw Error(u(329))}if((0x3c00000&t)===t&&10<(l=uB+300-ev())){if(se(r,t,uD,!uC),0!==eR(r,0,!0))break e;uX=t,r.timeoutHandle=cp(u7.bind(null,r,n,uj,u$,uU,t,uD,uM,uF,uC,a,\"Throttled\",-0,0),l);break e}u7(r,n,uj,u$,uU,t,uD,uM,uF,uC,a,null,-0,0)}}break}sF(e)}function u7(e,t,n,r,l,a,o,i,u,s,c,f,d,p){e.timeoutHandle=-1;var m,h,g=t.subtreeFlags,v=(0x13ffff00&a)===a;if(f=null,(v||8192&g||0x1002000==(0x1002000&g))&&(iz=null,uh(t,a,f={stylesheets:null,count:0,imgCount:0,imgBytes:0,suspenseyImages:[],waitingForImages:!0,waitingForViewTransition:!1,unsuspend:tT}),v&&(g=f,null!=(v=(9===(v=e.containerInfo).nodeType?v:v.ownerDocument).__reactViewTransition)&&(g.count++,g.waitingForViewTransition=!0,g=fd.bind(g),v.finished.then(g,g))),null!==(m=f,h=g=(0x3c00000&a)===a?uB-ev():(4194048&a)===a?uV-ev():0,m.stylesheets&&0===m.count&&fh(m,m.stylesheets),g=0<m.count||0<m.imgCount?function(e){var t=setTimeout(function(){if(m.stylesheets&&fh(m,m.stylesheets),m.unsuspend){var e=m.unsuspend;m.unsuspend=null,e()}},6e4+h);0<m.imgBytes&&0===fc&&(fc=62500*function(){if(\"function\"==typeof performance.getEntriesByType){for(var e=0,t=0,n=performance.getEntriesByType(\"resource\"),r=0;r<n.length;r++){var l=n[r],a=l.transferSize,o=l.initiatorType,i=l.duration;if(a&&i&&ca(o)){for(o=0,i=l.responseEnd,r+=1;r<n.length;r++){var u=n[r],s=u.startTime;if(s>i)break;var c=u.transferSize,f=u.initiatorType;c&&ca(f)&&(o+=c*((u=u.responseEnd)<i?1:(i-s)/(u-s)))}if(--r,t+=8*(a+o)/(l.duration/1e3),10<++e)break}}if(0<e)return t/e/1e6}return navigator.connection&&\"number\"==typeof(e=navigator.connection.downlink)?e:5}());var n=setTimeout(function(){if(m.waitingForImages=!1,0===m.count&&(m.stylesheets&&fh(m,m.stylesheets),m.unsuspend)){var e=m.unsuspend;m.unsuspend=null,e()}},(m.imgBytes>fc?50:800)+h);return m.unsuspend=e,function(){m.unsuspend=null,clearTimeout(t),clearTimeout(n)}}:null))){uX=a,e.cancelPendingCommit=g(sh.bind(null,e,t,a,n,r,l,o,i,u,c,f,null,d,p)),se(e,a,o,!s);return}sh(e,t,a,n,r,l,o,i,u,c,f)}function se(e,t,n,r){t&=~uI,t&=~uM,e.suspendedLanes|=t,e.pingedLanes&=~t,r&&(e.warmLanes|=t),r=e.expirationTimes;for(var l=t;0<l;){var a=31-eN(l),o=1<<a;r[a]=-1,l&=~o}0!==n&&eA(e,n,t)}function st(){return 0!=(6&uS)||(sA(0,!1),!1)}function sn(){if(null!==ux){if(0===uN)var e=ux.return;else e=ux,r3=r2=null,aE(e),lL=null,lR=0,e=ux;for(;null!==e;)im(e.alternate,e),e=e.return;ux=null}}function sr(e,t){var n=e.timeoutHandle;-1!==n&&(e.timeoutHandle=-1,cm(n)),null!==(n=e.cancelPendingCommit)&&(e.cancelPendingCommit=null,n()),uX=0,sn(),uE=e,ux=n=rb(e.current,null),u_=t,uN=0,uP=null,uC=!1,uT=eM(e,t),uO=!1,uF=uD=uI=uM=uR=uL=0,uj=uA=null,uU=!1,0!=(8&t)&&(t|=32&t);var r=e.entangledLanes;if(0!==r)for(e=e.entanglements,r&=t;0<r;){var l=31-eN(r),a=1<<l;t|=e[l],r&=~a}return uz=t,rs(),n}function sl(e,t){aa=null,W.H=oS,t===lS||t===lx?(t=lO(),uN=3):t===lE?(t=lO(),uN=4):uN=t===oj?8:null!==t&&\"object\"==typeof t&&\"function\"==typeof t.then?6:1,uP=t,null===ux&&(uL=1,oM(e,rP(t,e.current)))}function sa(){var e=l3.current;return null===e||((4194048&u_)===u_?null===l4:((0x3c00000&u_)===u_||0!=(0x20000000&u_))&&e===l4)}function so(){var e=W.H;return W.H=oS,null===e?oS:e}function si(){var e=W.A;return W.A=uw,e}function su(){uL=4,uC||(4194048&u_)!==u_&&null!==l3.current||(uT=!0),0==(0x7ffffff&uR)&&0==(0x7ffffff&uM)||null===uE||se(uE,u_,uD,!1)}function ss(e,t,n){var r=uS;uS|=2;var l=so(),a=si();(uE!==e||u_!==t)&&(u$=null,sr(e,t)),t=!1;var o=uL;e:for(;;)try{if(0!==uN&&null!==ux){var i=ux,u=uP;switch(uN){case 8:sn(),o=6;break e;case 3:case 2:case 9:case 6:null===l3.current&&(t=!0);var s=uN;if(uN=0,uP=null,sd(e,i,u,s),n&&uT){o=0;break e}break;default:s=uN,uN=0,uP=null,sd(e,i,u,s)}}(function(){for(;null!==ux;)sc(ux)})(),o=uL;break}catch(t){sl(e,t)}return t&&e.shellSuspendCounter++,r3=r2=null,uS=r,W.H=l,W.A=a,null===ux&&(uE=null,u_=0,rs()),o}function sc(e){var t=io(e.alternate,e,uz);e.memoizedProps=e.pendingProps,null===t?sp(e):ux=t}function sf(e){var t=e,n=t.alternate;switch(t.tag){case 15:case 0:t=oJ(n,t,t.pendingProps,t.type,void 0,u_);break;case 11:t=oJ(n,t,t.pendingProps,t.type.render,t.ref,u_);break;case 5:aE(t);default:im(n,t),t=io(n,t=ux=rw(t,uz),uz)}e.memoizedProps=e.pendingProps,null===t?sp(e):ux=t}function sd(e,t,n,r){r3=r2=null,aE(t),lL=null,lR=0;var l=t.return;try{if(function(e,t,n,r,l){if(n.flags|=32768,null!==r&&\"object\"==typeof r&&\"function\"==typeof r.then){if(null!==(t=n.alternate)&&r9(t,n,l,!0),null!==(n=l3.current)){switch(n.tag){case 31:case 13:case 19:return null===l4?su():null===n.alternate&&0===uL&&(uL=3),n.flags&=-257,n.flags|=65536,n.lanes=l,r===l_?n.flags|=16384:(null===(t=n.updateQueue)?n.updateQueue=new Set([r]):t.add(r),sN(e,r,l)),!1;case 22:return n.flags|=65536,r===l_?n.flags|=16384:(null===(t=n.updateQueue)?(t={transitions:null,markerInstances:null,retryQueue:new Set([r])},n.updateQueue=t):null===(n=t.retryQueue)?t.retryQueue=new Set([r]):n.add(r),sN(e,r,l)),!1}throw Error(u(435,n.tag))}return sN(e,r,l),su(),!1}if(r$)return null!==(t=l3.current)?(0==(65536&t.flags)&&(t.flags|=256),t.flags|=65536,t.lanes=l,r!==rq&&r0(rP(e=Error(u(422),{cause:r}),n))):(r!==rq&&r0(rP(t=Error(u(423),{cause:r}),n)),e=e.current.alternate,e.flags|=65536,l&=-l,e.lanes|=l,r=rP(r,n),l=oD(e.stateNode,r,l),lW(e,l),4!==uL&&(uL=2)),!1;var a=Error(u(520),{cause:r});if(a=rP(a,n),null===uA?uA=[a]:uA.push(a),4!==uL&&(uL=2),null===t)return!0;r=rP(r,n),n=t;do{switch(n.tag){case 3:return n.flags|=65536,e=l&-l,n.lanes|=e,e=oD(n.stateNode,r,e),lW(n,e),!1;case 1:if(t=n.type,a=n.stateNode,0==(128&n.flags)&&(\"function\"==typeof t.getDerivedStateFromError||null!==a&&\"function\"==typeof a.componentDidCatch&&(null===uQ||!uQ.has(a))))return n.flags|=65536,l&=-l,n.lanes|=l,oA(l=oF(l),e,n,r),lW(n,l),!1;break;case 22:if(null!==n.memoizedState)return n.flags|=65536,!1}n=n.return}while(null!==n)return!1}(e,l,t,n,u_)){uL=1,oM(e,rP(n,e.current)),ux=null;return}}catch(t){if(null!==l)throw ux=l,t;uL=1,oM(e,rP(n,e.current)),ux=null;return}32768&t.flags?(r$||1===r?e=!0:uT||0!=(0x20000000&u_)?e=!1:(uC=e=!0,(2===r||9===r||3===r||6===r)&&null!==(r=l3.current)&&13===r.tag&&(r.flags|=16384)),sm(t,e)):sp(t)}function sp(e){var t=e;do{if(0!=(32768&t.flags))return void sm(t,uC);e=t.return;var n=function(e,t,n){var r=t.pendingProps;switch(rU(t),t.tag){case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:case 1:return ip(t),null;case 3:return n=t.stateNode,r=null,null!==e&&(r=e.memoizedState.cache),t.memoizedState.cache!==r&&(t.flags|=2048),r5(li),ea(),n.pendingContext&&(n.context=n.pendingContext,n.pendingContext=null),(null===e||null===e.child)&&(rY(t)?ii(t):null===e||e.memoizedState.isDehydrated&&0==(256&t.flags)||(t.flags|=1024,rZ())),ip(t),null;case 26:var l=t.type,a=t.memoizedState;return null===e?(ii(t),null!==a?(ip(t),is(t,a)):(ip(t),iu(t,l,null,r,n))):a?a!==e.memoizedState?(ii(t),ip(t),is(t,a)):(ip(t),t.flags&=-0x1000001):((e=e.memoizedProps)!==r&&ii(t),ip(t),iu(t,l,e,r,n)),null;case 27:if(ei(t),n=en.current,l=t.type,null!==e&&null!=t.stateNode)e.memoizedProps!==r&&ii(t);else{if(!r){if(null===t.stateNode)throw Error(u(166));return ip(t),t.subtreeFlags&=-0x2000001,null}e=ee.current,rY(t)?rX(t,e):(t.stateNode=e=cX(l,r,n),ii(t))}return ip(t),t.subtreeFlags&=-0x2000001,null;case 5:if(ei(t),l=t.type,null!==e&&null!=t.stateNode)e.memoizedProps!==r&&ii(t);else{if(!r){if(null===t.stateNode)throw Error(u(166));return ip(t),t.subtreeFlags&=-0x2000001,null}if(a=ee.current,rY(t))rX(t,a);else{var o=cu(en.current);switch(a){case 1:a=o.createElementNS(\"http://www.w3.org/2000/svg\",l);break;case 2:a=o.createElementNS(\"http://www.w3.org/1998/Math/MathML\",l);break;default:switch(l){case\"svg\":a=o.createElementNS(\"http://www.w3.org/2000/svg\",l);break;case\"math\":a=o.createElementNS(\"http://www.w3.org/1998/Math/MathML\",l);break;case\"script\":(a=o.createElement(\"div\")).innerHTML=\"<script></script>\",a=a.removeChild(a.firstChild);break;case\"select\":a=\"string\"==typeof r.is?o.createElement(\"select\",{is:r.is}):o.createElement(\"select\"),r.multiple?a.multiple=!0:r.size&&(a.size=r.size);break;default:a=\"string\"==typeof r.is?o.createElement(l,{is:r.is}):o.createElement(l)}}a[eW]=t,a[eq]=r;e:for(o=t.child;null!==o;){if(5===o.tag||6===o.tag)a.appendChild(o.stateNode);else if(4!==o.tag&&27!==o.tag&&null!==o.child){o.child.return=o,o=o.child;continue}if(o===t)break;for(;null===o.sibling;){if(null===o.return||o.return===t)break e;o=o.return}o.sibling.return=o.return,o=o.sibling}switch(t.stateNode=a,cl(a,l,r),l){case\"button\":case\"input\":case\"select\":case\"textarea\":r=!!r.autoFocus;break;case\"img\":r=!0;break;default:r=!1}r&&ii(t)}}return ip(t),t.subtreeFlags&=-0x2000001,iu(t,t.type,null===e?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&null!=t.stateNode)e.memoizedProps!==r&&ii(t);else{if(\"string\"!=typeof r&&null===t.stateNode)throw Error(u(166));if(e=en.current,rY(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,null!==(l=rV))switch(l.tag){case 27:case 5:r=l.memoizedProps}e[eW]=t,(e=!!(e.nodeValue===n||null!==r&&!0===r.suppressHydrationWarning||ct(e.nodeValue,n)))||rK(t,!0)}else(e=cu(e).createTextNode(r))[eW]=t,t.stateNode=e}return ip(t),null;case 31:if(n=t.memoizedState,null===e||null!==e.memoizedState){if(r=rY(t),null!==n){if(null===e){if(!r)throw Error(u(318));if(!(e=null!==(e=t.memoizedState)?e.dehydrated:null))throw Error(u(557));e[eW]=t}else rJ(),0==(128&t.flags)&&(t.memoizedState=null),t.flags|=4;ip(t),e=!1}else n=rZ(),null!==e&&null!==e.memoizedState&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e){if(256&t.flags)return l7(t),t;return l7(t),null}if(0!=(128&t.flags))throw Error(u(558))}return ip(t),null;case 13:if(r=t.memoizedState,null===e||null!==e.memoizedState&&null!==e.memoizedState.dehydrated){if(l=rY(t),null!==r&&null!==r.dehydrated){if(null===e){if(!l)throw Error(u(318));if(!(l=null!==(l=t.memoizedState)?l.dehydrated:null))throw Error(u(317));l[eW]=t}else rJ(),0==(128&t.flags)&&(t.memoizedState=null),t.flags|=4;ip(t),l=!1}else l=rZ(),null!==e&&null!==e.memoizedState&&(e.memoizedState.hydrationErrors=l),l=!0;if(!l){if(256&t.flags)return l7(t),t;return l7(t),null}}if(l7(t),0!=(128&t.flags))return t.lanes=n,t;return n=null!==r,e=null!==e&&null!==e.memoizedState,n&&(r=t.child,l=null,null!==r.alternate&&null!==r.alternate.memoizedState&&null!==r.alternate.memoizedState.cachePool&&(l=r.alternate.memoizedState.cachePool.pool),a=null,null!==r.memoizedState&&null!==r.memoizedState.cachePool&&(a=r.memoizedState.cachePool.pool),a!==l&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),ic(t,t.updateQueue),ip(t),null;case 4:return ea(),null===e&&s1(t.stateNode.containerInfo),t.flags|=0x4000000,ip(t),null;case 10:return r5(t.type),ip(t),null;case 19:if(an(t),null===(r=t.memoizedState))return ip(t),null;if(l=0!=(128&t.flags),null===(a=r.rendering))if(l)id(r,!1);else{if(0!==uL||null!==e&&0!=(128&e.flags))for(e=t.child;null!==e;){if(null!==(a=ar(e))){for(t.flags|=128,id(r,!1),t.updateQueue=e=a.updateQueue,ic(t,e),t.subtreeFlags=0,e=n,n=t.child;null!==n;)rw(n,e),n=n.sibling;return at(t,1&ae.current|2),r$&&rF(t,r.treeForkCount),t.child}e=e.sibling}null!==r.tail&&ev()>uH&&(t.flags|=128,l=!0,id(r,!1),t.lanes=4194304)}else{if(!l)if(null!==(e=ar(a))){if(t.flags|=128,l=!0,t.updateQueue=e=e.updateQueue,ic(t,e),id(r,!0),null===r.tail&&\"collapsed\"!==r.tailMode&&\"visible\"!==r.tailMode&&!a.alternate&&!r$)return ip(t),null}else 2*ev()-r.renderingStartTime>uH&&0x20000000!==n&&(t.flags|=128,l=!0,id(r,!1),t.lanes=4194304);r.isBackwards?(a.sibling=t.child,t.child=a):(null!==(e=r.last)?e.sibling=a:t.child=a,r.last=a)}if(null!==r.tail){e=r.tail;e:{for(n=e;null!==n;){if(null!==n.alternate){n=!1;break e}n=n.sibling}n=!0}return r.rendering=e,r.tail=e.sibling,r.renderingStartTime=ev(),e.sibling=null,a=ae.current,a=l?1&a|2:1&a,\"visible\"===r.tailMode||\"collapsed\"===r.tailMode||!n||r$?at(t,a):(n=a,Z(l3,t),Z(ae,n),null===l4&&(l4=t)),r$&&rF(t,r.treeForkCount),e}return ip(t),null;case 22:case 23:return l7(t),l2(),r=null!==t.memoizedState,null!==e?null!==e.memoizedState!==r&&(t.flags|=8192):r&&(t.flags|=8192),r?0!=(0x20000000&n)&&0==(128&t.flags)&&(ip(t),6&t.subtreeFlags&&(t.flags|=8192)):ip(t),null!==(n=t.updateQueue)&&ic(t,n.retryQueue),n=null,null!==e&&null!==e.memoizedState&&null!==e.memoizedState.cachePool&&(n=e.memoizedState.cachePool.pool),r=null,null!==t.memoizedState&&null!==t.memoizedState.cachePool&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),null!==e&&J(ly),null;case 24:return n=null,null!==e&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),r5(li),ip(t),null;case 25:return null;case 30:return t.flags|=0x2000000,ip(t),null}throw Error(u(156,t.tag))}(t.alternate,t,uz);if(null!==n){ux=n;return}if(null!==(t=t.sibling)){ux=t;return}ux=t=e}while(null!==t)0===uL&&(uL=5)}function sm(e,t){do{var n=function(e,t){switch(rU(t),t.tag){case 1:return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 3:return r5(li),ea(),0!=(65536&(e=t.flags))&&0==(128&e)?(t.flags=-65537&e|128,t):null;case 26:case 27:case 5:return ei(t),null;case 31:if(null!==t.memoizedState){if(l7(t),null===t.alternate)throw Error(u(340));rJ()}return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 13:if(l7(t),null!==(e=t.memoizedState)&&null!==e.dehydrated){if(null===t.alternate)throw Error(u(340));rJ()}return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 19:return an(t),65536&(e=t.flags)?(t.flags=-65537&e|128,null!==(e=t.memoizedState)&&(e.rendering=null,e.tail=null),t.flags|=4,t):null;case 4:return ea(),null;case 10:return r5(t.type),null;case 22:case 23:return l7(t),l2(),null!==e&&J(ly),65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 24:return r5(li),null;default:return null}}(e.alternate,e);if(null!==n){n.flags&=32767,ux=n;return}if(null!==(n=e.return)&&(n.flags|=32768,n.subtreeFlags=0,n.deletions=null),!t&&null!==(e=e.sibling)){ux=e;return}ux=e=n}while(null!==e)uL=6,ux=null}function sh(e,t,n,r,l,a,o,i,s,c,f){e.cancelPendingCommit=null;do sS();while(0!==uW)if(0!=(6&uS))throw Error(u(327));if(null!==t){var d;if(t===e.current)throw Error(u(177));if(!function(e,t,n,r,l,a){var o=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var i=e.entanglements,u=e.expirationTimes,s=e.hiddenUpdates;for(n=o&~n;0<n;){var c=31-eN(n),f=1<<c;i[c]=0,u[c]=-1;var d=s[c];if(null!==d)for(s[c]=null,c=0;c<d.length;c++){var p=d[c];null!==p&&(p.lane&=-0x20000001)}n&=~f}0!==r&&eA(e,r,0),0!==a&&0===l&&0!==e.tag&&(e.suspendedLanes|=a&~(o&~t))}(e,n,a=t.lanes|t.childLanes|ru,o,i,s),e===uE&&(ux=uE=null,u_=0),uK=t,uq=e,uX=n,uG=a,uY=l,uJ=r,u0=null,(0x13ffff00&n)===n?(d=e.transitionTypes,e.transitionTypes=null,u1=d,r=10262):(u1=null,r=10256),0!=(t.subtreeFlags&r)||0!=(t.flags&r)?(e.callbackNode=null,e.callbackPriority=0,ep(ek,function(){return sE(),null})):(e.callbackNode=null,e.callbackPriority=0),iO=!1,r=0!=(13878&t.flags),0!=(13878&t.subtreeFlags)||r){r=W.T,W.T=null,l=q.p,q.p=2,o=uS,uS|=4;try{!function(e,t,n){if(e=e.containerInfo,co=f_,nH(e=nV(e))){if(\"selectionStart\"in e)var r={start:e.selectionStart,end:e.selectionEnd};else e:{var l=(r=(r=e.ownerDocument)&&r.defaultView||window).getSelection&&r.getSelection();if(l&&0!==l.rangeCount){r=l.anchorNode;var a,o=l.anchorOffset,i=l.focusNode;l=l.focusOffset;try{r.nodeType,i.nodeType}catch(e){r=null;break e}var u=0,s=-1,c=-1,f=0,d=0,p=e,m=null;t:for(;;){for(;p!==r||0!==o&&3!==p.nodeType||(s=u+o),p!==i||0!==l&&3!==p.nodeType||(c=u+l),3===p.nodeType&&(u+=p.nodeValue.length),null!==(a=p.firstChild);)m=p,p=a;for(;;){if(p===e)break t;if(m===r&&++f===o&&(s=u),m===i&&++d===l&&(c=u),null!==(a=p.nextSibling))break;m=(p=m).parentNode}p=a}r=-1===s||-1===c?null:{start:s,end:c}}else r=null}r=r||{start:0,end:0}}else r=null;for(ci={focusedElem:e,selectionRange:r},f_=!1,n=(0x13ffff00&n)===n,iG=t,t=n?9270:1028;null!==iG;){if(e=iG,n&&null!==(r=e.deletions))for(o=0;o<r.length;o++)n&&iB(r[o]);if(null===e.alternate&&0!=(2&e.flags))n&&iL(e),i1(n);else{if(22===e.tag){if(r=e.alternate,null!==e.memoizedState){null!==r&&null===r.memoizedState&&n&&iB(r),i1(n);continue}else if(null!==r&&null!==r.memoizedState){n&&iL(e),i1(n);continue}}r=e.child,0!=(e.subtreeFlags&t)&&null!==r?(r.return=e,iG=r):(n&&function e(t){for(t=t.child;null!==t;){if(30===t.tag){var n=t.memoizedProps,r=rn(n,t.stateNode);n=rl(n.default,n.update),t.flags&=-5,\"none\"!==n&&iD(t,r,n,t.memoizedState=[],!1)}else 0!=(0x2000000&t.subtreeFlags)&&e(t);t=t.sibling}}(e),i1(n))}}iz=null}(e,t,n)}finally{uS=o,q.p=l,W.T=r}}uW=1,(t=iO)?uZ=function(e,t,n,r,l,a,o,i,u){var s=9===t.nodeType?t:t.ownerDocument;try{var c=s.startViewTransition({update:function(){var t=s.defaultView,n=t.navigation&&t.navigation.transition,o=s.fonts.status;r();var i=[];if(\"loaded\"===o&&(s.documentElement.clientHeight,\"loading\"===s.fonts.status&&i.push(s.fonts.ready)),o=i.length,null!==e)for(var u=e.suspenseyImages,c=0,f=0;f<u.length;f++){var d=u[f];if(!d.complete){var p=d.getBoundingClientRect();if(0<p.bottom&&0<p.right&&p.top<t.innerHeight&&p.left<t.innerWidth){if((c+=fu(d))>fc){i.length=o;break}d=new Promise(cN.bind(d)),i.push(d)}}}return 0<i.length?(t=Promise.race([Promise.all(i),new Promise(function(e){return setTimeout(e,500)})]).then(l,l),(n?Promise.allSettled([n.finished,t]):t).then(a,a)):(l(),n)?n.finished.then(a,a):void a()},types:n});s.__reactViewTransition=c;var f=[];return c.ready.then(function(){for(var e=s.documentElement.getAnimations({subtree:!0}),t=0;t<e.length;t++){var n=e[t],r=n.effect,l=r.pseudoElement;if(null!=l&&l.startsWith(\"::view-transition\")){f.push(n),n=r.getKeyframes();for(var a=l=void 0,i=!0,u=0;u<n.length;u++){var c=n[u],d=c.width;if(void 0===l)l=d;else if(l!==d){i=!1;break}if(d=c.height,void 0===a)a=d;else if(a!==d){i=!1;break}delete c.width,delete c.height,\"none\"===c.transform&&delete c.transform}i&&void 0!==l&&void 0!==a&&(r.setKeyframes(n),(i=getComputedStyle(r.target,r.pseudoElement)).width!==l||i.height!==a)&&((i=n[0]).width=l,i.height=a,(i=n[n.length-1]).width=l,i.height=a,r.setKeyframes(n))}}o()},function(e){s.__reactViewTransition===c&&(s.__reactViewTransition=null);try{\"object\"==typeof e&&null!==e&&\"InvalidStateError\"===e.name&&(\"View transition was skipped because document visibility state is hidden.\"===e.message||\"Skipping view transition because document visibility state has become hidden.\"===e.message||\"Skipping view transition because viewport size changed.\"===e.message||\"Transition was aborted because of invalid state\"===e.message)&&(e=null),null!==e&&u(e)}finally{r(),l(),o()}}),c.finished.finally(function(){for(var e=0;e<f.length;e++)f[e].cancel();s.__reactViewTransition===c&&(s.__reactViewTransition=null),i()}),c}catch(e){return r(),l(),o(),null}}(f,e.containerInfo,u1,sy,sb,sv,sw,sE,sg,null,null):(sy(),sb(),sw())}}function sg(e){0!==uW&&(0,uq.onRecoverableError)(e,{componentStack:null})}function sv(){3===uW&&(uW=0,uo(uK,uq),uW=4)}function sy(){if(1===uW){uW=0;var e=uq,t=uK,n=uX,r=0!=(13878&t.flags);if(0!=(13878&t.subtreeFlags)||r){r=W.T,W.T=null;var l=q.p;q.p=2;var a=uS;uS|=4;try{iJ=iZ=!1,ur(t,e,n),n=ci;var o=nV(e.containerInfo),i=n.focusedElem,u=n.selectionRange;if(o!==i&&i&&i.ownerDocument&&function e(t,n){return!!t&&!!n&&(t===n||(!t||3!==t.nodeType)&&(n&&3===n.nodeType?e(t,n.parentNode):\"contains\"in t?t.contains(n):!!t.compareDocumentPosition&&!!(16&t.compareDocumentPosition(n))))}(i.ownerDocument.documentElement,i)){if(null!==u&&nH(i)){var s=u.start,c=u.end;if(void 0===c&&(c=s),\"selectionStart\"in i)i.selectionStart=s,i.selectionEnd=Math.min(c,i.value.length);else{var f=i.ownerDocument||document,d=f&&f.defaultView||window;if(d.getSelection){var p=d.getSelection(),m=i.textContent.length,h=Math.min(u.start,m),g=void 0===u.end?h:Math.min(u.end,m);!p.extend&&h>g&&(o=g,g=h,h=o);var v=nB(i,h),y=nB(i,g);if(v&&y&&(1!==p.rangeCount||p.anchorNode!==v.node||p.anchorOffset!==v.offset||p.focusNode!==y.node||p.focusOffset!==y.offset)){var b=f.createRange();b.setStart(v.node,v.offset),p.removeAllRanges(),h>g?(p.addRange(b),p.extend(y.node,y.offset)):(b.setEnd(y.node,y.offset),p.addRange(b))}}}}for(f=[],p=i;p=p.parentNode;)1===p.nodeType&&f.push({element:p,left:p.scrollLeft,top:p.scrollTop});for(\"function\"==typeof i.focus&&i.focus(),i=0;i<f.length;i++){var w=f[i];w.element.scrollLeft=w.left,w.element.scrollTop=w.top}}f_=!!co,ci=co=null}finally{uS=a,q.p=l,W.T=r}}e.current=t,uW=2}}function sb(){if(2===uW){uW=0;var e=uq,t=uK,n=0!=(8772&t.flags);if(0!=(8772&t.subtreeFlags)||n){n=W.T,W.T=null;var r=q.p;q.p=2;var l=uS;uS|=4;try{i2(e,t.alternate,t)}finally{uS=l,q.p=r,W.T=n}}uW=3}}function sw(){if(4===uW||3===uW){uW=0,uZ=null,eg();var e=uq,t=uK,n=uX,r=uJ,l=(0x13ffff00&n)===n?10262:10256;if(0!=(t.subtreeFlags&l)||0!=(t.flags&l)?uW=5:(uW=0,uK=uq=null,sk(e,e.pendingLanes)),0===(l=e.pendingLanes)&&(uQ=null),eV(n),t=t.stateNode,e_&&\"function\"==typeof e_.onCommitFiberRoot)try{e_.onCommitFiberRoot(ex,t,void 0,128==(128&t.current.flags))}catch(e){}if(null!==r){t=W.T,l=q.p,q.p=2,W.T=null;try{for(var a=e.onRecoverableError,o=0;o<r.length;o++){var i=r[o];a(i.value,{componentStack:i.stack})}}finally{W.T=t,q.p=l}}if(r=u0,a=u1,u1=null,null!==r)for(u0=null,null===a&&(a=[]),i=0;i<r.length;i++)(0,r[i])(a);0!=(3&uX)&&sS(),sF(e),l=e.pendingLanes,0!=(261930&n)&&0!=(42&l)?e===u3?u2++:(u2=0,u3=e):u2=0,sA(0,!1)}}function sk(e,t){0==(e.pooledCacheLanes&=t)&&null!=(t=e.pooledCache)&&(e.pooledCache=null,ls(t))}function sS(){return null!==uZ&&(uZ.skipTransition(),uZ=null),sy(),sb(),sw(),sE()}function sE(){if(5!==uW)return!1;var e=uq,t=uG;uG=0;var n=eV(uX),r=W.T,l=q.p;try{q.p=32>n?32:n,W.T=null,n=uY,uY=null;var a=uq,o=uX;if(uW=0,uK=uq=null,uX=0,0!=(6&uS))throw Error(u(331));var i=uS;if(uS|=4,uy(a.current),uf(a,a.current,o,n),uS=i,sA(0,!1),e_&&\"function\"==typeof e_.onPostCommitFiberRoot)try{e_.onPostCommitFiberRoot(ex,a)}catch(e){}return!0}finally{q.p=l,W.T=r,sk(e,t)}}function sx(e,t,n){t=rP(n,t),t=oD(e.stateNode,t,2),null!==(e=l$(e,t,2))&&(eF(e,2),sF(e))}function s_(e,t,n){if(3===e.tag)sx(e,e,n);else for(;null!==t;){if(3===t.tag){sx(t,e,n);break}if(1===t.tag){var r=t.stateNode;if(\"function\"==typeof t.type.getDerivedStateFromError||\"function\"==typeof r.componentDidCatch&&(null===uQ||!uQ.has(r))){e=rP(n,e),null!==(r=l$(t,n=oF(2),2))&&(oA(n,r,t,e),eF(r,2),sF(r));break}}t=t.return}}function sN(e,t,n){var r=e.pingCache;if(null===r){r=e.pingCache=new uk;var l=new Set;r.set(t,l)}else void 0===(l=r.get(t))&&(l=new Set,r.set(t,l));l.has(n)||(uO=!0,l.add(n),e=sP.bind(null,e,t,n),t.then(e,e))}function sP(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,uE===e&&(u_&n)===n&&(4===uL||3===uL&&(0x3c00000&u_)===u_&&300>ev()-uB?0==(2&uS)&&sr(e,0):uI|=n,uF===u_&&(uF=0)),sF(e)}function sC(e,t){0===t&&(t=eI()),null!==(e=rd(e,t))&&(eF(e,t),sF(e))}function sT(e){var t=e.memoizedState,n=0;null!==t&&(n=t.retryLane),sC(e,n)}function sO(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,l=e.memoizedState;null!==l&&(n=l.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(u(314))}null!==r&&r.delete(t),sC(e,n)}var sz=null,sL=null,sR=!1,sM=!1,sI=!1,sD=0;function sF(e){e!==sL&&null===e.next&&(null===sL?sz=sL=e:sL=sL.next=e),sM=!0,sR||(sR=!0,cg(function(){0!=(6&uS)?ep(eb,sj):sU()}))}function sA(e,t){if(!sI&&sM){sI=!0;do for(var n=!1,r=sz;null!==r;){if(!t)if(0!==e){var l=r.pendingLanes;if(0===l)var a=0;else{var o=r.suspendedLanes,i=r.pingedLanes;a=0xc000095&(a=(1<<31-eN(42|e)+1)-1&(l&~(o&~i)))?0xc000095&a|1:a?2|a:0}0!==a&&(n=!0,sH(r,a))}else a=u_,0==(3&(a=eR(r,r===uE?a:0,null!==r.cancelPendingCommit||-1!==r.timeoutHandle)))||eM(r,a)||(n=!0,sH(r,a));r=r.next}while(n)sI=!1}}function sj(){sU()}function sU(){sM=sR=!1;var e,t=0;0===sD||((e=window.event)&&\"popstate\"===e.type?e===cd||(cd=e,0):(cd=null,1))||(t=sD);for(var n=ev(),r=null,l=sz;null!==l;){var a=l.next,o=sB(l,n);0===o?(l.next=null,null===r?sz=a:r.next=a,null===a&&(sL=r)):(r=l,(0!==t||0!=(3&o))&&(sM=!0)),l=a}0!==uW&&5!==uW||sA(t,!1),0!==sD&&(sD=0)}function sB(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,l=e.expirationTimes,a=-0x3c00001&e.pendingLanes;0<a;){var o=31-eN(a),i=1<<o,u=l[o];-1===u?(0==(i&n)||0!=(i&r))&&(l[o]=function(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;default:return -1}}(i,t)):u<=t&&(e.expiredLanes|=i),a&=~i}if(t=uE,n=u_,n=eR(e,e===t?n:0,null!==e.cancelPendingCommit||-1!==e.timeoutHandle),r=e.callbackNode,0===n||e===t&&(2===uN||9===uN)||null!==e.cancelPendingCommit)return null!==r&&null!==r&&em(r),e.callbackNode=null,e.callbackPriority=0;if(0==(3&n)||eM(e,n)){if((t=n&-n)===e.callbackPriority)return t;switch(null!==r&&em(r),eV(n)){case 2:case 8:n=ew;break;case 32:default:n=ek;break;case 0x10000000:n=eE}return n=ep(n,r=sV.bind(null,e)),e.callbackPriority=t,e.callbackNode=n,t}return null!==r&&null!==r&&em(r),e.callbackPriority=2,e.callbackNode=null,2}function sV(e,t){if(0!==uW&&5!==uW)return e.callbackNode=null,e.callbackPriority=0,null;var n=e.callbackNode;if(sS()&&e.callbackNode!==n)return null;var r=u_;return 0===(r=eR(e,e===uE?r:0,null!==e.cancelPendingCommit||-1!==e.timeoutHandle))?null:(u9(e,r,t),sB(e,ev()),null!=e.callbackNode&&e.callbackNode===n?sV.bind(null,e):null)}function sH(e,t){if(sS())return null;u9(e,t,!0)}function s$(){if(0===sD){var e=lm;0===e&&(e=eT,0==(261888&(eT<<=1))&&(eT=256)),sD=e}return sD}function sQ(e){return null==e||\"symbol\"==typeof e||\"boolean\"==typeof e?null:\"function\"==typeof e?e:tC(\"\"+e)}function sW(e,t){var n=t.ownerDocument.createElement(\"input\");return n.name=t.name,n.value=t.value,e.id&&n.setAttribute(\"form\",e.id),t.parentNode.insertBefore(n,t),e=new FormData(e),n.parentNode.removeChild(n),e}for(var sq=0;sq<n7.length;sq++){var sK=n7[sq];re(sK.toLowerCase(),\"on\"+(sK[0].toUpperCase()+sK.slice(1)))}re(n1,\"onAnimationEnd\"),re(n2,\"onAnimationIteration\"),re(n3,\"onAnimationStart\"),re(\"dblclick\",\"onDoubleClick\"),re(\"focusin\",\"onFocus\"),re(\"focusout\",\"onBlur\"),re(n4,\"onTransitionRun\"),re(n5,\"onTransitionStart\"),re(n8,\"onTransitionCancel\"),re(n6,\"onTransitionEnd\"),e7(\"onMouseEnter\",[\"mouseout\",\"mouseover\"]),e7(\"onMouseLeave\",[\"mouseout\",\"mouseover\"]),e7(\"onPointerEnter\",[\"pointerout\",\"pointerover\"]),e7(\"onPointerLeave\",[\"pointerout\",\"pointerover\"]),e9(\"onChange\",\"change click focusin focusout input keydown keyup selectionchange\".split(\" \")),e9(\"onSelect\",\"focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange\".split(\" \")),e9(\"onBeforeInput\",[\"compositionend\",\"keypress\",\"textInput\",\"paste\"]),e9(\"onCompositionEnd\",\"compositionend focusout keydown keypress keyup mousedown\".split(\" \")),e9(\"onCompositionStart\",\"compositionstart focusout keydown keypress keyup mousedown\".split(\" \")),e9(\"onCompositionUpdate\",\"compositionupdate focusout keydown keypress keyup mousedown\".split(\" \"));var sX=\"abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting\".split(\" \"),sG=new Set(\"beforetoggle cancel close invalid load scroll scrollend toggle\".split(\" \").concat(sX));function sY(e,t){t=0!=(4&t);for(var n=0;n<e.length;n++){var r=e[n],l=r.event;r=r.listeners;e:{var a=void 0;if(t)for(var o=r.length-1;0<=o;o--){var i=r[o],u=i.instance,s=i.currentTarget;if(i=i.listener,u!==a&&l.isPropagationStopped())break e;a=i,l.currentTarget=s;try{a(l)}catch(e){ra(e)}l.currentTarget=null,a=u}else for(o=0;o<r.length;o++){if(u=(i=r[o]).instance,s=i.currentTarget,i=i.listener,u!==a&&l.isPropagationStopped())break e;a=i,l.currentTarget=s;try{a(l)}catch(e){ra(e)}l.currentTarget=null,a=u}}}}function sJ(e,t){var n=t[eX];void 0===n&&(n=t[eX]=new Set);var r=e+\"__bubble\";n.has(r)||(s2(t,e,2,!1),n.add(r))}function sZ(e,t,n){var r=0;t&&(r|=4),s2(n,e,r,t)}var s0=\"_reactListening\"+Math.random().toString(36).slice(2);function s1(e){if(!e[s0]){e[s0]=!0,e8.forEach(function(t){\"selectionchange\"!==t&&(sG.has(t)||sZ(t,!1,e),sZ(t,!0,e))});var t=9===e.nodeType?e:e.ownerDocument;null===t||t[s0]||(t[s0]=!0,sZ(\"selectionchange\",!1,t))}}function s2(e,t,n,r){switch(fL(t)){case 2:var l=fN;break;case 8:l=fP;break;default:l=fC}n=l.bind(null,t,n,e),l=void 0,tj&&(\"touchstart\"===t||\"touchmove\"===t||\"wheel\"===t)&&(l=!0),r?void 0!==l?e.addEventListener(t,n,{capture:!0,passive:l}):e.addEventListener(t,n,!0):void 0!==l?e.addEventListener(t,n,{passive:l}):e.addEventListener(t,n,!1)}function s3(e,t,n,r,l){var a=r;if(0==(1&t)&&0==(2&t)&&null!==r)e:for(;;){if(null===r)return;var o=r.tag;if(3===o||4===o){var i=r.stateNode.containerInfo;if(i===l)break;if(4===o)for(o=r.return;null!==o;){var u=o.tag;if((3===u||4===u)&&o.stateNode.containerInfo===l)return;o=o.return}for(;null!==i;){if(null===(o=e1(i)))return;if(5===(u=o.tag)||6===u||26===u||27===u){r=a=o;continue e}i=i.parentNode}}r=r.return}tD(function(){var r=a,l=tz(n),o=[];e:{var i=n9.get(e);if(void 0!==i){var u=t1,s=e;switch(e){case\"keypress\":if(0===tQ(n))break e;case\"keydown\":case\"keyup\":u=no;break;case\"focusin\":s=\"focus\",u=t6;break;case\"focusout\":s=\"blur\",u=t6;break;case\"beforeblur\":case\"afterblur\":u=t6;break;case\"click\":if(2===n.button)break e;case\"auxclick\":case\"dblclick\":case\"mousedown\":case\"mousemove\":case\"mouseup\":case\"mouseout\":case\"mouseover\":case\"contextmenu\":u=t5;break;case\"drag\":case\"dragend\":case\"dragenter\":case\"dragexit\":case\"dragleave\":case\"dragover\":case\"dragstart\":case\"drop\":u=t8;break;case\"touchcancel\":case\"touchend\":case\"touchmove\":case\"touchstart\":u=nu;break;case n1:case n2:case n3:u=t9;break;case n6:u=ns;break;case\"scroll\":case\"scrollend\":u=t3;break;case\"wheel\":u=nc;break;case\"copy\":case\"cut\":case\"paste\":u=t7;break;case\"gotpointercapture\":case\"lostpointercapture\":case\"pointercancel\":case\"pointerdown\":case\"pointermove\":case\"pointerout\":case\"pointerover\":case\"pointerup\":u=ni;break;case\"toggle\":case\"beforetoggle\":u=nf}var f=0!=(4&t),d=!f&&(\"scroll\"===e||\"scrollend\"===e),p=f?null!==i?i+\"Capture\":null:i;f=[];for(var m,h=r;null!==h;){var g=h;if(m=g.stateNode,5!==(g=g.tag)&&26!==g&&27!==g||null===m||null===p||null!=(g=tF(h,p))&&f.push(s4(h,g,m)),d)break;h=h.return}0<f.length&&(i=new u(i,s,null,n,l),o.push({event:i,listeners:f}))}}if(0==(7&t)){u=\"mouseover\"===e||\"pointerover\"===e,i=\"mouseout\"===e||\"pointerout\"===e,!(u&&n!==tO&&(s=n.relatedTarget||n.fromElement)&&(e1(s)||s[eK]))&&(i||u)&&(s=l.window===l?l:(u=l.ownerDocument)?u.defaultView||u.parentWindow:window,i?(u=n.relatedTarget||n.toElement,i=r,null!==(u=u?e1(u):null)&&(d=c(u),f=u.tag,u!==d||5!==f&&27!==f&&6!==f)&&(u=null)):(i=null,u=r),i!==u&&(f=t5,g=\"onMouseLeave\",p=\"onMouseEnter\",h=\"mouse\",(\"pointerout\"===e||\"pointerover\"===e)&&(f=ni,g=\"onPointerLeave\",p=\"onPointerEnter\",h=\"pointer\"),d=null==i?s:e3(i),m=null==u?s:e3(u),(s=new f(g,h+\"leave\",i,n,l)).target=d,s.relatedTarget=m,g=null,e1(l)===r&&((f=new f(p,h+\"enter\",u,n,l)).target=m,f.relatedTarget=d,g=f),d=g,f=i&&u?E(i,u,s8):null,null!==i&&s6(o,s,i,f,!1),null!==u&&null!==d&&s6(o,d,u,f,!0)));e:{if(\"select\"===(u=(i=r?e3(r):window).nodeName&&i.nodeName.toLowerCase())||\"input\"===u&&\"file\"===i.type)var v,y=nC;else if(nS(i))if(nT)y=nF;else{y=nI;var b=nM}else(u=i.nodeName)&&\"input\"===u.toLowerCase()&&(\"checkbox\"===i.type||\"radio\"===i.type)?y=nD:r&&t_(r.elementType)&&(y=nC);if(y&&(y=y(e,r))){nE(o,y,n,l);break e}b&&b(e,i,r),\"focusout\"===e&&r&&\"number\"===i.type&&null!=r.memoizedProps.value&&tv(i,\"number\",i.value)}switch(b=r?e3(r):window,e){case\"focusin\":(nS(b)||\"true\"===b.contentEditable)&&(nQ=b,nW=r,nq=null);break;case\"focusout\":nq=nW=nQ=null;break;case\"mousedown\":nK=!0;break;case\"contextmenu\":case\"mouseup\":case\"dragend\":nK=!1,nX(o,n,l);break;case\"selectionchange\":if(n$)break;case\"keydown\":case\"keyup\":nX(o,n,l)}if(np)t:{switch(e){case\"compositionstart\":var w=\"onCompositionStart\";break t;case\"compositionend\":w=\"onCompositionEnd\";break t;case\"compositionupdate\":w=\"onCompositionUpdate\";break t}w=void 0}else nw?ny(e,n)&&(w=\"onCompositionEnd\"):\"keydown\"===e&&229===n.keyCode&&(w=\"onCompositionStart\");w&&(ng&&\"ko\"!==n.locale&&(nw||\"onCompositionStart\"!==w?\"onCompositionEnd\"===w&&nw&&(v=t$()):(tV=\"value\"in(tB=l)?tB.value:tB.textContent,nw=!0)),0<(b=s5(r,w)).length&&(w=new ne(w,e,null,n,l),o.push({event:w,listeners:b}),v?w.data=v:null!==(v=nb(n))&&(w.data=v))),(v=nh?function(e,t){switch(e){case\"compositionend\":return nb(t);case\"keypress\":if(32!==t.which)return null;return nv=!0,\" \";case\"textInput\":return\" \"===(e=t.data)&&nv?null:e;default:return null}}(e,n):function(e,t){if(nw)return\"compositionend\"===e||!np&&ny(e,t)?(e=t$(),tH=tV=tB=null,nw=!1,e):null;switch(e){case\"paste\":default:return null;case\"keypress\":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case\"compositionend\":return ng&&\"ko\"!==t.locale?null:t.data}}(e,n))&&0<(w=s5(r,\"onBeforeInput\")).length&&(b=new ne(\"onBeforeInput\",\"beforeinput\",null,n,l),o.push({event:b,listeners:w}),b.data=v);var k=e;if(\"submit\"===k&&r&&r.stateNode===l){var S=sQ((l[eq]||null).action),x=n.submitter;x&&null!==(k=(k=x[eq]||null)?sQ(k.formAction):x.getAttribute(\"formAction\"))&&(S=k,x=null);var _=new t1(\"action\",\"action\",null,n,l);o.push({event:_,listeners:[{instance:null,listener:function(){if(n.defaultPrevented){if(0!==sD){var e=x?sW(l,x):new FormData(l);ou(r,{pending:!0,data:e,method:l.method,action:S},null,e)}}else\"function\"==typeof S&&(_.preventDefault(),ou(r,{pending:!0,data:e=x?sW(l,x):new FormData(l),method:l.method,action:S},S,e))},currentTarget:l}]})}}sY(o,t)})}function s4(e,t,n){return{instance:e,listener:t,currentTarget:n}}function s5(e,t){for(var n=t+\"Capture\",r=[];null!==e;){var l=e,a=l.stateNode;if(5!==(l=l.tag)&&26!==l&&27!==l||null===a||(null!=(l=tF(e,n))&&r.unshift(s4(e,l,a)),null!=(l=tF(e,t))&&r.push(s4(e,l,a))),3===e.tag)return r;e=e.return}return[]}function s8(e){if(null===e)return null;do e=e.return;while(e&&5!==e.tag&&27!==e.tag)return e||null}function s6(e,t,n,r,l){for(var a=t._reactName,o=[];null!==n&&n!==r;){var i=n,u=i.alternate,s=i.stateNode;if(i=i.tag,null!==u&&u===r)break;5!==i&&26!==i&&27!==i||null===s||(u=s,l?null!=(s=tF(n,a))&&o.unshift(s4(n,s,u)):l||null!=(s=tF(n,a))&&o.push(s4(n,s,u))),n=n.return}0!==o.length&&e.push({event:t,listeners:o})}var s9=/\\r\\n?/g,s7=/\\u0000|\\uFFFD/g;function ce(e){return(\"string\"==typeof e?e:\"\"+e).replace(s9,\"\\n\").replace(s7,\"\")}function ct(e,t){return t=ce(t),ce(e)===t}function cn(e,t,n,r,l,a){switch(n){case\"children\":if(\"string\"==typeof r)\"body\"===t||\"textarea\"===t&&\"\"===r||tk(e,r);else{if(\"number\"!=typeof r&&\"bigint\"!=typeof r)return;\"body\"!==t&&tk(e,\"\"+r)}break;case\"className\":to(e,\"class\",r);break;case\"tabIndex\":to(e,\"tabindex\",r);break;case\"dir\":case\"role\":case\"viewBox\":case\"width\":case\"height\":to(e,n,r);break;case\"style\":tx(e,r,a);return;case\"data\":if(\"object\"!==t){to(e,\"data\",r);break}case\"src\":case\"href\":if(\"\"===r&&(\"a\"!==t||\"href\"!==n)||null==r||\"function\"==typeof r||\"symbol\"==typeof r||\"boolean\"==typeof r){e.removeAttribute(n);break}r=tC(\"\"+r),e.setAttribute(n,r);break;case\"action\":case\"formAction\":if(\"function\"==typeof r){e.setAttribute(n,\"javascript:throw new Error('A React form was unexpectedly submitted. If you called form.submit() manually, consider using form.requestSubmit() instead. If you\\\\'re trying to use event.stopPropagation() in a submit event handler, consider also calling event.preventDefault().')\");break}if(\"function\"==typeof a&&(\"formAction\"===n?(\"input\"!==t&&cn(e,t,\"name\",l.name,l,null),cn(e,t,\"formEncType\",l.formEncType,l,null),cn(e,t,\"formMethod\",l.formMethod,l,null),cn(e,t,\"formTarget\",l.formTarget,l,null)):(cn(e,t,\"encType\",l.encType,l,null),cn(e,t,\"method\",l.method,l,null),cn(e,t,\"target\",l.target,l,null))),null==r||\"symbol\"==typeof r||\"boolean\"==typeof r){e.removeAttribute(n);break}r=tC(\"\"+r),e.setAttribute(n,r);break;case\"onClick\":null!=r&&(e.onclick=tT);return;case\"onScroll\":null!=r&&sJ(\"scroll\",e);return;case\"onScrollEnd\":null!=r&&sJ(\"scrollend\",e);return;case\"dangerouslySetInnerHTML\":if(null!=r){if(\"object\"!=typeof r||!(\"__html\"in r))throw Error(u(61));if(null!=(n=r.__html)){if(null!=l.children)throw Error(u(60));e.innerHTML=n}}break;case\"multiple\":e.multiple=r&&\"function\"!=typeof r&&\"symbol\"!=typeof r;break;case\"muted\":e.muted=r&&\"function\"!=typeof r&&\"symbol\"!=typeof r;break;case\"suppressContentEditableWarning\":case\"suppressHydrationWarning\":case\"defaultValue\":case\"defaultChecked\":case\"innerHTML\":case\"ref\":case\"autoFocus\":break;case\"xlinkHref\":if(null==r||\"function\"==typeof r||\"boolean\"==typeof r||\"symbol\"==typeof r){e.removeAttribute(\"xlink:href\");break}n=tC(\"\"+r),e.setAttributeNS(\"http://www.w3.org/1999/xlink\",\"xlink:href\",n);break;case\"contentEditable\":case\"spellCheck\":case\"draggable\":case\"value\":case\"autoReverse\":case\"externalResourcesRequired\":case\"focusable\":case\"preserveAlpha\":null!=r&&\"function\"!=typeof r&&\"symbol\"!=typeof r?e.setAttribute(n,\"\"+r):e.removeAttribute(n);break;case\"inert\":case\"allowFullScreen\":case\"async\":case\"autoPlay\":case\"controls\":case\"default\":case\"defer\":case\"disabled\":case\"disablePictureInPicture\":case\"disableRemotePlayback\":case\"formNoValidate\":case\"hidden\":case\"loop\":case\"noModule\":case\"noValidate\":case\"open\":case\"playsInline\":case\"readOnly\":case\"required\":case\"reversed\":case\"scoped\":case\"seamless\":case\"itemScope\":r&&\"function\"!=typeof r&&\"symbol\"!=typeof r?e.setAttribute(n,\"\"):e.removeAttribute(n);break;case\"capture\":case\"download\":!0===r?e.setAttribute(n,\"\"):!1!==r&&null!=r&&\"function\"!=typeof r&&\"symbol\"!=typeof r?e.setAttribute(n,r):e.removeAttribute(n);break;case\"cols\":case\"rows\":case\"size\":case\"span\":null!=r&&\"function\"!=typeof r&&\"symbol\"!=typeof r&&!isNaN(r)&&1<=r?e.setAttribute(n,r):e.removeAttribute(n);break;case\"rowSpan\":case\"start\":null==r||\"function\"==typeof r||\"symbol\"==typeof r||isNaN(r)?e.removeAttribute(n):e.setAttribute(n,r);break;case\"popover\":sJ(\"beforetoggle\",e),sJ(\"toggle\",e),ta(e,\"popover\",r);break;case\"xlinkActuate\":ti(e,\"http://www.w3.org/1999/xlink\",\"xlink:actuate\",r);break;case\"xlinkArcrole\":ti(e,\"http://www.w3.org/1999/xlink\",\"xlink:arcrole\",r);break;case\"xlinkRole\":ti(e,\"http://www.w3.org/1999/xlink\",\"xlink:role\",r);break;case\"xlinkShow\":ti(e,\"http://www.w3.org/1999/xlink\",\"xlink:show\",r);break;case\"xlinkTitle\":ti(e,\"http://www.w3.org/1999/xlink\",\"xlink:title\",r);break;case\"xlinkType\":ti(e,\"http://www.w3.org/1999/xlink\",\"xlink:type\",r);break;case\"xmlBase\":ti(e,\"http://www.w3.org/XML/1998/namespace\",\"xml:base\",r);break;case\"xmlLang\":ti(e,\"http://www.w3.org/XML/1998/namespace\",\"xml:lang\",r);break;case\"xmlSpace\":ti(e,\"http://www.w3.org/XML/1998/namespace\",\"xml:space\",r);break;case\"is\":ta(e,\"is\",r);break;case\"innerText\":case\"textContent\":return;default:if(2<n.length&&(\"o\"===n[0]||\"O\"===n[0])&&(\"n\"===n[1]||\"N\"===n[1]))return;ta(e,n=tN.get(n)||n,r)}tr=!0}function cr(e,t,n,r,l,a){switch(n){case\"style\":tx(e,r,a);return;case\"dangerouslySetInnerHTML\":if(null!=r){if(\"object\"!=typeof r||!(\"__html\"in r))throw Error(u(61));if(null!=(n=r.__html)){if(null!=l.children)throw Error(u(60));e.innerHTML=n}}break;case\"children\":if(\"string\"==typeof r)tk(e,r);else{if(\"number\"!=typeof r&&\"bigint\"!=typeof r)return;tk(e,\"\"+r)}break;case\"onScroll\":null!=r&&sJ(\"scroll\",e);return;case\"onScrollEnd\":null!=r&&sJ(\"scrollend\",e);return;case\"onClick\":null!=r&&(e.onclick=tT);return;case\"suppressContentEditableWarning\":case\"suppressHydrationWarning\":case\"innerHTML\":case\"ref\":case\"innerText\":case\"textContent\":return;default:if(!e6.hasOwnProperty(n))e:{if(\"o\"===n[0]&&\"n\"===n[1]&&(l=n.endsWith(\"Capture\"),t=n.slice(2,l?n.length-7:void 0),\"function\"==typeof(a=null!=(a=e[eq]||null)?a[n]:null)&&e.removeEventListener(t,a,l),\"function\"==typeof r)){\"function\"!=typeof a&&null!==a&&(n in e?e[n]=null:e.hasAttribute(n)&&e.removeAttribute(n)),e.addEventListener(t,r,l);break e}tr=!0,n in e?e[n]=r:!0===r?e.setAttribute(n,\"\"):ta(e,n,r)}return}tr=!0}function cl(e,t,n){switch(t){case\"div\":case\"span\":case\"svg\":case\"path\":case\"a\":case\"g\":case\"p\":case\"li\":break;case\"img\":sJ(\"error\",e),sJ(\"load\",e);var r,l=!1,a=!1;for(r in n)if(n.hasOwnProperty(r)){var o=n[r];if(null!=o)switch(r){case\"src\":l=!0;break;case\"srcSet\":a=!0;break;case\"children\":case\"dangerouslySetInnerHTML\":throw Error(u(137,t));default:cn(e,t,r,o,n,null)}}a&&cn(e,t,\"srcSet\",n.srcSet,n,null),l&&cn(e,t,\"src\",n.src,n,null);return;case\"input\":sJ(\"invalid\",e);var i=r=o=a=null,s=null,c=null;for(l in n)if(n.hasOwnProperty(l)){var f=n[l];if(null!=f)switch(l){case\"name\":a=f;break;case\"type\":o=f;break;case\"checked\":s=f;break;case\"defaultChecked\":c=f;break;case\"value\":r=f;break;case\"defaultValue\":i=f;break;case\"children\":case\"dangerouslySetInnerHTML\":if(null!=f)throw Error(u(137,t));break;default:cn(e,t,l,f,n,null)}}tg(e,r,i,s,c,o,a,!1);return;case\"select\":for(a in sJ(\"invalid\",e),l=o=r=null,n)if(n.hasOwnProperty(a)&&null!=(i=n[a]))switch(a){case\"value\":r=i;break;case\"defaultValue\":o=i;break;case\"multiple\":l=i;default:cn(e,t,a,i,n,null)}t=r,n=o,e.multiple=!!l,null!=t?ty(e,!!l,t,!1):null!=n&&ty(e,!!l,n,!0);return;case\"textarea\":for(o in sJ(\"invalid\",e),r=a=l=null,n)if(n.hasOwnProperty(o)&&null!=(i=n[o]))switch(o){case\"value\":l=i;break;case\"defaultValue\":a=i;break;case\"children\":r=i;break;case\"dangerouslySetInnerHTML\":if(null!=i)throw Error(u(91));break;default:cn(e,t,o,i,n,null)}tw(e,l,a,r);return;case\"option\":for(s in n)n.hasOwnProperty(s)&&null!=(l=n[s])&&(\"selected\"===s?e.selected=l&&\"function\"!=typeof l&&\"symbol\"!=typeof l:cn(e,t,s,l,n,null));return;case\"dialog\":sJ(\"beforetoggle\",e),sJ(\"toggle\",e),sJ(\"cancel\",e),sJ(\"close\",e);break;case\"iframe\":case\"object\":sJ(\"load\",e);break;case\"video\":case\"audio\":for(l=0;l<sX.length;l++)sJ(sX[l],e);break;case\"image\":sJ(\"error\",e),sJ(\"load\",e);break;case\"details\":sJ(\"toggle\",e);break;case\"embed\":case\"source\":case\"link\":sJ(\"error\",e),sJ(\"load\",e);case\"area\":case\"base\":case\"br\":case\"col\":case\"hr\":case\"keygen\":case\"meta\":case\"param\":case\"track\":case\"wbr\":case\"menuitem\":for(c in n)if(n.hasOwnProperty(c)&&null!=(l=n[c]))switch(c){case\"children\":case\"dangerouslySetInnerHTML\":throw Error(u(137,t));default:cn(e,t,c,l,n,null)}return;default:if(t_(t)){for(f in n)n.hasOwnProperty(f)&&void 0!==(l=n[f])&&cr(e,t,f,l,n,void 0);return}}for(i in n)n.hasOwnProperty(i)&&null!=(l=n[i])&&cn(e,t,i,l,n,null)}function ca(e){switch(e){case\"css\":case\"script\":case\"font\":case\"img\":case\"image\":case\"input\":case\"link\":return!0;default:return!1}}var co=null,ci=null;function cu(e){return 9===e.nodeType?e:e.ownerDocument}function cs(e){switch(e){case\"http://www.w3.org/2000/svg\":return 1;case\"http://www.w3.org/1998/Math/MathML\":return 2;default:return 0}}function cc(e,t){if(0===e)switch(t){case\"svg\":return 1;case\"math\":return 2;default:return 0}return 1===e&&\"foreignObject\"===t?0:e}function cf(e,t){return\"textarea\"===e||\"noscript\"===e||\"string\"==typeof t.children||\"number\"==typeof t.children||\"bigint\"==typeof t.children||\"object\"==typeof t.dangerouslySetInnerHTML&&null!==t.dangerouslySetInnerHTML&&null!=t.dangerouslySetInnerHTML.__html}var cd=null,cp=\"function\"==typeof setTimeout?setTimeout:void 0,cm=\"function\"==typeof clearTimeout?clearTimeout:void 0,ch=\"function\"==typeof Promise?Promise:void 0,cg=\"function\"==typeof queueMicrotask?queueMicrotask:void 0!==ch?function(e){return ch.resolve(null).then(e).catch(cv)}:cp;function cv(e){setTimeout(function(){throw e})}function cy(e){return\"head\"===e}function cb(e,t){var n=t,r=0;do{var l=n.nextSibling;if(e.removeChild(n),l&&8===l.nodeType)if(\"/$\"===(n=l.data)||\"/&\"===n){if(0===r){e.removeChild(l),fG(t);return}r--}else if(\"$\"===n||\"$?\"===n||\"$~\"===n||\"$!\"===n||\"&\"===n)r++;else if(\"html\"===n)cG(e.ownerDocument.documentElement);else if(\"head\"===n){cG(n=e.ownerDocument.head);for(var a=n.firstChild;a;){var o=a.nextSibling,i=a.nodeName;a[eZ]||\"SCRIPT\"===i||\"STYLE\"===i||\"LINK\"===i&&\"stylesheet\"===a.rel.toLowerCase()||n.removeChild(a),a=o}}else\"body\"===n&&cG(e.ownerDocument.body);n=l}while(n)fG(t)}function cw(e,t){var n=e;e=0;do{var r=n.nextSibling;if(1===n.nodeType?t?(n._stashedDisplay=n.style.display,n.style.display=\"none\"):(n.style.display=n._stashedDisplay||\"\",\"\"===n.getAttribute(\"style\")&&n.removeAttribute(\"style\")):3===n.nodeType&&(t?(n._stashedText=n.nodeValue,n.nodeValue=\"\"):n.nodeValue=n._stashedText||\"\"),r&&8===r.nodeType)if(\"/$\"===(n=r.data))if(0===e)break;else e--;else\"$\"!==n&&\"$?\"!==n&&\"$~\"!==n&&\"$!\"!==n||e++;n=r}while(n)}function ck(e,t,n){if(t=CSS.escape(t)!==t?\"r-\"+btoa(t).replace(/=/g,\"\"):t,e.style.viewTransitionName=t,null!=n&&(e.style.viewTransitionClass=n),\"inline\"===(n=getComputedStyle(e)).display){if(1===(t=e.getClientRects()).length)var r=1;else for(var l=r=0;l<t.length;l++){var a=t[l];0<a.width&&0<a.height&&r++}1===r&&((e=e.style).display=1===t.length?\"inline-block\":\"block\",e.marginTop=\"-\"+n.paddingTop,e.marginBottom=\"-\"+n.paddingBottom)}}function cS(e,t){e=e.style;var n=null!=(t=t.style)?t.hasOwnProperty(\"viewTransitionName\")?t.viewTransitionName:t.hasOwnProperty(\"view-transition-name\")?t[\"view-transition-name\"]:null:null;e.viewTransitionName=null==n||\"boolean\"==typeof n?\"\":(\"\"+n).trim(),n=null!=t?t.hasOwnProperty(\"viewTransitionClass\")?t.viewTransitionClass:t.hasOwnProperty(\"view-transition-class\")?t[\"view-transition-class\"]:null:null,e.viewTransitionClass=null==n||\"boolean\"==typeof n?\"\":(\"\"+n).trim(),\"inline-block\"===e.display&&(null==t?e.display=e.margin=\"\":(n=t.display,e.display=null==n||\"boolean\"==typeof n?\"\":n,null!=(n=t.margin)?e.margin=n:(n=t.hasOwnProperty(\"marginTop\")?t.marginTop:t[\"margin-top\"],e.marginTop=null==n||\"boolean\"==typeof n?\"\":n,t=t.hasOwnProperty(\"marginBottom\")?t.marginBottom:t[\"margin-bottom\"],e.marginBottom=null==t||\"boolean\"==typeof t?\"\":t)))}function cE(e,t,n){return n=n.ownerDocument.defaultView,{rect:e,abs:\"absolute\"===t.position||\"fixed\"===t.position,clip:\"none\"!==t.clipPath||\"visible\"!==t.overflow||\"none\"!==t.filter||\"none\"!==t.mask||\"none\"!==t.mask||\"0px\"!==t.borderRadius,view:0<=e.bottom&&0<=e.right&&e.top<=n.innerHeight&&e.left<=n.innerWidth}}function cx(e){return cE(e.getBoundingClientRect(),getComputedStyle(e),e)}function c_(e){var t=e.getBoundingClientRect();return cE(t=new DOMRect(t.x+2e4,t.y+2e4,t.width,t.height),getComputedStyle(e),e)}function cN(e){this.addEventListener(\"load\",e),this.addEventListener(\"error\",e)}function cP(e,t){this._scope=document.documentElement,this._selector=\"::view-transition-\"+e+\"(\"+t+\")\"}function cC(e){return{name:e,group:new cP(\"group\",e),imagePair:new cP(\"image-pair\",e),old:new cP(\"old\",e),new:new cP(\"new\",e)}}function cT(e){this._fragmentFiber=e,this._observers=this._eventListeners=null}function cO(e,t,n,r){return g(e).addEventListener(t,n,r),!1}function cz(e,t,n,r){return g(e).removeEventListener(t,n,r),!1}function cL(e){return null==e?\"0\":\"boolean\"==typeof e?\"c=\"+(e?\"1\":\"0\"):\"c=\"+(e.capture?\"1\":\"0\")+\"&o=\"+(e.once?\"1\":\"0\")+\"&p=\"+(e.passive?\"1\":\"0\")}function cR(e,t,n,r){for(var l=0;l<e.length;l++){var a=e[l];if(a.type===t&&a.listener===n&&cL(a.optionsOrUseCapture)===cL(r))return l}return -1}function cM(e,t){var n=e=g(e),r=t;function l(){a=!0}var a=!1;try{n.addEventListener(\"focus\",l),(n.focus||HTMLElement.prototype.focus).call(n,r)}finally{n.removeEventListener(\"focus\",l)}return a}function cI(e,t){return t.push(e),!1}function cD(e){return(e=g(e))===e.ownerDocument.activeElement&&(e.blur(),!0)}function cF(e,t){return e=g(e),t.observe(e),!1}function cA(e,t){return e=g(e),t.unobserve(e),!1}function cj(e,t){return e=g(e),t.push.apply(t,e.getClientRects()),!1}function cU(e,t){var n=t._eventListeners;if(null!==n)for(var r=0;r<n.length;r++){var l=n[r];e.addEventListener(l.type,l.listener,l.optionsOrUseCapture)}null!==t._observers&&t._observers.forEach(function(t){t.observe(e)})}function cB(e){var t=e.firstChild;for(t&&10===t.nodeType&&(t=t.nextSibling);t;){var n=t;switch(t=t.nextSibling,n.nodeName){case\"HTML\":case\"HEAD\":case\"BODY\":cB(n),e0(n);continue;case\"SCRIPT\":case\"STYLE\":continue;case\"LINK\":if(\"stylesheet\"===n.rel.toLowerCase())continue}e.removeChild(n)}}function cV(e,t){for(;8!==e.nodeType;)if((1!==e.nodeType||\"INPUT\"!==e.nodeName||\"hidden\"!==e.type)&&!t||null===(e=cQ(e.nextSibling)))return null;return e}function cH(e){return\"$?\"===e.data||\"$~\"===e.data}function c$(e){return\"$!\"===e.data||\"$?\"===e.data&&\"loading\"!==e.ownerDocument.readyState}function cQ(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||3===t)break;if(8===t){if(\"$\"===(t=e.data)||\"$!\"===t||\"$?\"===t||\"$~\"===t||\"&\"===t||\"F!\"===t||\"F\"===t)break;if(\"/$\"===t||\"/&\"===t)return null}}return e}cP.prototype.animate=function(e,t){return(t=\"number\"==typeof t?{duration:t}:x({},t)).pseudoElement=this._selector,this._scope.animate(e,t)},cP.prototype.getAnimations=function(){for(var e=this._scope,t=this._selector,n=e.getAnimations({subtree:!0}),r=[],l=0;l<n.length;l++){var a=n[l].effect;null!==a&&a.target===e&&a.pseudoElement===t&&r.push(n[l])}return r},cP.prototype.getComputedStyle=function(){return getComputedStyle(this._scope,this._selector)},cT.prototype.addEventListener=function(e,t,n){null===this._eventListeners&&(this._eventListeners=[]);var r=this._eventListeners;-1===cR(r,e,t,n)&&(r.push({type:e,listener:t,optionsOrUseCapture:n}),m(this._fragmentFiber.child,!1,cO,e,t,n)),this._eventListeners=r},cT.prototype.removeEventListener=function(e,t,n){var r=this._eventListeners;null!=r&&0<r.length&&(m(this._fragmentFiber.child,!1,cz,e,t,n),e=cR(r,e,t,n),null!==this._eventListeners&&this._eventListeners.splice(e,1))},cT.prototype.dispatchEvent=function(e){var t=h(this._fragmentFiber);if(null===t)return!0;t=g(t);var n=this._eventListeners;if(null!==n&&0<n.length||!e.bubbles){var r=document.createTextNode(\"\");if(n)for(var l=0;l<n.length;l++){var a=n[l];r.addEventListener(a.type,a.listener,a.optionsOrUseCapture)}if(t.appendChild(r),e=r.dispatchEvent(e),n)for(l=0;l<n.length;l++)a=n[l],r.removeEventListener(a.type,a.listener,a.optionsOrUseCapture);return t.removeChild(r),e}return t.dispatchEvent(e)},cT.prototype.focus=function(e){m(this._fragmentFiber.child,!0,cM,e,void 0,void 0)},cT.prototype.focusLast=function(e){var t=[];m(this._fragmentFiber.child,!0,cI,t,void 0,void 0);for(var n=t.length-1;0<=n&&!cM(t[n],e);n--);},cT.prototype.blur=function(){m(this._fragmentFiber.child,!1,cD,void 0,void 0,void 0)},cT.prototype.observeUsing=function(e){null===this._observers&&(this._observers=new Set),this._observers.add(e),m(this._fragmentFiber.child,!1,cF,e,void 0,void 0)},cT.prototype.unobserveUsing=function(e){var t=this._observers;null!==t&&t.has(e)&&(t.delete(e),m(this._fragmentFiber.child,!1,cA,e,void 0,void 0))},cT.prototype.getClientRects=function(){var e=[];return m(this._fragmentFiber.child,!1,cj,e,void 0,void 0),e},cT.prototype.getRootNode=function(e){var t=h(this._fragmentFiber);return null===t?this:g(t).getRootNode(e)},cT.prototype.compareDocumentPosition=function(e){var t=h(this._fragmentFiber);if(null===t)return Node.DOCUMENT_POSITION_DISCONNECTED;var n=[];m(this._fragmentFiber.child,!1,cI,n,void 0,void 0);var r=g(t);if(0===n.length){n=this._fragmentFiber;var l=r.compareDocumentPosition(e);return t=l,r===e?t=Node.DOCUMENT_POSITION_CONTAINS:l&Node.DOCUMENT_POSITION_CONTAINED_BY&&(m(n.sibling,!1,b),n=v,v=null,t=null===n?Node.DOCUMENT_POSITION_PRECEDING:0===(e=g(n).compareDocumentPosition(e))||e&Node.DOCUMENT_POSITION_FOLLOWING?Node.DOCUMENT_POSITION_FOLLOWING:Node.DOCUMENT_POSITION_PRECEDING),t|Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC}t=g(n[0]),l=g(n[n.length-1]);for(var a=g(n[0]),o=!1,i=this._fragmentFiber.return;null!==i&&(4===i.tag&&(o=!0),3!==i.tag&&5!==i.tag);)i=i.return;if(null==(a=o?a.parentElement:r))return Node.DOCUMENT_POSITION_DISCONNECTED;r=a.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_CONTAINED_BY,a=a.compareDocumentPosition(l)&Node.DOCUMENT_POSITION_CONTAINED_BY,o=t.compareDocumentPosition(e);var u=l.compareDocumentPosition(e);return i=o&Node.DOCUMENT_POSITION_CONTAINED_BY||u&Node.DOCUMENT_POSITION_CONTAINED_BY,u=r&&a&&o&Node.DOCUMENT_POSITION_FOLLOWING&&u&Node.DOCUMENT_POSITION_PRECEDING,(t=r&&t===e||a&&l===e||i||u?Node.DOCUMENT_POSITION_CONTAINED_BY:(r||t!==e)&&(a||l!==e)?o:Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC)&Node.DOCUMENT_POSITION_DISCONNECTED||t&Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC||function(e,t,n,r,l){var a=e1(l);if(e&Node.DOCUMENT_POSITION_CONTAINED_BY){if(n=!!a)e:{for(;null!==a;){if(7===a.tag&&(a===t||a.alternate===t)){n=!0;break e}a=a.return}n=!1}return n}if(e&Node.DOCUMENT_POSITION_CONTAINS){if(null===a)return a=l.ownerDocument,l===a||l===a.body;e:{for(a=t,t=h(t);null!==a;){if((5===a.tag||3===a.tag)&&(a===t||a.alternate===t)){a=!0;break e}a=a.return}a=!1}return a}return e&Node.DOCUMENT_POSITION_PRECEDING?((t=!!a)&&!(t=a===n)&&(null===(t=E(n,a,S))?t=!1:(m(t,!0,w,a,n),a=v,v=null,t=null!==a)),t):!!(e&Node.DOCUMENT_POSITION_FOLLOWING)&&((t=!!a)&&!(t=a===r)&&(null===(t=E(r,a,S))?t=!1:(m(t,!0,k,a,r),a=v,y=v=null,t=null!==a)),t)}(t,this._fragmentFiber,n[0],n[n.length-1],e)?t:Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC},cT.prototype.scrollIntoView=function(e){if(\"object\"==typeof e)throw Error(u(566));var t=[];m(this._fragmentFiber.child,!1,cI,t,void 0,void 0);var n=!1!==e;if(0===t.length){t=this._fragmentFiber;var r=[null,null],l=h(t);null!==l&&function e(t,n,r){for(var l=3<arguments.length&&void 0!==arguments[3]&&arguments[3];null!==r;){if(r===n)if(l=!0,!r.sibling)return!0;else r=r.sibling;if(5===r.tag){if(l)return t[1]=r,!0;t[0]=r}else if((22!==r.tag||null===r.memoizedState)&&e(t,n,r.child,l))return!0;r=r.sibling}return!1}(r,t,l.child),null!==(n=n?r[1]||r[0]||h(this._fragmentFiber):r[0]||r[1])&&g(n).scrollIntoView(e)}else for(r=n?t.length-1:0;r!==(n?-1:t.length);)g(t[r]).scrollIntoView(e),r+=n?-1:1};var cW=null;function cq(e){e=e.nextSibling;for(var t=0;e;){if(8===e.nodeType){var n=e.data;if(\"/$\"===n||\"/&\"===n){if(0===t)return cQ(e.nextSibling);t--}else\"$\"!==n&&\"$!\"!==n&&\"$?\"!==n&&\"$~\"!==n&&\"&\"!==n||t++}e=e.nextSibling}return null}function cK(e){e=e.previousSibling;for(var t=0;e;){if(8===e.nodeType){var n=e.data;if(\"$\"===n||\"$!\"===n||\"$?\"===n||\"$~\"===n||\"&\"===n){if(0===t)return e;t--}else\"/$\"!==n&&\"/&\"!==n||t++}e=e.previousSibling}return null}function cX(e,t,n){switch(t=cu(n),e){case\"html\":if(!(e=t.documentElement))throw Error(u(452));return e;case\"head\":if(!(e=t.head))throw Error(u(453));return e;case\"body\":if(!(e=t.body))throw Error(u(454));return e;default:throw Error(u(451))}}function cG(e){for(var t=e.attributes;t.length;)e.removeAttributeNode(t[0]);e0(e)}var cY=new Map,cJ=new Set;function cZ(e){return\"function\"==typeof e.getRootNode?e.getRootNode():9===e.nodeType?e:e.ownerDocument}var c0=q.d;q.d={f:function(){var e=c0.f(),t=st();return e||t},r:function(e){var t=e2(e);null!==t&&5===t.tag&&\"form\"===t.type?oc(t):c0.r(e)},D:function(e){c0.D(e),c2(\"dns-prefetch\",e,null)},C:function(e,t){c0.C(e,t),c2(\"preconnect\",e,t)},L:function(e,t,n){if(c0.L(e,t,n),c1&&e&&t){var r='link[rel=\"preload\"][as=\"'+tm(t)+'\"]';\"image\"===t&&n&&n.imageSrcSet?(r+='[imagesrcset=\"'+tm(n.imageSrcSet)+'\"]',\"string\"==typeof n.imageSizes&&(r+='[imagesizes=\"'+tm(n.imageSizes)+'\"]')):r+='[href=\"'+tm(e)+'\"]';var l=r;switch(t){case\"style\":l=c4(e);break;case\"script\":l=c6(e)}cY.has(l)||(e=x({rel:\"preload\",href:\"image\"===t&&n&&n.imageSrcSet?void 0:e,as:t},n),cY.set(l,e),null!==c1.querySelector(r)||\"style\"===t&&c1.querySelector(c5(l))||\"script\"===t&&c1.querySelector(c9(l))||(cl(t=c1.createElement(\"link\"),\"link\",e),e5(t),c1.head.appendChild(t)))}},m:function(e,t){if(c0.m(e,t),c1&&e){var n=t&&\"string\"==typeof t.as?t.as:\"script\",r='link[rel=\"modulepreload\"][as=\"'+tm(n)+'\"][href=\"'+tm(e)+'\"]',l=r;switch(n){case\"audioworklet\":case\"paintworklet\":case\"serviceworker\":case\"sharedworker\":case\"worker\":case\"script\":l=c6(e)}if(!cY.has(l)&&(e=x({rel:\"modulepreload\",href:e},t),cY.set(l,e),null===c1.querySelector(r))){switch(n){case\"audioworklet\":case\"paintworklet\":case\"serviceworker\":case\"sharedworker\":case\"worker\":case\"script\":if(c1.querySelector(c9(l)))return}cl(n=c1.createElement(\"link\"),\"link\",e),e5(n),c1.head.appendChild(n)}}},X:function(e,t){if(c0.X(e,t),c1&&e){var n=e4(c1).hoistableScripts,r=c6(e),l=n.get(r);l||((l=c1.querySelector(c9(r)))||(e=x({src:e,async:!0},t),(t=cY.get(r))&&fn(e,t),e5(l=c1.createElement(\"script\")),cl(l,\"link\",e),c1.head.appendChild(l)),l={type:\"script\",instance:l,count:1,state:null},n.set(r,l))}},S:function(e,t,n){if(c0.S(e,t,n),c1&&e){var r=e4(c1).hoistableStyles,l=c4(e);t=t||\"default\";var a=r.get(l);if(!a){var o={loading:0,preload:null};if(a=c1.querySelector(c5(l)))o.loading=5;else{e=x({rel:\"stylesheet\",href:e,\"data-precedence\":t},n),(n=cY.get(l))&&ft(e,n);var i=a=c1.createElement(\"link\");e5(i),cl(i,\"link\",e),i._p=new Promise(function(e,t){i.onload=e,i.onerror=t}),i.addEventListener(\"load\",function(){o.loading|=1}),i.addEventListener(\"error\",function(){o.loading|=2}),o.loading|=4,fe(a,t,c1)}a={type:\"stylesheet\",instance:a,count:1,state:o},r.set(l,a)}}},M:function(e,t){if(c0.M(e,t),c1&&e){var n=e4(c1).hoistableScripts,r=c6(e),l=n.get(r);l||((l=c1.querySelector(c9(r)))||(e=x({src:e,async:!0,type:\"module\"},t),(t=cY.get(r))&&fn(e,t),e5(l=c1.createElement(\"script\")),cl(l,\"link\",e),c1.head.appendChild(l)),l={type:\"script\",instance:l,count:1,state:null},n.set(r,l))}}};var c1=\"u\"<typeof document?null:document;function c2(e,t,n){if(c1&&\"string\"==typeof t&&t){var r=tm(t);r='link[rel=\"'+e+'\"][href=\"'+r+'\"]',\"string\"==typeof n&&(r+='[crossorigin=\"'+n+'\"]'),cJ.has(r)||(cJ.add(r),e={rel:e,crossOrigin:n,href:t},null===c1.querySelector(r)&&(cl(t=c1.createElement(\"link\"),\"link\",e),e5(t),c1.head.appendChild(t)))}}function c3(e,t,n,r){var l=(l=en.current)?cZ(l):null;if(!l)throw Error(u(446));switch(e){case\"meta\":case\"title\":return null;case\"style\":return\"string\"==typeof n.precedence&&\"string\"==typeof n.href?(t=c4(n.href),(r=(n=e4(l).hoistableStyles).get(t))||(r={type:\"style\",instance:null,count:0,state:null},n.set(t,r)),r):{type:\"void\",instance:null,count:0,state:null};case\"link\":if(\"stylesheet\"===n.rel&&\"string\"==typeof n.href&&\"string\"==typeof n.precedence){e=c4(n.href);var a,o,i,s,c=e4(l).hoistableStyles,f=c.get(e);if(f||(l=l.ownerDocument||l,f={type:\"stylesheet\",instance:null,count:0,state:{loading:0,preload:null}},c.set(e,f),(c=l.querySelector(c5(e)))&&!c._p&&(f.instance=c,f.state.loading=5),cY.has(e)||(n={rel:\"preload\",as:\"style\",href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},cY.set(e,n),c||(a=l,o=e,i=n,s=f.state,a.querySelector('link[rel=\"preload\"][as=\"style\"]['+o+\"]\")?s.loading=1:(s.preload=o=a.createElement(\"link\"),o.addEventListener(\"load\",function(){return s.loading|=1}),o.addEventListener(\"error\",function(){return s.loading|=2}),cl(o,\"link\",i),e5(o),a.head.appendChild(o))))),t&&null===r)throw Error(u(528,\"\"));return f}if(t&&null!==r)throw Error(u(529,\"\"));return null;case\"script\":return t=n.async,\"string\"==typeof(n=n.src)&&t&&\"function\"!=typeof t&&\"symbol\"!=typeof t?(t=c6(n),(r=(n=e4(l).hoistableScripts).get(t))||(r={type:\"script\",instance:null,count:0,state:null},n.set(t,r)),r):{type:\"void\",instance:null,count:0,state:null};default:throw Error(u(444,e))}}function c4(e){return'href=\"'+tm(e)+'\"'}function c5(e){return'link[rel=\"stylesheet\"]['+e+\"]\"}function c8(e){return x({},e,{\"data-precedence\":e.precedence,precedence:null})}function c6(e){return'[src=\"'+tm(e)+'\"]'}function c9(e){return\"script[async]\"+e}function c7(e,t,n){if(t.count++,null===t.instance)switch(t.type){case\"style\":var r=e.querySelector('style[data-href~=\"'+tm(n.href)+'\"]');if(r)return t.instance=r,e5(r),r;var l=x({},n,{\"data-href\":n.href,\"data-precedence\":n.precedence,href:null,precedence:null});return e5(r=(e.ownerDocument||e).createElement(\"style\")),cl(r,\"style\",l),fe(r,n.precedence,e),t.instance=r;case\"stylesheet\":l=c4(n.href);var a=e.querySelector(c5(l));if(a)return t.state.loading|=4,t.instance=a,e5(a),a;r=c8(n),(l=cY.get(l))&&ft(r,l),e5(a=(e.ownerDocument||e).createElement(\"link\"));var o=a;return o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),cl(a,\"link\",r),t.state.loading|=4,fe(a,n.precedence,e),t.instance=a;case\"script\":if(a=c6(n.src),l=e.querySelector(c9(a)))return t.instance=l,e5(l),l;return r=n,(l=cY.get(a))&&fn(r=x({},n),l),e5(l=(e=e.ownerDocument||e).createElement(\"script\")),cl(l,\"link\",r),e.head.appendChild(l),t.instance=l;case\"void\":return null;default:throw Error(u(443,t.type))}return\"stylesheet\"===t.type&&0==(4&t.state.loading)&&(r=t.instance,t.state.loading|=4,fe(r,n.precedence,e)),t.instance}function fe(e,t,n){for(var r=n.querySelectorAll('link[rel=\"stylesheet\"][data-precedence],style[data-precedence]'),l=r.length?r[r.length-1]:null,a=l,o=0;o<r.length;o++){var i=r[o];if(i.dataset.precedence===t)a=i;else if(a!==l)break}a?a.parentNode.insertBefore(e,a.nextSibling):(t=9===n.nodeType?n.head:n).insertBefore(e,t.firstChild)}function ft(e,t){null==e.crossOrigin&&(e.crossOrigin=t.crossOrigin),null==e.referrerPolicy&&(e.referrerPolicy=t.referrerPolicy),null==e.title&&(e.title=t.title)}function fn(e,t){null==e.crossOrigin&&(e.crossOrigin=t.crossOrigin),null==e.referrerPolicy&&(e.referrerPolicy=t.referrerPolicy),null==e.integrity&&(e.integrity=t.integrity)}var fr=null;function fl(e,t,n){if(null===fr){var r=new Map,l=fr=new Map;l.set(n,r)}else(r=(l=fr).get(n))||(r=new Map,l.set(n,r));if(r.has(e))return r;for(r.set(e,null),n=n.getElementsByTagName(e),l=0;l<n.length;l++){var a=n[l];if(!(a[eZ]||a[eW]||\"link\"===e&&\"stylesheet\"===a.getAttribute(\"rel\"))&&\"http://www.w3.org/2000/svg\"!==a.namespaceURI){var o=a.getAttribute(t)||\"\";o=e+o;var i=r.get(o);i?i.push(a):r.set(o,[a])}}return r}function fa(e,t,n){(e=e.ownerDocument||e).head.insertBefore(n,\"title\"===t?e.querySelector(\"head > title\"):null)}function fo(e,t){return\"img\"===e&&null!=t.src&&\"\"!==t.src&&null==t.onLoad&&\"lazy\"!==t.loading}function fi(e){return\"stylesheet\"!==e.type||0!=(3&e.state.loading)}function fu(e){return(e.width||100)*(e.height||100)*(\"number\"==typeof devicePixelRatio?devicePixelRatio:1)*.25}function fs(e,t){\"function\"==typeof t.decode&&(e.imgCount++,t.complete||(e.imgBytes+=fu(t),e.suspenseyImages.push(t)),e=fp.bind(e),t.decode().then(e,e))}var fc=0;function ff(e){if(0===e.count&&(0===e.imgCount||!e.waitingForImages)){if(e.stylesheets)fh(e,e.stylesheets);else if(e.unsuspend){var t=e.unsuspend;e.unsuspend=null,t()}}}function fd(){this.count--,ff(this)}function fp(){this.imgCount--,ff(this)}var fm=null;function fh(e,t){e.stylesheets=null,null!==e.unsuspend&&(e.count++,fm=new Map,t.forEach(fg,e),fm=null,fd.call(e))}function fg(e,t){if(!(4&t.state.loading)){var n=fm.get(e);if(n)var r=n.get(null);else{n=new Map,fm.set(e,n);for(var l=e.querySelectorAll(\"link[data-precedence],style[data-precedence]\"),a=0;a<l.length;a++){var o=l[a];(\"LINK\"===o.nodeName||\"not all\"!==o.getAttribute(\"media\"))&&(n.set(o.dataset.precedence,o),r=o)}r&&n.set(null,r)}o=(l=t.instance).getAttribute(\"data-precedence\"),(a=n.get(o)||r)===r&&n.set(null,l),n.set(o,l),this.count++,r=fd.bind(this),l.addEventListener(\"load\",r),l.addEventListener(\"error\",r),a?a.parentNode.insertBefore(l,a.nextSibling):(e=9===e.nodeType?e.head:e).insertBefore(l,e.firstChild),t.state.loading|=4}}var fv={$$typeof:L,Provider:null,Consumer:null,_currentValue:K,_currentValue2:K,_threadCount:0};function fy(e,t,n,r,l,a,o,i,u){this.tag=1,this.containerInfo=e,this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.next=this.pendingContext=this.context=this.cancelPendingCommit=null,this.callbackPriority=0,this.expirationTimes=eD(-1),this.entangledLanes=this.shellSuspendCounter=this.errorRecoveryDisabledLanes=this.expiredLanes=this.warmLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=eD(0),this.hiddenUpdates=eD(null),this.identifierPrefix=r,this.onUncaughtError=l,this.onCaughtError=a,this.onRecoverableError=o,this.pooledCache=null,this.pooledCacheLanes=0,this.formState=u,this.transitionTypes=null,this.incompleteTransitions=new Map}function fb(e,t,n,r,l,a,o,i,u,s,c,f){return e=new fy(e,t,n,o,u,s,c,f,i),t=1,!0===a&&(t|=24),a=rv(3,null,null,t),e.current=a,a.stateNode=e,t=lu(),t.refCount++,e.pooledCache=t,t.refCount++,a.memoizedState={element:r,isDehydrated:n,cache:t},lB(a),e}function fw(e,t,n,r,l,a){l=l?rh:rh,null===r.context?r.context=l:r.pendingContext=l,(r=lH(t)).payload={element:n},null!==(a=void 0===a?null:a)&&(r.callback=a),null!==(n=l$(e,r,t))&&(u6(n,e,t),lQ(n,e,t))}function fk(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n<t?n:t}}function fS(e,t){fk(e,t),(e=e.alternate)&&fk(e,t)}function fE(e){if(13===e.tag||31===e.tag){var t=rd(e,0x4000000);null!==t&&u6(t,e,0x4000000),fS(e,0x4000000)}}function fx(e){if(13===e.tag||31===e.tag){var t=u4(),n=rd(e,t=eB(t));null!==n&&u6(n,e,t),fS(e,t)}}var f_=!0;function fN(e,t,n,r){var l=W.T;W.T=null;var a=q.p;try{q.p=2,fC(e,t,n,r)}finally{q.p=a,W.T=l}}function fP(e,t,n,r){var l=W.T;W.T=null;var a=q.p;try{q.p=8,fC(e,t,n,r)}finally{q.p=a,W.T=l}}function fC(e,t,n,r){if(f_){var l=fT(r);if(null===l)s3(e,t,r,fO,n),fB(e,r);else if(function(e,t,n,r,l){switch(t){case\"focusin\":return fM=fV(fM,e,t,n,r,l),!0;case\"dragenter\":return fI=fV(fI,e,t,n,r,l),!0;case\"mouseover\":return fD=fV(fD,e,t,n,r,l),!0;case\"pointerover\":var a=l.pointerId;return fF.set(a,fV(fF.get(a)||null,e,t,n,r,l)),!0;case\"gotpointercapture\":return a=l.pointerId,fA.set(a,fV(fA.get(a)||null,e,t,n,r,l)),!0}return!1}(l,e,t,n,r))r.stopPropagation();else if(fB(e,r),4&t&&-1<fU.indexOf(e)){for(;null!==l;){var a=e2(l);if(null!==a)switch(a.tag){case 3:if((a=a.stateNode).current.memoizedState.isDehydrated){var o=eL(a.pendingLanes);if(0!==o){var i=a;for(i.pendingLanes|=2,i.entangledLanes|=2;o;){var u=1<<31-eN(o);i.entanglements[1]|=u,o&=~u}sF(a),0==(6&uS)&&(uH=ev()+500,sA(0,!1))}}break;case 31:case 13:null!==(i=rd(a,2))&&u6(i,a,2),st(),fS(a,2)}if(null===(a=fT(r))&&s3(e,t,r,fO,n),a===l)break;l=a}null!==l&&r.stopPropagation()}else s3(e,t,r,null,n)}}function fT(e){return fz(e=tz(e))}var fO=null;function fz(e){if(fO=null,null!==(e=e1(e))){var t=c(e);if(null===t)e=null;else{var n=t.tag;if(13===n){if(null!==(e=f(t)))return e;e=null}else if(31===n){if(null!==(e=d(t)))return e;e=null}else if(3===n){if(t.stateNode.current.memoizedState.isDehydrated)return 3===t.tag?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null)}}return fO=e,null}function fL(e){switch(e){case\"beforetoggle\":case\"cancel\":case\"click\":case\"close\":case\"contextmenu\":case\"copy\":case\"cut\":case\"auxclick\":case\"dblclick\":case\"dragend\":case\"dragstart\":case\"drop\":case\"focusin\":case\"focusout\":case\"input\":case\"invalid\":case\"keydown\":case\"keypress\":case\"keyup\":case\"mousedown\":case\"mouseup\":case\"paste\":case\"pause\":case\"play\":case\"pointercancel\":case\"pointerdown\":case\"pointerup\":case\"ratechange\":case\"reset\":case\"seeked\":case\"submit\":case\"toggle\":case\"touchcancel\":case\"touchend\":case\"touchstart\":case\"volumechange\":case\"change\":case\"selectionchange\":case\"textInput\":case\"compositionstart\":case\"compositionend\":case\"compositionupdate\":case\"beforeblur\":case\"afterblur\":case\"beforeinput\":case\"blur\":case\"fullscreenchange\":case\"focus\":case\"hashchange\":case\"popstate\":case\"select\":case\"selectstart\":return 2;case\"drag\":case\"dragenter\":case\"dragexit\":case\"dragleave\":case\"dragover\":case\"mousemove\":case\"mouseout\":case\"mouseover\":case\"pointermove\":case\"pointerout\":case\"pointerover\":case\"resize\":case\"scroll\":case\"touchmove\":case\"wheel\":case\"mouseenter\":case\"mouseleave\":case\"pointerenter\":case\"pointerleave\":return 8;case\"message\":switch(ey()){case eb:return 2;case ew:return 8;case ek:case eS:return 32;case eE:return 0x10000000;default:return 32}default:return 32}}var fR=!1,fM=null,fI=null,fD=null,fF=new Map,fA=new Map,fj=[],fU=\"mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset\".split(\" \");function fB(e,t){switch(e){case\"focusin\":case\"focusout\":fM=null;break;case\"dragenter\":case\"dragleave\":fI=null;break;case\"mouseover\":case\"mouseout\":fD=null;break;case\"pointerover\":case\"pointerout\":fF.delete(t.pointerId);break;case\"gotpointercapture\":case\"lostpointercapture\":fA.delete(t.pointerId)}}function fV(e,t,n,r,l,a){return null===e||e.nativeEvent!==a?(e={blockedOn:t,domEventName:n,eventSystemFlags:r,nativeEvent:a,targetContainers:[l]},null!==t&&null!==(t=e2(t))&&fE(t)):(e.eventSystemFlags|=r,t=e.targetContainers,null!==l&&-1===t.indexOf(l)&&t.push(l)),e}function fH(e){var t=e1(e.target);if(null!==t){var n=c(t);if(null!==n){if(13===(t=n.tag)){if(null!==(t=f(n))){e.blockedOn=t,e$(e.priority,function(){fx(n)});return}}else if(31===t){if(null!==(t=d(n))){e.blockedOn=t,e$(e.priority,function(){fx(n)});return}}else if(3===t&&n.stateNode.current.memoizedState.isDehydrated){e.blockedOn=3===n.tag?n.stateNode.containerInfo:null;return}}}e.blockedOn=null}function f$(e){if(null!==e.blockedOn)return!1;for(var t=e.targetContainers;0<t.length;){var n=fT(e.nativeEvent);if(null!==n)return null!==(t=e2(n))&&fE(t),e.blockedOn=n,!1;var r=new(n=e.nativeEvent).constructor(n.type,n);tO=r,n.target.dispatchEvent(r),tO=null,t.shift()}return!0}function fQ(e,t,n){f$(e)&&n.delete(t)}function fW(){fR=!1,null!==fM&&f$(fM)&&(fM=null),null!==fI&&f$(fI)&&(fI=null),null!==fD&&f$(fD)&&(fD=null),fF.forEach(fQ),fA.forEach(fQ)}function fq(e,t){e.blockedOn===t&&(e.blockedOn=null,fR||(fR=!0,a.unstable_scheduleCallback(a.unstable_NormalPriority,fW)))}var fK=null;function fX(e){fK!==e&&(fK=e,a.unstable_scheduleCallback(a.unstable_NormalPriority,function(){fK===e&&(fK=null);for(var t=0;t<e.length;t+=3){var n=e[t],r=e[t+1],l=e[t+2];if(\"function\"!=typeof r)if(null===fz(r||n))continue;else break;var a=e2(n);null!==a&&(e.splice(t,3),t-=3,ou(a,{pending:!0,data:l,method:n.method,action:r},r,l))}}))}function fG(e){function t(t){return fq(t,e)}null!==fM&&fq(fM,e),null!==fI&&fq(fI,e),null!==fD&&fq(fD,e),fF.forEach(t),fA.forEach(t);for(var n=0;n<fj.length;n++){var r=fj[n];r.blockedOn===e&&(r.blockedOn=null)}for(;0<fj.length&&null===(n=fj[0]).blockedOn;)fH(n),null===n.blockedOn&&fj.shift();if(null!=(n=(e.ownerDocument||e).$$reactFormReplay))for(r=0;r<n.length;r+=3){var l=n[r],a=n[r+1],o=l[eq]||null;if(\"function\"==typeof a)o||fX(n);else if(o){var i=null;if(a&&a.hasAttribute(\"formAction\")){if(l=a,o=a[eq]||null)i=o.formAction;else if(null!==fz(l))continue}else i=o.action;\"function\"==typeof i?n[r+1]=i:(n.splice(r,3),r-=3),fX(n)}}}function fY(){function e(e){e.canIntercept&&\"react-transition\"===e.info&&e.intercept({handler:function(){return new Promise(function(e){return l=e})},focusReset:\"manual\",scroll:\"manual\"})}function t(){null!==l&&(l(),l=null),r||setTimeout(n,20)}function n(){if(!r&&!navigation.transition){var e=navigation.currentEntry;e&&null!=e.url&&navigation.navigate(e.url,{state:e.getState(),info:\"react-transition\",history:\"replace\"})}}if(\"object\"==typeof navigation){var r=!1,l=null;return navigation.addEventListener(\"navigate\",e),navigation.addEventListener(\"navigatesuccess\",t),navigation.addEventListener(\"navigateerror\",t),setTimeout(n,100),function(){r=!0,navigation.removeEventListener(\"navigate\",e),navigation.removeEventListener(\"navigatesuccess\",t),navigation.removeEventListener(\"navigateerror\",t),null!==l&&(l(),l=null)}}}function fJ(e){this._internalRoot=e}function fZ(e){this._internalRoot=e}fZ.prototype.render=fJ.prototype.render=function(e){var t=this._internalRoot;if(null===t)throw Error(u(409));fw(t.current,u4(),e,t,null,null)},fZ.prototype.unmount=fJ.prototype.unmount=function(){var e=this._internalRoot;if(null!==e){this._internalRoot=null;var t=e.containerInfo;fw(e.current,2,null,e,null,null),st(),t[eK]=null}},fZ.prototype.unstable_scheduleHydration=function(e){if(e){var t=eH();e={blockedOn:null,target:e,priority:t};for(var n=0;n<fj.length&&0!==t&&t<fj[n].priority;n++);fj.splice(n,0,e),0===n&&fH(e)}};var f0=o.version;if(\"19.3.0-canary-f93b9fd4-20251217\"!==f0)throw Error(u(527,f0,\"19.3.0-canary-f93b9fd4-20251217\"));if(q.findDOMNode=function(e){var t=e._reactInternals;if(void 0===t){if(\"function\"==typeof e.render)throw Error(u(188));throw Error(u(268,e=Object.keys(e).join(\",\")))}return null===(e=null!==(e=function(e){var t=e.alternate;if(!t){if(null===(t=c(e)))throw Error(u(188));return t!==e?null:e}for(var n=e,r=t;;){var l=n.return;if(null===l)break;var a=l.alternate;if(null===a){if(null!==(r=l.return)){n=r;continue}break}if(l.child===a.child){for(a=l.child;a;){if(a===n)return p(l),e;if(a===r)return p(l),t;a=a.sibling}throw Error(u(188))}if(n.return!==r.return)n=l,r=a;else{for(var o=!1,i=l.child;i;){if(i===n){o=!0,n=l,r=a;break}if(i===r){o=!0,r=l,n=a;break}i=i.sibling}if(!o){for(i=a.child;i;){if(i===n){o=!0,n=a,r=l;break}if(i===r){o=!0,r=a,n=l;break}i=i.sibling}if(!o)throw Error(u(189))}}if(n.alternate!==r)throw Error(u(190))}if(3!==n.tag)throw Error(u(188));return n.stateNode.current===n?e:t}(t))?function e(t){var n=t.tag;if(5===n||26===n||27===n||6===n)return t;for(t=t.child;null!==t;){if(null!==(n=e(t)))return n;t=t.sibling}return null}(e):null)?null:e.stateNode},\"u\">typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var f1=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!f1.isDisabled&&f1.supportsFiber)try{ex=f1.inject({bundleType:0,version:\"19.3.0-canary-f93b9fd4-20251217\",rendererPackageName:\"react-dom\",currentDispatcherRef:W,reconcilerVersion:\"19.3.0-canary-f93b9fd4-20251217\"}),e_=f1}catch(e){}}n.createRoot=function(e,t){if(!s(e))throw Error(u(299));var n=!1,r=\"\",l=oz,a=oL,o=oR;return null!=t&&(!0===t.unstable_strictMode&&(n=!0),void 0!==t.identifierPrefix&&(r=t.identifierPrefix),void 0!==t.onUncaughtError&&(l=t.onUncaughtError),void 0!==t.onCaughtError&&(a=t.onCaughtError),void 0!==t.onRecoverableError&&(o=t.onRecoverableError)),t=fb(e,1,!1,null,null,n,r,null,l,a,o,fY),e[eK]=t.current,s1(e),new fJ(t)},n.hydrateRoot=function(e,t,n){if(!s(e))throw Error(u(299));var r,l=!1,a=\"\",o=oz,i=oL,c=oR,f=null;return null!=n&&(!0===n.unstable_strictMode&&(l=!0),void 0!==n.identifierPrefix&&(a=n.identifierPrefix),void 0!==n.onUncaughtError&&(o=n.onUncaughtError),void 0!==n.onCaughtError&&(i=n.onCaughtError),void 0!==n.onRecoverableError&&(c=n.onRecoverableError),void 0!==n.formState&&(f=n.formState)),(t=fb(e,1,!0,t,null!=n?n:null,l,a,f,o,i,c,fY)).context=(r=null,rh),n=t.current,(a=lH(l=eB(l=u4()))).callback=null,l$(n,a,l),n=l,t.current.lanes=n,eF(t,n),sF(t),e[eK]=t.current,s1(e),new fZ(t)},n.version=\"19.3.0-canary-f93b9fd4-20251217\"},56408,(e,t,n)=>{\"use strict\";!function e(){if(\"u\">typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&\"function\"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(e){console.error(e)}}(),t.exports=e.r(17615)},39423,(e,t,n)=>{\"use strict\";Object.defineProperty(n,\"__esModule\",{value:!0});var r={onCaughtError:function(){return d},onUncaughtError:function(){return p}};for(var l in r)Object.defineProperty(n,l,{enumerable:!0,get:r[l]});let a=e.r(81258),o=e.r(25626),i=e.r(83025),u=e.r(44893),s=e.r(74506),c=a._(e.r(70566)),f={decorateDevError:e=>e,handleClientError:()=>{},originConsoleError:console.error.bind(console)};function d(e,t){let n,r=t.errorBoundary?.constructor;if(n=n||r===s.ErrorBoundaryHandler&&t.errorBoundary.props.errorComponent===c.default)return p(e);(0,i.isBailoutToCSRError)(e)||(0,o.isNextRouterError)(e)||f.originConsoleError(e)}function p(e){(0,i.isBailoutToCSRError)(e)||(0,o.isNextRouterError)(e)||(0,u.reportGlobalError)(e)}(\"function\"==typeof n.default||\"object\"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,\"__esModule\",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},93708,(e,t,n)=>{\"use strict\";Object.defineProperty(n,\"__esModule\",{value:!0}),Object.defineProperty(n,\"AppRouterAnnouncer\",{enumerable:!0,get:function(){return o}});let r=e.r(33664),l=e.r(72491),a=\"next-route-announcer\";function o({tree:e}){let[t,n]=(0,r.useState)(null);(0,r.useEffect)(()=>(n(function(){let e=document.getElementsByName(a)[0];if(e?.shadowRoot?.childNodes[0])return e.shadowRoot.childNodes[0];{let e=document.createElement(a);e.style.cssText=\"position:absolute\";let t=document.createElement(\"div\");return t.ariaLive=\"assertive\",t.id=\"__next-route-announcer__\",t.role=\"alert\",t.style.cssText=\"position:absolute;border:0;height:1px;margin:-1px;padding:0;width:1px;clip:rect(0 0 0 0);overflow:hidden;white-space:nowrap;word-wrap:normal\",e.attachShadow({mode:\"open\"}).appendChild(t),document.body.appendChild(e),t}}()),()=>{let e=document.getElementsByTagName(a)[0];e?.isConnected&&document.body.removeChild(e)}),[]);let[o,i]=(0,r.useState)(\"\"),u=(0,r.useRef)(void 0);return(0,r.useEffect)(()=>{let e=\"\";if(document.title)e=document.title;else{let t=document.querySelector(\"h1\");t&&(e=t.innerText||t.textContent||\"\")}void 0!==u.current&&u.current!==e&&i(e),u.current=e},[e]),t?(0,l.createPortal)(o,t):null}(\"function\"==typeof n.default||\"object\"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,\"__esModule\",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},50110,(e,t,n)=>{\"use strict\";Object.defineProperty(n,\"__esModule\",{value:!0}),Object.defineProperty(n,\"findHeadInCache\",{enumerable:!0,get:function(){return a}});let r=e.r(17403),l=e.r(75861);function a(e,t){return function e(t,n,a,o){if(0===Object.keys(n).length)return[t,a,o];let i=Object.keys(n).filter(e=>\"children\"!==e);for(let o of(\"children\"in n&&i.unshift(\"children\"),i)){let[i,u]=n[o];if(i===r.DEFAULT_SEGMENT_KEY)continue;let s=t.parallelRoutes.get(o);if(!s)continue;let c=(0,l.createRouterCacheKey)(i),f=(0,l.createRouterCacheKey)(i,!0),d=s.get(c);if(!d)continue;let p=e(d,u,a+\"/\"+c,a+\"/\"+f);if(p)return p}return null}(e,t,\"\",\"\")}(\"function\"==typeof n.default||\"object\"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,\"__esModule\",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},29664,(e,t,n)=>{\"use strict\";Object.defineProperty(n,\"__esModule\",{value:!0});var r={GracefulDegradeBoundary:function(){return i},default:function(){return u}};for(var l in r)Object.defineProperty(n,l,{enumerable:!0,get:r[l]});let a=e.r(964),o=e.r(33664);class i extends o.Component{constructor(e){super(e),this.state={hasError:!1},this.rootHtml=\"\",this.htmlAttributes={},this.htmlRef=(0,o.createRef)()}static getDerivedStateFromError(e){return{hasError:!0}}componentDidMount(){let e=this.htmlRef.current;this.state.hasError&&e&&Object.entries(this.htmlAttributes).forEach(([t,n])=>{e.setAttribute(t,n)})}render(){let{hasError:e}=this.state;return(\"u\">typeof window&&!this.rootHtml&&(this.rootHtml=document.documentElement.innerHTML,this.htmlAttributes=function(e){let t={};for(let n=0;n<e.attributes.length;n++){let r=e.attributes[n];t[r.name]=r.value}return t}(document.documentElement)),e)?(0,a.jsx)(\"html\",{ref:this.htmlRef,suppressHydrationWarning:!0,dangerouslySetInnerHTML:{__html:this.rootHtml}}):this.props.children}}let u=i;(\"function\"==typeof n.default||\"object\"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,\"__esModule\",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},82843,(e,t,n)=>{\"use strict\";Object.defineProperty(n,\"__esModule\",{value:!0}),Object.defineProperty(n,\"default\",{enumerable:!0,get:function(){return s}});let r=e.r(81258),l=e.r(964);e.r(33664);let a=r._(e.r(29664)),o=e.r(74506),i=e.r(3753),u=\"u\">typeof window&&(0,i.isBot)(window.navigator.userAgent);function s({children:e,errorComponent:t,errorStyles:n,errorScripts:r}){return u?(0,l.jsx)(a.default,{children:e}):(0,l.jsx)(o.ErrorBoundary,{errorComponent:t,errorStyles:n,errorScripts:r,children:e})}(\"function\"==typeof n.default||\"object\"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,\"__esModule\",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},89439,(e,t,n)=>{\"use strict\";Object.defineProperty(n,\"__esModule\",{value:!0}),Object.defineProperty(n,\"default\",{enumerable:!0,get:function(){return R}});let r=e.r(81258),l=e.r(44066),a=e.r(964),o=l._(e.r(33664)),i=e.r(7e4),u=e.r(57695),s=e.r(13425),c=e.r(53675),f=e.r(82183),d=e.r(93708),p=e.r(13409),m=e.r(50110),h=e.r(81814),g=e.r(17117),v=e.r(24208),y=e.r(7022),b=e.r(83985),w=e.r(12942),k=e.r(62595),S=e.r(58310),E=e.r(21001),x=r._(e.r(82843)),_=r._(e.r(70566)),N=e.r(45924),P=e.r(77447),C={};function T({appRouterState:e}){return(0,o.useInsertionEffect)(()=>{let{tree:t,pushRef:n,canonicalUrl:r,renderedSearch:l}=e,a={...n.preserveCustomHistoryState?window.history.state:{},__NA:!0,__PRIVATE_NEXTJS_INTERNALS_TREE:{tree:t,renderedSearch:l}};n.pendingPush&&(0,s.createHrefFromUrl)(new URL(window.location.href))!==r?(n.pendingPush=!1,window.history.pushState(a,\"\",r)):window.history.replaceState(a,\"\",r)},[e]),(0,o.useEffect)(()=>{(0,E.pingVisibleLinks)(e.nextUrl,e.tree)},[e.nextUrl,e.tree]),null}function O(e){null==e&&(e={});let t=window.history.state,n=t?.__NA;n&&(e.__NA=n);let r=t?.__PRIVATE_NEXTJS_INTERNALS_TREE;return r&&(e.__PRIVATE_NEXTJS_INTERNALS_TREE=r),e}function z({headCacheNode:e}){let t=null!==e?e.head:null,n=null!==e?e.prefetchHead:null,r=null!==n?n:t;return(0,o.useDeferredValue)(t,r)}function L({actionQueue:e,globalError:t,webSocket:n,staticIndicatorState:r}){let l,s=(0,f.useActionQueue)(e),{canonicalUrl:b}=s,{searchParams:E,pathname:_}=(0,o.useMemo)(()=>{let e=new URL(b,\"u\"<typeof window?\"http://n\":window.location.href);return{searchParams:e.searchParams,pathname:(0,v.hasBasePath)(e.pathname)?(0,g.removeBasePath)(e.pathname):e.pathname}},[b]);(0,o.useEffect)(()=>{function e(e){e.persisted&&window.history.state?.__PRIVATE_NEXTJS_INTERNALS_TREE&&(C.pendingMpaPath=void 0,(0,f.dispatchAppRouterAction)({type:u.ACTION_RESTORE,url:new URL(window.location.href),historyState:window.history.state.__PRIVATE_NEXTJS_INTERNALS_TREE}))}return window.addEventListener(\"pageshow\",e),()=>{window.removeEventListener(\"pageshow\",e)}},[]),(0,o.useEffect)(()=>{function e(e){let t=\"reason\"in e?e.reason:e.error;if((0,S.isRedirectError)(t)){e.preventDefault();let n=(0,k.getURLFromRedirectError)(t);(0,k.getRedirectTypeFromError)(t)===S.RedirectType.push?w.publicAppRouterInstance.push(n,{}):w.publicAppRouterInstance.replace(n,{})}}return window.addEventListener(\"error\",e),window.addEventListener(\"unhandledrejection\",e),()=>{window.removeEventListener(\"error\",e),window.removeEventListener(\"unhandledrejection\",e)}},[]);let{pushRef:P}=s;if(P.mpaNavigation){if(C.pendingMpaPath!==b){let e=window.location;P.pendingPush?e.assign(b):e.replace(b),C.pendingMpaPath=b}throw h.unresolvedThenable}(0,o.useEffect)(()=>{let e=window.history.pushState.bind(window.history),t=window.history.replaceState.bind(window.history),n=e=>{let t=window.location.href,n=window.history.state?.__PRIVATE_NEXTJS_INTERNALS_TREE;(0,o.startTransition)(()=>{(0,f.dispatchAppRouterAction)({type:u.ACTION_RESTORE,url:new URL(e??t,t),historyState:n})})};window.history.pushState=function(t,r,l){return t?.__NA||t?._N||(t=O(t),l&&n(l)),e(t,r,l)},window.history.replaceState=function(e,r,l){return e?.__NA||e?._N||(e=O(e),l&&n(l)),t(e,r,l)};let r=e=>{if(e.state){if(!e.state.__NA)return void window.location.reload();(0,o.startTransition)(()=>{(0,w.dispatchTraverseAction)(window.location.href,e.state.__PRIVATE_NEXTJS_INTERNALS_TREE)})}};return window.addEventListener(\"popstate\",r),()=>{window.history.pushState=e,window.history.replaceState=t,window.removeEventListener(\"popstate\",r)}},[]);let{cache:L,tree:R,nextUrl:M,focusAndScrollRef:I,previousNextUrl:F}=s,A=(0,o.useMemo)(()=>(0,m.findHeadInCache)(L,R[1]),[L,R]),j=(0,o.useMemo)(()=>(0,y.getSelectedParams)(R),[R]),U=(0,o.useMemo)(()=>({parentTree:R,parentCacheNode:L,parentSegmentPath:null,parentParams:{},debugNameContext:\"/\",url:b,isActive:!0}),[R,L,b]),B=(0,o.useMemo)(()=>({tree:R,focusAndScrollRef:I,nextUrl:M,previousNextUrl:F}),[R,I,M,F]);if(null!==A){let[e,t,n]=A;l=(0,a.jsx)(z,{headCacheNode:e},\"u\"<typeof window?n:t)}else l=null;let V=(0,a.jsxs)(p.RedirectBoundary,{children:[l,(0,a.jsx)(N.RootLayoutBoundary,{children:L.rsc}),(0,a.jsx)(d.AppRouterAnnouncer,{tree:R})]});return V=(0,a.jsx)(x.default,{errorComponent:t[0],errorStyles:t[1],children:V}),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(T,{appRouterState:s}),(0,a.jsx)(D,{}),(0,a.jsx)(c.NavigationPromisesContext.Provider,{value:null,children:(0,a.jsx)(c.PathParamsContext.Provider,{value:j,children:(0,a.jsx)(c.PathnameContext.Provider,{value:_,children:(0,a.jsx)(c.SearchParamsContext.Provider,{value:E,children:(0,a.jsx)(i.GlobalLayoutRouterContext.Provider,{value:B,children:(0,a.jsx)(i.AppRouterContext.Provider,{value:w.publicAppRouterInstance,children:(0,a.jsx)(i.LayoutRouterContext.Provider,{value:U,children:V})})})})})})})]})}function R({actionQueue:e,globalErrorState:t,webSocket:n,staticIndicatorState:r}){(0,b.useNavFailureHandler)();let l=(0,a.jsx)(L,{actionQueue:e,globalError:t,webSocket:n,staticIndicatorState:r});return(0,a.jsx)(x.default,{errorComponent:_.default,children:l})}let M=new Set,I=new Set;function D(){let[,e]=o.default.useState(0),t=M.size;(0,o.useEffect)(()=>{let n=()=>e(e=>e+1);return I.add(n),t!==M.size&&n(),()=>{I.delete(n)}},[t,e]);let n=(0,P.getDeploymentIdQueryOrEmptyString)();return[...M].map((e,t)=>(0,a.jsx)(\"link\",{rel:\"stylesheet\",href:`${e}${n}`,precedence:\"next\"},t))}globalThis._N_E_STYLE_LOAD=function(e){let t=M.size;return M.add(e),M.size!==t&&I.forEach(e=>e()),Promise.resolve()},(\"function\"==typeof n.default||\"object\"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,\"__esModule\",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},28550,(e,t,n)=>{\"use strict\";Object.defineProperty(n,\"__esModule\",{value:!0}),Object.defineProperty(n,\"createInitialRouterState\",{enumerable:!0,get:function(){return i}});let r=e.r(13425),l=e.r(7022),a=e.r(2860),o=e.r(46088);function i({navigatedAt:e,initialFlightData:t,initialCanonicalUrlParts:n,initialRenderedSearch:i,location:u}){let s=n.join(\"/\"),{tree:c,seedData:f,head:d}=(0,a.getFlightDataPartsFromPath)(t[0]),p=u?(0,r.createHrefFromUrl)(u):s;return{tree:c,cache:(0,o.createInitialCacheNodeForHydration)(e,c,f,d),pushRef:{pendingPush:!1,mpaNavigation:!1,preserveCustomHistoryState:!0},focusAndScrollRef:{apply:!1,onlyHashChange:!1,hashFragment:null,segmentPaths:[]},canonicalUrl:p,renderedSearch:i,nextUrl:((0,l.extractPathFromFlightRouterState)(c)||u?.pathname)??null,previousNextUrl:null,debugInfo:null}}(\"function\"==typeof n.default||\"object\"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,\"__esModule\",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},79287,(e,t,n)=>{\"use strict\";let r,l,a,o;Object.defineProperty(n,\"__esModule\",{value:!0}),Object.defineProperty(n,\"hydrate\",{enumerable:!0,get:function(){return A}});let i=e.r(81258),u=e.r(964);e.r(13734);let s=i._(e.r(56408)),c=i._(e.r(33664)),f=e.r(58662),d=e.r(38019),p=e.r(43492),m=e.r(39423),h=e.r(55748),g=e.r(3958),v=e.r(12942),y=i._(e.r(89439)),b=e.r(28550);e.r(7e4);let w=e.r(94275),k=e.r(2860),S=f.createFromReadableStream,E=f.createFromFetch,x=document,_=new TextEncoder,N=!1,P=!1,C=null;function T(e){if(0===e[0])a=[];else if(1===e[0]){if(!a)throw Object.defineProperty(Error(\"Unexpected server data: missing bootstrap script.\"),\"__NEXT_ERROR_CODE\",{value:\"E18\",enumerable:!1,configurable:!0});o?o.enqueue(_.encode(e[1])):a.push(e[1])}else if(2===e[0])C=e[1];else if(3===e[0]){if(!a)throw Object.defineProperty(Error(\"Unexpected server data: missing bootstrap script.\"),\"__NEXT_ERROR_CODE\",{value:\"E18\",enumerable:!1,configurable:!0});let n=atob(e[1]),r=new Uint8Array(n.length);for(var t=0;t<n.length;t++)r[t]=n.charCodeAt(t);o?o.enqueue(r):a.push(r)}}let O=function(){o&&!P&&(o.close(),P=!0,a=void 0),N=!0};\"loading\"===document.readyState?document.addEventListener(\"DOMContentLoaded\",O,!1):setTimeout(O);let z=self.__next_f=self.__next_f||[];z.forEach(T),z.length=0,z.push=T;let L=new ReadableStream({start(e){a&&(a.forEach(t=>{e.enqueue(\"string\"==typeof t?_.encode(t):t)}),N&&!P)&&(null===e.desiredSize||e.desiredSize<0?e.error(Object.defineProperty(Error(\"The connection to the page was unexpectedly closed, possibly due to the stop button being clicked, loss of Wi-Fi, or an unstable internet connection.\"),\"__NEXT_ERROR_CODE\",{value:\"E117\",enumerable:!1,configurable:!0})):e.close(),P=!0,a=void 0),o=e}}),R=window.__NEXT_CLIENT_RESUME;function M({initialRSCPayload:e,actionQueue:t,webSocket:n,staticIndicatorState:r}){return(0,u.jsx)(y.default,{actionQueue:t,globalErrorState:e.G,webSocket:n,staticIndicatorState:r})}l=R?Promise.resolve(E(R,{callServer:h.callServer,findSourceMapURL:g.findSourceMapURL,debugChannel:r})).then(async e=>(0,k.createInitialRSCPayloadFromFallbackPrerender)(await R,e)):S(L,{callServer:h.callServer,findSourceMapURL:g.findSourceMapURL,debugChannel:r,startTime:0});let I=c.default.StrictMode;function D({children:e}){return e}let F={onDefaultTransitionIndicator:function(){return()=>{}},onRecoverableError:p.onRecoverableError,onCaughtError:m.onCaughtError,onUncaughtError:m.onUncaughtError};async function A(e,t){let n,r,a=await l;(0,w.setAppBuildId)(a.b);let o=Date.now(),i=(0,v.createMutableActionQueue)((0,b.createInitialRouterState)({navigatedAt:o,initialFlightData:a.f,initialCanonicalUrlParts:a.c,initialRenderedSearch:a.q,location:window.location}),e),f=(0,u.jsx)(I,{children:(0,u.jsx)(d.HeadManagerContext.Provider,{value:{appDir:!0},children:(0,u.jsx)(D,{children:(0,u.jsx)(M,{initialRSCPayload:a,actionQueue:i,webSocket:r,staticIndicatorState:n})})})});\"__next_error__\"===document.documentElement.id?s.default.createRoot(x,F).render(f):c.default.startTransition(()=>{s.default.hydrateRoot(x,f,{...F,formState:C})})}(\"function\"==typeof n.default||\"object\"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,\"__esModule\",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},39324,(e,t,n)=>{\"use strict\";Object.defineProperty(n,\"__esModule\",{value:!0});let r=e.r(34921);e.r(43492),window.next.turbopack=!0,self.__webpack_hash__=\"\";let l=e.r(6557);(0,r.appBootstrap)(t=>{let{hydrate:n}=e.r(79287);n(l,t)}),(\"function\"==typeof n.default||\"object\"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,\"__esModule\",{value:!0}),Object.assign(n.default,n),t.exports=n.default)}]);"
  },
  {
    "path": "docs/_next/static/chunks/b492b32695e3b282.js",
    "content": "(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push([\"object\"==typeof document?document.currentScript:void 0,40574,(e,t,i)=>{\"use strict\";function r({widthInt:e,heightInt:t,blurWidth:i,blurHeight:r,blurDataURL:n,objectFit:s}){let o=i?40*i:e,a=r?40*r:t,l=o&&a?`viewBox='0 0 ${o} ${a}'`:\"\";return`%3Csvg xmlns='http://www.w3.org/2000/svg' ${l}%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeColorMatrix values='1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 100 -1' result='s'/%3E%3CfeFlood x='0' y='0' width='100%25' height='100%25'/%3E%3CfeComposite operator='out' in='s'/%3E%3CfeComposite in2='SourceGraphic'/%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3C/filter%3E%3Cimage width='100%25' height='100%25' x='0' y='0' preserveAspectRatio='${l?\"none\":\"contain\"===s?\"xMidYMid\":\"cover\"===s?\"xMidYMid slice\":\"none\"}' style='filter: url(%23b);' href='${n}'/%3E%3C/svg%3E`}Object.defineProperty(i,\"__esModule\",{value:!0}),Object.defineProperty(i,\"getImageBlurSvg\",{enumerable:!0,get:function(){return r}})},47720,(e,t,i)=>{\"use strict\";Object.defineProperty(i,\"__esModule\",{value:!0});var r={VALID_LOADERS:function(){return s},imageConfigDefault:function(){return o}};for(var n in r)Object.defineProperty(i,n,{enumerable:!0,get:r[n]});let s=[\"default\",\"imgix\",\"cloudinary\",\"akamai\",\"custom\"],o={deviceSizes:[640,750,828,1080,1200,1920,2048,3840],imageSizes:[32,48,64,96,128,256,384],path:\"/_next/image\",loader:\"default\",loaderFile:\"\",domains:[],disableStaticImages:!1,minimumCacheTTL:14400,formats:[\"image/webp\"],maximumRedirects:3,maximumResponseBody:5e7,dangerouslyAllowLocalIP:!1,dangerouslyAllowSVG:!1,contentSecurityPolicy:\"script-src 'none'; frame-src 'none'; sandbox;\",contentDispositionType:\"attachment\",localPatterns:void 0,remotePatterns:[],qualities:[75],unoptimized:!1}},49947,(e,t,i)=>{\"use strict\";Object.defineProperty(i,\"__esModule\",{value:!0}),Object.defineProperty(i,\"getImgProps\",{enumerable:!0,get:function(){return u}}),e.r(46424);let r=e.r(77447),n=e.r(40574),s=e.r(47720),o=[\"-moz-initial\",\"fill\",\"none\",\"scale-down\",void 0];function a(e){return void 0!==e.default}function l(e){return void 0===e?e:\"number\"==typeof e?Number.isFinite(e)?e:NaN:\"string\"==typeof e&&/^[0-9]+$/.test(e)?parseInt(e,10):NaN}function u({src:e,sizes:t,unoptimized:i=!1,priority:u=!1,preload:h=!1,loading:c,className:d,quality:p,width:m,height:f,fill:g=!1,style:v,overrideSrc:x,onLoad:y,onLoadingComplete:b,placeholder:w=\"empty\",blurDataURL:j,fetchPriority:P,decoding:T=\"async\",layout:S,objectFit:E,objectPosition:A,lazyBoundary:k,lazyRoot:M,...C},R){var N;let V,D,L,{imgConf:F,showAltText:O,blurComplete:_,defaultLoader:I}=R,B=F||s.imageConfigDefault;if(\"allSizes\"in B)V=B;else{let e=[...B.deviceSizes,...B.imageSizes].sort((e,t)=>e-t),t=B.deviceSizes.sort((e,t)=>e-t),i=B.qualities?.sort((e,t)=>e-t);V={...B,allSizes:e,deviceSizes:t,qualities:i}}if(void 0===I)throw Object.defineProperty(Error(\"images.loaderFile detected but the file is missing default export.\\nRead more: https://nextjs.org/docs/messages/invalid-images-config\"),\"__NEXT_ERROR_CODE\",{value:\"E163\",enumerable:!1,configurable:!0});let $=C.loader||I;delete C.loader,delete C.srcSet;let U=\"__next_img_default\"in $;if(U){if(\"custom\"===V.loader)throw Object.defineProperty(Error(`Image with src \"${e}\" is missing \"loader\" prop.\nRead more: https://nextjs.org/docs/messages/next-image-missing-loader`),\"__NEXT_ERROR_CODE\",{value:\"E252\",enumerable:!1,configurable:!0})}else{let e=$;$=t=>{let{config:i,...r}=t;return e(r)}}if(S){\"fill\"===S&&(g=!0);let e={intrinsic:{maxWidth:\"100%\",height:\"auto\"},responsive:{width:\"100%\",height:\"auto\"}}[S];e&&(v={...v,...e});let i={responsive:\"100vw\",fill:\"100vw\"}[S];i&&!t&&(t=i)}let z=\"\",W=l(m),H=l(f);if((N=e)&&\"object\"==typeof N&&(a(N)||void 0!==N.src)){let t=a(e)?e.default:e;if(!t.src)throw Object.defineProperty(Error(`An object should only be passed to the image component src parameter if it comes from a static image import. It must include src. Received ${JSON.stringify(t)}`),\"__NEXT_ERROR_CODE\",{value:\"E460\",enumerable:!1,configurable:!0});if(!t.height||!t.width)throw Object.defineProperty(Error(`An object should only be passed to the image component src parameter if it comes from a static image import. It must include height and width. Received ${JSON.stringify(t)}`),\"__NEXT_ERROR_CODE\",{value:\"E48\",enumerable:!1,configurable:!0});if(D=t.blurWidth,L=t.blurHeight,j=j||t.blurDataURL,z=t.src,!g)if(W||H){if(W&&!H){let e=W/t.width;H=Math.round(t.height*e)}else if(!W&&H){let e=H/t.height;W=Math.round(t.width*e)}}else W=t.width,H=t.height}let q=!u&&!h&&(\"lazy\"===c||void 0===c);(!(e=\"string\"==typeof e?e:z)||e.startsWith(\"data:\")||e.startsWith(\"blob:\"))&&(i=!0,q=!1),V.unoptimized&&(i=!0),U&&!V.dangerouslyAllowSVG&&e.split(\"?\",1)[0].endsWith(\".svg\")&&(i=!0);let Y=l(p),X=Object.assign(g?{position:\"absolute\",height:\"100%\",width:\"100%\",left:0,top:0,right:0,bottom:0,objectFit:E,objectPosition:A}:{},O?{}:{color:\"transparent\"},v),G=_||\"empty\"===w?null:\"blur\"===w?`url(\"data:image/svg+xml;charset=utf-8,${(0,n.getImageBlurSvg)({widthInt:W,heightInt:H,blurWidth:D,blurHeight:L,blurDataURL:j||\"\",objectFit:X.objectFit})}\")`:`url(\"${w}\")`,K=o.includes(X.objectFit)?\"fill\"===X.objectFit?\"100% 100%\":\"cover\":X.objectFit,Z=G?{backgroundSize:K,backgroundPosition:X.objectPosition||\"50% 50%\",backgroundRepeat:\"no-repeat\",backgroundImage:G}:{},J=function({config:e,src:t,unoptimized:i,width:n,quality:s,sizes:o,loader:a}){if(i){let e=(0,r.getDeploymentId)();if(t.startsWith(\"/\")&&!t.startsWith(\"//\")&&e){let i=t.includes(\"?\")?\"&\":\"?\";t=`${t}${i}dpl=${e}`}return{src:t,srcSet:void 0,sizes:void 0}}let{widths:l,kind:u}=function({deviceSizes:e,allSizes:t},i,r){if(r){let i=/(^|\\s)(1?\\d?\\d)vw/g,n=[];for(let e;e=i.exec(r);)n.push(parseInt(e[2]));if(n.length){let i=.01*Math.min(...n);return{widths:t.filter(t=>t>=e[0]*i),kind:\"w\"}}return{widths:t,kind:\"w\"}}return\"number\"!=typeof i?{widths:e,kind:\"w\"}:{widths:[...new Set([i,2*i].map(e=>t.find(t=>t>=e)||t[t.length-1]))],kind:\"x\"}}(e,n,o),h=l.length-1;return{sizes:o||\"w\"!==u?o:\"100vw\",srcSet:l.map((i,r)=>`${a({config:e,src:t,quality:s,width:i})} ${\"w\"===u?i:r+1}${u}`).join(\", \"),src:a({config:e,src:t,quality:s,width:l[h]})}}({config:V,src:e,unoptimized:i,width:W,quality:Y,sizes:t,loader:$}),Q=q?\"lazy\":c;return{props:{...C,loading:Q,fetchPriority:P,width:W,height:H,decoding:T,className:d,style:{...X,...Z},sizes:J.sizes,srcSet:J.srcSet,src:x||J.src},meta:{unoptimized:i,preload:h||u,placeholder:w,fill:g}}}},8953,(e,t,i)=>{\"use strict\";Object.defineProperty(i,\"__esModule\",{value:!0}),Object.defineProperty(i,\"default\",{enumerable:!0,get:function(){return a}});let r=e.r(33664),n=\"u\"<typeof window,s=n?()=>{}:r.useLayoutEffect,o=n?()=>{}:r.useEffect;function a(e){let{headManager:t,reduceComponentsToState:i}=e;function a(){if(t&&t.mountedInstances){let e=r.Children.toArray(Array.from(t.mountedInstances).filter(Boolean));t.updateHead(i(e))}}return n&&(t?.mountedInstances?.add(e.children),a()),s(()=>(t?.mountedInstances?.add(e.children),()=>{t?.mountedInstances?.delete(e.children)})),s(()=>(t&&(t._pendingUpdate=a),()=>{t&&(t._pendingUpdate=a)})),o(()=>(t&&t._pendingUpdate&&(t._pendingUpdate(),t._pendingUpdate=null),()=>{t&&t._pendingUpdate&&(t._pendingUpdate(),t._pendingUpdate=null)})),null}},83768,(e,t,i)=>{\"use strict\";Object.defineProperty(i,\"__esModule\",{value:!0});var r={default:function(){return f},defaultHead:function(){return c}};for(var n in r)Object.defineProperty(i,n,{enumerable:!0,get:r[n]});let s=e.r(81258),o=e.r(44066),a=e.r(964),l=o._(e.r(33664)),u=s._(e.r(8953)),h=e.r(38019);function c(){return[(0,a.jsx)(\"meta\",{charSet:\"utf-8\"},\"charset\"),(0,a.jsx)(\"meta\",{name:\"viewport\",content:\"width=device-width\"},\"viewport\")]}function d(e,t){return\"string\"==typeof t||\"number\"==typeof t?e:t.type===l.default.Fragment?e.concat(l.default.Children.toArray(t.props.children).reduce((e,t)=>\"string\"==typeof t||\"number\"==typeof t?e:e.concat(t),[])):e.concat(t)}e.r(46424);let p=[\"name\",\"httpEquiv\",\"charSet\",\"itemProp\"];function m(e){let t,i,r,n;return e.reduce(d,[]).reverse().concat(c().reverse()).filter((t=new Set,i=new Set,r=new Set,n={},e=>{let s=!0,o=!1;if(e.key&&\"number\"!=typeof e.key&&e.key.indexOf(\"$\")>0){o=!0;let i=e.key.slice(e.key.indexOf(\"$\")+1);t.has(i)?s=!1:t.add(i)}switch(e.type){case\"title\":case\"base\":i.has(e.type)?s=!1:i.add(e.type);break;case\"meta\":for(let t=0,i=p.length;t<i;t++){let i=p[t];if(e.props.hasOwnProperty(i))if(\"charSet\"===i)r.has(i)?s=!1:r.add(i);else{let t=e.props[i],r=n[i]||new Set;(\"name\"!==i||!o)&&r.has(t)?s=!1:(r.add(t),n[i]=r)}}}return s})).reverse().map((e,t)=>{let i=e.key||t;return l.default.cloneElement(e,{key:i})})}let f=function({children:e}){let t=(0,l.useContext)(h.HeadManagerContext);return(0,a.jsx)(u.default,{reduceComponentsToState:m,headManager:t,children:e})};(\"function\"==typeof i.default||\"object\"==typeof i.default&&null!==i.default)&&void 0===i.default.__esModule&&(Object.defineProperty(i.default,\"__esModule\",{value:!0}),Object.assign(i.default,i),t.exports=i.default)},20120,(e,t,i)=>{\"use strict\";Object.defineProperty(i,\"__esModule\",{value:!0}),Object.defineProperty(i,\"ImageConfigContext\",{enumerable:!0,get:function(){return s}});let r=e.r(81258)._(e.r(33664)),n=e.r(47720),s=r.default.createContext(n.imageConfigDefault)},50762,(e,t,i)=>{\"use strict\";Object.defineProperty(i,\"__esModule\",{value:!0}),Object.defineProperty(i,\"RouterContext\",{enumerable:!0,get:function(){return r}});let r=e.r(81258)._(e.r(33664)).default.createContext(null)},40128,(e,t,i)=>{\"use strict\";function r(e,t){let i=e||75;return t?.qualities?.length?t.qualities.reduce((e,t)=>Math.abs(t-i)<Math.abs(e-i)?t:e,0):i}Object.defineProperty(i,\"__esModule\",{value:!0}),Object.defineProperty(i,\"findClosestQuality\",{enumerable:!0,get:function(){return r}})},53315,(e,t,i)=>{\"use strict\";Object.defineProperty(i,\"__esModule\",{value:!0}),Object.defineProperty(i,\"default\",{enumerable:!0,get:function(){return o}});let r=e.r(40128),n=e.r(77447);function s({config:e,src:t,width:i,quality:s}){if(t.startsWith(\"/\")&&t.includes(\"?\")&&e.localPatterns?.length===1&&\"**\"===e.localPatterns[0].pathname&&\"\"===e.localPatterns[0].search)throw Object.defineProperty(Error(`Image with src \"${t}\" is using a query string which is not configured in images.localPatterns.\nRead more: https://nextjs.org/docs/messages/next-image-unconfigured-localpatterns`),\"__NEXT_ERROR_CODE\",{value:\"E871\",enumerable:!1,configurable:!0});let o=(0,r.findClosestQuality)(s,e),a=(0,n.getDeploymentId)();return`${e.path}?url=${encodeURIComponent(t)}&w=${i}&q=${o}${t.startsWith(\"/\")&&a?`&dpl=${a}`:\"\"}`}s.__next_img_default=!0;let o=s},79419,(e,t,i)=>{\"use strict\";Object.defineProperty(i,\"__esModule\",{value:!0}),Object.defineProperty(i,\"useMergedRef\",{enumerable:!0,get:function(){return n}});let r=e.r(33664);function n(e,t){let i=(0,r.useRef)(null),n=(0,r.useRef)(null);return(0,r.useCallback)(r=>{if(null===r){let e=i.current;e&&(i.current=null,e());let t=n.current;t&&(n.current=null,t())}else e&&(i.current=s(e,r)),t&&(n.current=s(t,r))},[e,t])}function s(e,t){if(\"function\"!=typeof e)return e.current=t,()=>{e.current=null};{let i=e(t);return\"function\"==typeof i?i:()=>e(null)}}(\"function\"==typeof i.default||\"object\"==typeof i.default&&null!==i.default)&&void 0===i.default.__esModule&&(Object.defineProperty(i.default,\"__esModule\",{value:!0}),Object.assign(i.default,i),t.exports=i.default)},58495,(e,t,i)=>{\"use strict\";Object.defineProperty(i,\"__esModule\",{value:!0}),Object.defineProperty(i,\"Image\",{enumerable:!0,get:function(){return b}});let r=e.r(81258),n=e.r(44066),s=e.r(964),o=n._(e.r(33664)),a=r._(e.r(72491)),l=r._(e.r(83768)),u=e.r(49947),h=e.r(47720),c=e.r(20120);e.r(46424);let d=e.r(50762),p=r._(e.r(53315)),m=e.r(79419),f={deviceSizes:[640,750,828,1080,1200,1920,2048,3840],imageSizes:[32,48,64,96,128,256,384],qualities:[75],path:\"/_next/image/\",loader:\"default\",dangerouslyAllowSVG:!1,unoptimized:!0};function g(e,t,i,r,n,s,o){let a=e?.src;e&&e[\"data-loaded-src\"]!==a&&(e[\"data-loaded-src\"]=a,(\"decode\"in e?e.decode():Promise.resolve()).catch(()=>{}).then(()=>{if(e.parentElement&&e.isConnected){if(\"empty\"!==t&&n(!0),i?.current){let t=new Event(\"load\");Object.defineProperty(t,\"target\",{writable:!1,value:e});let r=!1,n=!1;i.current({...t,nativeEvent:t,currentTarget:e,target:e,isDefaultPrevented:()=>r,isPropagationStopped:()=>n,persist:()=>{},preventDefault:()=>{r=!0,t.preventDefault()},stopPropagation:()=>{n=!0,t.stopPropagation()}})}r?.current&&r.current(e)}}))}function v(e){return o.use?{fetchPriority:e}:{fetchpriority:e}}\"u\"<typeof window&&(globalThis.__NEXT_IMAGE_IMPORTED=!0);let x=(0,o.forwardRef)(({src:e,srcSet:t,sizes:i,height:r,width:n,decoding:a,className:l,style:u,fetchPriority:h,placeholder:c,loading:d,unoptimized:p,fill:f,onLoadRef:x,onLoadingCompleteRef:y,setBlurComplete:b,setShowAltText:w,sizesInput:j,onLoad:P,onError:T,...S},E)=>{let A=(0,o.useCallback)(e=>{e&&(T&&(e.src=e.src),e.complete&&g(e,c,x,y,b,p,j))},[e,c,x,y,b,T,p,j]),k=(0,m.useMergedRef)(E,A);return(0,s.jsx)(\"img\",{...S,...v(h),loading:d,width:n,height:r,decoding:a,\"data-nimg\":f?\"fill\":\"1\",className:l,style:u,sizes:i,srcSet:t,src:e,ref:k,onLoad:e=>{g(e.currentTarget,c,x,y,b,p,j)},onError:e=>{w(!0),\"empty\"!==c&&b(!0),T&&T(e)}})});function y({isAppRouter:e,imgAttributes:t}){let i={as:\"image\",imageSrcSet:t.srcSet,imageSizes:t.sizes,crossOrigin:t.crossOrigin,referrerPolicy:t.referrerPolicy,...v(t.fetchPriority)};return e&&a.default.preload?(a.default.preload(t.src,i),null):(0,s.jsx)(l.default,{children:(0,s.jsx)(\"link\",{rel:\"preload\",href:t.srcSet?void 0:t.src,...i},\"__nimg-\"+t.src+t.srcSet+t.sizes)})}let b=(0,o.forwardRef)((e,t)=>{let i=(0,o.useContext)(d.RouterContext),r=(0,o.useContext)(c.ImageConfigContext),n=(0,o.useMemo)(()=>{let e=f||r||h.imageConfigDefault,t=[...e.deviceSizes,...e.imageSizes].sort((e,t)=>e-t),i=e.deviceSizes.sort((e,t)=>e-t),n=e.qualities?.sort((e,t)=>e-t);return{...e,allSizes:t,deviceSizes:i,qualities:n,localPatterns:\"u\"<typeof window?r?.localPatterns:e.localPatterns}},[r]),{onLoad:a,onLoadingComplete:l}=e,m=(0,o.useRef)(a);(0,o.useEffect)(()=>{m.current=a},[a]);let g=(0,o.useRef)(l);(0,o.useEffect)(()=>{g.current=l},[l]);let[v,b]=(0,o.useState)(!1),[w,j]=(0,o.useState)(!1),{props:P,meta:T}=(0,u.getImgProps)(e,{defaultLoader:p.default,imgConf:n,blurComplete:v,showAltText:w});return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(x,{...P,unoptimized:T.unoptimized,placeholder:T.placeholder,fill:T.fill,onLoadRef:m,onLoadingCompleteRef:g,setBlurComplete:b,setShowAltText:j,sizesInput:e.sizes,ref:t}),T.preload?(0,s.jsx)(y,{isAppRouter:!i,imgAttributes:P}):null]})});(\"function\"==typeof i.default||\"object\"==typeof i.default&&null!==i.default)&&void 0===i.default.__esModule&&(Object.defineProperty(i.default,\"__esModule\",{value:!0}),Object.assign(i.default,i),t.exports=i.default)},49610,(e,t,i)=>{\"use strict\";Object.defineProperty(i,\"__esModule\",{value:!0});var r={default:function(){return h},getImageProps:function(){return u}};for(var n in r)Object.defineProperty(i,n,{enumerable:!0,get:r[n]});let s=e.r(81258),o=e.r(49947),a=e.r(58495),l=s._(e.r(53315));function u(e){let{props:t}=(0,o.getImgProps)(e,{defaultLoader:l.default,imgConf:{deviceSizes:[640,750,828,1080,1200,1920,2048,3840],imageSizes:[32,48,64,96,128,256,384],qualities:[75],path:\"/_next/image/\",loader:\"default\",dangerouslyAllowSVG:!1,unoptimized:!0}});for(let[e,i]of Object.entries(t))void 0===i&&delete t[e];return{props:t}}let h=a.Image},67141,(e,t,i)=>{t.exports=e.r(49610)},4343,(e,t,i)=>{\"use strict\";var r=e.r(33664),n=\"function\"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},s=r.useState,o=r.useEffect,a=r.useLayoutEffect,l=r.useDebugValue;function u(e){var t=e.getSnapshot;e=e.value;try{var i=t();return!n(e,i)}catch(e){return!0}}var h=\"u\"<typeof window||void 0===window.document||void 0===window.document.createElement?function(e,t){return t()}:function(e,t){var i=t(),r=s({inst:{value:i,getSnapshot:t}}),n=r[0].inst,h=r[1];return a(function(){n.value=i,n.getSnapshot=t,u(n)&&h({inst:n})},[e,i,t]),o(function(){return u(n)&&h({inst:n}),e(function(){u(n)&&h({inst:n})})},[e]),l(i),i};i.useSyncExternalStore=void 0!==r.useSyncExternalStore?r.useSyncExternalStore:h},7678,(e,t,i)=>{\"use strict\";t.exports=e.r(4343)},61096,e=>{\"use strict\";let t,i,r;var n,s,o,a=e.i(964),l=e.i(67141),u=e.i(33664);let h={src:e.i(1933).default,width:512,height:512,blurWidth:8,blurHeight:8,blurDataURL:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAABDElEQVR42h1Pz0vCUBzfPPS2tzdN16P1A0qQNVtRmJAkRDGIbTpzGFGYlxyYeenSIQSJrkHHoEPQvUv/huCf857Xb+/5he/p81tRVTWj6cQhphUaptUwiPzlECHsSEyRoL2xN/WqCWv2Xrl7mHBqHzCLFqcI6Y4ilJFbabP+5A8eh98QnDzB+to5FOgu03UzUkh2JT69fuPp6Aeu/CFcHg/gojaCkhdwjHOxdIirzRd+0/uATpBC+6wPD+knhN0xx8aCkI/srRrbqd/Bbfcd0sEX3I9/obTviwjSECUNt0C3Z3TziFei53m9M5kXPZ9nc6uzJaS5SkacpuGysGsRkk/ExARjs4WQVpYz/wEz30qW98VWQwAAAABJRU5ErkJggg==\"};function c(e,t,i){return Math.min(i,Math.max(t,e))}function d(e){let t=1e4*Math.sin(e);return t-Math.floor(t)}function p({className:e=\"\"}){let t=(0,u.useRef)(null),i=(0,u.useRef)(null);return(0,u.useEffect)(()=>{let e=t.current;if(!e)return;let r=window.matchMedia?.(\"(prefers-reduced-motion: reduce)\")?.matches??!1,n=navigator.connection?.saveData??!1;if(r||n)return;let s=e.getContext(\"2d\",{alpha:!0});if(!s)return;let o={x:-1e4,y:-1e4,active:!1},a=[\"rgba(255,255,255,0.12)\",\"rgba(255,255,255,0.08)\",\"rgba(255,255,255,0.05)\"],l=1,u=1,h=[],p=()=>{let t=e.getBoundingClientRect();l=Math.max(1,Math.floor(t.width)),u=Math.max(1,Math.floor(t.height));let i=Math.max(1,window.devicePixelRatio||1);e.width=Math.floor(l*i),e.height=Math.floor(u*i),s.setTransform(i,0,0,i,0,0);let r=window.matchMedia?.(\"(pointer: coarse)\")?.matches??!1;h=Array.from({length:c(Math.floor(l*u/5e3*(r?.35:.7)),140,620)},(e,t)=>{let i=12.345*t;return{x:d(i)*l,y:d(i+1)*u,vx:0,vy:0,seed:1e3*d(i+2),color:t%3}}),s.clearRect(0,0,l,u)},m=t=>{let i=e.getBoundingClientRect();o.x=t.clientX-i.left,o.y=t.clientY-i.top,o.active=!0},f=()=>{o.active=!1,o.x=-1e4,o.y=-1e4};window.addEventListener(\"pointermove\",m,{passive:!0}),window.addEventListener(\"blur\",f),window.addEventListener(\"resize\",p,{passive:!0}),p();let g=performance.now(),v=!0,x=(e,t,i,r)=>(Math.sin(.0022*e+(i+r)*65e-5)+Math.cos(.002*t-(i-r)*55e-5)+Math.sin((e+t)*.0014+(i+r)*32e-5))/3*Math.PI*2.2,y=e=>{if(!v)return;let t=c(e-g,6,28);g=e;let r=Math.max(1,document.documentElement.scrollHeight-window.innerHeight),n=c(window.scrollY/r,0,1);s.fillStyle=`rgba(0, 0, 0, ${.08+.05*n})`,s.fillRect(0,0,l,u),s.save(),s.globalCompositeOperation=\"lighter\",s.lineWidth=1;let p=.8+1.4*n;for(let i of h){let r=i.x,n=i.y,h=x(r,n,e,i.seed),c=.55*Math.cos(h),m=.55*Math.sin(h);if(i.vx=.84*i.vx+c,i.vy=.84*i.vy+m,o.active){let e=r-o.x,t=n-o.y,s=Math.sqrt(e*e+t*t)||1;if(s<180){let r=(1-s/180)*1.15;i.vx+=-t/s*r,i.vy+=e/s*r}}let f=r+i.vx*p*(t/16),g=n+i.vy*p*(t/16);if(i.x=f,i.y=g,s.strokeStyle=a[i.color],s.beginPath(),s.moveTo(r,n),s.lineTo(f,g),s.stroke(),f<-40||f>l+40||g<-40||g>u+40){let t=i.seed+.001*e;i.x=d(t)*l,i.y=d(t+1)*u,i.vx=0,i.vy=0}}s.restore(),v&&(i.current=window.requestAnimationFrame(y))};i.current=window.requestAnimationFrame(y);let b=()=>{if(document.hidden){v=!1,i.current&&window.cancelAnimationFrame(i.current),i.current=null;return}v||(v=!0,g=performance.now(),i.current=window.requestAnimationFrame(y))};return document.addEventListener(\"visibilitychange\",b),()=>{i.current&&window.cancelAnimationFrame(i.current),window.removeEventListener(\"pointermove\",m),window.removeEventListener(\"blur\",f),window.removeEventListener(\"resize\",p),document.removeEventListener(\"visibilitychange\",b)}},[]),(0,a.jsx)(\"canvas\",{ref:t,className:`block w-full h-full pointer-events-none ${e}`,\"aria-hidden\":\"true\"})}var m=e.i(72491);function f(e){return e?Array.from(e.querySelectorAll('a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex=\"-1\"])')).filter(e=>{let t=window.getComputedStyle(e);return\"none\"!==t.display&&\"hidden\"!==t.visibility}):[]}function g({isOpen:e,onClose:t,title:i,children:r,width:n=\"max-w-sm\",closeLabel:s=\"Close dialog\"}){let[o,l]=(0,u.useState)(null),h=(0,u.useId)(),c=(0,u.useRef)(null),d=(0,u.useRef)(null),p=(0,u.useRef)(null),g=(0,u.useMemo)(()=>({titleId:h}),[h]);return((0,u.useEffect)(()=>{l(document.body)},[]),(0,u.useEffect)(()=>{if(!e)return;p.current=document.activeElement instanceof HTMLElement?document.activeElement:null;let i=document.body.style.overflow;document.body.style.overflow=\"hidden\";let r=window.requestAnimationFrame(()=>{let e=f(c.current);(d.current??e[0]??c.current)?.focus?.()}),n=e=>{if(\"Escape\"===e.key){e.preventDefault(),t();return}if(\"Tab\"!==e.key)return;let i=c.current;if(!i)return;let r=f(i);if(0===r.length){e.preventDefault(),i.focus();return}let n=r[0],s=r[r.length-1],o=document.activeElement instanceof HTMLElement?document.activeElement:null;if(e.shiftKey){o&&i.contains(o)&&o!==n||(e.preventDefault(),s.focus());return}o&&i.contains(o)&&o!==s||(e.preventDefault(),n.focus())};return document.addEventListener(\"keydown\",n),()=>{window.cancelAnimationFrame(r),document.body.style.overflow=i,document.removeEventListener(\"keydown\",n);try{p.current?.focus?.()}catch{}finally{p.current=null}}},[e,t]),o&&e)?(0,m.createPortal)((0,a.jsx)(\"div\",{className:\"fixed inset-0 z-[80] grid place-items-center px-4 py-6 bg-black/70 supports-[backdrop-filter:blur(0)]:bg-black/45 supports-[-webkit-backdrop-filter:blur(0)]:bg-black/45 backdrop-blur-xl\",role:\"presentation\",onClick:e=>{e.target===e.currentTarget&&t()},children:(0,a.jsxs)(\"div\",{ref:c,role:\"dialog\",\"aria-modal\":\"true\",\"aria-labelledby\":g.titleId,tabIndex:-1,className:`w-full ${n} max-h-[calc(100vh-3rem)] max-h-[calc(100svh-3rem)] overflow-auto rounded-[22px] border border-white/10\n                 bg-[rgba(10,11,16,0.72)] shadow-elevated backdrop-blur-xl\n                 motion-safe:animate-[modal-appear_0.5s_var(--ease-out)]`,children:[(0,a.jsxs)(\"div\",{className:\"flex justify-between items-center px-5 sm:px-6 pt-5 sm:pt-6\",children:[(0,a.jsx)(\"h3\",{id:g.titleId,className:\"font-display text-lg sm:text-xl text-white\",children:i}),(0,a.jsx)(\"button\",{ref:d,type:\"button\",onClick:t,className:\"rounded-xl p-2 text-white/55 hover:text-white/85 hover:bg-white/5 transition-colors\",\"aria-label\":s,children:(0,a.jsx)(\"svg\",{className:\"w-6 h-6\",fill:\"none\",viewBox:\"0 0 24 24\",stroke:\"currentColor\",children:(0,a.jsx)(\"path\",{strokeLinecap:\"round\",strokeLinejoin:\"round\",strokeWidth:2,d:\"M6 18L18 6M6 6l12 12\"})})})]}),(0,a.jsx)(\"div\",{className:\"px-5 sm:px-6 pb-5 sm:pb-6 pt-4\",children:r})]})}),o):null}function v({children:e,strength:t=16,className:i=\"\"}){let r=(0,u.useRef)(null),n=(0,u.useRef)(null),s=(0,u.useRef)(null);return(0,u.useEffect)(()=>{let e=r.current,i=n.current;if(!e||!i)return;let o=window.matchMedia?.(\"(any-pointer: fine)\")?.matches??!1,a=window.matchMedia?.(\"(prefers-reduced-motion: reduce)\")?.matches??!1;if(!o||a)return;let l=0,u=0,h=0,c=0,d=(e,t,i)=>Math.min(i,Math.max(t,e)),p=()=>{l+=(h-l)*.18,u+=(c-u)*.18,i.style.transform=`translate3d(${l}px, ${u}px, 0)`,s.current=window.requestAnimationFrame(p)},m=i=>{let r=e.getBoundingClientRect(),n=i.clientX-(r.left+r.width/2),s=i.clientY-(r.top+r.height/2),o=n/Math.max(1,r.width/2),a=s/Math.max(1,r.height/2);h=d(o,-1,1)*t,c=d(a,-1,1)*t},f=()=>{h=0,c=0};return e.addEventListener(\"pointermove\",m,{passive:!0}),e.addEventListener(\"pointerleave\",f,{passive:!0}),s.current=window.requestAnimationFrame(p),()=>{s.current&&window.cancelAnimationFrame(s.current),e.removeEventListener(\"pointermove\",m),e.removeEventListener(\"pointerleave\",f),i.style.transform=\"translate3d(0, 0, 0)\"}},[t]),(0,a.jsx)(\"div\",{ref:r,className:`inline-block ${i}`,children:(0,a.jsx)(\"div\",{ref:n,style:{willChange:\"transform\"},children:e})})}var x=e.i(22576);let y=[{code:\"en\",name:\"English\"},{code:\"zh\",name:\"简体中文\"},{code:\"zh-Hant\",name:\"繁體中文\"},{code:\"ja\",name:\"日本語\"},{code:\"ko\",name:\"한국어\"},{code:\"ru\",name:\"Русский\"},{code:\"de\",name:\"Deutsch\"},{code:\"pl\",name:\"Polski\"},{code:\"el\",name:\"Ελληνικά\"},{code:\"tr\",name:\"Türkçe\"},{code:\"uk\",name:\"Українська\"},{code:\"id\",name:\"Bahasa\"}];function b(){let{language:e,setLanguage:t,t:i}=(0,x.useI18n)(),{isOpen:r,handleOpen:n,handleClose:s}=function(e=!1){let[t,i]=(0,u.useState)(e);return{isOpen:t,handleOpen:(0,u.useCallback)(()=>i(!0),[]),handleClose:(0,u.useCallback)(()=>i(!1),[]),setIsOpen:i}}(),o=y.find(t=>t.code===e);return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(v,{strength:14,children:(0,a.jsx)(\"button\",{type:\"button\",onClick:n,className:\"group grid h-11 w-11 place-items-center rounded-2xl border border-white/5 bg-white/4 hover:bg-white/7 hover:border-white/9 transition-colors\",\"aria-label\":i.languageSelector.title,title:o?.name??\"English\",children:(0,a.jsx)(\"svg\",{\"aria-hidden\":\"true\",viewBox:\"0 0 24 24\",className:\"h-5 w-5 text-white/82 group-hover:text-white/92 transition-colors\",fill:\"currentColor\",children:(0,a.jsx)(\"path\",{d:\"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z\"})})})}),(0,a.jsx)(g,{isOpen:r,onClose:s,title:i.languageSelector.title,closeLabel:i.a11y.closeDialog,width:\"max-w-lg\",children:(0,a.jsx)(\"div\",{className:\"grid grid-cols-2 gap-2\",children:y.map(i=>(0,a.jsx)(\"button\",{type:\"button\",onClick:()=>{t(i.code),s()},className:`p-3 rounded-lg text-left transition-colors\n                        ${e===i.code?\"bg-white/10 text-white\":\"text-white/60 hover:bg-white/5 hover:text-white/90\"}`,children:i.name},i.code))})})]})}function w(e){return null!==e&&\"object\"==typeof e&&\"function\"==typeof e.start}e.i(96171);let j=e=>Array.isArray(e);function P(e,t){if(!Array.isArray(t))return!1;let i=t.length;if(i!==e.length)return!1;for(let r=0;r<i;r++)if(t[r]!==e[r])return!1;return!0}function T(e){return\"string\"==typeof e||Array.isArray(e)}function S(e){let t=[{},{}];return null==e||e.values.forEach((e,i)=>{t[0][i]=e.get(),t[1][i]=e.getVelocity()}),t}function E(e,t,i,r){if(\"function\"==typeof t){let[n,s]=S(r);t=t(void 0!==i?i:e.custom,n,s)}if(\"string\"==typeof t&&(t=e.variants&&e.variants[t]),\"function\"==typeof t){let[n,s]=S(r);t=t(void 0!==i?i:e.custom,n,s)}return t}function A(e,t,i){let r=e.getProps();return E(r,t,void 0!==i?i:r.custom,e)}let k=[\"animate\",\"whileInView\",\"whileFocus\",\"whileHover\",\"whileTap\",\"whileDrag\",\"exit\"],M=[\"initial\",...k],C=e=>e;function R(e){let t;return()=>(void 0===t&&(t=e()),t)}let N=(e,t,i)=>{let r=t-e;return 0===r?1:(i-e)/r},V=e=>1e3*e,D=R(()=>void 0!==window.ScrollTimeline);class L{constructor(e){this.stop=()=>this.runAll(\"stop\"),this.animations=e.filter(Boolean)}get finished(){return Promise.all(this.animations.map(e=>\"finished\"in e?e.finished:e))}getAll(e){return this.animations[0][e]}setAll(e,t){for(let i=0;i<this.animations.length;i++)this.animations[i][e]=t}attachTimeline(e,t){let i=this.animations.map(i=>D()&&i.attachTimeline?i.attachTimeline(e):\"function\"==typeof t?t(i):void 0);return()=>{i.forEach((e,t)=>{e&&e(),this.animations[t].stop()})}}get time(){return this.getAll(\"time\")}set time(e){this.setAll(\"time\",e)}get speed(){return this.getAll(\"speed\")}set speed(e){this.setAll(\"speed\",e)}get startTime(){return this.getAll(\"startTime\")}get duration(){let e=0;for(let t=0;t<this.animations.length;t++)e=Math.max(e,this.animations[t].duration);return e}runAll(e){this.animations.forEach(t=>t[e]())}flatten(){this.runAll(\"flatten\")}play(){this.runAll(\"play\")}pause(){this.runAll(\"pause\")}cancel(){this.runAll(\"cancel\")}complete(){this.runAll(\"complete\")}}class F extends L{then(e,t){return Promise.all(this.animations).then(e).catch(t)}}function O(e,t){return e?e[t]||e.default||e:void 0}function _(e){let t=0,i=e.next(t);for(;!i.done&&t<2e4;)t+=50,i=e.next(t);return t>=2e4?1/0:t}function I(e){return\"function\"==typeof e}function B(e,t){e.timeline=t,e.onfinish=null}let $=e=>Array.isArray(e)&&\"number\"==typeof e[0],U,z=(i=R(()=>{try{document.createElement(\"div\").animate({opacity:0},{easing:\"linear(0, 1)\"})}catch(e){return!1}return!0}),()=>{var e;return null!=(e=U)?e:i()}),W=(e,t,i=10)=>{let r=\"\",n=Math.max(Math.round(t/i),2);for(let t=0;t<n;t++)r+=e(N(0,n-1,t))+\", \";return`linear(${r.substring(0,r.length-2)})`},H=([e,t,i,r])=>`cubic-bezier(${e}, ${t}, ${i}, ${r})`,q={linear:\"linear\",ease:\"ease\",easeIn:\"ease-in\",easeOut:\"ease-out\",easeInOut:\"ease-in-out\",circIn:H([0,.65,.55,1]),circOut:H([.55,0,1,.45]),backIn:H([.31,.01,.66,-.59]),backOut:H([.33,1.53,.69,.99])},Y={x:!1,y:!1};function X(e,t,i){var r;if(e instanceof Element)return[e];if(\"string\"==typeof e){let n=document;t&&(n=t.current);let s=null!=(r=null==i?void 0:i[e])?r:n.querySelectorAll(e);return s?Array.from(s):[]}return Array.from(e)}function G(e,t){let i=X(e),r=new AbortController;return[i,{passive:!0,...t,signal:r.signal},()=>r.abort()]}function K(e){return t=>{\"touch\"===t.pointerType||Y.x||Y.y||e(t)}}let Z=(e,t)=>!!t&&(e===t||Z(e,t.parentElement)),J=e=>\"mouse\"===e.pointerType?\"number\"!=typeof e.button||e.button<=0:!1!==e.isPrimary,Q=new Set([\"BUTTON\",\"INPUT\",\"SELECT\",\"TEXTAREA\",\"A\"]),ee=new WeakSet;function et(e){return t=>{\"Enter\"===t.key&&e(t)}}function ei(e,t){e.dispatchEvent(new PointerEvent(\"pointer\"+t,{isPrimary:!0,bubbles:!0}))}function er(e){return J(e)&&!(Y.x||Y.y)}let en=[\"transformPerspective\",\"x\",\"y\",\"z\",\"translateX\",\"translateY\",\"translateZ\",\"scale\",\"scaleX\",\"scaleY\",\"rotate\",\"rotateX\",\"rotateY\",\"rotateZ\",\"skew\",\"skewX\",\"skewY\"],es=new Set(en),eo=new Set([\"width\",\"height\",\"top\",\"left\",\"right\",\"bottom\",...en]),ea=e=>j(e)?e[e.length-1]||0:e,el=[\"read\",\"resolveKeyframes\",\"update\",\"preRender\",\"render\",\"postRender\"];function eu(e,t){let i=!1,r=!0,n={delta:0,timestamp:0,isProcessing:!1},s=()=>i=!0,o=el.reduce((e,t)=>(e[t]=function(e){let t=new Set,i=new Set,r=!1,n=!1,s=new WeakSet,o={delta:0,timestamp:0,isProcessing:!1};function a(t){s.has(t)&&(l.schedule(t),e()),t(o)}let l={schedule:(e,n=!1,o=!1)=>{let a=o&&r?t:i;return n&&s.add(e),a.has(e)||a.add(e),e},cancel:e=>{i.delete(e),s.delete(e)},process:e=>{if(o=e,r){n=!0;return}r=!0,[t,i]=[i,t],t.forEach(a),t.clear(),r=!1,n&&(n=!1,l.process(e))}};return l}(s),e),{}),{read:a,resolveKeyframes:l,update:u,preRender:h,render:c,postRender:d}=o,p=()=>{let s=performance.now();i=!1,n.delta=r?1e3/60:Math.max(Math.min(s-n.timestamp,40),1),n.timestamp=s,n.isProcessing=!0,a.process(n),l.process(n),u.process(n),h.process(n),c.process(n),d.process(n),n.isProcessing=!1,i&&t&&(r=!1,e(p))};return{schedule:el.reduce((t,s)=>{let a=o[s];return t[s]=(t,s=!1,o=!1)=>(!i&&(i=!0,r=!0,n.isProcessing||e(p)),a.schedule(t,s,o)),t},{}),cancel:e=>{for(let t=0;t<el.length;t++)o[el[t]].cancel(e)},state:n,steps:o}}let{schedule:eh,cancel:ec,state:ed,steps:ep}=eu(\"u\">typeof requestAnimationFrame?requestAnimationFrame:C,!0);function em(){t=void 0}let ef={now:()=>(void 0===t&&ef.set(ed.isProcessing?ed.timestamp:performance.now()),t),set:e=>{t=e,queueMicrotask(em)}};function eg(e,t){-1===e.indexOf(t)&&e.push(t)}function ev(e,t){let i=e.indexOf(t);i>-1&&e.splice(i,1)}class ex{constructor(){this.subscriptions=[]}add(e){return eg(this.subscriptions,e),()=>ev(this.subscriptions,e)}notify(e,t,i){let r=this.subscriptions.length;if(r)if(1===r)this.subscriptions[0](e,t,i);else for(let n=0;n<r;n++){let r=this.subscriptions[n];r&&r(e,t,i)}}getSize(){return this.subscriptions.length}clear(){this.subscriptions.length=0}}let ey={current:void 0};class eb{constructor(e,t={}){this.version=\"11.18.2\",this.canTrackVelocity=null,this.events={},this.updateAndNotify=(e,t=!0)=>{let i=ef.now();this.updatedAt!==i&&this.setPrevFrameValue(),this.prev=this.current,this.setCurrent(e),this.current!==this.prev&&this.events.change&&this.events.change.notify(this.current),t&&this.events.renderRequest&&this.events.renderRequest.notify(this.current)},this.hasAnimated=!1,this.setCurrent(e),this.owner=t.owner}setCurrent(e){this.current=e,this.updatedAt=ef.now(),null===this.canTrackVelocity&&void 0!==e&&(this.canTrackVelocity=!isNaN(parseFloat(this.current)))}setPrevFrameValue(e=this.current){this.prevFrameValue=e,this.prevUpdatedAt=this.updatedAt}onChange(e){return this.on(\"change\",e)}on(e,t){this.events[e]||(this.events[e]=new ex);let i=this.events[e].add(t);return\"change\"===e?()=>{i(),eh.read(()=>{this.events.change.getSize()||this.stop()})}:i}clearListeners(){for(let e in this.events)this.events[e].clear()}attach(e,t){this.passiveEffect=e,this.stopPassiveEffect=t}set(e,t=!0){t&&this.passiveEffect?this.passiveEffect(e,this.updateAndNotify):this.updateAndNotify(e,t)}setWithVelocity(e,t,i){this.set(t),this.prev=void 0,this.prevFrameValue=e,this.prevUpdatedAt=this.updatedAt-i}jump(e,t=!0){this.updateAndNotify(e),this.prev=e,this.prevUpdatedAt=this.prevFrameValue=void 0,t&&this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}get(){return ey.current&&ey.current.push(this),this.current}getPrevious(){return this.prev}getVelocity(){var e;let t=ef.now();if(!this.canTrackVelocity||void 0===this.prevFrameValue||t-this.updatedAt>30)return 0;let i=Math.min(this.updatedAt-this.prevUpdatedAt,30);return e=parseFloat(this.current)-parseFloat(this.prevFrameValue),i?1e3/i*e:0}start(e){return this.stop(),new Promise(t=>{this.hasAnimated=!0,this.animation=e(t),this.events.animationStart&&this.events.animationStart.notify()}).then(()=>{this.events.animationComplete&&this.events.animationComplete.notify(),this.clearAnimation()})}stop(){this.animation&&(this.animation.stop(),this.events.animationCancel&&this.events.animationCancel.notify()),this.clearAnimation()}isAnimating(){return!!this.animation}clearAnimation(){delete this.animation}destroy(){this.clearListeners(),this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}}function ew(e,t){return new eb(e,t)}let ej=e=>!!(e&&e.getVelocity);function eP(e,t){let i=e.getValue(\"willChange\");if(ej(i)&&i.add)return i.add(t)}let eT=e=>e.replace(/([a-z])([A-Z])/gu,\"$1-$2\").toLowerCase(),eS=\"data-\"+eT(\"framerAppearId\"),eE=(e,t,i)=>(((1-3*i+3*t)*e+(3*i-6*t))*e+3*t)*e;function eA(e,t,i,r){return e===t&&i===r?C:n=>0===n||1===n?n:eE(function(e,t,i,r,n){let s,o,a=0;do(s=eE(o=t+(i-t)/2,r,n)-e)>0?i=o:t=o;while(Math.abs(s)>1e-7&&++a<12)return o}(n,0,1,e,i),t,r)}let ek=e=>t=>t<=.5?e(2*t)/2:(2-e(2*(1-t)))/2,eM=e=>t=>1-e(1-t),eC=eA(.33,1.53,.69,.99),eR=eM(eC),eN=ek(eR),eV=e=>(e*=2)<1?.5*eR(e):.5*(2-Math.pow(2,-10*(e-1))),eD=e=>1-Math.sin(Math.acos(e)),eL=eM(eD),eF=ek(eD),eO=(e,t,i)=>i>t?t:i<e?e:i,e_={test:e=>\"number\"==typeof e,parse:parseFloat,transform:e=>e},eI={...e_,transform:e=>eO(0,1,e)},eB={...e_,default:1},e$=e=>Math.round(1e5*e)/1e5,eU=/-?(?:\\d+(?:\\.\\d+)?|\\.\\d+)/gu,ez=/^(?:#[\\da-f]{3,8}|(?:rgb|hsl)a?\\((?:-?[\\d.]+%?[,\\s]+){2}-?[\\d.]+%?\\s*(?:[,/]\\s*)?(?:\\b\\d+(?:\\.\\d+)?|\\.\\d+)?%?\\))$/iu,eW=(e,t)=>i=>!!(\"string\"==typeof i&&ez.test(i)&&i.startsWith(e)||t&&null!=i&&Object.prototype.hasOwnProperty.call(i,t)),eH=(e,t,i)=>r=>{if(\"string\"!=typeof r)return r;let[n,s,o,a]=r.match(eU);return{[e]:parseFloat(n),[t]:parseFloat(s),[i]:parseFloat(o),alpha:void 0!==a?parseFloat(a):1}},eq={...e_,transform:e=>Math.round(eO(0,255,e))},eY={test:eW(\"rgb\",\"red\"),parse:eH(\"red\",\"green\",\"blue\"),transform:({red:e,green:t,blue:i,alpha:r=1})=>\"rgba(\"+eq.transform(e)+\", \"+eq.transform(t)+\", \"+eq.transform(i)+\", \"+e$(eI.transform(r))+\")\"},eX={test:eW(\"#\"),parse:function(e){let t=\"\",i=\"\",r=\"\",n=\"\";return e.length>5?(t=e.substring(1,3),i=e.substring(3,5),r=e.substring(5,7),n=e.substring(7,9)):(t=e.substring(1,2),i=e.substring(2,3),r=e.substring(3,4),n=e.substring(4,5),t+=t,i+=i,r+=r,n+=n),{red:parseInt(t,16),green:parseInt(i,16),blue:parseInt(r,16),alpha:n?parseInt(n,16)/255:1}},transform:eY.transform},eG=e=>({test:t=>\"string\"==typeof t&&t.endsWith(e)&&1===t.split(\" \").length,parse:parseFloat,transform:t=>`${t}${e}`}),eK=eG(\"deg\"),eZ=eG(\"%\"),eJ=eG(\"px\"),eQ=eG(\"vh\"),e0=eG(\"vw\"),e1={...eZ,parse:e=>eZ.parse(e)/100,transform:e=>eZ.transform(100*e)},e2={test:eW(\"hsl\",\"hue\"),parse:eH(\"hue\",\"saturation\",\"lightness\"),transform:({hue:e,saturation:t,lightness:i,alpha:r=1})=>\"hsla(\"+Math.round(e)+\", \"+eZ.transform(e$(t))+\", \"+eZ.transform(e$(i))+\", \"+e$(eI.transform(r))+\")\"},e5={test:e=>eY.test(e)||eX.test(e)||e2.test(e),parse:e=>eY.test(e)?eY.parse(e):e2.test(e)?e2.parse(e):eX.parse(e),transform:e=>\"string\"==typeof e?e:e.hasOwnProperty(\"red\")?eY.transform(e):e2.transform(e)},e3=/(?:#[\\da-f]{3,8}|(?:rgb|hsl)a?\\((?:-?[\\d.]+%?[,\\s]+){2}-?[\\d.]+%?\\s*(?:[,/]\\s*)?(?:\\b\\d+(?:\\.\\d+)?|\\.\\d+)?%?\\))/giu,e4=\"number\",e6=\"color\",e8=/var\\s*\\(\\s*--(?:[\\w-]+\\s*|[\\w-]+\\s*,(?:\\s*[^)(\\s]|\\s*\\((?:[^)(]|\\([^)(]*\\))*\\))+\\s*)\\)|#[\\da-f]{3,8}|(?:rgb|hsl)a?\\((?:-?[\\d.]+%?[,\\s]+){2}-?[\\d.]+%?\\s*(?:[,/]\\s*)?(?:\\b\\d+(?:\\.\\d+)?|\\.\\d+)?%?\\)|-?(?:\\d+(?:\\.\\d+)?|\\.\\d+)/giu;function e9(e){let t=e.toString(),i=[],r={color:[],number:[],var:[]},n=[],s=0,o=t.replace(e8,e=>(e5.test(e)?(r.color.push(s),n.push(e6),i.push(e5.parse(e))):e.startsWith(\"var(\")?(r.var.push(s),n.push(\"var\"),i.push(e)):(r.number.push(s),n.push(e4),i.push(parseFloat(e))),++s,\"${}\")).split(\"${}\");return{values:i,split:o,indexes:r,types:n}}function e7(e){return e9(e).values}function te(e){let{split:t,types:i}=e9(e),r=t.length;return e=>{let n=\"\";for(let s=0;s<r;s++)if(n+=t[s],void 0!==e[s]){let t=i[s];t===e4?n+=e$(e[s]):t===e6?n+=e5.transform(e[s]):n+=e[s]}return n}}let tt=e=>\"number\"==typeof e?0:e,ti={test:function(e){var t,i;return isNaN(e)&&\"string\"==typeof e&&((null==(t=e.match(eU))?void 0:t.length)||0)+((null==(i=e.match(e3))?void 0:i.length)||0)>0},parse:e7,createTransformer:te,getAnimatableNone:function(e){let t=e7(e);return te(e)(t.map(tt))}},tr=new Set([\"brightness\",\"contrast\",\"saturate\",\"opacity\"]);function tn(e){let[t,i]=e.slice(0,-1).split(\"(\");if(\"drop-shadow\"===t)return e;let[r]=i.match(eU)||[];if(!r)return e;let n=i.replace(r,\"\"),s=+!!tr.has(t);return r!==i&&(s*=100),t+\"(\"+s+n+\")\"}let ts=/\\b([a-z-]*)\\(.*?\\)/gu,to={...ti,getAnimatableNone:e=>{let t=e.match(ts);return t?t.map(tn).join(\" \"):e}},ta={...e_,transform:Math.round},tl={borderWidth:eJ,borderTopWidth:eJ,borderRightWidth:eJ,borderBottomWidth:eJ,borderLeftWidth:eJ,borderRadius:eJ,radius:eJ,borderTopLeftRadius:eJ,borderTopRightRadius:eJ,borderBottomRightRadius:eJ,borderBottomLeftRadius:eJ,width:eJ,maxWidth:eJ,height:eJ,maxHeight:eJ,top:eJ,right:eJ,bottom:eJ,left:eJ,padding:eJ,paddingTop:eJ,paddingRight:eJ,paddingBottom:eJ,paddingLeft:eJ,margin:eJ,marginTop:eJ,marginRight:eJ,marginBottom:eJ,marginLeft:eJ,backgroundPositionX:eJ,backgroundPositionY:eJ,rotate:eK,rotateX:eK,rotateY:eK,rotateZ:eK,scale:eB,scaleX:eB,scaleY:eB,scaleZ:eB,skew:eK,skewX:eK,skewY:eK,distance:eJ,translateX:eJ,translateY:eJ,translateZ:eJ,x:eJ,y:eJ,z:eJ,perspective:eJ,transformPerspective:eJ,opacity:eI,originX:e1,originY:e1,originZ:eJ,zIndex:ta,size:eJ,fillOpacity:eI,strokeOpacity:eI,numOctaves:ta},tu={...tl,color:e5,backgroundColor:e5,outlineColor:e5,fill:e5,stroke:e5,borderColor:e5,borderTopColor:e5,borderRightColor:e5,borderBottomColor:e5,borderLeftColor:e5,filter:to,WebkitFilter:to},th=e=>tu[e];function tc(e,t){let i=th(e);return i!==to&&(i=ti),i.getAnimatableNone?i.getAnimatableNone(t):void 0}let td=new Set([\"auto\",\"none\",\"0\"]),tp=e=>e===e_||e===eJ,tm=(e,t)=>parseFloat(e.split(\", \")[t]),tf=(e,t)=>(i,{transform:r})=>{if(\"none\"===r||!r)return 0;let n=r.match(/^matrix3d\\((.+)\\)$/u);if(n)return tm(n[1],t);{let t=r.match(/^matrix\\((.+)\\)$/u);return t?tm(t[1],e):0}},tg=new Set([\"x\",\"y\",\"z\"]),tv=en.filter(e=>!tg.has(e)),tx={width:({x:e},{paddingLeft:t=\"0\",paddingRight:i=\"0\"})=>e.max-e.min-parseFloat(t)-parseFloat(i),height:({y:e},{paddingTop:t=\"0\",paddingBottom:i=\"0\"})=>e.max-e.min-parseFloat(t)-parseFloat(i),top:(e,{top:t})=>parseFloat(t),left:(e,{left:t})=>parseFloat(t),bottom:({y:e},{top:t})=>parseFloat(t)+(e.max-e.min),right:({x:e},{left:t})=>parseFloat(t)+(e.max-e.min),x:tf(4,13),y:tf(5,14)};tx.translateX=tx.x,tx.translateY=tx.y;let ty=new Set,tb=!1,tw=!1;function tj(){if(tw){let e=Array.from(ty).filter(e=>e.needsMeasurement),t=new Set(e.map(e=>e.element)),i=new Map;t.forEach(e=>{let t,r=(t=[],tv.forEach(i=>{let r=e.getValue(i);void 0!==r&&(t.push([i,r.get()]),r.set(+!!i.startsWith(\"scale\")))}),t);r.length&&(i.set(e,r),e.render())}),e.forEach(e=>e.measureInitialState()),t.forEach(e=>{e.render();let t=i.get(e);t&&t.forEach(([t,i])=>{var r;null==(r=e.getValue(t))||r.set(i)})}),e.forEach(e=>e.measureEndState()),e.forEach(e=>{void 0!==e.suspendedScrollY&&window.scrollTo(0,e.suspendedScrollY)})}tw=!1,tb=!1,ty.forEach(e=>e.complete()),ty.clear()}function tP(){ty.forEach(e=>{e.readKeyframes(),e.needsMeasurement&&(tw=!0)})}class tT{constructor(e,t,i,r,n,s=!1){this.isComplete=!1,this.isAsync=!1,this.needsMeasurement=!1,this.isScheduled=!1,this.unresolvedKeyframes=[...e],this.onComplete=t,this.name=i,this.motionValue=r,this.element=n,this.isAsync=s}scheduleResolve(){this.isScheduled=!0,this.isAsync?(ty.add(this),tb||(tb=!0,eh.read(tP),eh.resolveKeyframes(tj))):(this.readKeyframes(),this.complete())}readKeyframes(){let{unresolvedKeyframes:e,name:t,element:i,motionValue:r}=this;for(let n=0;n<e.length;n++)if(null===e[n])if(0===n){let n=null==r?void 0:r.get(),s=e[e.length-1];if(void 0!==n)e[0]=n;else if(i&&t){let r=i.readValue(t,s);null!=r&&(e[0]=r)}void 0===e[0]&&(e[0]=s),r&&void 0===n&&r.set(e[0])}else e[n]=e[n-1]}setFinalKeyframe(){}measureInitialState(){}renderEndStyles(){}measureEndState(){}complete(){this.isComplete=!0,this.onComplete(this.unresolvedKeyframes,this.finalKeyframe),ty.delete(this)}cancel(){this.isComplete||(this.isScheduled=!1,ty.delete(this))}resume(){this.isComplete||this.scheduleResolve()}}let tS=e=>t=>\"string\"==typeof t&&t.startsWith(e),tE=tS(\"--\"),tA=tS(\"var(--\"),tk=e=>!!tA(e)&&tM.test(e.split(\"/*\")[0].trim()),tM=/var\\(--(?:[\\w-]+\\s*|[\\w-]+\\s*,(?:\\s*[^)(\\s]|\\s*\\((?:[^)(]|\\([^)(]*\\))*\\))+\\s*)\\)$/iu,tC=/^var\\(--(?:([\\w-]+)|([\\w-]+), ?([a-zA-Z\\d ()%#.,-]+))\\)/u,tR=e=>t=>t.test(e),tN=[e_,eJ,eZ,eK,e0,eQ,{test:e=>\"auto\"===e,parse:e=>e}],tV=e=>tN.find(tR(e));class tD extends tT{constructor(e,t,i,r,n){super(e,t,i,r,n,!0)}readKeyframes(){let{unresolvedKeyframes:e,element:t,name:i}=this;if(!t||!t.current)return;super.readKeyframes();for(let i=0;i<e.length;i++){let r=e[i];if(\"string\"==typeof r&&tk(r=r.trim())){let n=function e(t,i,r=1){C(r<=4,`Max CSS variable fallback depth detected in property \"${t}\". This may indicate a circular fallback dependency.`);let[n,s]=function(e){let t=tC.exec(e);if(!t)return[,];let[,i,r,n]=t;return[`--${null!=i?i:r}`,n]}(t);if(!n)return;let o=window.getComputedStyle(i).getPropertyValue(n);if(o){let e=o.trim();return/^-?(?:\\d+(?:\\.\\d+)?|\\.\\d+)$/u.test(e)?parseFloat(e):e}return tk(s)?e(s,i,r+1):s}(r,t.current);void 0!==n&&(e[i]=n),i===e.length-1&&(this.finalKeyframe=r)}}if(this.resolveNoneKeyframes(),!eo.has(i)||2!==e.length)return;let[r,n]=e,s=tV(r),o=tV(n);if(s!==o)if(tp(s)&&tp(o))for(let t=0;t<e.length;t++){let i=e[t];\"string\"==typeof i&&(e[t]=parseFloat(i))}else this.needsMeasurement=!0}resolveNoneKeyframes(){let{unresolvedKeyframes:e,name:t}=this,i=[];for(let t=0;t<e.length;t++)(function(e){if(\"number\"==typeof e)return 0===e;if(null===e)return!0;return\"none\"===e||\"0\"===e||/^0[^.\\s]+$/u.test(e)})(e[t])&&i.push(t);i.length&&function(e,t,i){let r,n=0;for(;n<e.length&&!r;){let t=e[n];\"string\"==typeof t&&!td.has(t)&&e9(t).values.length&&(r=e[n]),n++}if(r&&i)for(let n of t)e[n]=tc(i,r)}(e,i,t)}measureInitialState(){let{element:e,unresolvedKeyframes:t,name:i}=this;if(!e||!e.current)return;\"height\"===i&&(this.suspendedScrollY=window.pageYOffset),this.measuredOrigin=tx[i](e.measureViewportBox(),window.getComputedStyle(e.current)),t[0]=this.measuredOrigin;let r=t[t.length-1];void 0!==r&&e.getValue(i,r).jump(r,!1)}measureEndState(){var e;let{element:t,name:i,unresolvedKeyframes:r}=this;if(!t||!t.current)return;let n=t.getValue(i);n&&n.jump(this.measuredOrigin,!1);let s=r.length-1,o=r[s];r[s]=tx[i](t.measureViewportBox(),window.getComputedStyle(t.current)),null!==o&&void 0===this.finalKeyframe&&(this.finalKeyframe=o),(null==(e=this.removedTransforms)?void 0:e.length)&&this.removedTransforms.forEach(([e,i])=>{t.getValue(e).set(i)}),this.resolveNoneKeyframes()}}let tL=(e,t)=>\"zIndex\"!==t&&!!(\"number\"==typeof e||Array.isArray(e)||\"string\"==typeof e&&(ti.test(e)||\"0\"===e)&&!e.startsWith(\"url(\")),tF=e=>null!==e;function tO(e,{repeat:t,repeatType:i=\"loop\"},r){let n=e.filter(tF),s=t&&\"loop\"!==i&&t%2==1?0:n.length-1;return s&&void 0!==r?r:n[s]}class t_{constructor({autoplay:e=!0,delay:t=0,type:i=\"keyframes\",repeat:r=0,repeatDelay:n=0,repeatType:s=\"loop\",...o}){this.isStopped=!1,this.hasAttemptedResolve=!1,this.createdAt=ef.now(),this.options={autoplay:e,delay:t,type:i,repeat:r,repeatDelay:n,repeatType:s,...o},this.updateFinishedPromise()}calcStartTime(){return this.resolvedAt&&this.resolvedAt-this.createdAt>40?this.resolvedAt:this.createdAt}get resolved(){return this._resolved||this.hasAttemptedResolve||(tP(),tj()),this._resolved}onKeyframesResolved(e,t){this.resolvedAt=ef.now(),this.hasAttemptedResolve=!0;let{name:i,type:r,velocity:n,delay:s,onComplete:o,onUpdate:a,isGenerator:l}=this.options;if(!l&&!function(e,t,i,r){let n=e[0];if(null===n)return!1;if(\"display\"===t||\"visibility\"===t)return!0;let s=e[e.length-1],o=tL(n,t),a=tL(s,t);return C(o===a,`You are trying to animate ${t} from \"${n}\" to \"${s}\". ${n} is not an animatable value - to enable this animation set ${n} to a value animatable to ${s} via the \\`style\\` property.`),!!o&&!!a&&(function(e){let t=e[0];if(1===e.length)return!0;for(let i=0;i<e.length;i++)if(e[i]!==t)return!0}(e)||(\"spring\"===i||I(i))&&r)}(e,i,r,n))if(s)this.options.duration=0;else{a&&a(tO(e,this.options,t)),o&&o(),this.resolveFinishedPromise();return}let u=this.initPlayback(e,t);!1!==u&&(this._resolved={keyframes:e,finalKeyframe:t,...u},this.onPostResolved())}onPostResolved(){}then(e,t){return this.currentFinishedPromise.then(e,t)}flatten(){this.options.type=\"keyframes\",this.options.ease=\"linear\"}updateFinishedPromise(){this.currentFinishedPromise=new Promise(e=>{this.resolveFinishedPromise=e})}}let tI=(e,t,i)=>e+(t-e)*i;function tB(e,t,i){return(i<0&&(i+=1),i>1&&(i-=1),i<1/6)?e+(t-e)*6*i:i<.5?t:i<2/3?e+(t-e)*(2/3-i)*6:e}function t$(e,t){return i=>i>0?t:e}let tU=(e,t,i)=>{let r=e*e,n=i*(t*t-r)+r;return n<0?0:Math.sqrt(n)},tz=[eX,eY,e2];function tW(e){let t=tz.find(t=>t.test(e));if(C(!!t,`'${e}' is not an animatable color. Use the equivalent color code instead.`),!t)return!1;let i=t.parse(e);return t===e2&&(i=function({hue:e,saturation:t,lightness:i,alpha:r}){e/=360,i/=100;let n=0,s=0,o=0;if(t/=100){let r=i<.5?i*(1+t):i+t-i*t,a=2*i-r;n=tB(a,r,e+1/3),s=tB(a,r,e),o=tB(a,r,e-1/3)}else n=s=o=i;return{red:Math.round(255*n),green:Math.round(255*s),blue:Math.round(255*o),alpha:r}}(i)),i}let tH=(e,t)=>{let i=tW(e),r=tW(t);if(!i||!r)return t$(e,t);let n={...i};return e=>(n.red=tU(i.red,r.red,e),n.green=tU(i.green,r.green,e),n.blue=tU(i.blue,r.blue,e),n.alpha=tI(i.alpha,r.alpha,e),eY.transform(n))},tq=(e,t)=>i=>t(e(i)),tY=(...e)=>e.reduce(tq),tX=new Set([\"none\",\"hidden\"]);function tG(e,t){return i=>tI(e,t,i)}function tK(e){return\"number\"==typeof e?tG:\"string\"==typeof e?tk(e)?t$:e5.test(e)?tH:tQ:Array.isArray(e)?tZ:\"object\"==typeof e?e5.test(e)?tH:tJ:t$}function tZ(e,t){let i=[...e],r=i.length,n=e.map((e,i)=>tK(e)(e,t[i]));return e=>{for(let t=0;t<r;t++)i[t]=n[t](e);return i}}function tJ(e,t){let i={...e,...t},r={};for(let n in i)void 0!==e[n]&&void 0!==t[n]&&(r[n]=tK(e[n])(e[n],t[n]));return e=>{for(let t in r)i[t]=r[t](e);return i}}let tQ=(e,t)=>{let i=ti.createTransformer(t),r=e9(e),n=e9(t);if(!(r.indexes.var.length===n.indexes.var.length&&r.indexes.color.length===n.indexes.color.length&&r.indexes.number.length>=n.indexes.number.length))return C(!0,`Complex values '${e}' and '${t}' too different to mix. Ensure all colors are of the same type, and that each contains the same quantity of number and color values. Falling back to instant transition.`),t$(e,t);if(tX.has(e)&&!n.values.length||tX.has(t)&&!r.values.length)return tX.has(e)?i=>i<=0?e:t:i=>i>=1?t:e;return tY(tZ(function(e,t){var i;let r=[],n={color:0,var:0,number:0};for(let s=0;s<t.values.length;s++){let o=t.types[s],a=e.indexes[o][n[o]],l=null!=(i=e.values[a])?i:0;r[s]=l,n[o]++}return r}(r,n),n.values),i)};function t0(e,t,i){return\"number\"==typeof e&&\"number\"==typeof t&&\"number\"==typeof i?tI(e,t,i):tK(e)(e,t)}function t1(e,t,i){var r,n;let s=Math.max(t-5,0);return r=i-e(s),(n=t-s)?1e3/n*r:0}let t2=.01,t5=2,t3=.005,t4=.5;function t6(e,t){return e*Math.sqrt(1-t*t)}let t8=[\"duration\",\"bounce\"],t9=[\"stiffness\",\"damping\",\"mass\"];function t7(e,t){return t.some(t=>void 0!==e[t])}function ie(e=.3,t=.3){let i,r=\"object\"!=typeof e?{visualDuration:e,keyframes:[0,1],bounce:t}:e,{restSpeed:n,restDelta:s}=r,o=r.keyframes[0],a=r.keyframes[r.keyframes.length-1],l={done:!1,value:o},{stiffness:u,damping:h,mass:c,duration:d,velocity:p,isResolvedFromDuration:m}=function(e){let t={velocity:0,stiffness:100,damping:10,mass:1,isResolvedFromDuration:!1,...e};if(!t7(e,t9)&&t7(e,t8))if(e.visualDuration){let i=2*Math.PI/(1.2*e.visualDuration),r=i*i,n=2*eO(.05,1,1-(e.bounce||0))*Math.sqrt(r);t={...t,mass:1,stiffness:r,damping:n}}else{let i=function({duration:e=800,bounce:t=.3,velocity:i=0,mass:r=1}){let n,s;C(e<=V(10),\"Spring duration must be 10 seconds or less\");let o=1-t;o=eO(.05,1,o),e=eO(.01,10,e/1e3),o<1?(n=t=>{let r=t*o,n=r*e;return .001-(r-i)/t6(t,o)*Math.exp(-n)},s=t=>{let r=t*o*e,s=Math.pow(o,2)*Math.pow(t,2)*e,a=Math.exp(-r),l=t6(Math.pow(t,2),o);return(r*i+i-s)*a*(-n(t)+.001>0?-1:1)/l}):(n=t=>-.001+Math.exp(-t*e)*((t-i)*e+1),s=t=>e*e*(i-t)*Math.exp(-t*e));let a=function(e,t,i){let r=i;for(let i=1;i<12;i++)r-=e(r)/t(r);return r}(n,s,5/e);if(e=V(e),isNaN(a))return{stiffness:100,damping:10,duration:e};{let t=Math.pow(a,2)*r;return{stiffness:t,damping:2*o*Math.sqrt(r*t),duration:e}}}(e);(t={...t,...i,mass:1}).isResolvedFromDuration=!0}return t}({...r,velocity:-((r.velocity||0)/1e3)}),f=p||0,g=h/(2*Math.sqrt(u*c)),v=a-o,x=Math.sqrt(u/c)/1e3,y=5>Math.abs(v);if(n||(n=y?t2:t5),s||(s=y?t3:t4),g<1){let e=t6(x,g);i=t=>a-Math.exp(-g*x*t)*((f+g*x*v)/e*Math.sin(e*t)+v*Math.cos(e*t))}else if(1===g)i=e=>a-Math.exp(-x*e)*(v+(f+x*v)*e);else{let e=x*Math.sqrt(g*g-1);i=t=>{let i=Math.exp(-g*x*t),r=Math.min(e*t,300);return a-i*((f+g*x*v)*Math.sinh(r)+e*v*Math.cosh(r))/e}}let b={calculatedDuration:m&&d||null,next:e=>{let t=i(e);if(m)l.done=e>=d;else{let r=0;g<1&&(r=0===e?V(f):t1(i,e,t));let o=Math.abs(a-t)<=s;l.done=Math.abs(r)<=n&&o}return l.value=l.done?a:t,l},toString:()=>{let e=Math.min(_(b),2e4),t=W(t=>b.next(e*t).value,e,30);return e+\"ms \"+t}};return b}function it({keyframes:e,velocity:t=0,power:i=.8,timeConstant:r=325,bounceDamping:n=10,bounceStiffness:s=500,modifyTarget:o,min:a,max:l,restDelta:u=.5,restSpeed:h}){let c,d,p=e[0],m={done:!1,value:p},f=i*t,g=p+f,v=void 0===o?g:o(g);v!==g&&(f=v-p);let x=e=>-f*Math.exp(-e/r),y=e=>v+x(e),b=e=>{let t=x(e),i=y(e);m.done=Math.abs(t)<=u,m.value=m.done?v:i},w=e=>{let t;if(t=m.value,void 0!==a&&t<a||void 0!==l&&t>l){var i;c=e,d=ie({keyframes:[m.value,(i=m.value,void 0===a?l:void 0===l||Math.abs(a-i)<Math.abs(l-i)?a:l)],velocity:t1(y,e,m.value),damping:n,stiffness:s,restDelta:u,restSpeed:h})}};return w(0),{calculatedDuration:null,next:e=>{let t=!1;return(d||void 0!==c||(t=!0,b(e),w(e)),void 0!==c&&e>=c)?d.next(e-c):(t||b(e),m)}}}let ii=eA(.42,0,1,1),ir=eA(0,0,.58,1),is=eA(.42,0,.58,1),io={linear:C,easeIn:ii,easeInOut:is,easeOut:ir,circIn:eD,circInOut:eF,circOut:eL,backIn:eR,backInOut:eN,backOut:eC,anticipate:eV},ia=e=>{if($(e)){C(4===e.length,\"Cubic bezier arrays must contain four numerical values.\");let[t,i,r,n]=e;return eA(t,i,r,n)}return\"string\"==typeof e?(C(void 0!==io[e],`Invalid easing type '${e}'`),io[e]):e};function il(e,t,{clamp:i=!0,ease:r,mixer:n}={}){let s=e.length;if(C(s===t.length,\"Both input and output ranges must be the same length\"),1===s)return()=>t[0];if(2===s&&t[0]===t[1])return()=>t[1];let o=e[0]===e[1];e[0]>e[s-1]&&(e=[...e].reverse(),t=[...t].reverse());let a=function(e,t,i){let r=[],n=i||t0,s=e.length-1;for(let i=0;i<s;i++){let s=n(e[i],e[i+1]);t&&(s=tY(Array.isArray(t)?t[i]||C:t,s)),r.push(s)}return r}(t,r,n),l=a.length,u=i=>{if(o&&i<e[0])return t[0];let r=0;if(l>1)for(;r<e.length-2&&!(i<e[r+1]);r++);let n=N(e[r],e[r+1],i);return a[r](n)};return i?t=>u(eO(e[0],e[s-1],t)):u}function iu({duration:e=300,keyframes:t,times:i,ease:r=\"easeInOut\"}){var n;let s,o=Array.isArray(r)&&\"number\"!=typeof r[0]?r.map(ia):ia(r),a={done:!1,value:t[0]},l=il((n=i&&i.length===t.length?i:(!function(e,t){let i=e[e.length-1];for(let r=1;r<=t;r++){let n=N(0,t,r);e.push(tI(i,1,n))}}(s=[0],t.length-1),s),n.map(t=>t*e)),t,{ease:Array.isArray(o)?o:t.map(()=>o||is).splice(0,t.length-1)});return{calculatedDuration:e,next:t=>(a.value=l(t),a.done=t>=e,a)}}let ih=e=>{let t=({timestamp:t})=>e(t);return{start:()=>eh.update(t,!0),stop:()=>ec(t),now:()=>ed.isProcessing?ed.timestamp:ef.now()}},ic={decay:it,inertia:it,tween:iu,keyframes:iu,spring:ie},id=e=>e/100;class ip extends t_{constructor(e){super(e),this.holdTime=null,this.cancelTime=null,this.currentTime=0,this.playbackSpeed=1,this.pendingPlayState=\"running\",this.startTime=null,this.state=\"idle\",this.stop=()=>{if(this.resolver.cancel(),this.isStopped=!0,\"idle\"===this.state)return;this.teardown();let{onStop:e}=this.options;e&&e()};const{name:t,motionValue:i,element:r,keyframes:n}=this.options,s=(null==r?void 0:r.KeyframeResolver)||tT,o=(e,t)=>this.onKeyframesResolved(e,t);this.resolver=new s(n,o,t,i,r),this.resolver.scheduleResolve()}flatten(){super.flatten(),this._resolved&&Object.assign(this._resolved,this.initPlayback(this._resolved.keyframes))}initPlayback(e){let t,i,{type:r=\"keyframes\",repeat:n=0,repeatDelay:s=0,repeatType:o,velocity:a=0}=this.options,l=I(r)?r:ic[r]||iu;l!==iu&&\"number\"!=typeof e[0]&&(t=tY(id,t0(e[0],e[1])),e=[0,100]);let u=l({...this.options,keyframes:e});\"mirror\"===o&&(i=l({...this.options,keyframes:[...e].reverse(),velocity:-a})),null===u.calculatedDuration&&(u.calculatedDuration=_(u));let{calculatedDuration:h}=u,c=h+s;return{generator:u,mirroredGenerator:i,mapPercentToKeyframes:t,calculatedDuration:h,resolvedDuration:c,totalDuration:c*(n+1)-s}}onPostResolved(){let{autoplay:e=!0}=this.options;this.play(),\"paused\"!==this.pendingPlayState&&e?this.state=this.pendingPlayState:this.pause()}tick(e,t=!1){let{resolved:i}=this;if(!i){let{keyframes:e}=this.options;return{done:!0,value:e[e.length-1]}}let{finalKeyframe:r,generator:n,mirroredGenerator:s,mapPercentToKeyframes:o,keyframes:a,calculatedDuration:l,totalDuration:u,resolvedDuration:h}=i;if(null===this.startTime)return n.next(0);let{delay:c,repeat:d,repeatType:p,repeatDelay:m,onUpdate:f}=this.options;this.speed>0?this.startTime=Math.min(this.startTime,e):this.speed<0&&(this.startTime=Math.min(e-u/this.speed,this.startTime)),t?this.currentTime=e:null!==this.holdTime?this.currentTime=this.holdTime:this.currentTime=Math.round(e-this.startTime)*this.speed;let g=this.currentTime-c*(this.speed>=0?1:-1),v=this.speed>=0?g<0:g>u;this.currentTime=Math.max(g,0),\"finished\"===this.state&&null===this.holdTime&&(this.currentTime=u);let x=this.currentTime,y=n;if(d){let e=Math.min(this.currentTime,u)/h,t=Math.floor(e),i=e%1;!i&&e>=1&&(i=1),1===i&&t--,(t=Math.min(t,d+1))%2&&(\"reverse\"===p?(i=1-i,m&&(i-=m/h)):\"mirror\"===p&&(y=s)),x=eO(0,1,i)*h}let b=v?{done:!1,value:a[0]}:y.next(x);o&&(b.value=o(b.value));let{done:w}=b;v||null===l||(w=this.speed>=0?this.currentTime>=u:this.currentTime<=0);let j=null===this.holdTime&&(\"finished\"===this.state||\"running\"===this.state&&w);return j&&void 0!==r&&(b.value=tO(a,this.options,r)),f&&f(b.value),j&&this.finish(),b}get duration(){let{resolved:e}=this;return e?e.calculatedDuration/1e3:0}get time(){return this.currentTime/1e3}set time(e){e=V(e),this.currentTime=e,null!==this.holdTime||0===this.speed?this.holdTime=e:this.driver&&(this.startTime=this.driver.now()-e/this.speed)}get speed(){return this.playbackSpeed}set speed(e){let t=this.playbackSpeed!==e;this.playbackSpeed=e,t&&(this.time=this.currentTime/1e3)}play(){if(this.resolver.isScheduled||this.resolver.resume(),!this._resolved){this.pendingPlayState=\"running\";return}if(this.isStopped)return;let{driver:e=ih,onPlay:t,startTime:i}=this.options;this.driver||(this.driver=e(e=>this.tick(e))),t&&t();let r=this.driver.now();null!==this.holdTime?this.startTime=r-this.holdTime:this.startTime?\"finished\"===this.state&&(this.startTime=r):this.startTime=null!=i?i:this.calcStartTime(),\"finished\"===this.state&&this.updateFinishedPromise(),this.cancelTime=this.startTime,this.holdTime=null,this.state=\"running\",this.driver.start()}pause(){var e;if(!this._resolved){this.pendingPlayState=\"paused\";return}this.state=\"paused\",this.holdTime=null!=(e=this.currentTime)?e:0}complete(){\"running\"!==this.state&&this.play(),this.pendingPlayState=this.state=\"finished\",this.holdTime=null}finish(){this.teardown(),this.state=\"finished\";let{onComplete:e}=this.options;e&&e()}cancel(){null!==this.cancelTime&&this.tick(this.cancelTime),this.teardown(),this.updateFinishedPromise()}teardown(){this.state=\"idle\",this.stopDriver(),this.resolveFinishedPromise(),this.updateFinishedPromise(),this.startTime=this.cancelTime=null,this.resolver.cancel()}stopDriver(){this.driver&&(this.driver.stop(),this.driver=void 0)}sample(e){return this.startTime=0,this.tick(e,!0)}}let im=new Set([\"opacity\",\"clipPath\",\"filter\",\"transform\"]),ig=R(()=>Object.hasOwnProperty.call(Element.prototype,\"animate\")),iv={anticipate:eV,backInOut:eN,circInOut:eF};class ix extends t_{constructor(e){super(e);const{name:t,motionValue:i,element:r,keyframes:n}=this.options;this.resolver=new tD(n,(e,t)=>this.onKeyframesResolved(e,t),t,i,r),this.resolver.scheduleResolve()}initPlayback(e,t){var i;let{duration:r=300,times:n,ease:s,type:o,motionValue:a,name:l,startTime:u}=this.options;if(!a.owner||!a.owner.current)return!1;if(\"string\"==typeof s&&z()&&s in iv&&(s=iv[s]),I((i=this.options).type)||\"spring\"===i.type||!function e(t){return!!(\"function\"==typeof t&&z()||!t||\"string\"==typeof t&&(t in q||z())||$(t)||Array.isArray(t)&&t.every(e))}(i.ease)){let{onComplete:t,onUpdate:i,motionValue:a,element:l,...u}=this.options,h=function(e,t){let i=new ip({...t,keyframes:e,repeat:0,delay:0,isGenerator:!0}),r={done:!1,value:e[0]},n=[],s=0;for(;!r.done&&s<2e4;)n.push((r=i.sample(s)).value),s+=10;return{times:void 0,keyframes:n,duration:s-10,ease:\"linear\"}}(e,u);1===(e=h.keyframes).length&&(e[1]=e[0]),r=h.duration,n=h.times,s=h.ease,o=\"keyframes\"}let h=function(e,t,i,{delay:r=0,duration:n=300,repeat:s=0,repeatType:o=\"loop\",ease:a=\"easeInOut\",times:l}={}){let u={[t]:i};l&&(u.offset=l);let h=function e(t,i){if(t)return\"function\"==typeof t&&z()?W(t,i):$(t)?H(t):Array.isArray(t)?t.map(t=>e(t,i)||q.easeOut):q[t]}(a,n);return Array.isArray(h)&&(u.easing=h),e.animate(u,{delay:r,duration:n,easing:Array.isArray(h)?\"linear\":h,fill:\"both\",iterations:s+1,direction:\"reverse\"===o?\"alternate\":\"normal\"})}(a.owner.current,l,e,{...this.options,duration:r,times:n,ease:s});return h.startTime=null!=u?u:this.calcStartTime(),this.pendingTimeline?(B(h,this.pendingTimeline),this.pendingTimeline=void 0):h.onfinish=()=>{let{onComplete:i}=this.options;a.set(tO(e,this.options,t)),i&&i(),this.cancel(),this.resolveFinishedPromise()},{animation:h,duration:r,times:n,type:o,ease:s,keyframes:e}}get duration(){let{resolved:e}=this;if(!e)return 0;let{duration:t}=e;return t/1e3}get time(){let{resolved:e}=this;if(!e)return 0;let{animation:t}=e;return(t.currentTime||0)/1e3}set time(e){let{resolved:t}=this;if(!t)return;let{animation:i}=t;i.currentTime=V(e)}get speed(){let{resolved:e}=this;if(!e)return 1;let{animation:t}=e;return t.playbackRate}set speed(e){let{resolved:t}=this;if(!t)return;let{animation:i}=t;i.playbackRate=e}get state(){let{resolved:e}=this;if(!e)return\"idle\";let{animation:t}=e;return t.playState}get startTime(){let{resolved:e}=this;if(!e)return null;let{animation:t}=e;return t.startTime}attachTimeline(e){if(this._resolved){let{resolved:t}=this;if(!t)return C;let{animation:i}=t;B(i,e)}else this.pendingTimeline=e;return C}play(){if(this.isStopped)return;let{resolved:e}=this;if(!e)return;let{animation:t}=e;\"finished\"===t.playState&&this.updateFinishedPromise(),t.play()}pause(){let{resolved:e}=this;if(!e)return;let{animation:t}=e;t.pause()}stop(){if(this.resolver.cancel(),this.isStopped=!0,\"idle\"===this.state)return;this.resolveFinishedPromise(),this.updateFinishedPromise();let{resolved:e}=this;if(!e)return;let{animation:t,keyframes:i,duration:r,type:n,ease:s,times:o}=e;if(\"idle\"===t.playState||\"finished\"===t.playState)return;if(this.time){let{motionValue:e,onUpdate:t,onComplete:a,element:l,...u}=this.options,h=new ip({...u,keyframes:i,duration:r,type:n,ease:s,times:o,isGenerator:!0}),c=V(this.time);e.setWithVelocity(h.sample(c-10).value,h.sample(c).value,10)}let{onStop:a}=this.options;a&&a(),this.cancel()}complete(){let{resolved:e}=this;e&&e.animation.finish()}cancel(){let{resolved:e}=this;e&&e.animation.cancel()}static supports(e){let{motionValue:t,name:i,repeatDelay:r,repeatType:n,damping:s,type:o}=e;if(!t||!t.owner||!(t.owner.current instanceof HTMLElement))return!1;let{onUpdate:a,transformTemplate:l}=t.owner.getProps();return ig()&&i&&im.has(i)&&!a&&!l&&!r&&\"mirror\"!==n&&0!==s&&\"inertia\"!==o}}let iy={type:\"spring\",stiffness:500,damping:25,restSpeed:10},ib={type:\"keyframes\",duration:.8},iw={type:\"keyframes\",ease:[.25,.1,.35,1],duration:.3},ij=(e,t,i,r={},n,s)=>o=>{let a=O(r,e)||{},l=a.delay||r.delay||0,{elapsed:u=0}=r;u-=V(l);let h={keyframes:Array.isArray(i)?i:[null,i],ease:\"easeOut\",velocity:t.getVelocity(),...a,delay:-u,onUpdate:e=>{t.set(e),a.onUpdate&&a.onUpdate(e)},onComplete:()=>{o(),a.onComplete&&a.onComplete()},name:e,motionValue:t,element:s?void 0:n};!function({when:e,delay:t,delayChildren:i,staggerChildren:r,staggerDirection:n,repeat:s,repeatType:o,repeatDelay:a,from:l,elapsed:u,...h}){return!!Object.keys(h).length}(a)&&(h={...h,...((e,{keyframes:t})=>t.length>2?ib:es.has(e)?e.startsWith(\"scale\")?{type:\"spring\",stiffness:550,damping:0===t[1]?2*Math.sqrt(550):30,restSpeed:10}:iy:iw)(e,h)}),h.duration&&(h.duration=V(h.duration)),h.repeatDelay&&(h.repeatDelay=V(h.repeatDelay)),void 0!==h.from&&(h.keyframes[0]=h.from);let c=!1;if(!1!==h.type&&(0!==h.duration||h.repeatDelay)||(h.duration=0,0===h.delay&&(c=!0)),c&&!s&&void 0!==t.get()){let e=tO(h.keyframes,a);if(void 0!==e)return eh.update(()=>{h.onUpdate(e),h.onComplete()}),new F([])}return!s&&ix.supports(h)?new ix(h):new ip(h)};function iP(e,t,{delay:i=0,transitionOverride:r,type:n}={}){var s;let{transition:o=e.getDefaultTransition(),transitionEnd:a,...l}=t;r&&(o=r);let u=[],h=n&&e.animationState&&e.animationState.getState()[n];for(let t in l){let r=e.getValue(t,null!=(s=e.latestValues[t])?s:null),n=l[t];if(void 0===n||h&&function({protectedKeys:e,needsAnimating:t},i){let r=e.hasOwnProperty(i)&&!0!==t[i];return t[i]=!1,r}(h,t))continue;let a={delay:i,...O(o||{},t)},c=!1;if(window.MotionHandoffAnimation){let i=e.props[eS];if(i){let e=window.MotionHandoffAnimation(i,t,eh);null!==e&&(a.startTime=e,c=!0)}}eP(e,t),r.start(ij(t,r,n,e.shouldReduceMotion&&eo.has(t)?{type:!1}:a,e,c));let d=r.animation;d&&u.push(d)}return a&&Promise.all(u).then(()=>{eh.update(()=>{a&&function(e,t){let{transitionEnd:i={},transition:r={},...n}=A(e,t)||{};for(let t in n={...n,...i}){let i=ea(n[t]);e.hasValue(t)?e.getValue(t).set(i):e.addValue(t,ew(i))}}(e,a)})}),u}function iT(e,t,i={}){var r;let n=A(e,t,\"exit\"===i.type?null==(r=e.presenceContext)?void 0:r.custom:void 0),{transition:s=e.getDefaultTransition()||{}}=n||{};i.transitionOverride&&(s=i.transitionOverride);let o=n?()=>Promise.all(iP(e,n,i)):()=>Promise.resolve(),a=e.variantChildren&&e.variantChildren.size?(r=0)=>{let{delayChildren:n=0,staggerChildren:o,staggerDirection:a}=s;return function(e,t,i=0,r=0,n=1,s){let o=[],a=(e.variantChildren.size-1)*r,l=1===n?(e=0)=>e*r:(e=0)=>a-e*r;return Array.from(e.variantChildren).sort(iS).forEach((e,r)=>{e.notify(\"AnimationStart\",t),o.push(iT(e,t,{...s,delay:i+l(r)}).then(()=>e.notify(\"AnimationComplete\",t)))}),Promise.all(o)}(e,t,n+r,o,a,i)}:()=>Promise.resolve(),{when:l}=s;if(!l)return Promise.all([o(),a(i.delay)]);{let[e,t]=\"beforeChildren\"===l?[o,a]:[a,o];return e().then(()=>t())}}function iS(e,t){return e.sortNodePosition(t)}let iE=M.length,iA=[...k].reverse(),ik=k.length;function iM(e=!1){return{isActive:e,protectedKeys:{},needsAnimating:{},prevResolvedValues:{}}}function iC(){return{animate:iM(!0),whileInView:iM(),whileHover:iM(),whileTap:iM(),whileDrag:iM(),whileFocus:iM(),exit:iM()}}class iR{constructor(e){this.isMounted=!1,this.node=e}update(){}}let iN=0;function iV(e,t,i,r={passive:!0}){return e.addEventListener(t,i,r),()=>e.removeEventListener(t,i)}function iD(e){return{point:{x:e.pageX,y:e.pageY}}}function iL(e,t,i,r){return iV(e,t,e=>J(e)&&i(e,iD(e)),r)}let iF=(e,t)=>Math.abs(e-t);class iO{constructor(e,t,{transformPagePoint:i,contextWindow:r,dragSnapToOrigin:n=!1}={}){if(this.startEvent=null,this.lastMoveEvent=null,this.lastMoveEventInfo=null,this.handlers={},this.contextWindow=window,this.updatePoint=()=>{var e,t;if(!(this.lastMoveEvent&&this.lastMoveEventInfo))return;let i=iB(this.lastMoveEventInfo,this.history),r=null!==this.startEvent,n=(e=i.offset,t={x:0,y:0},Math.sqrt(iF(e.x,t.x)**2+iF(e.y,t.y)**2)>=3);if(!r&&!n)return;let{point:s}=i,{timestamp:o}=ed;this.history.push({...s,timestamp:o});let{onStart:a,onMove:l}=this.handlers;r||(a&&a(this.lastMoveEvent,i),this.startEvent=this.lastMoveEvent),l&&l(this.lastMoveEvent,i)},this.handlePointerMove=(e,t)=>{this.lastMoveEvent=e,this.lastMoveEventInfo=i_(t,this.transformPagePoint),eh.update(this.updatePoint,!0)},this.handlePointerUp=(e,t)=>{this.end();let{onEnd:i,onSessionEnd:r,resumeAnimation:n}=this.handlers;if(this.dragSnapToOrigin&&n&&n(),!(this.lastMoveEvent&&this.lastMoveEventInfo))return;let s=iB(\"pointercancel\"===e.type?this.lastMoveEventInfo:i_(t,this.transformPagePoint),this.history);this.startEvent&&i&&i(e,s),r&&r(e,s)},!J(e))return;this.dragSnapToOrigin=n,this.handlers=t,this.transformPagePoint=i,this.contextWindow=r||window;const s=i_(iD(e),this.transformPagePoint),{point:o}=s,{timestamp:a}=ed;this.history=[{...o,timestamp:a}];const{onSessionStart:l}=t;l&&l(e,iB(s,this.history)),this.removeListeners=tY(iL(this.contextWindow,\"pointermove\",this.handlePointerMove),iL(this.contextWindow,\"pointerup\",this.handlePointerUp),iL(this.contextWindow,\"pointercancel\",this.handlePointerUp))}updateHandlers(e){this.handlers=e}end(){this.removeListeners&&this.removeListeners(),ec(this.updatePoint)}}function i_(e,t){return t?{point:t(e.point)}:e}function iI(e,t){return{x:e.x-t.x,y:e.y-t.y}}function iB({point:e},t){return{point:e,delta:iI(e,i$(t)),offset:iI(e,t[0]),velocity:function(e,t){if(e.length<2)return{x:0,y:0};let i=e.length-1,r=null,n=i$(e);for(;i>=0&&(r=e[i],!(n.timestamp-r.timestamp>V(.1)));)i--;if(!r)return{x:0,y:0};let s=(n.timestamp-r.timestamp)/1e3;if(0===s)return{x:0,y:0};let o={x:(n.x-r.x)/s,y:(n.y-r.y)/s};return o.x===1/0&&(o.x=0),o.y===1/0&&(o.y=0),o}(t,.1)}}function i$(e){return e[e.length-1]}function iU(e){return e&&\"object\"==typeof e&&Object.prototype.hasOwnProperty.call(e,\"current\")}function iz(e){return e.max-e.min}function iW(e,t,i,r=.5){e.origin=r,e.originPoint=tI(t.min,t.max,e.origin),e.scale=iz(i)/iz(t),e.translate=tI(i.min,i.max,e.origin)-e.originPoint,(e.scale>=.9999&&e.scale<=1.0001||isNaN(e.scale))&&(e.scale=1),(e.translate>=-.01&&e.translate<=.01||isNaN(e.translate))&&(e.translate=0)}function iH(e,t,i,r){iW(e.x,t.x,i.x,r?r.originX:void 0),iW(e.y,t.y,i.y,r?r.originY:void 0)}function iq(e,t,i){e.min=i.min+t.min,e.max=e.min+iz(t)}function iY(e,t,i){e.min=t.min-i.min,e.max=e.min+iz(t)}function iX(e,t,i){iY(e.x,t.x,i.x),iY(e.y,t.y,i.y)}function iG(e,t,i){return{min:void 0!==t?e.min+t:void 0,max:void 0!==i?e.max+i-(e.max-e.min):void 0}}function iK(e,t){let i=t.min-e.min,r=t.max-e.max;return t.max-t.min<e.max-e.min&&([i,r]=[r,i]),{min:i,max:r}}function iZ(e,t,i){return{min:iJ(e,t),max:iJ(e,i)}}function iJ(e,t){return\"number\"==typeof e?e:e[t]||0}let iQ=()=>({translate:0,scale:1,origin:0,originPoint:0}),i0=()=>({x:iQ(),y:iQ()}),i1=()=>({min:0,max:0}),i2=()=>({x:i1(),y:i1()});function i5(e){return[e(\"x\"),e(\"y\")]}function i3({top:e,left:t,right:i,bottom:r}){return{x:{min:t,max:i},y:{min:e,max:r}}}function i4(e){return void 0===e||1===e}function i6({scale:e,scaleX:t,scaleY:i}){return!i4(e)||!i4(t)||!i4(i)}function i8(e){return i6(e)||i9(e)||e.z||e.rotate||e.rotateX||e.rotateY||e.skewX||e.skewY}function i9(e){var t,i;return(t=e.x)&&\"0%\"!==t||(i=e.y)&&\"0%\"!==i}function i7(e,t,i,r,n){return void 0!==n&&(e=r+n*(e-r)),r+i*(e-r)+t}function re(e,t=0,i=1,r,n){e.min=i7(e.min,t,i,r,n),e.max=i7(e.max,t,i,r,n)}function rt(e,{x:t,y:i}){re(e.x,t.translate,t.scale,t.originPoint),re(e.y,i.translate,i.scale,i.originPoint)}function ri(e,t){e.min=e.min+t,e.max=e.max+t}function rr(e,t,i,r,n=.5){let s=tI(e.min,e.max,n);re(e,t,i,s,r)}function rn(e,t){rr(e.x,t.x,t.scaleX,t.scale,t.originX),rr(e.y,t.y,t.scaleY,t.scale,t.originY)}function rs(e,t){return i3(function(e,t){if(!t)return e;let i=t({x:e.left,y:e.top}),r=t({x:e.right,y:e.bottom});return{top:i.y,left:i.x,bottom:r.y,right:r.x}}(e.getBoundingClientRect(),t))}let ro=({current:e})=>e?e.ownerDocument.defaultView:null,ra=new WeakMap;class rl{constructor(e){this.openDragLock=null,this.isDragging=!1,this.currentDirection=null,this.originPoint={x:0,y:0},this.constraints=!1,this.hasMutatedConstraints=!1,this.elastic=i2(),this.visualElement=e}start(e,{snapToCursor:t=!1}={}){let{presenceContext:i}=this.visualElement;if(i&&!1===i.isPresent)return;let r=e=>{let{dragSnapToOrigin:i}=this.getProps();i?this.pauseAnimation():this.stopAnimation(),t&&this.snapToCursor(iD(e).point)},n=(e,t)=>{let{drag:i,dragPropagation:r,onDragStart:n}=this.getProps();if(i&&!r&&(this.openDragLock&&this.openDragLock(),this.openDragLock=function(e){if(\"x\"===e||\"y\"===e)if(Y[e])return null;else return Y[e]=!0,()=>{Y[e]=!1};return Y.x||Y.y?null:(Y.x=Y.y=!0,()=>{Y.x=Y.y=!1})}(i),!this.openDragLock))return;this.isDragging=!0,this.currentDirection=null,this.resolveConstraints(),this.visualElement.projection&&(this.visualElement.projection.isAnimationBlocked=!0,this.visualElement.projection.target=void 0),i5(e=>{let t=this.getAxisMotionValue(e).get()||0;if(eZ.test(t)){let{projection:i}=this.visualElement;if(i&&i.layout){let r=i.layout.layoutBox[e];r&&(t=iz(r)*(parseFloat(t)/100))}}this.originPoint[e]=t}),n&&eh.postRender(()=>n(e,t)),eP(this.visualElement,\"transform\");let{animationState:s}=this.visualElement;s&&s.setActive(\"whileDrag\",!0)},s=(e,t)=>{let{dragPropagation:i,dragDirectionLock:r,onDirectionLock:n,onDrag:s}=this.getProps();if(!i&&!this.openDragLock)return;let{offset:o}=t;if(r&&null===this.currentDirection){this.currentDirection=function(e,t=10){let i=null;return Math.abs(e.y)>t?i=\"y\":Math.abs(e.x)>t&&(i=\"x\"),i}(o),null!==this.currentDirection&&n&&n(this.currentDirection);return}this.updateAxis(\"x\",t.point,o),this.updateAxis(\"y\",t.point,o),this.visualElement.render(),s&&s(e,t)},o=(e,t)=>this.stop(e,t),a=()=>i5(e=>{var t;return\"paused\"===this.getAnimationState(e)&&(null==(t=this.getAxisMotionValue(e).animation)?void 0:t.play())}),{dragSnapToOrigin:l}=this.getProps();this.panSession=new iO(e,{onSessionStart:r,onStart:n,onMove:s,onSessionEnd:o,resumeAnimation:a},{transformPagePoint:this.visualElement.getTransformPagePoint(),dragSnapToOrigin:l,contextWindow:ro(this.visualElement)})}stop(e,t){let i=this.isDragging;if(this.cancel(),!i)return;let{velocity:r}=t;this.startAnimation(r);let{onDragEnd:n}=this.getProps();n&&eh.postRender(()=>n(e,t))}cancel(){this.isDragging=!1;let{projection:e,animationState:t}=this.visualElement;e&&(e.isAnimationBlocked=!1),this.panSession&&this.panSession.end(),this.panSession=void 0;let{dragPropagation:i}=this.getProps();!i&&this.openDragLock&&(this.openDragLock(),this.openDragLock=null),t&&t.setActive(\"whileDrag\",!1)}updateAxis(e,t,i){let{drag:r}=this.getProps();if(!i||!ru(e,r,this.currentDirection))return;let n=this.getAxisMotionValue(e),s=this.originPoint[e]+i[e];this.constraints&&this.constraints[e]&&(s=function(e,{min:t,max:i},r){return void 0!==t&&e<t?e=r?tI(t,e,r.min):Math.max(e,t):void 0!==i&&e>i&&(e=r?tI(i,e,r.max):Math.min(e,i)),e}(s,this.constraints[e],this.elastic[e])),n.set(s)}resolveConstraints(){var e;let{dragConstraints:t,dragElastic:i}=this.getProps(),r=this.visualElement.projection&&!this.visualElement.projection.layout?this.visualElement.projection.measure(!1):null==(e=this.visualElement.projection)?void 0:e.layout,n=this.constraints;t&&iU(t)?this.constraints||(this.constraints=this.resolveRefConstraints()):t&&r?this.constraints=function(e,{top:t,left:i,bottom:r,right:n}){return{x:iG(e.x,i,n),y:iG(e.y,t,r)}}(r.layoutBox,t):this.constraints=!1,this.elastic=function(e=.35){return!1===e?e=0:!0===e&&(e=.35),{x:iZ(e,\"left\",\"right\"),y:iZ(e,\"top\",\"bottom\")}}(i),n!==this.constraints&&r&&this.constraints&&!this.hasMutatedConstraints&&i5(e=>{var t,i;let n;!1!==this.constraints&&this.getAxisMotionValue(e)&&(this.constraints[e]=(t=r.layoutBox[e],i=this.constraints[e],n={},void 0!==i.min&&(n.min=i.min-t.min),void 0!==i.max&&(n.max=i.max-t.min),n))})}resolveRefConstraints(){var e;let{dragConstraints:t,onMeasureDragConstraints:i}=this.getProps();if(!t||!iU(t))return!1;let r=t.current;C(null!==r,\"If `dragConstraints` is set as a React ref, that ref must be passed to another component's `ref` prop.\");let{projection:n}=this.visualElement;if(!n||!n.layout)return!1;let s=function(e,t,i){let r=rs(e,i),{scroll:n}=t;return n&&(ri(r.x,n.offset.x),ri(r.y,n.offset.y)),r}(r,n.root,this.visualElement.getTransformPagePoint()),o=(e=n.layout.layoutBox,{x:iK(e.x,s.x),y:iK(e.y,s.y)});if(i){let e=i(function({x:e,y:t}){return{top:t.min,right:e.max,bottom:t.max,left:e.min}}(o));this.hasMutatedConstraints=!!e,e&&(o=i3(e))}return o}startAnimation(e){let{drag:t,dragMomentum:i,dragElastic:r,dragTransition:n,dragSnapToOrigin:s,onDragTransitionEnd:o}=this.getProps(),a=this.constraints||{};return Promise.all(i5(o=>{if(!ru(o,t,this.currentDirection))return;let l=a&&a[o]||{};s&&(l={min:0,max:0});let u={type:\"inertia\",velocity:i?e[o]:0,bounceStiffness:r?200:1e6,bounceDamping:r?40:1e7,timeConstant:750,restDelta:1,restSpeed:10,...n,...l};return this.startAxisValueAnimation(o,u)})).then(o)}startAxisValueAnimation(e,t){let i=this.getAxisMotionValue(e);return eP(this.visualElement,e),i.start(ij(e,i,0,t,this.visualElement,!1))}stopAnimation(){i5(e=>this.getAxisMotionValue(e).stop())}pauseAnimation(){i5(e=>{var t;return null==(t=this.getAxisMotionValue(e).animation)?void 0:t.pause()})}getAnimationState(e){var t;return null==(t=this.getAxisMotionValue(e).animation)?void 0:t.state}getAxisMotionValue(e){let t=`_drag${e.toUpperCase()}`,i=this.visualElement.getProps();return i[t]||this.visualElement.getValue(e,(i.initial?i.initial[e]:void 0)||0)}snapToCursor(e){i5(t=>{let{drag:i}=this.getProps();if(!ru(t,i,this.currentDirection))return;let{projection:r}=this.visualElement,n=this.getAxisMotionValue(t);if(r&&r.layout){let{min:i,max:s}=r.layout.layoutBox[t];n.set(e[t]-tI(i,s,.5))}})}scalePositionWithinConstraints(){if(!this.visualElement.current)return;let{drag:e,dragConstraints:t}=this.getProps(),{projection:i}=this.visualElement;if(!iU(t)||!i||!this.constraints)return;this.stopAnimation();let r={x:0,y:0};i5(e=>{let t=this.getAxisMotionValue(e);if(t&&!1!==this.constraints){var i,n;let s,o,a,l=t.get();r[e]=(i={min:l,max:l},n=this.constraints[e],s=.5,o=iz(i),(a=iz(n))>o?s=N(n.min,n.max-o,i.min):o>a&&(s=N(i.min,i.max-a,n.min)),eO(0,1,s))}});let{transformTemplate:n}=this.visualElement.getProps();this.visualElement.current.style.transform=n?n({},\"\"):\"none\",i.root&&i.root.updateScroll(),i.updateLayout(),this.resolveConstraints(),i5(t=>{if(!ru(t,e,null))return;let i=this.getAxisMotionValue(t),{min:n,max:s}=this.constraints[t];i.set(tI(n,s,r[t]))})}addListeners(){if(!this.visualElement.current)return;ra.set(this.visualElement,this);let e=iL(this.visualElement.current,\"pointerdown\",e=>{let{drag:t,dragListener:i=!0}=this.getProps();t&&i&&this.start(e)}),t=()=>{let{dragConstraints:e}=this.getProps();iU(e)&&e.current&&(this.constraints=this.resolveRefConstraints())},{projection:i}=this.visualElement,r=i.addEventListener(\"measure\",t);i&&!i.layout&&(i.root&&i.root.updateScroll(),i.updateLayout()),eh.read(t);let n=iV(window,\"resize\",()=>this.scalePositionWithinConstraints()),s=i.addEventListener(\"didUpdate\",({delta:e,hasLayoutChanged:t})=>{this.isDragging&&t&&(i5(t=>{let i=this.getAxisMotionValue(t);i&&(this.originPoint[t]+=e[t].translate,i.set(i.get()+e[t].translate))}),this.visualElement.render())});return()=>{n(),e(),r(),s&&s()}}getProps(){let e=this.visualElement.getProps(),{drag:t=!1,dragDirectionLock:i=!1,dragPropagation:r=!1,dragConstraints:n=!1,dragElastic:s=.35,dragMomentum:o=!0}=e;return{...e,drag:t,dragDirectionLock:i,dragPropagation:r,dragConstraints:n,dragElastic:s,dragMomentum:o}}}function ru(e,t,i){return(!0===t||t===e)&&(null===i||i===e)}let rh=e=>(t,i)=>{e&&eh.postRender(()=>e(t,i))};var rc=u;let rd=(0,u.createContext)(null),rp=(0,u.createContext)({}),rm=(0,u.createContext)({}),rf={hasAnimatedSinceResize:!0,hasEverUpdated:!1};function rg(e,t){return t.max===t.min?0:e/(t.max-t.min)*100}let rv={correct:(e,t)=>{if(!t.target)return e;if(\"string\"==typeof e)if(!eJ.test(e))return e;else e=parseFloat(e);let i=rg(e,t.target.x),r=rg(e,t.target.y);return`${i}% ${r}%`}},rx={},{schedule:ry,cancel:rb}=eu(queueMicrotask,!1);class rw extends rc.Component{componentDidMount(){let{visualElement:e,layoutGroup:t,switchLayoutGroup:i,layoutId:r}=this.props,{projection:n}=e;Object.assign(rx,rP),n&&(t.group&&t.group.add(n),i&&i.register&&r&&i.register(n),n.root.didUpdate(),n.addEventListener(\"animationComplete\",()=>{this.safeToRemove()}),n.setOptions({...n.options,onExitComplete:()=>this.safeToRemove()})),rf.hasEverUpdated=!0}getSnapshotBeforeUpdate(e){let{layoutDependency:t,visualElement:i,drag:r,isPresent:n}=this.props,s=i.projection;return s&&(s.isPresent=n,r||e.layoutDependency!==t||void 0===t?s.willUpdate():this.safeToRemove(),e.isPresent!==n&&(n?s.promote():s.relegate()||eh.postRender(()=>{let e=s.getStack();e&&e.members.length||this.safeToRemove()}))),null}componentDidUpdate(){let{projection:e}=this.props.visualElement;e&&(e.root.didUpdate(),ry.postRender(()=>{!e.currentAnimation&&e.isLead()&&this.safeToRemove()}))}componentWillUnmount(){let{visualElement:e,layoutGroup:t,switchLayoutGroup:i}=this.props,{projection:r}=e;r&&(r.scheduleCheckAfterUnmount(),t&&t.group&&t.group.remove(r),i&&i.deregister&&i.deregister(r))}safeToRemove(){let{safeToRemove:e}=this.props;e&&e()}render(){return null}}function rj(e){let[t,i]=function(e=!0){let t=(0,u.useContext)(rd);if(null===t)return[!0,null];let{isPresent:i,onExitComplete:r,register:n}=t,s=(0,u.useId)();(0,u.useEffect)(()=>{e&&n(s)},[e]);let o=(0,u.useCallback)(()=>e&&r&&r(s),[s,r,e]);return!i&&r?[!1,o]:[!0]}(),r=(0,rc.useContext)(rp);return(0,a.jsx)(rw,{...e,layoutGroup:r,switchLayoutGroup:(0,rc.useContext)(rm),isPresent:t,safeToRemove:i})}let rP={borderRadius:{...rv,applyTo:[\"borderTopLeftRadius\",\"borderTopRightRadius\",\"borderBottomLeftRadius\",\"borderBottomRightRadius\"]},borderTopLeftRadius:rv,borderTopRightRadius:rv,borderBottomLeftRadius:rv,borderBottomRightRadius:rv,boxShadow:{correct:(e,{treeScale:t,projectionDelta:i})=>{let r=ti.parse(e);if(r.length>5)return e;let n=ti.createTransformer(e),s=+(\"number\"!=typeof r[0]),o=i.x.scale*t.x,a=i.y.scale*t.y;r[0+s]/=o,r[1+s]/=a;let l=tI(o,a,.5);return\"number\"==typeof r[2+s]&&(r[2+s]/=l),\"number\"==typeof r[3+s]&&(r[3+s]/=l),n(r)}}},rT=(e,t)=>e.depth-t.depth;class rS{constructor(){this.children=[],this.isDirty=!1}add(e){eg(this.children,e),this.isDirty=!0}remove(e){ev(this.children,e),this.isDirty=!0}forEach(e){this.isDirty&&this.children.sort(rT),this.isDirty=!1,this.children.forEach(e)}}function rE(e){let t=ej(e)?e.get():e;return t&&\"object\"==typeof t&&t.mix&&t.toValue?t.toValue():t}let rA=[\"TopLeft\",\"TopRight\",\"BottomLeft\",\"BottomRight\"],rk=rA.length,rM=e=>\"string\"==typeof e?parseFloat(e):e,rC=e=>\"number\"==typeof e||eJ.test(e);function rR(e,t){return void 0!==e[t]?e[t]:e.borderRadius}let rN=rD(0,.5,eL),rV=rD(.5,.95,C);function rD(e,t,i){return r=>r<e?0:r>t?1:i(N(e,t,r))}function rL(e,t){e.min=t.min,e.max=t.max}function rF(e,t){rL(e.x,t.x),rL(e.y,t.y)}function rO(e,t){e.translate=t.translate,e.scale=t.scale,e.originPoint=t.originPoint,e.origin=t.origin}function r_(e,t,i,r,n){return e-=t,e=r+1/i*(e-r),void 0!==n&&(e=r+1/n*(e-r)),e}function rI(e,t,[i,r,n],s,o){!function(e,t=0,i=1,r=.5,n,s=e,o=e){if(eZ.test(t)&&(t=parseFloat(t),t=tI(o.min,o.max,t/100)-o.min),\"number\"!=typeof t)return;let a=tI(s.min,s.max,r);e===s&&(a-=t),e.min=r_(e.min,t,i,a,n),e.max=r_(e.max,t,i,a,n)}(e,t[i],t[r],t[n],t.scale,s,o)}let rB=[\"x\",\"scaleX\",\"originX\"],r$=[\"y\",\"scaleY\",\"originY\"];function rU(e,t,i,r){rI(e.x,t,rB,i?i.x:void 0,r?r.x:void 0),rI(e.y,t,r$,i?i.y:void 0,r?r.y:void 0)}function rz(e){return 0===e.translate&&1===e.scale}function rW(e){return rz(e.x)&&rz(e.y)}function rH(e,t){return e.min===t.min&&e.max===t.max}function rq(e,t){return Math.round(e.min)===Math.round(t.min)&&Math.round(e.max)===Math.round(t.max)}function rY(e,t){return rq(e.x,t.x)&&rq(e.y,t.y)}function rX(e){return iz(e.x)/iz(e.y)}function rG(e,t){return e.translate===t.translate&&e.scale===t.scale&&e.originPoint===t.originPoint}class rK{constructor(){this.members=[]}add(e){eg(this.members,e),e.scheduleRender()}remove(e){if(ev(this.members,e),e===this.prevLead&&(this.prevLead=void 0),e===this.lead){let e=this.members[this.members.length-1];e&&this.promote(e)}}relegate(e){let t,i=this.members.findIndex(t=>e===t);if(0===i)return!1;for(let e=i;e>=0;e--){let i=this.members[e];if(!1!==i.isPresent){t=i;break}}return!!t&&(this.promote(t),!0)}promote(e,t){let i=this.lead;if(e!==i&&(this.prevLead=i,this.lead=e,e.show(),i)){i.instance&&i.scheduleRender(),e.scheduleRender(),e.resumeFrom=i,t&&(e.resumeFrom.preserveOpacity=!0),i.snapshot&&(e.snapshot=i.snapshot,e.snapshot.latestValues=i.animationValues||i.latestValues),e.root&&e.root.isUpdating&&(e.isLayoutDirty=!0);let{crossfade:r}=e.options;!1===r&&i.hide()}}exitAnimationComplete(){this.members.forEach(e=>{let{options:t,resumingFrom:i}=e;t.onExitComplete&&t.onExitComplete(),i&&i.options.onExitComplete&&i.options.onExitComplete()})}scheduleRender(){this.members.forEach(e=>{e.instance&&e.scheduleRender(!1)})}removeLeadSnapshot(){this.lead&&this.lead.snapshot&&(this.lead.snapshot=void 0)}}let rZ={type:\"projectionFrame\",totalNodes:0,resolvedTargetDeltas:0,recalculatedProjection:0},rJ=\"u\">typeof window&&void 0!==window.MotionDebug,rQ=[\"\",\"X\",\"Y\",\"Z\"],r0={visibility:\"hidden\"},r1=0;function r2(e,t,i,r){let{latestValues:n}=t;n[e]&&(i[e]=n[e],t.setStaticValue(e,0),r&&(r[e]=0))}function r5({attachResizeListener:e,defaultParent:t,measureScroll:i,checkIsScrollRoot:r,resetTransform:n}){return class{constructor(e={},i=null==t?void 0:t()){this.id=r1++,this.animationId=0,this.children=new Set,this.options={},this.isTreeAnimating=!1,this.isAnimationBlocked=!1,this.isLayoutDirty=!1,this.isProjectionDirty=!1,this.isSharedProjectionDirty=!1,this.isTransformDirty=!1,this.updateManuallyBlocked=!1,this.updateBlockedByResize=!1,this.isUpdating=!1,this.isSVG=!1,this.needsReset=!1,this.shouldResetTransform=!1,this.hasCheckedOptimisedAppear=!1,this.treeScale={x:1,y:1},this.eventHandlers=new Map,this.hasTreeAnimated=!1,this.updateScheduled=!1,this.scheduleUpdate=()=>this.update(),this.projectionUpdateScheduled=!1,this.checkUpdateFailed=()=>{this.isUpdating&&(this.isUpdating=!1,this.clearAllSnapshots())},this.updateProjection=()=>{this.projectionUpdateScheduled=!1,rJ&&(rZ.totalNodes=rZ.resolvedTargetDeltas=rZ.recalculatedProjection=0),this.nodes.forEach(r6),this.nodes.forEach(nr),this.nodes.forEach(nn),this.nodes.forEach(r8),rJ&&window.MotionDebug.record(rZ)},this.resolvedRelativeTargetAt=0,this.hasProjected=!1,this.isVisible=!0,this.animationProgress=0,this.sharedNodes=new Map,this.latestValues=e,this.root=i?i.root||i:this,this.path=i?[...i.path,i]:[],this.parent=i,this.depth=i?i.depth+1:0;for(let e=0;e<this.path.length;e++)this.path[e].shouldResetTransform=!0;this.root===this&&(this.nodes=new rS)}addEventListener(e,t){return this.eventHandlers.has(e)||this.eventHandlers.set(e,new ex),this.eventHandlers.get(e).add(t)}notifyListeners(e,...t){let i=this.eventHandlers.get(e);i&&i.notify(...t)}hasListeners(e){return this.eventHandlers.has(e)}mount(t,i=this.root.hasTreeAnimated){if(this.instance)return;this.isSVG=t instanceof SVGElement&&\"svg\"!==t.tagName,this.instance=t;let{layoutId:r,layout:n,visualElement:s}=this.options;if(s&&!s.current&&s.mount(t),this.root.nodes.add(this),this.parent&&this.parent.children.add(this),i&&(n||r)&&(this.isLayoutDirty=!0),e){let i,r=()=>this.root.updateBlockedByResize=!1;e(t,()=>{let e,t;this.root.updateBlockedByResize=!0,i&&i(),e=ef.now(),t=({timestamp:i})=>{let n=i-e;n>=250&&(ec(t),r(n-250))},eh.read(t,!0),i=()=>ec(t),rf.hasAnimatedSinceResize&&(rf.hasAnimatedSinceResize=!1,this.nodes.forEach(ni))})}r&&this.root.registerSharedNode(r,this),!1!==this.options.animate&&s&&(r||n)&&this.addEventListener(\"didUpdate\",({delta:e,hasLayoutChanged:t,hasRelativeTargetChanged:i,layout:r})=>{if(this.isTreeAnimationBlocked()){this.target=void 0,this.relativeTarget=void 0;return}let n=this.options.transition||s.getDefaultTransition()||nh,{onLayoutAnimationStart:o,onLayoutAnimationComplete:a}=s.getProps(),l=!this.targetLayout||!rY(this.targetLayout,r)||i,u=!t&&i;if(this.options.layoutRoot||this.resumeFrom&&this.resumeFrom.instance||u||t&&(l||!this.currentAnimation)){this.resumeFrom&&(this.resumingFrom=this.resumeFrom,this.resumingFrom.resumingFrom=void 0),this.setAnimationOrigin(e,u);let t={...O(n,\"layout\"),onPlay:o,onComplete:a};(s.shouldReduceMotion||this.options.layoutRoot)&&(t.delay=0,t.type=!1),this.startAnimation(t)}else t||ni(this),this.isLead()&&this.options.onExitComplete&&this.options.onExitComplete();this.targetLayout=r})}unmount(){this.options.layoutId&&this.willUpdate(),this.root.nodes.remove(this);let e=this.getStack();e&&e.remove(this),this.parent&&this.parent.children.delete(this),this.instance=void 0,ec(this.updateProjection)}blockUpdate(){this.updateManuallyBlocked=!0}unblockUpdate(){this.updateManuallyBlocked=!1}isUpdateBlocked(){return this.updateManuallyBlocked||this.updateBlockedByResize}isTreeAnimationBlocked(){return this.isAnimationBlocked||this.parent&&this.parent.isTreeAnimationBlocked()||!1}startUpdate(){!this.isUpdateBlocked()&&(this.isUpdating=!0,this.nodes&&this.nodes.forEach(ns),this.animationId++)}getTransformTemplate(){let{visualElement:e}=this.options;return e&&e.getProps().transformTemplate}willUpdate(e=!0){if(this.root.hasTreeAnimated=!0,this.root.isUpdateBlocked()){this.options.onExitComplete&&this.options.onExitComplete();return}if(window.MotionCancelOptimisedAnimation&&!this.hasCheckedOptimisedAppear&&function e(t){if(t.hasCheckedOptimisedAppear=!0,t.root===t)return;let{visualElement:i}=t.options;if(!i)return;let r=i.props[eS];if(window.MotionHasOptimisedAnimation(r,\"transform\")){let{layout:e,layoutId:i}=t.options;window.MotionCancelOptimisedAnimation(r,\"transform\",eh,!(e||i))}let{parent:n}=t;n&&!n.hasCheckedOptimisedAppear&&e(n)}(this),this.root.isUpdating||this.root.startUpdate(),this.isLayoutDirty)return;this.isLayoutDirty=!0;for(let e=0;e<this.path.length;e++){let t=this.path[e];t.shouldResetTransform=!0,t.updateScroll(\"snapshot\"),t.options.layoutRoot&&t.willUpdate(!1)}let{layoutId:t,layout:i}=this.options;if(void 0===t&&!i)return;let r=this.getTransformTemplate();this.prevTransformTemplateValue=r?r(this.latestValues,\"\"):void 0,this.updateSnapshot(),e&&this.notifyListeners(\"willUpdate\")}update(){if(this.updateScheduled=!1,this.isUpdateBlocked()){this.unblockUpdate(),this.clearAllSnapshots(),this.nodes.forEach(r7);return}this.isUpdating||this.nodes.forEach(ne),this.isUpdating=!1,this.nodes.forEach(nt),this.nodes.forEach(r3),this.nodes.forEach(r4),this.clearAllSnapshots();let e=ef.now();ed.delta=eO(0,1e3/60,e-ed.timestamp),ed.timestamp=e,ed.isProcessing=!0,ep.update.process(ed),ep.preRender.process(ed),ep.render.process(ed),ed.isProcessing=!1}didUpdate(){this.updateScheduled||(this.updateScheduled=!0,ry.read(this.scheduleUpdate))}clearAllSnapshots(){this.nodes.forEach(r9),this.sharedNodes.forEach(no)}scheduleUpdateProjection(){this.projectionUpdateScheduled||(this.projectionUpdateScheduled=!0,eh.preRender(this.updateProjection,!1,!0))}scheduleCheckAfterUnmount(){eh.postRender(()=>{this.isLayoutDirty?this.root.didUpdate():this.root.checkUpdateFailed()})}updateSnapshot(){!this.snapshot&&this.instance&&(this.snapshot=this.measure())}updateLayout(){if(!this.instance||(this.updateScroll(),!(this.options.alwaysMeasureLayout&&this.isLead())&&!this.isLayoutDirty))return;if(this.resumeFrom&&!this.resumeFrom.instance)for(let e=0;e<this.path.length;e++)this.path[e].updateScroll();let e=this.layout;this.layout=this.measure(!1),this.layoutCorrected=i2(),this.isLayoutDirty=!1,this.projectionDelta=void 0,this.notifyListeners(\"measure\",this.layout.layoutBox);let{visualElement:t}=this.options;t&&t.notify(\"LayoutMeasure\",this.layout.layoutBox,e?e.layoutBox:void 0)}updateScroll(e=\"measure\"){let t=!!(this.options.layoutScroll&&this.instance);if(this.scroll&&this.scroll.animationId===this.root.animationId&&this.scroll.phase===e&&(t=!1),t){let t=r(this.instance);this.scroll={animationId:this.root.animationId,phase:e,isRoot:t,offset:i(this.instance),wasRoot:this.scroll?this.scroll.isRoot:t}}}resetTransform(){if(!n)return;let e=this.isLayoutDirty||this.shouldResetTransform||this.options.alwaysMeasureLayout,t=this.projectionDelta&&!rW(this.projectionDelta),i=this.getTransformTemplate(),r=i?i(this.latestValues,\"\"):void 0,s=r!==this.prevTransformTemplateValue;e&&(t||i8(this.latestValues)||s)&&(n(this.instance,r),this.shouldResetTransform=!1,this.scheduleRender())}measure(e=!0){var t;let i=this.measurePageBox(),r=this.removeElementScroll(i);return e&&(r=this.removeTransform(r)),np((t=r).x),np(t.y),{animationId:this.root.animationId,measuredBox:i,layoutBox:r,latestValues:{},source:this.id}}measurePageBox(){var e;let{visualElement:t}=this.options;if(!t)return i2();let i=t.measureViewportBox();if(!((null==(e=this.scroll)?void 0:e.wasRoot)||this.path.some(nf))){let{scroll:e}=this.root;e&&(ri(i.x,e.offset.x),ri(i.y,e.offset.y))}return i}removeElementScroll(e){var t;let i=i2();if(rF(i,e),null==(t=this.scroll)?void 0:t.wasRoot)return i;for(let t=0;t<this.path.length;t++){let r=this.path[t],{scroll:n,options:s}=r;r!==this.root&&n&&s.layoutScroll&&(n.wasRoot&&rF(i,e),ri(i.x,n.offset.x),ri(i.y,n.offset.y))}return i}applyTransform(e,t=!1){let i=i2();rF(i,e);for(let e=0;e<this.path.length;e++){let r=this.path[e];!t&&r.options.layoutScroll&&r.scroll&&r!==r.root&&rn(i,{x:-r.scroll.offset.x,y:-r.scroll.offset.y}),i8(r.latestValues)&&rn(i,r.latestValues)}return i8(this.latestValues)&&rn(i,this.latestValues),i}removeTransform(e){let t=i2();rF(t,e);for(let e=0;e<this.path.length;e++){let i=this.path[e];if(!i.instance||!i8(i.latestValues))continue;i6(i.latestValues)&&i.updateSnapshot();let r=i2();rF(r,i.measurePageBox()),rU(t,i.latestValues,i.snapshot?i.snapshot.layoutBox:void 0,r)}return i8(this.latestValues)&&rU(t,this.latestValues),t}setTargetDelta(e){this.targetDelta=e,this.root.scheduleUpdateProjection(),this.isProjectionDirty=!0}setOptions(e){this.options={...this.options,...e,crossfade:void 0===e.crossfade||e.crossfade}}clearMeasurements(){this.scroll=void 0,this.layout=void 0,this.snapshot=void 0,this.prevTransformTemplateValue=void 0,this.targetDelta=void 0,this.target=void 0,this.isLayoutDirty=!1}forceRelativeParentToResolveTarget(){this.relativeParent&&this.relativeParent.resolvedRelativeTargetAt!==ed.timestamp&&this.relativeParent.resolveTargetDelta(!0)}resolveTargetDelta(e=!1){var t,i,r,n;let s=this.getLead();this.isProjectionDirty||(this.isProjectionDirty=s.isProjectionDirty),this.isTransformDirty||(this.isTransformDirty=s.isTransformDirty),this.isSharedProjectionDirty||(this.isSharedProjectionDirty=s.isSharedProjectionDirty);let o=!!this.resumingFrom||this!==s;if(!(e||o&&this.isSharedProjectionDirty||this.isProjectionDirty||(null==(t=this.parent)?void 0:t.isProjectionDirty)||this.attemptToResolveRelativeTarget||this.root.updateBlockedByResize))return;let{layout:a,layoutId:l}=this.options;if(this.layout&&(a||l)){if(this.resolvedRelativeTargetAt=ed.timestamp,!this.targetDelta&&!this.relativeTarget){let e=this.getClosestProjectingParent();e&&e.layout&&1!==this.animationProgress?(this.relativeParent=e,this.forceRelativeParentToResolveTarget(),this.relativeTarget=i2(),this.relativeTargetOrigin=i2(),iX(this.relativeTargetOrigin,this.layout.layoutBox,e.layout.layoutBox),rF(this.relativeTarget,this.relativeTargetOrigin)):this.relativeParent=this.relativeTarget=void 0}if(this.relativeTarget||this.targetDelta){if((this.target||(this.target=i2(),this.targetWithTransforms=i2()),this.relativeTarget&&this.relativeTargetOrigin&&this.relativeParent&&this.relativeParent.target)?(this.forceRelativeParentToResolveTarget(),i=this.target,r=this.relativeTarget,n=this.relativeParent.target,iq(i.x,r.x,n.x),iq(i.y,r.y,n.y)):this.targetDelta?(this.resumingFrom?this.target=this.applyTransform(this.layout.layoutBox):rF(this.target,this.layout.layoutBox),rt(this.target,this.targetDelta)):rF(this.target,this.layout.layoutBox),this.attemptToResolveRelativeTarget){this.attemptToResolveRelativeTarget=!1;let e=this.getClosestProjectingParent();e&&!!e.resumingFrom==!!this.resumingFrom&&!e.options.layoutScroll&&e.target&&1!==this.animationProgress?(this.relativeParent=e,this.forceRelativeParentToResolveTarget(),this.relativeTarget=i2(),this.relativeTargetOrigin=i2(),iX(this.relativeTargetOrigin,this.target,e.target),rF(this.relativeTarget,this.relativeTargetOrigin)):this.relativeParent=this.relativeTarget=void 0}rJ&&rZ.resolvedTargetDeltas++}}}getClosestProjectingParent(){if(!(!this.parent||i6(this.parent.latestValues)||i9(this.parent.latestValues)))if(this.parent.isProjecting())return this.parent;else return this.parent.getClosestProjectingParent()}isProjecting(){return!!((this.relativeTarget||this.targetDelta||this.options.layoutRoot)&&this.layout)}calcProjection(){var e;let t=this.getLead(),i=!!this.resumingFrom||this!==t,r=!0;if((this.isProjectionDirty||(null==(e=this.parent)?void 0:e.isProjectionDirty))&&(r=!1),i&&(this.isSharedProjectionDirty||this.isTransformDirty)&&(r=!1),this.resolvedRelativeTargetAt===ed.timestamp&&(r=!1),r)return;let{layout:n,layoutId:s}=this.options;if(this.isTreeAnimating=!!(this.parent&&this.parent.isTreeAnimating||this.currentAnimation||this.pendingAnimation),this.isTreeAnimating||(this.targetDelta=this.relativeTarget=void 0),!this.layout||!(n||s))return;rF(this.layoutCorrected,this.layout.layoutBox);let o=this.treeScale.x,a=this.treeScale.y;!function(e,t,i,r=!1){let n,s,o=i.length;if(o){t.x=t.y=1;for(let a=0;a<o;a++){s=(n=i[a]).projectionDelta;let{visualElement:o}=n.options;(!o||!o.props.style||\"contents\"!==o.props.style.display)&&(r&&n.options.layoutScroll&&n.scroll&&n!==n.root&&rn(e,{x:-n.scroll.offset.x,y:-n.scroll.offset.y}),s&&(t.x*=s.x.scale,t.y*=s.y.scale,rt(e,s)),r&&i8(n.latestValues)&&rn(e,n.latestValues))}t.x<1.0000000000001&&t.x>.999999999999&&(t.x=1),t.y<1.0000000000001&&t.y>.999999999999&&(t.y=1)}}(this.layoutCorrected,this.treeScale,this.path,i),t.layout&&!t.target&&(1!==this.treeScale.x||1!==this.treeScale.y)&&(t.target=t.layout.layoutBox,t.targetWithTransforms=i2());let{target:l}=t;if(!l){this.prevProjectionDelta&&(this.createProjectionDeltas(),this.scheduleRender());return}this.projectionDelta&&this.prevProjectionDelta?(rO(this.prevProjectionDelta.x,this.projectionDelta.x),rO(this.prevProjectionDelta.y,this.projectionDelta.y)):this.createProjectionDeltas(),iH(this.projectionDelta,this.layoutCorrected,l,this.latestValues),this.treeScale.x===o&&this.treeScale.y===a&&rG(this.projectionDelta.x,this.prevProjectionDelta.x)&&rG(this.projectionDelta.y,this.prevProjectionDelta.y)||(this.hasProjected=!0,this.scheduleRender(),this.notifyListeners(\"projectionUpdate\",l)),rJ&&rZ.recalculatedProjection++}hide(){this.isVisible=!1}show(){this.isVisible=!0}scheduleRender(e=!0){var t;if(null==(t=this.options.visualElement)||t.scheduleRender(),e){let e=this.getStack();e&&e.scheduleRender()}this.resumingFrom&&!this.resumingFrom.instance&&(this.resumingFrom=void 0)}createProjectionDeltas(){this.prevProjectionDelta=i0(),this.projectionDelta=i0(),this.projectionDeltaWithTransform=i0()}setAnimationOrigin(e,t=!1){let i,r=this.snapshot,n=r?r.latestValues:{},s={...this.latestValues},o=i0();this.relativeParent&&this.relativeParent.options.layoutRoot||(this.relativeTarget=this.relativeTargetOrigin=void 0),this.attemptToResolveRelativeTarget=!t;let a=i2(),l=(r?r.source:void 0)!==(this.layout?this.layout.source:void 0),u=this.getStack(),h=!u||u.members.length<=1,c=!!(l&&!h&&!0===this.options.crossfade&&!this.path.some(nu));this.animationProgress=0,this.mixTargetDelta=t=>{let r=t/1e3;if(na(o.x,e.x,r),na(o.y,e.y,r),this.setTargetDelta(o),this.relativeTarget&&this.relativeTargetOrigin&&this.layout&&this.relativeParent&&this.relativeParent.layout){var u,d,p,m,f,g;iX(a,this.layout.layoutBox,this.relativeParent.layout.layoutBox),p=this.relativeTarget,m=this.relativeTargetOrigin,f=a,g=r,nl(p.x,m.x,f.x,g),nl(p.y,m.y,f.y,g),i&&(u=this.relativeTarget,d=i,rH(u.x,d.x)&&rH(u.y,d.y))&&(this.isProjectionDirty=!1),i||(i=i2()),rF(i,this.relativeTarget)}l&&(this.animationValues=s,function(e,t,i,r,n,s){n?(e.opacity=tI(0,void 0!==i.opacity?i.opacity:1,rN(r)),e.opacityExit=tI(void 0!==t.opacity?t.opacity:1,0,rV(r))):s&&(e.opacity=tI(void 0!==t.opacity?t.opacity:1,void 0!==i.opacity?i.opacity:1,r));for(let n=0;n<rk;n++){let s=`border${rA[n]}Radius`,o=rR(t,s),a=rR(i,s);(void 0!==o||void 0!==a)&&(o||(o=0),a||(a=0),0===o||0===a||rC(o)===rC(a)?(e[s]=Math.max(tI(rM(o),rM(a),r),0),(eZ.test(a)||eZ.test(o))&&(e[s]+=\"%\")):e[s]=a)}(t.rotate||i.rotate)&&(e.rotate=tI(t.rotate||0,i.rotate||0,r))}(s,n,this.latestValues,r,c,h)),this.root.scheduleUpdateProjection(),this.scheduleRender(),this.animationProgress=r},this.mixTargetDelta(1e3*!!this.options.layoutRoot)}startAnimation(e){this.notifyListeners(\"animationStart\"),this.currentAnimation&&this.currentAnimation.stop(),this.resumingFrom&&this.resumingFrom.currentAnimation&&this.resumingFrom.currentAnimation.stop(),this.pendingAnimation&&(ec(this.pendingAnimation),this.pendingAnimation=void 0),this.pendingAnimation=eh.update(()=>{var t;let i;rf.hasAnimatedSinceResize=!0,this.currentAnimation=(t={...e,onUpdate:t=>{this.mixTargetDelta(t),e.onUpdate&&e.onUpdate(t)},onComplete:()=>{e.onComplete&&e.onComplete(),this.completeAnimation()}},(i=ej(0)?0:ew(0)).start(ij(\"\",i,1e3,t)),i.animation),this.resumingFrom&&(this.resumingFrom.currentAnimation=this.currentAnimation),this.pendingAnimation=void 0})}completeAnimation(){this.resumingFrom&&(this.resumingFrom.currentAnimation=void 0,this.resumingFrom.preserveOpacity=void 0);let e=this.getStack();e&&e.exitAnimationComplete(),this.resumingFrom=this.currentAnimation=this.animationValues=void 0,this.notifyListeners(\"animationComplete\")}finishAnimation(){this.currentAnimation&&(this.mixTargetDelta&&this.mixTargetDelta(1e3),this.currentAnimation.stop()),this.completeAnimation()}applyTransformsToTarget(){let e=this.getLead(),{targetWithTransforms:t,target:i,layout:r,latestValues:n}=e;if(t&&i&&r){if(this!==e&&this.layout&&r&&nm(this.options.animationType,this.layout.layoutBox,r.layoutBox)){i=this.target||i2();let t=iz(this.layout.layoutBox.x);i.x.min=e.target.x.min,i.x.max=i.x.min+t;let r=iz(this.layout.layoutBox.y);i.y.min=e.target.y.min,i.y.max=i.y.min+r}rF(t,i),rn(t,n),iH(this.projectionDeltaWithTransform,this.layoutCorrected,t,n)}}registerSharedNode(e,t){this.sharedNodes.has(e)||this.sharedNodes.set(e,new rK),this.sharedNodes.get(e).add(t);let i=t.options.initialPromotionConfig;t.promote({transition:i?i.transition:void 0,preserveFollowOpacity:i&&i.shouldPreserveFollowOpacity?i.shouldPreserveFollowOpacity(t):void 0})}isLead(){let e=this.getStack();return!e||e.lead===this}getLead(){var e;let{layoutId:t}=this.options;return t&&(null==(e=this.getStack())?void 0:e.lead)||this}getPrevLead(){var e;let{layoutId:t}=this.options;return t?null==(e=this.getStack())?void 0:e.prevLead:void 0}getStack(){let{layoutId:e}=this.options;if(e)return this.root.sharedNodes.get(e)}promote({needsReset:e,transition:t,preserveFollowOpacity:i}={}){let r=this.getStack();r&&r.promote(this,i),e&&(this.projectionDelta=void 0,this.needsReset=!0),t&&this.setOptions({transition:t})}relegate(){let e=this.getStack();return!!e&&e.relegate(this)}resetSkewAndRotation(){let{visualElement:e}=this.options;if(!e)return;let t=!1,{latestValues:i}=e;if((i.z||i.rotate||i.rotateX||i.rotateY||i.rotateZ||i.skewX||i.skewY)&&(t=!0),!t)return;let r={};i.z&&r2(\"z\",e,r,this.animationValues);for(let t=0;t<rQ.length;t++)r2(`rotate${rQ[t]}`,e,r,this.animationValues),r2(`skew${rQ[t]}`,e,r,this.animationValues);for(let t in e.render(),r)e.setStaticValue(t,r[t]),this.animationValues&&(this.animationValues[t]=r[t]);e.scheduleRender()}getProjectionStyles(e){var t,i;if(!this.instance||this.isSVG)return;if(!this.isVisible)return r0;let r={visibility:\"\"},n=this.getTransformTemplate();if(this.needsReset)return this.needsReset=!1,r.opacity=\"\",r.pointerEvents=rE(null==e?void 0:e.pointerEvents)||\"\",r.transform=n?n(this.latestValues,\"\"):\"none\",r;let s=this.getLead();if(!this.projectionDelta||!this.layout||!s.target){let t={};return this.options.layoutId&&(t.opacity=void 0!==this.latestValues.opacity?this.latestValues.opacity:1,t.pointerEvents=rE(null==e?void 0:e.pointerEvents)||\"\"),this.hasProjected&&!i8(this.latestValues)&&(t.transform=n?n({},\"\"):\"none\",this.hasProjected=!1),t}let o=s.animationValues||s.latestValues;this.applyTransformsToTarget(),r.transform=function(e,t,i){let r=\"\",n=e.x.translate/t.x,s=e.y.translate/t.y,o=(null==i?void 0:i.z)||0;if((n||s||o)&&(r=`translate3d(${n}px, ${s}px, ${o}px) `),(1!==t.x||1!==t.y)&&(r+=`scale(${1/t.x}, ${1/t.y}) `),i){let{transformPerspective:e,rotate:t,rotateX:n,rotateY:s,skewX:o,skewY:a}=i;e&&(r=`perspective(${e}px) ${r}`),t&&(r+=`rotate(${t}deg) `),n&&(r+=`rotateX(${n}deg) `),s&&(r+=`rotateY(${s}deg) `),o&&(r+=`skewX(${o}deg) `),a&&(r+=`skewY(${a}deg) `)}let a=e.x.scale*t.x,l=e.y.scale*t.y;return(1!==a||1!==l)&&(r+=`scale(${a}, ${l})`),r||\"none\"}(this.projectionDeltaWithTransform,this.treeScale,o),n&&(r.transform=n(o,r.transform));let{x:a,y:l}=this.projectionDelta;for(let e in r.transformOrigin=`${100*a.origin}% ${100*l.origin}% 0`,s.animationValues?r.opacity=s===this?null!=(i=null!=(t=o.opacity)?t:this.latestValues.opacity)?i:1:this.preserveOpacity?this.latestValues.opacity:o.opacityExit:r.opacity=s===this?void 0!==o.opacity?o.opacity:\"\":void 0!==o.opacityExit?o.opacityExit:0,rx){if(void 0===o[e])continue;let{correct:t,applyTo:i}=rx[e],n=\"none\"===r.transform?o[e]:t(o[e],s);if(i){let e=i.length;for(let t=0;t<e;t++)r[i[t]]=n}else r[e]=n}return this.options.layoutId&&(r.pointerEvents=s===this?rE(null==e?void 0:e.pointerEvents)||\"\":\"none\"),r}clearSnapshot(){this.resumeFrom=this.snapshot=void 0}resetTree(){this.root.nodes.forEach(e=>{var t;return null==(t=e.currentAnimation)?void 0:t.stop()}),this.root.nodes.forEach(r7),this.root.sharedNodes.clear()}}}function r3(e){e.updateLayout()}function r4(e){var t;let i=(null==(t=e.resumeFrom)?void 0:t.snapshot)||e.snapshot;if(e.isLead()&&e.layout&&i&&e.hasListeners(\"didUpdate\")){let{layoutBox:t,measuredBox:r}=e.layout,{animationType:n}=e.options,s=i.source!==e.layout.source;\"size\"===n?i5(e=>{let r=s?i.measuredBox[e]:i.layoutBox[e],n=iz(r);r.min=t[e].min,r.max=r.min+n}):nm(n,i.layoutBox,t)&&i5(r=>{let n=s?i.measuredBox[r]:i.layoutBox[r],o=iz(t[r]);n.max=n.min+o,e.relativeTarget&&!e.currentAnimation&&(e.isProjectionDirty=!0,e.relativeTarget[r].max=e.relativeTarget[r].min+o)});let o=i0();iH(o,t,i.layoutBox);let a=i0();s?iH(a,e.applyTransform(r,!0),i.measuredBox):iH(a,t,i.layoutBox);let l=!rW(o),u=!1;if(!e.resumeFrom){let r=e.getClosestProjectingParent();if(r&&!r.resumeFrom){let{snapshot:n,layout:s}=r;if(n&&s){let o=i2();iX(o,i.layoutBox,n.layoutBox);let a=i2();iX(a,t,s.layoutBox),rY(o,a)||(u=!0),r.options.layoutRoot&&(e.relativeTarget=a,e.relativeTargetOrigin=o,e.relativeParent=r)}}}e.notifyListeners(\"didUpdate\",{layout:t,snapshot:i,delta:a,layoutDelta:o,hasLayoutChanged:l,hasRelativeTargetChanged:u})}else if(e.isLead()){let{onExitComplete:t}=e.options;t&&t()}e.options.transition=void 0}function r6(e){rJ&&rZ.totalNodes++,e.parent&&(e.isProjecting()||(e.isProjectionDirty=e.parent.isProjectionDirty),e.isSharedProjectionDirty||(e.isSharedProjectionDirty=!!(e.isProjectionDirty||e.parent.isProjectionDirty||e.parent.isSharedProjectionDirty)),e.isTransformDirty||(e.isTransformDirty=e.parent.isTransformDirty))}function r8(e){e.isProjectionDirty=e.isSharedProjectionDirty=e.isTransformDirty=!1}function r9(e){e.clearSnapshot()}function r7(e){e.clearMeasurements()}function ne(e){e.isLayoutDirty=!1}function nt(e){let{visualElement:t}=e.options;t&&t.getProps().onBeforeLayoutMeasure&&t.notify(\"BeforeLayoutMeasure\"),e.resetTransform()}function ni(e){e.finishAnimation(),e.targetDelta=e.relativeTarget=e.target=void 0,e.isProjectionDirty=!0}function nr(e){e.resolveTargetDelta()}function nn(e){e.calcProjection()}function ns(e){e.resetSkewAndRotation()}function no(e){e.removeLeadSnapshot()}function na(e,t,i){e.translate=tI(t.translate,0,i),e.scale=tI(t.scale,1,i),e.origin=t.origin,e.originPoint=t.originPoint}function nl(e,t,i,r){e.min=tI(t.min,i.min,r),e.max=tI(t.max,i.max,r)}function nu(e){return e.animationValues&&void 0!==e.animationValues.opacityExit}let nh={duration:.45,ease:[.4,0,.1,1]},nc=e=>\"u\">typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().includes(e),nd=nc(\"applewebkit/\")&&!nc(\"chrome/\")?Math.round:C;function np(e){e.min=nd(e.min),e.max=nd(e.max)}function nm(e,t,i){return\"position\"===e||\"preserve-aspect\"===e&&!(.2>=Math.abs(rX(t)-rX(i)))}function nf(e){var t;return e!==e.root&&(null==(t=e.scroll)?void 0:t.wasRoot)}let ng=r5({attachResizeListener:(e,t)=>iV(e,\"resize\",t),measureScroll:()=>({x:document.documentElement.scrollLeft||document.body.scrollLeft,y:document.documentElement.scrollTop||document.body.scrollTop}),checkIsScrollRoot:()=>!0}),nv={current:void 0},nx=r5({measureScroll:e=>({x:e.scrollLeft,y:e.scrollTop}),defaultParent:()=>{if(!nv.current){let e=new ng({});e.mount(window),e.setOptions({layoutScroll:!0}),nv.current=e}return nv.current},resetTransform:(e,t)=>{e.style.transform=void 0!==t?t:\"none\"},checkIsScrollRoot:e=>\"fixed\"===window.getComputedStyle(e).position});function ny(e,t,i){let{props:r}=e;e.animationState&&r.whileHover&&e.animationState.setActive(\"whileHover\",\"Start\"===i);let n=r[\"onHover\"+i];n&&eh.postRender(()=>n(t,iD(t)))}function nb(e,t,i){let{props:r}=e;e.animationState&&r.whileTap&&e.animationState.setActive(\"whileTap\",\"Start\"===i);let n=r[\"onTap\"+(\"End\"===i?\"\":i)];n&&eh.postRender(()=>n(t,iD(t)))}let nw=new WeakMap,nj=new WeakMap,nP=e=>{let t=nw.get(e.target);t&&t(e)},nT=e=>{e.forEach(nP)},nS={some:0,all:1},nE=(0,u.createContext)({strict:!1}),nA=(0,u.createContext)({transformPagePoint:e=>e,isStatic:!1,reducedMotion:\"never\"}),nk=(0,u.createContext)({});function nM(e){return w(e.animate)||M.some(t=>T(e[t]))}function nC(e){return!!(nM(e)||e.variants)}function nR(e){return Array.isArray(e)?e.join(\" \"):e}let nN=\"u\">typeof window,nV={animation:[\"animate\",\"variants\",\"whileHover\",\"whileTap\",\"exit\",\"whileInView\",\"whileFocus\",\"whileDrag\"],exit:[\"exit\"],drag:[\"drag\",\"dragControls\"],focus:[\"whileFocus\"],hover:[\"whileHover\",\"onHoverStart\",\"onHoverEnd\"],tap:[\"whileTap\",\"onTap\",\"onTapStart\",\"onTapCancel\"],pan:[\"onPan\",\"onPanStart\",\"onPanSessionStart\",\"onPanEnd\"],inView:[\"whileInView\",\"onViewportEnter\",\"onViewportLeave\"],layout:[\"layout\",\"layoutId\"]},nD={};for(let e in nV)nD[e]={isEnabled:t=>nV[e].some(e=>!!t[e])};let nL=Symbol.for(\"motionComponentSymbol\"),nF=nN?u.useLayoutEffect:u.useEffect,nO=[\"animate\",\"circle\",\"defs\",\"desc\",\"ellipse\",\"g\",\"image\",\"line\",\"filter\",\"marker\",\"mask\",\"metadata\",\"path\",\"pattern\",\"polygon\",\"polyline\",\"rect\",\"stop\",\"switch\",\"symbol\",\"svg\",\"text\",\"tspan\",\"use\",\"view\"];function n_(e){if(\"string\"!=typeof e||e.includes(\"-\"));else if(nO.indexOf(e)>-1||/[A-Z]/u.test(e))return!0;return!1}function nI(e){let t=(0,u.useRef)(null);return null===t.current&&(t.current=e()),t.current}let nB=e=>(t,i)=>{let r=(0,u.useContext)(nk),n=(0,u.useContext)(rd),s=()=>(function({scrapeMotionValuesFromProps:e,createRenderState:t,onUpdate:i},r,n,s){let o={latestValues:function(e,t,i,r){let n={},s=r(e,{});for(let e in s)n[e]=rE(s[e]);let{initial:o,animate:a}=e,l=nM(e),u=nC(e);t&&u&&!l&&!1!==e.inherit&&(void 0===o&&(o=t.initial),void 0===a&&(a=t.animate));let h=!!i&&!1===i.initial,c=(h=h||!1===o)?a:o;if(c&&\"boolean\"!=typeof c&&!w(c)){let t=Array.isArray(c)?c:[c];for(let i=0;i<t.length;i++){let r=E(e,t[i]);if(r){let{transitionEnd:e,transition:t,...i}=r;for(let e in i){let t=i[e];if(Array.isArray(t)){let e=h?t.length-1:0;t=t[e]}null!==t&&(n[e]=t)}for(let t in e)n[t]=e[t]}}}return n}(r,n,s,e),renderState:t()};return i&&(o.onMount=e=>i({props:r,current:e,...o}),o.onUpdate=e=>i(e)),o})(e,t,r,n);return i?s():nI(s)},n$=(e,t)=>t&&\"number\"==typeof e?t.transform(e):e,nU={x:\"translateX\",y:\"translateY\",z:\"translateZ\",transformPerspective:\"perspective\"},nz=en.length;function nW(e,t,i){let{style:r,vars:n,transformOrigin:s}=e,o=!1,a=!1;for(let e in t){let i=t[e];if(es.has(e)){o=!0;continue}if(tE(e)){n[e]=i;continue}{let t=n$(i,tl[e]);e.startsWith(\"origin\")?(a=!0,s[e]=t):r[e]=t}}if(!t.transform&&(o||i?r.transform=function(e,t,i){let r=\"\",n=!0;for(let s=0;s<nz;s++){let o=en[s],a=e[o];if(void 0===a)continue;let l=!0;if(!(l=\"number\"==typeof a?a===+!!o.startsWith(\"scale\"):0===parseFloat(a))||i){let e=n$(a,tl[o]);if(!l){n=!1;let t=nU[o]||o;r+=`${t}(${e}) `}i&&(t[o]=e)}}return r=r.trim(),i?r=i(t,n?\"\":r):n&&(r=\"none\"),r}(t,e.transform,i):r.transform&&(r.transform=\"none\")),a){let{originX:e=\"50%\",originY:t=\"50%\",originZ:i=0}=s;r.transformOrigin=`${e} ${t} ${i}`}}let nH={offset:\"stroke-dashoffset\",array:\"stroke-dasharray\"},nq={offset:\"strokeDashoffset\",array:\"strokeDasharray\"};function nY(e,t,i){return\"string\"==typeof e?e:eJ.transform(t+i*e)}function nX(e,{attrX:t,attrY:i,attrScale:r,originX:n,originY:s,pathLength:o,pathSpacing:a=1,pathOffset:l=0,...u},h,c){let d,p;if(nW(e,u,c),h){e.style.viewBox&&(e.attrs.viewBox=e.style.viewBox);return}e.attrs=e.style,e.style={};let{attrs:m,style:f,dimensions:g}=e;m.transform&&(g&&(f.transform=m.transform),delete m.transform),g&&(void 0!==n||void 0!==s||f.transform)&&(d=nY(void 0!==n?n:.5,g.x,g.width),p=nY(void 0!==s?s:.5,g.y,g.height),f.transformOrigin=`${d} ${p}`),void 0!==t&&(m.x=t),void 0!==i&&(m.y=i),void 0!==r&&(m.scale=r),void 0!==o&&function(e,t,i=1,r=0,n=!0){e.pathLength=1;let s=n?nH:nq;e[s.offset]=eJ.transform(-r);let o=eJ.transform(t),a=eJ.transform(i);e[s.array]=`${o} ${a}`}(m,o,a,l,!1)}let nG=()=>({style:{},transform:{},transformOrigin:{},vars:{}}),nK=()=>({...nG(),attrs:{}}),nZ=e=>\"string\"==typeof e&&\"svg\"===e.toLowerCase();function nJ(e,{style:t,vars:i},r,n){for(let s in Object.assign(e.style,t,n&&n.getProjectionStyles(r)),i)e.style.setProperty(s,i[s])}let nQ=new Set([\"baseFrequency\",\"diffuseConstant\",\"kernelMatrix\",\"kernelUnitLength\",\"keySplines\",\"keyTimes\",\"limitingConeAngle\",\"markerHeight\",\"markerWidth\",\"numOctaves\",\"targetX\",\"targetY\",\"surfaceScale\",\"specularConstant\",\"specularExponent\",\"stdDeviation\",\"tableValues\",\"viewBox\",\"gradientTransform\",\"pathLength\",\"startOffset\",\"textLength\",\"lengthAdjust\"]);function n0(e,t,i,r){for(let i in nJ(e,t,void 0,r),t.attrs)e.setAttribute(nQ.has(i)?i:eT(i),t.attrs[i])}function n1(e,{layout:t,layoutId:i}){return es.has(e)||e.startsWith(\"origin\")||(t||void 0!==i)&&(!!rx[e]||\"opacity\"===e)}function n2(e,t,i){var r;let{style:n}=e,s={};for(let o in n)(ej(n[o])||t.style&&ej(t.style[o])||n1(o,e)||(null==(r=null==i?void 0:i.getValue(o))?void 0:r.liveStyle)!==void 0)&&(s[o]=n[o]);return s}function n5(e,t,i){let r=n2(e,t,i);for(let i in e)(ej(e[i])||ej(t[i]))&&(r[-1!==en.indexOf(i)?\"attr\"+i.charAt(0).toUpperCase()+i.substring(1):i]=e[i]);return r}let n3=[\"x\",\"y\",\"width\",\"height\",\"cx\",\"cy\",\"r\"],n4={useVisualState:nB({scrapeMotionValuesFromProps:n5,createRenderState:nK,onUpdate:({props:e,prevProps:t,current:i,renderState:r,latestValues:n})=>{if(!i)return;let s=!!e.drag;if(!s){for(let e in n)if(es.has(e)){s=!0;break}}if(!s)return;let o=!t;if(t)for(let i=0;i<n3.length;i++){let r=n3[i];e[r]!==t[r]&&(o=!0)}o&&eh.read(()=>{try{r.dimensions=\"function\"==typeof i.getBBox?i.getBBox():i.getBoundingClientRect()}catch(e){r.dimensions={x:0,y:0,width:0,height:0}}eh.render(()=>{nX(r,n,nZ(i.tagName),e.transformTemplate),n0(i,r)})})}})},n6={useVisualState:nB({scrapeMotionValuesFromProps:n2,createRenderState:nG})};function n8(e,t,i){for(let r in t)ej(t[r])||n1(r,i)||(e[r]=t[r])}let n9=new Set([\"animate\",\"exit\",\"variants\",\"initial\",\"style\",\"values\",\"variants\",\"transition\",\"transformTemplate\",\"custom\",\"inherit\",\"onBeforeLayoutMeasure\",\"onAnimationStart\",\"onAnimationComplete\",\"onUpdate\",\"onDragStart\",\"onDrag\",\"onDragEnd\",\"onMeasureDragConstraints\",\"onDirectionLock\",\"onDragTransitionEnd\",\"_dragX\",\"_dragY\",\"onHoverStart\",\"onHoverEnd\",\"onViewportEnter\",\"onViewportLeave\",\"globalTapTarget\",\"ignoreStrict\",\"viewport\"]);function n7(e){return e.startsWith(\"while\")||e.startsWith(\"drag\")&&\"draggable\"!==e||e.startsWith(\"layout\")||e.startsWith(\"onTap\")||e.startsWith(\"onPan\")||e.startsWith(\"onLayout\")||n9.has(e)}let se=e=>!n7(e);try{(n=(()=>{let e=Error(\"Cannot find module '@emotion/is-prop-valid'\");throw e.code=\"MODULE_NOT_FOUND\",e})().default)&&(se=e=>e.startsWith(\"on\")?!n7(e):n(e))}catch(e){}let st={current:null},si={current:!1};function sr(){if(si.current=!0,nN)if(window.matchMedia){let e=window.matchMedia(\"(prefers-reduced-motion)\"),t=()=>st.current=e.matches;e.addListener(t),t()}else st.current=!1}let sn=[...tN,e5,ti],ss=new WeakMap,so=[\"AnimationStart\",\"AnimationComplete\",\"Update\",\"BeforeLayoutMeasure\",\"LayoutMeasure\",\"LayoutAnimationStart\",\"LayoutAnimationComplete\"];class sa{scrapeMotionValuesFromProps(e,t,i){return{}}constructor({parent:e,props:t,presenceContext:i,reducedMotionConfig:r,blockInitialAnimation:n,visualState:s},o={}){this.current=null,this.children=new Set,this.isVariantNode=!1,this.isControllingVariants=!1,this.shouldReduceMotion=null,this.values=new Map,this.KeyframeResolver=tT,this.features={},this.valueSubscriptions=new Map,this.prevMotionValues={},this.events={},this.propEventSubscriptions={},this.notifyUpdate=()=>this.notify(\"Update\",this.latestValues),this.render=()=>{this.current&&(this.triggerBuild(),this.renderInstance(this.current,this.renderState,this.props.style,this.projection))},this.renderScheduledAt=0,this.scheduleRender=()=>{let e=ef.now();this.renderScheduledAt<e&&(this.renderScheduledAt=e,eh.render(this.render,!1,!0))};const{latestValues:a,renderState:l,onUpdate:u}=s;this.onUpdate=u,this.latestValues=a,this.baseTarget={...a},this.initialValues=t.initial?{...a}:{},this.renderState=l,this.parent=e,this.props=t,this.presenceContext=i,this.depth=e?e.depth+1:0,this.reducedMotionConfig=r,this.options=o,this.blockInitialAnimation=!!n,this.isControllingVariants=nM(t),this.isVariantNode=nC(t),this.isVariantNode&&(this.variantChildren=new Set),this.manuallyAnimateOnMount=!!(e&&e.current);const{willChange:h,...c}=this.scrapeMotionValuesFromProps(t,{},this);for(const e in c){const t=c[e];void 0!==a[e]&&ej(t)&&t.set(a[e],!1)}}mount(e){this.current=e,ss.set(e,this),this.projection&&!this.projection.instance&&this.projection.mount(e),this.parent&&this.isVariantNode&&!this.isControllingVariants&&(this.removeFromVariantTree=this.parent.addVariantChild(this)),this.values.forEach((e,t)=>this.bindToMotionValue(t,e)),si.current||sr(),this.shouldReduceMotion=\"never\"!==this.reducedMotionConfig&&(\"always\"===this.reducedMotionConfig||st.current),this.parent&&this.parent.children.add(this),this.update(this.props,this.presenceContext)}unmount(){for(let e in ss.delete(this.current),this.projection&&this.projection.unmount(),ec(this.notifyUpdate),ec(this.render),this.valueSubscriptions.forEach(e=>e()),this.valueSubscriptions.clear(),this.removeFromVariantTree&&this.removeFromVariantTree(),this.parent&&this.parent.children.delete(this),this.events)this.events[e].clear();for(let e in this.features){let t=this.features[e];t&&(t.unmount(),t.isMounted=!1)}this.current=null}bindToMotionValue(e,t){let i;this.valueSubscriptions.has(e)&&this.valueSubscriptions.get(e)();let r=es.has(e),n=t.on(\"change\",t=>{this.latestValues[e]=t,this.props.onUpdate&&eh.preRender(this.notifyUpdate),r&&this.projection&&(this.projection.isTransformDirty=!0)}),s=t.on(\"renderRequest\",this.scheduleRender);window.MotionCheckAppearSync&&(i=window.MotionCheckAppearSync(this,e,t)),this.valueSubscriptions.set(e,()=>{n(),s(),i&&i(),t.owner&&t.stop()})}sortNodePosition(e){return this.current&&this.sortInstanceNodePosition&&this.type===e.type?this.sortInstanceNodePosition(this.current,e.current):0}updateFeatures(){let e=\"animation\";for(e in nD){let t=nD[e];if(!t)continue;let{isEnabled:i,Feature:r}=t;if(!this.features[e]&&r&&i(this.props)&&(this.features[e]=new r(this)),this.features[e]){let t=this.features[e];t.isMounted?t.update():(t.mount(),t.isMounted=!0)}}}triggerBuild(){this.build(this.renderState,this.latestValues,this.props)}measureViewportBox(){return this.current?this.measureInstanceViewportBox(this.current,this.props):i2()}getStaticValue(e){return this.latestValues[e]}setStaticValue(e,t){this.latestValues[e]=t}update(e,t){(e.transformTemplate||this.props.transformTemplate)&&this.scheduleRender(),this.prevProps=this.props,this.props=e,this.prevPresenceContext=this.presenceContext,this.presenceContext=t;for(let t=0;t<so.length;t++){let i=so[t];this.propEventSubscriptions[i]&&(this.propEventSubscriptions[i](),delete this.propEventSubscriptions[i]);let r=e[\"on\"+i];r&&(this.propEventSubscriptions[i]=this.on(i,r))}this.prevMotionValues=function(e,t,i){for(let r in t){let n=t[r],s=i[r];if(ej(n))e.addValue(r,n);else if(ej(s))e.addValue(r,ew(n,{owner:e}));else if(s!==n)if(e.hasValue(r)){let t=e.getValue(r);!0===t.liveStyle?t.jump(n):t.hasAnimated||t.set(n)}else{let t=e.getStaticValue(r);e.addValue(r,ew(void 0!==t?t:n,{owner:e}))}}for(let r in i)void 0===t[r]&&e.removeValue(r);return t}(this,this.scrapeMotionValuesFromProps(e,this.prevProps,this),this.prevMotionValues),this.handleChildMotionValue&&this.handleChildMotionValue(),this.onUpdate&&this.onUpdate(this)}getProps(){return this.props}getVariant(e){return this.props.variants?this.props.variants[e]:void 0}getDefaultTransition(){return this.props.transition}getTransformPagePoint(){return this.props.transformPagePoint}getClosestVariantNode(){return this.isVariantNode?this:this.parent?this.parent.getClosestVariantNode():void 0}addVariantChild(e){let t=this.getClosestVariantNode();if(t)return t.variantChildren&&t.variantChildren.add(e),()=>t.variantChildren.delete(e)}addValue(e,t){let i=this.values.get(e);t!==i&&(i&&this.removeValue(e),this.bindToMotionValue(e,t),this.values.set(e,t),this.latestValues[e]=t.get())}removeValue(e){this.values.delete(e);let t=this.valueSubscriptions.get(e);t&&(t(),this.valueSubscriptions.delete(e)),delete this.latestValues[e],this.removeValueFromRenderState(e,this.renderState)}hasValue(e){return this.values.has(e)}getValue(e,t){if(this.props.values&&this.props.values[e])return this.props.values[e];let i=this.values.get(e);return void 0===i&&void 0!==t&&(i=ew(null===t?void 0:t,{owner:this}),this.addValue(e,i)),i}readValue(e,t){var i;let r=void 0===this.latestValues[e]&&this.current?null!=(i=this.getBaseTargetFromProps(this.props,e))?i:this.readValueFromInstance(this.current,e,this.options):this.latestValues[e];if(null!=r){let i,n;if(\"string\"==typeof r&&(i=r,/^-?(?:\\d+(?:\\.\\d+)?|\\.\\d+)$/u.test(i)||(n=r,/^0[^.\\s]+$/u.test(n))))r=parseFloat(r);else{let i;i=r,!sn.find(tR(i))&&ti.test(t)&&(r=tc(e,t))}this.setBaseTarget(e,ej(r)?r.get():r)}return ej(r)?r.get():r}setBaseTarget(e,t){this.baseTarget[e]=t}getBaseTarget(e){var t;let i,{initial:r}=this.props;if(\"string\"==typeof r||\"object\"==typeof r){let n=E(this.props,r,null==(t=this.presenceContext)?void 0:t.custom);n&&(i=n[e])}if(r&&void 0!==i)return i;let n=this.getBaseTargetFromProps(this.props,e);return void 0===n||ej(n)?void 0!==this.initialValues[e]&&void 0===i?void 0:this.baseTarget[e]:n}on(e,t){return this.events[e]||(this.events[e]=new ex),this.events[e].add(t)}notify(e,...t){this.events[e]&&this.events[e].notify(...t)}}class sl extends sa{constructor(){super(...arguments),this.KeyframeResolver=tD}sortInstanceNodePosition(e,t){return 2&e.compareDocumentPosition(t)?1:-1}getBaseTargetFromProps(e,t){return e.style?e.style[t]:void 0}removeValueFromRenderState(e,{vars:t,style:i}){delete t[e],delete i[e]}handleChildMotionValue(){this.childSubscription&&(this.childSubscription(),delete this.childSubscription);let{children:e}=this.props;ej(e)&&(this.childSubscription=e.on(\"change\",e=>{this.current&&(this.current.textContent=`${e}`)}))}}class su extends sl{constructor(){super(...arguments),this.type=\"html\",this.renderInstance=nJ}readValueFromInstance(e,t){if(es.has(t)){let e=th(t);return e&&e.default||0}{let i=window.getComputedStyle(e),r=(tE(t)?i.getPropertyValue(t):i[t])||0;return\"string\"==typeof r?r.trim():r}}measureInstanceViewportBox(e,{transformPagePoint:t}){return rs(e,t)}build(e,t,i){nW(e,t,i.transformTemplate)}scrapeMotionValuesFromProps(e,t,i){return n2(e,t,i)}}class sh extends sl{constructor(){super(...arguments),this.type=\"svg\",this.isSVGTag=!1,this.measureInstanceViewportBox=i2}getBaseTargetFromProps(e,t){return e[t]}readValueFromInstance(e,t){if(es.has(t)){let e=th(t);return e&&e.default||0}return t=nQ.has(t)?t:eT(t),e.getAttribute(t)}scrapeMotionValuesFromProps(e,t,i){return n5(e,t,i)}build(e,t,i){nX(e,t,this.isSVGTag,i.transformTemplate)}renderInstance(e,t,i,r){n0(e,t,i,r)}mount(e){this.isSVGTag=nZ(e.tagName),super.mount(e)}}let sc=function(e){if(\"u\"<typeof Proxy)return e;let t=new Map;return new Proxy((...t)=>e(...t),{get:(i,r)=>\"create\"===r?e:(t.has(r)||t.set(r,e(r)),t.get(r))})}((s={animation:{Feature:class extends iR{constructor(e){super(e),e.animationState||(e.animationState=function(e){let t=t=>Promise.all(t.map(({animation:t,options:i})=>(function(e,t,i={}){let r;if(e.notify(\"AnimationStart\",t),Array.isArray(t))r=Promise.all(t.map(t=>iT(e,t,i)));else if(\"string\"==typeof t)r=iT(e,t,i);else{let n=\"function\"==typeof t?A(e,t,i.custom):t;r=Promise.all(iP(e,n,i))}return r.then(()=>{e.notify(\"AnimationComplete\",t)})})(e,t,i))),i=iC(),r=!0,n=t=>(i,r)=>{var n;let s=A(e,r,\"exit\"===t?null==(n=e.presenceContext)?void 0:n.custom:void 0);if(s){let{transition:e,transitionEnd:t,...r}=s;i={...i,...r,...t}}return i};function s(s){let{props:o}=e,a=function e(t){if(!t)return;if(!t.isControllingVariants){let i=t.parent&&e(t.parent)||{};return void 0!==t.props.initial&&(i.initial=t.props.initial),i}let i={};for(let e=0;e<iE;e++){let r=M[e],n=t.props[r];(T(n)||!1===n)&&(i[r]=n)}return i}(e.parent)||{},l=[],u=new Set,h={},c=1/0;for(let t=0;t<ik;t++){var d,p;let m=iA[t],f=i[m],g=void 0!==o[m]?o[m]:a[m],v=T(g),x=m===s?f.isActive:null;!1===x&&(c=t);let y=g===a[m]&&g!==o[m]&&v;if(y&&r&&e.manuallyAnimateOnMount&&(y=!1),f.protectedKeys={...h},!f.isActive&&null===x||!g&&!f.prevProp||w(g)||\"boolean\"==typeof g)continue;let b=(d=f.prevProp,\"string\"==typeof(p=g)?p!==d:!!Array.isArray(p)&&!P(p,d)),S=b||m===s&&f.isActive&&!y&&v||t>c&&v,E=!1,A=Array.isArray(g)?g:[g],k=A.reduce(n(m),{});!1===x&&(k={});let{prevResolvedValues:M={}}=f,C={...M,...k},R=t=>{S=!0,u.has(t)&&(E=!0,u.delete(t)),f.needsAnimating[t]=!0;let i=e.getValue(t);i&&(i.liveStyle=!1)};for(let e in C){let t=k[e],i=M[e];if(!h.hasOwnProperty(e))(j(t)&&j(i)?P(t,i):t===i)?void 0!==t&&u.has(e)?R(e):f.protectedKeys[e]=!0:null!=t?R(e):u.add(e)}f.prevProp=g,f.prevResolvedValues=k,f.isActive&&(h={...h,...k}),r&&e.blockInitialAnimation&&(S=!1);let N=!(y&&b)||E;S&&N&&l.push(...A.map(e=>({animation:e,options:{type:m}})))}if(u.size){let t={};u.forEach(i=>{let r=e.getBaseTarget(i),n=e.getValue(i);n&&(n.liveStyle=!0),t[i]=null!=r?r:null}),l.push({animation:t})}let m=!!l.length;return r&&(!1===o.initial||o.initial===o.animate)&&!e.manuallyAnimateOnMount&&(m=!1),r=!1,m?t(l):Promise.resolve()}return{animateChanges:s,setActive:function(t,r){var n;if(i[t].isActive===r)return Promise.resolve();null==(n=e.variantChildren)||n.forEach(e=>{var i;return null==(i=e.animationState)?void 0:i.setActive(t,r)}),i[t].isActive=r;let o=s(t);for(let e in i)i[e].protectedKeys={};return o},setAnimateFunction:function(i){t=i(e)},getState:()=>i,reset:()=>{i=iC(),r=!0}}}(e))}updateAnimationControlsSubscription(){let{animate:e}=this.node.getProps();w(e)&&(this.unmountControls=e.subscribe(this.node))}mount(){this.updateAnimationControlsSubscription()}update(){let{animate:e}=this.node.getProps(),{animate:t}=this.node.prevProps||{};e!==t&&this.updateAnimationControlsSubscription()}unmount(){var e;this.node.animationState.reset(),null==(e=this.unmountControls)||e.call(this)}}},exit:{Feature:class extends iR{constructor(){super(...arguments),this.id=iN++}update(){if(!this.node.presenceContext)return;let{isPresent:e,onExitComplete:t}=this.node.presenceContext,{isPresent:i}=this.node.prevPresenceContext||{};if(!this.node.animationState||e===i)return;let r=this.node.animationState.setActive(\"exit\",!e);t&&!e&&r.then(()=>t(this.id))}mount(){let{register:e}=this.node.presenceContext||{};e&&(this.unmount=e(this.id))}unmount(){}}},inView:{Feature:class extends iR{constructor(){super(...arguments),this.hasEnteredView=!1,this.isInView=!1}startObserver(){var e;let t;this.unmount();let{viewport:i={}}=this.node.getProps(),{root:r,margin:n,amount:s=\"some\",once:o}=i,a={root:r?r.current:void 0,rootMargin:n,threshold:\"number\"==typeof s?s:nS[s]},l=e=>{let{isIntersecting:t}=e;if(this.isInView===t||(this.isInView=t,o&&!t&&this.hasEnteredView))return;t&&(this.hasEnteredView=!0),this.node.animationState&&this.node.animationState.setActive(\"whileInView\",t);let{onViewportEnter:i,onViewportLeave:r}=this.node.getProps(),n=t?i:r;n&&n(e)};return e=this.node.current,t=function({root:e,...t}){let i=e||document;nj.has(i)||nj.set(i,{});let r=nj.get(i),n=JSON.stringify(t);return r[n]||(r[n]=new IntersectionObserver(nT,{root:e,...t})),r[n]}(a),nw.set(e,l),t.observe(e),()=>{nw.delete(e),t.unobserve(e)}}mount(){this.startObserver()}update(){if(\"u\"<typeof IntersectionObserver)return;let{props:e,prevProps:t}=this.node;[\"amount\",\"margin\",\"root\"].some(function({viewport:e={}},{viewport:t={}}={}){return i=>e[i]!==t[i]}(e,t))&&this.startObserver()}unmount(){}}},tap:{Feature:class extends iR{mount(){let{current:e}=this.node;e&&(this.unmount=function(e,t,i={}){let[r,n,s]=G(e,i),o=e=>{let r=e.currentTarget;if(!er(e)||ee.has(r))return;ee.add(r);let s=t(e),o=(e,t)=>{window.removeEventListener(\"pointerup\",a),window.removeEventListener(\"pointercancel\",l),er(e)&&ee.has(r)&&(ee.delete(r),\"function\"==typeof s&&s(e,{success:t}))},a=e=>{o(e,i.useGlobalTarget||Z(r,e.target))},l=e=>{o(e,!1)};window.addEventListener(\"pointerup\",a,n),window.addEventListener(\"pointercancel\",l,n)};return r.forEach(e=>{Q.has(e.tagName)||-1!==e.tabIndex||null!==e.getAttribute(\"tabindex\")||(e.tabIndex=0),(i.useGlobalTarget?window:e).addEventListener(\"pointerdown\",o,n),e.addEventListener(\"focus\",e=>((e,t)=>{let i=e.currentTarget;if(!i)return;let r=et(()=>{if(ee.has(i))return;ei(i,\"down\");let e=et(()=>{ei(i,\"up\")});i.addEventListener(\"keyup\",e,t),i.addEventListener(\"blur\",()=>ei(i,\"cancel\"),t)});i.addEventListener(\"keydown\",r,t),i.addEventListener(\"blur\",()=>i.removeEventListener(\"keydown\",r),t)})(e,n),n)}),s}(e,e=>(nb(this.node,e,\"Start\"),(e,{success:t})=>nb(this.node,e,t?\"End\":\"Cancel\")),{useGlobalTarget:this.node.props.globalTapTarget}))}unmount(){}}},focus:{Feature:class extends iR{constructor(){super(...arguments),this.isActive=!1}onFocus(){let e=!1;try{e=this.node.current.matches(\":focus-visible\")}catch(t){e=!0}e&&this.node.animationState&&(this.node.animationState.setActive(\"whileFocus\",!0),this.isActive=!0)}onBlur(){this.isActive&&this.node.animationState&&(this.node.animationState.setActive(\"whileFocus\",!1),this.isActive=!1)}mount(){this.unmount=tY(iV(this.node.current,\"focus\",()=>this.onFocus()),iV(this.node.current,\"blur\",()=>this.onBlur()))}unmount(){}}},hover:{Feature:class extends iR{mount(){let{current:e}=this.node;e&&(this.unmount=function(e,t,i={}){let[r,n,s]=G(e,i),o=K(e=>{let{target:i}=e,r=t(e);if(\"function\"!=typeof r||!i)return;let s=K(e=>{r(e),i.removeEventListener(\"pointerleave\",s)});i.addEventListener(\"pointerleave\",s,n)});return r.forEach(e=>{e.addEventListener(\"pointerenter\",o,n)}),s}(e,e=>(ny(this.node,e,\"Start\"),e=>ny(this.node,e,\"End\"))))}unmount(){}}},pan:{Feature:class extends iR{constructor(){super(...arguments),this.removePointerDownListener=C}onPointerDown(e){this.session=new iO(e,this.createPanHandlers(),{transformPagePoint:this.node.getTransformPagePoint(),contextWindow:ro(this.node)})}createPanHandlers(){let{onPanSessionStart:e,onPanStart:t,onPan:i,onPanEnd:r}=this.node.getProps();return{onSessionStart:rh(e),onStart:rh(t),onMove:i,onEnd:(e,t)=>{delete this.session,r&&eh.postRender(()=>r(e,t))}}}mount(){this.removePointerDownListener=iL(this.node.current,\"pointerdown\",e=>this.onPointerDown(e))}update(){this.session&&this.session.updateHandlers(this.createPanHandlers())}unmount(){this.removePointerDownListener(),this.session&&this.session.end()}}},drag:{Feature:class extends iR{constructor(e){super(e),this.removeGroupControls=C,this.removeListeners=C,this.controls=new rl(e)}mount(){let{dragControls:e}=this.node.getProps();e&&(this.removeGroupControls=e.subscribe(this.controls)),this.removeListeners=this.controls.addListeners()||C}unmount(){this.removeGroupControls(),this.removeListeners()}},ProjectionNode:nx,MeasureLayout:rj},layout:{ProjectionNode:nx,MeasureLayout:rj}},o=(e,t)=>n_(e)?new sh(t):new su(t,{allowProjection:e!==u.Fragment}),function(e,{forwardMotionProps:t}={forwardMotionProps:!1}){return function({preloadedFeatures:e,createVisualElement:t,useRender:i,useVisualState:r,Component:n}){var s,o;function l(e,s){var o;let l,h={...(0,u.useContext)(nA),...e,layoutId:function({layoutId:e}){let t=(0,u.useContext)(rp).id;return t&&void 0!==e?t+\"-\"+e:e}(e)},{isStatic:c}=h,d=function(e){let{initial:t,animate:i}=function(e,t){if(nM(e)){let{initial:t,animate:i}=e;return{initial:!1===t||T(t)?t:void 0,animate:T(i)?i:void 0}}return!1!==e.inherit?t:{}}(e,(0,u.useContext)(nk));return(0,u.useMemo)(()=>({initial:t,animate:i}),[nR(t),nR(i)])}(e),p=r(e,c);if(!c&&nN){(0,u.useContext)(nE).strict;let e=function(e){let{drag:t,layout:i}=nD;if(!t&&!i)return{};let r={...t,...i};return{MeasureLayout:(null==t?void 0:t.isEnabled(e))||(null==i?void 0:i.isEnabled(e))?r.MeasureLayout:void 0,ProjectionNode:r.ProjectionNode}}(h);l=e.MeasureLayout,d.visualElement=function(e,t,i,r,n){var s,o;let{visualElement:a}=(0,u.useContext)(nk),l=(0,u.useContext)(nE),h=(0,u.useContext)(rd),c=(0,u.useContext)(nA).reducedMotion,d=(0,u.useRef)(null);r=r||l.renderer,!d.current&&r&&(d.current=r(e,{visualState:t,parent:a,props:i,presenceContext:h,blockInitialAnimation:!!h&&!1===h.initial,reducedMotionConfig:c}));let p=d.current,m=(0,u.useContext)(rm);p&&!p.projection&&n&&(\"html\"===p.type||\"svg\"===p.type)&&function(e,t,i,r){let{layoutId:n,layout:s,drag:o,dragConstraints:a,layoutScroll:l,layoutRoot:u}=t;e.projection=new i(e.latestValues,t[\"data-framer-portal-id\"]?void 0:function e(t){if(t)return!1!==t.options.allowProjection?t.projection:e(t.parent)}(e.parent)),e.projection.setOptions({layoutId:n,layout:s,alwaysMeasureLayout:!!o||a&&iU(a),visualElement:e,animationType:\"string\"==typeof s?s:\"both\",initialPromotionConfig:r,layoutScroll:l,layoutRoot:u})}(d.current,i,n,m);let f=(0,u.useRef)(!1);(0,u.useInsertionEffect)(()=>{p&&f.current&&p.update(i,h)});let g=i[eS],v=(0,u.useRef)(!!g&&!(null==(s=window.MotionHandoffIsComplete)?void 0:s.call(window,g))&&(null==(o=window.MotionHasOptimisedAnimation)?void 0:o.call(window,g)));return nF(()=>{p&&(f.current=!0,window.MotionIsMounted=!0,p.updateFeatures(),ry.render(p.render),v.current&&p.animationState&&p.animationState.animateChanges())}),(0,u.useEffect)(()=>{p&&(!v.current&&p.animationState&&p.animationState.animateChanges(),v.current&&(queueMicrotask(()=>{var e;null==(e=window.MotionHandoffMarkAsComplete)||e.call(window,g)}),v.current=!1))}),p}(n,p,h,t,e.ProjectionNode)}return(0,a.jsxs)(nk.Provider,{value:d,children:[l&&d.visualElement?(0,a.jsx)(l,{visualElement:d.visualElement,...h}):null,i(n,e,(o=d.visualElement,(0,u.useCallback)(e=>{e&&p.onMount&&p.onMount(e),o&&(e?o.mount(e):o.unmount()),s&&(\"function\"==typeof s?s(e):iU(s)&&(s.current=e))},[o])),p,c,d.visualElement)]})}e&&function(e){for(let t in e)nD[t]={...nD[t],...e[t]}}(e),l.displayName=`motion.${\"string\"==typeof n?n:`create(${null!=(o=null!=(s=n.displayName)?s:n.name)?o:\"\"})`}`;let h=(0,u.forwardRef)(l);return h[nL]=n,h}({...n_(e)?n4:n6,preloadedFeatures:s,useRender:function(e=!1){return(t,i,r,{latestValues:n},s)=>{let o=(n_(t)?function(e,t,i,r){let n=(0,u.useMemo)(()=>{let i=nK();return nX(i,t,nZ(r),e.transformTemplate),{...i.attrs,style:{...i.style}}},[t]);if(e.style){let t={};n8(t,e.style,e),n.style={...t,...n.style}}return n}:function(e,t){let i,r,n={},s=(i=e.style||{},n8(r={},i,e),Object.assign(r,function({transformTemplate:e},t){return(0,u.useMemo)(()=>{let i=nG();return nW(i,t,e),Object.assign({},i.vars,i.style)},[t])}(e,t)),r);return e.drag&&!1!==e.dragListener&&(n.draggable=!1,s.userSelect=s.WebkitUserSelect=s.WebkitTouchCallout=\"none\",s.touchAction=!0===e.drag?\"none\":`pan-${\"x\"===e.drag?\"y\":\"x\"}`),void 0===e.tabIndex&&(e.onTap||e.onTapStart||e.whileTap)&&(n.tabIndex=0),n.style=s,n})(i,n,s,t),a=function(e,t,i){let r={};for(let n in e)(\"values\"!==n||\"object\"!=typeof e.values)&&(se(n)||!0===i&&n7(n)||!t&&!n7(n)||e.draggable&&n.startsWith(\"onDrag\"))&&(r[n]=e[n]);return r}(i,\"string\"==typeof t,e),l=t!==u.Fragment?{...a,...o,ref:r}:{},{children:h}=i,c=(0,u.useMemo)(()=>ej(h)?h.get():h,[h]);return(0,u.createElement)(t,{...l,children:c})}}(t),createVisualElement:o,Component:e})})),sd={some:0,all:1};function sp(){si.current||sr();let[e]=(0,u.useState)(st.current);return e}let sm={type:\"spring\",stiffness:100,damping:20},sf={hidden:{opacity:0,y:24},visible:{opacity:1,y:0}};function sg({children:e,className:t=\"\",delayMs:i=0}){let r=(0,u.useRef)(null),n=sp(),s=function(e,{root:t,margin:i,amount:r,once:n=!1}={}){let[s,o]=(0,u.useState)(!1);return(0,u.useEffect)(()=>{if(!e.current||n&&s)return;let a={root:t&&t.current||void 0,margin:i,amount:r};return function(e,t,{root:i,margin:r,amount:n=\"some\"}={}){let s=X(e),o=new WeakMap,a=new IntersectionObserver(e=>{e.forEach(e=>{let i=o.get(e.target);if(!!i!==e.isIntersecting)if(e.isIntersecting){let i=t(e);\"function\"==typeof i?o.set(e.target,i):a.unobserve(e.target)}else\"function\"==typeof i&&(i(e),o.delete(e.target))})},{root:i,rootMargin:r,threshold:\"number\"==typeof n?n:sd[n]});return s.forEach(e=>a.observe(e)),()=>a.disconnect()}(e.current,()=>(o(!0),n?void 0:()=>o(!1)),a)},[t,e,i,n,r]),s}(r,{once:!0,margin:\"40px 0px -10% 0px\"});return(0,a.jsx)(sc.div,{ref:r,className:t,variants:sf,initial:n?\"visible\":\"hidden\",animate:s?\"visible\":\"hidden\",transition:{...sm,delay:i/1e3},children:e})}function sv(e,t,i){return Math.min(i,Math.max(t,e))}function sx(e,t,i){var r;let n=(r=1-Math.sqrt(sv(i,0,5)/5.2),Math.round(1e3*r)/1e3),s=0,o=0,a=0,l=0,u=0,h=!0,c=[0,0],d=[];for(let i=0;i<90;i+=1){i<10&&(e*a>0?o+=e*t:(o=e*t,s=0),a=e,u=l,h=!1);let r=(o-s)*n;s+=r;let p=(c=function(e,t){let i=e[1]??0,r=t-i;return[i,i+.23*r,i+.5*r,i+.77*r,t]}(c,r))[0]??0,m=Math.abs(p)>1?p:0;!h&&l-u>.18&&(h=!0),d.push(m),l+=.016666666666666666}let p=Math.max(1,...d.map(e=>Math.abs(e)));return{samples:d,trans:n,maxAbs:p}}function sy(e,t,i){let r,n,s,{maxAbs:o}=sx(e,t,i);return Math.min(6e3,(n=Math.pow(10,Math.floor(Math.log10(r=Math.max(1e-6,1.06*o)))),((s=r/n)<=1?1:s<=2?2:s<=5?5:10)*n))}function sb({className:e=\"\"}){let{t}=(0,x.useI18n)(),[i,r]=(0,u.useState)(33.6),[n,s]=(0,u.useState)(2.7),[o,l]=(0,u.useState)(4.35),h=(0,u.useRef)(null),[c,d]=(0,u.useState)(()=>Math.max(60,sy(33.6,2.7,4.35))),p=(0,u.useMemo)(()=>sx(i,n,o),[o,n,i]),m=(0,u.useMemo)(()=>{let e=p.samples,t=Math.max(2,e.length),i=e=>56+sv(e,0,t-1)/(t-1)*786,r=e=>236-sv(e,0,c)/c*218,n=e.map((e,t)=>({x:i(t),y:r(e)})),s=\"\";for(let e=0;e<n.length;e+=1){let t=n[e];s+=0===e?`M ${t.x.toFixed(2)} ${t.y.toFixed(2)}`:` L ${t.x.toFixed(2)} ${t.y.toFixed(2)}`}let o=r(0),a=`${s} L ${i(n.length-1).toFixed(2)} ${o.toFixed(2)} L ${i(0).toFixed(2)} ${o.toFixed(2)} Z`;return{VW:860,VH:280,padL:56,padR:18,padT:18,padB:44,points:n,d:s,fill:a,baselineY:o}},[p.samples,c]);return(0,u.useEffect)(()=>{let e;if(window.matchMedia?.(\"(prefers-reduced-motion: reduce)\")?.matches)return;let t=h.current;if(!t)return;let r=0,n=performance.now(),s=(e=(Math.log(sv(i,.01,100))-Math.log(.01))/Math.max(1e-6,Math.log(100)-Math.log(.01)),.0025+.042499999999999996*(1-sv(e,0,1))),o=e=>{let i=(e-n)%1580,a=m.points,l=sv(i/1260,0,1),u=sv(Math.round(l/s)*s,0,1)*(a.length-1),h=Math.floor(u),c=Math.min(a.length-1,h+1),d=sv(u-h,0,1),p=a[h]??a[0],f=a[c]??a[a.length-1],g=p.x+(f.x-p.x)*d,v=p.y+(f.y-p.y)*d,x=1;i<140&&(x=i/140);i>1440&&(x=1-(i-1440)/140),t.setAttribute(\"cx\",g.toFixed(2)),t.setAttribute(\"cy\",v.toFixed(2)),t.setAttribute(\"opacity\",sv(x,0,1).toFixed(2)),r=window.requestAnimationFrame(o)};return r=window.requestAnimationFrame(o),()=>window.cancelAnimationFrame(r)},[m.points,i]),(0,a.jsxs)(\"div\",{className:e,children:[(0,a.jsx)(\"div\",{className:\"rounded-2xl border border-white/10 bg-black/35 overflow-hidden\",children:(0,a.jsxs)(\"svg\",{viewBox:`0 0 ${m.VW} ${m.VH}`,className:\"block w-full h-auto\",\"aria-label\":t.easing.graphAria,children:[(0,a.jsx)(\"defs\",{children:(0,a.jsxs)(\"linearGradient\",{id:\"easeFill\",x1:\"0\",y1:\"0\",x2:\"0\",y2:\"1\",children:[(0,a.jsx)(\"stop\",{offset:\"0%\",stopColor:\"rgba(255,255,255,0.14)\"}),(0,a.jsx)(\"stop\",{offset:\"100%\",stopColor:\"rgba(255,255,255,0)\"})]})}),(0,a.jsxs)(\"g\",{stroke:\"rgba(255,255,255,0.08)\",strokeWidth:\"1\",children:[Array.from({length:7}).map((e,t)=>{let i=m.padL+t/6*(m.VW-m.padL-m.padR);return(0,a.jsx)(\"line\",{x1:i,y1:m.padT,x2:i,y2:m.VH-m.padB},t)}),Array.from({length:5}).map((e,t)=>{let i=m.padT+t/4*(m.VH-m.padT-m.padB);return(0,a.jsx)(\"line\",{x1:m.padL,y1:i,x2:m.VW-m.padR,y2:i},t)})]}),(0,a.jsx)(\"path\",{d:m.fill,fill:\"url(#easeFill)\",opacity:\"0.9\"}),(0,a.jsx)(\"path\",{d:m.d,fill:\"none\",stroke:\"rgba(255,255,255,0.92)\",strokeWidth:\"2\",strokeLinecap:\"round\",strokeLinejoin:\"round\",pathLength:1,strokeDasharray:1,strokeDashoffset:1,style:{animation:\"stroke-in 900ms var(--ease-out) both\"}},`${i}-${n}-${o}`),(0,a.jsx)(\"circle\",{ref:h,cx:m.padL,cy:m.baselineY,r:\"4.2\",fill:\"rgba(255,255,255,0.95)\"}),(0,a.jsx)(\"circle\",{cx:m.padL,cy:m.baselineY,r:\"2\",fill:\"rgba(255,255,255,0.55)\",opacity:\"0.7\"})]})}),(0,a.jsxs)(\"div\",{className:\"mt-4 grid gap-4 md:grid-cols-3\",children:[(0,a.jsxs)(\"div\",{className:\"rounded-2xl border border-white/10 bg-black/35 p-4\",children:[(0,a.jsxs)(\"div\",{className:\"flex items-center justify-between\",children:[(0,a.jsx)(\"div\",{className:\"font-display text-sm tracking-[0.18em] uppercase text-white/70\",children:t.easing.step.label}),(0,a.jsx)(\"div\",{className:\"font-mono text-xs text-white/55\",children:i.toFixed(2)})]}),(0,a.jsx)(\"input\",{className:\"mt-3 w-full range\",type:\"range\",min:.01,max:100,step:.01,value:i,onChange:e=>{let t=Number(e.target.value);r(t),d(e=>Math.max(e,sy(t,n,o)))},\"aria-label\":t.easing.step.aria}),(0,a.jsx)(\"div\",{className:\"mt-2 font-mono text-[11px] text-white/40\",children:t.easing.step.help})]}),(0,a.jsxs)(\"div\",{className:\"rounded-2xl border border-white/10 bg-black/35 p-4\",children:[(0,a.jsxs)(\"div\",{className:\"flex items-center justify-between\",children:[(0,a.jsx)(\"div\",{className:\"font-display text-sm tracking-[0.18em] uppercase text-white/70\",children:t.easing.gain.label}),(0,a.jsxs)(\"div\",{className:\"font-mono text-xs text-white/55\",children:[\"×\",n.toFixed(2)]})]}),(0,a.jsx)(\"input\",{className:\"mt-3 w-full range\",type:\"range\",min:1,max:10,step:.01,value:n,onChange:e=>{let t=Number(e.target.value);s(t),d(e=>Math.max(e,sy(i,t,o)))},\"aria-label\":t.easing.gain.aria}),(0,a.jsx)(\"div\",{className:\"mt-2 font-mono text-[11px] text-white/40\",children:t.easing.gain.help})]}),(0,a.jsxs)(\"div\",{className:\"rounded-2xl border border-white/10 bg-black/35 p-4\",children:[(0,a.jsxs)(\"div\",{className:\"flex items-center justify-between\",children:[(0,a.jsx)(\"div\",{className:\"font-display text-sm tracking-[0.18em] uppercase text-white/70\",children:t.easing.duration.label}),(0,a.jsx)(\"div\",{className:\"font-mono text-xs text-white/55\",children:o.toFixed(2)})]}),(0,a.jsx)(\"input\",{className:\"mt-3 w-full range\",type:\"range\",min:1,max:5,step:.01,value:o,onChange:e=>{let t=Number(e.target.value);l(t),d(e=>Math.max(e,sy(i,n,t)))},\"aria-label\":t.easing.duration.aria}),(0,a.jsx)(\"div\",{className:\"mt-2 font-mono text-[11px] text-white/40\",children:t.easing.duration.help})]})]}),(0,a.jsx)(\"div\",{className:\"mt-3 font-mono text-[11px] tracking-[0.18em] uppercase text-white/40\",children:t.easing.footer})]})}async function sw(e){try{return await navigator.clipboard.writeText(e),!0}catch{try{let t=document.createElement(\"textarea\");t.value=e,t.setAttribute(\"readonly\",\"\"),t.style.position=\"fixed\",t.style.top=\"-9999px\",document.body.appendChild(t),t.select();let i=document.execCommand(\"copy\");return document.body.removeChild(t),i}catch{return!1}}}function sj({value:e,children:t,className:i=\"\",copiedLabel:r=\"Copied\"}){let[n,s]=(0,u.useState)(!1),o=(0,u.useCallback)(async()=>{await sw(e)&&(s(!0),window.setTimeout(()=>s(!1),1400))},[e]);return(0,a.jsx)(\"button\",{type:\"button\",onClick:o,className:i,children:n?r:t})}var sP=e.i(7678);e.s([\"ERROR_REVALIDATE_EVENT\",()=>3,\"FOCUS_EVENT\",()=>0,\"MUTATE_EVENT\",()=>2,\"RECONNECT_EVENT\",()=>1],40822);var sT=Object.prototype.hasOwnProperty;let sS=new WeakMap,sE=()=>{},sA=sE(),sk=Object,sM=e=>e===sA,sC=(e,t)=>({...e,...t}),sR={},sN={},sV=\"undefined\",sD=typeof window!=sV,sL=typeof document!=sV,sF=sD&&\"Deno\"in window,sO=(e,t)=>{let i=sS.get(e);return[()=>!sM(t)&&e.get(t)||sR,r=>{if(!sM(t)){let n=e.get(t);t in sN||(sN[t]=n),i[5](t,sC(n,r),n||sR)}},i[6],()=>!sM(t)&&t in sN?sN[t]:!sM(t)&&e.get(t)||sR]},s_=!0,[sI,sB]=sD&&window.addEventListener?[window.addEventListener.bind(window),window.removeEventListener.bind(window)]:[sE,sE],s$={initFocus:e=>(sL&&document.addEventListener(\"visibilitychange\",e),sI(\"focus\",e),()=>{sL&&document.removeEventListener(\"visibilitychange\",e),sB(\"focus\",e)}),initReconnect:e=>{let t=()=>{s_=!0,e()},i=()=>{s_=!1};return sI(\"online\",t),sI(\"offline\",i),()=>{sB(\"online\",t),sB(\"offline\",i)}}},sU=!u.default.useId,sz=!sD||sF,sW=sz?u.useEffect:u.useLayoutEffect,sH=\"u\">typeof navigator&&navigator.connection,sq=!sz&&sH&&([\"slow-2g\",\"2g\"].includes(sH.effectiveType)||sH.saveData),sY=new WeakMap,sX=(e,t)=>e===`[object ${t}]`,sG=0,sK=e=>{let t,i,r=typeof e,n=sk.prototype.toString.call(e),s=sX(n,\"Date\"),o=sX(n,\"RegExp\"),a=sX(n,\"Object\");if(sk(e)!==e||s||o)t=s?e.toJSON():\"symbol\"==r?e.toString():\"string\"==r?JSON.stringify(e):\"\"+e;else{if(t=sY.get(e))return t;if(t=++sG+\"~\",sY.set(e,t),Array.isArray(e)){for(i=0,t=\"@\";i<e.length;i++)t+=sK(e[i])+\",\";sY.set(e,t)}if(a){t=\"#\";let r=sk.keys(e).sort();for(;!sM(i=r.pop());)sM(e[i])||(t+=i+\":\"+sK(e[i])+\",\");sY.set(e,t)}}return t},sZ=e=>{if(\"function\"==typeof e)try{e=e()}catch(t){e=\"\"}let t=e;return[e=\"string\"==typeof e?e:(Array.isArray(e)?e.length:e)?sK(e):\"\",t]},sJ=0,sQ=()=>++sJ;async function s0(...e){let[t,i,r,n]=e,s=sC({populateCache:!0,throwOnError:!0},\"boolean\"==typeof n?{revalidate:n}:n||{}),o=s.populateCache,a=s.rollbackOnError,l=s.optimisticData,u=s.throwOnError;if(\"function\"==typeof i){let e=[];for(let r of t.keys())!/^\\$(inf|sub)\\$/.test(r)&&i(t.get(r)._k)&&e.push(r);return Promise.all(e.map(h))}return h(i);async function h(i){let n,[h]=sZ(i);if(!h)return;let[c,d]=sO(t,h),[p,m,f,g]=sS.get(t),v=()=>{let e=p[h];return(\"function\"==typeof s.revalidate?s.revalidate(c().data,i):!1!==s.revalidate)&&(delete f[h],delete g[h],e&&e[0])?e[0](2).then(()=>c().data):c().data};if(e.length<3)return v();let x=r,y=!1,b=sQ();m[h]=[b,0];let w=!sM(l),j=c(),P=j.data,T=j._c,S=sM(T)?P:T;if(w&&d({data:l=\"function\"==typeof l?l(S,P):l,_c:S}),\"function\"==typeof x)try{x=x(S)}catch(e){n=e,y=!0}if(x&&\"function\"==typeof x.then){let e;if(x=await x.catch(e=>{n=e,y=!0}),b!==m[h][0]){if(y)throw n;return x}y&&w&&(e=n,\"function\"==typeof a?a(e):!1!==a)&&(o=!0,d({data:S,_c:sA}))}if(o&&!y&&(\"function\"==typeof o?d({data:o(x,S),error:sA,_c:sA}):d({data:x,error:sA,_c:sA})),m[h][1]=sQ(),Promise.resolve(v()).then(()=>{d({_c:sA})}),y){if(u)throw n;return}return x}}let s1=(e,t)=>{for(let i in e)e[i][0]&&e[i][0](t)},s2=(e,t)=>{if(!sS.has(e)){let i=sC(s$,t),r=Object.create(null),n=s0.bind(sA,e),s=sE,o=Object.create(null),a=(e,t)=>{let i=o[e]||[];return o[e]=i,i.push(t),()=>i.splice(i.indexOf(t),1)},l=(t,i,r)=>{e.set(t,i);let n=o[t];if(n)for(let e of n)e(i,r)},u=()=>{if(!sS.has(e)&&(sS.set(e,[r,Object.create(null),Object.create(null),Object.create(null),n,l,a]),!sz)){let t=i.initFocus(setTimeout.bind(sA,s1.bind(sA,r,0))),n=i.initReconnect(setTimeout.bind(sA,s1.bind(sA,r,1)));s=()=>{t&&t(),n&&n(),sS.delete(e)}}};return u(),[e,n,u,s]}return[e,sS.get(e)[4]]},[s5,s3]=s2(new Map),s4=sC({onLoadingSlow:sE,onSuccess:sE,onError:sE,onErrorRetry:(e,t,i,r,n)=>{let s=i.errorRetryCount,o=n.retryCount,a=~~((Math.random()+.5)*(1<<(o<8?o:8)))*i.errorRetryInterval;(sM(s)||!(o>s))&&setTimeout(r,a,n)},onDiscarded:sE,revalidateOnFocus:!0,revalidateOnReconnect:!0,revalidateIfStale:!0,shouldRetryOnError:!0,errorRetryInterval:sq?1e4:5e3,focusThrottleInterval:5e3,dedupingInterval:2e3,loadingTimeout:sq?5e3:3e3,compare:function e(t,i){var r,n;if(t===i)return!0;if(t&&i&&(r=t.constructor)===i.constructor){if(r===Date)return t.getTime()===i.getTime();if(r===RegExp)return t.toString()===i.toString();if(r===Array){if((n=t.length)===i.length)for(;n--&&e(t[n],i[n]););return -1===n}if(!r||\"object\"==typeof t){for(r in n=0,t)if(sT.call(t,r)&&++n&&!sT.call(i,r)||!(r in i)||!e(t[r],i[r]))return!1;return Object.keys(i).length===n}}return t!=t&&i!=i},isPaused:()=>!1,cache:s5,mutate:s3,fallback:{}},{isOnline:()=>s_,isVisible:()=>{let e=sL&&document.visibilityState;return sM(e)||\"hidden\"!==e}}),s6=(e,t)=>{let i=sC(e,t);if(t){let{use:r,fallback:n}=e,{use:s,fallback:o}=t;r&&s&&(i.use=r.concat(s)),n&&o&&(i.fallback=sC(n,o))}return i},s8=(0,u.createContext)({});var s9=e.i(40822);let s7=sD&&window.__SWR_DEVTOOLS_USE__,oe=(s7?window.__SWR_DEVTOOLS_USE__:[]).concat(e=>(t,i,r)=>{let n=i&&((...e)=>{let[r]=sZ(t),[,,,n]=sS.get(s5);if(r.startsWith(\"$inf$\"))return i(...e);let s=n[r];return sM(s)?i(...e):(delete n[r],s)});return e(t,n,r)});s7&&(window.__SWR_DEVTOOLS_REACT__=u.default);let ot=()=>{},oi=ot(),or=(new WeakMap,u.default.use||(e=>{switch(e.status){case\"pending\":throw e;case\"fulfilled\":return e.value;case\"rejected\":throw e.reason;default:throw e.status=\"pending\",e.then(t=>{e.status=\"fulfilled\",e.value=t},t=>{e.status=\"rejected\",e.reason=t}),e}})),on={dedupe:!0},os=Promise.resolve(sA);sk.defineProperty(e=>{let{value:t}=e,i=(0,u.useContext)(s8),r=\"function\"==typeof t,n=(0,u.useMemo)(()=>r?t(i):t,[r,i,t]),s=(0,u.useMemo)(()=>r?n:s6(i,n),[r,i,n]),o=n&&n.provider,a=(0,u.useRef)(sA);o&&!a.current&&(a.current=s2(o(s.cache||s5),n));let l=a.current;return l&&(s.cache=l[0],s.mutate=l[1]),sW(()=>{if(l)return l[2]&&l[2](),l[3]},[]),(0,u.createElement)(s8.Provider,sC(e,{value:s}))},\"defaultValue\",{value:s4});let oo=(r=(e,t,i)=>{let{cache:r,compare:n,suspense:s,fallbackData:o,revalidateOnMount:a,revalidateIfStale:l,refreshInterval:h,refreshWhenHidden:c,refreshWhenOffline:d,keepPreviousData:p}=i,[m,f,g,v]=sS.get(r),[x,y]=sZ(e),b=(0,u.useRef)(!1),w=(0,u.useRef)(!1),j=(0,u.useRef)(x),P=(0,u.useRef)(t),T=(0,u.useRef)(i),S=()=>T.current.isVisible()&&T.current.isOnline(),[E,A,k,M]=sO(r,x),C=(0,u.useRef)({}).current,R=sM(o)?sM(i.fallback)?sA:i.fallback[x]:o,N=(e,t)=>{for(let i in C)if(\"data\"===i){if(!n(e[i],t[i])&&(!sM(e[i])||!n($,t[i])))return!1}else if(t[i]!==e[i])return!1;return!0},V=(0,u.useMemo)(()=>{let e=!!x&&!!t&&(sM(a)?!T.current.isPaused()&&!s&&!1!==l:a),i=t=>{let i=sC(t);return(delete i._k,e)?{isValidating:!0,isLoading:!0,...i}:i},r=E(),n=M(),o=i(r),u=r===n?o:i(n),h=o;return[()=>{let e=i(E());return N(e,h)?(h.data=e.data,h.isLoading=e.isLoading,h.isValidating=e.isValidating,h.error=e.error,h):(h=e,e)},()=>u]},[r,x]),D=(0,sP.useSyncExternalStore)((0,u.useCallback)(e=>k(x,(t,i)=>{N(i,t)||e()}),[r,x]),V[0],V[1]),L=!b.current,F=m[x]&&m[x].length>0,O=D.data,_=sM(O)?R&&\"function\"==typeof R.then?or(R):R:O,I=D.error,B=(0,u.useRef)(_),$=p?sM(O)?sM(B.current)?_:B.current:O:_,U=(!F||!!sM(I))&&(L&&!sM(a)?a:!T.current.isPaused()&&(s?!sM(_)&&l:sM(_)||l)),z=!!(x&&t&&L&&U),W=sM(D.isValidating)?z:D.isValidating,H=sM(D.isLoading)?z:D.isLoading,q=(0,u.useCallback)(async e=>{let t,r,s=P.current;if(!x||!s||w.current||T.current.isPaused())return!1;let o=!0,a=e||{},l=!g[x]||!a.dedupe,u=()=>sU?!w.current&&x===j.current&&b.current:x===j.current,h={isValidating:!1,isLoading:!1},c=()=>{A(h)},d=()=>{let e=g[x];e&&e[1]===r&&delete g[x]},p={isValidating:!0};sM(E().data)&&(p.isLoading=!0);try{if(l&&(A(p),i.loadingTimeout&&sM(E().data)&&setTimeout(()=>{o&&u()&&T.current.onLoadingSlow(x,i)},i.loadingTimeout),g[x]=[s(y),sQ()]),[t,r]=g[x],t=await t,l&&setTimeout(d,i.dedupingInterval),!g[x]||g[x][1]!==r)return l&&u()&&T.current.onDiscarded(x),!1;h.error=sA;let e=f[x];if(!sM(e)&&(r<=e[0]||r<=e[1]||0===e[1]))return c(),l&&u()&&T.current.onDiscarded(x),!1;let a=E().data;h.data=n(a,t)?a:t,l&&u()&&T.current.onSuccess(t,x,i)}catch(i){d();let e=T.current,{shouldRetryOnError:t}=e;!e.isPaused()&&(h.error=i,l&&u())&&(e.onError(i,x,e),(!0===t||\"function\"==typeof t&&t(i))&&(!T.current.revalidateOnFocus||!T.current.revalidateOnReconnect||S())&&e.onErrorRetry(i,x,e,e=>{let t=m[x];t&&t[0]&&t[0](s9.ERROR_REVALIDATE_EVENT,e)},{retryCount:(a.retryCount||0)+1,dedupe:!0}))}return o=!1,c(),!0},[x,r]),Y=(0,u.useCallback)((...e)=>s0(r,j.current,...e),[]);if(sW(()=>{P.current=t,T.current=i,sM(O)||(B.current=O)}),sW(()=>{var e;let t;if(!x)return;let i=q.bind(sA,on),r=0;T.current.revalidateOnFocus&&(r=Date.now()+T.current.focusThrottleInterval);let n=(e=(e,t={})=>{if(e==s9.FOCUS_EVENT){let e=Date.now();T.current.revalidateOnFocus&&e>r&&S()&&(r=e+T.current.focusThrottleInterval,i())}else if(e==s9.RECONNECT_EVENT)T.current.revalidateOnReconnect&&S()&&i();else if(e==s9.MUTATE_EVENT)return q();else if(e==s9.ERROR_REVALIDATE_EVENT)return q(t)},(t=m[x]||(m[x]=[])).push(e),()=>{let i=t.indexOf(e);i>=0&&(t[i]=t[t.length-1],t.pop())});if(w.current=!1,j.current=x,b.current=!0,A({_k:y}),U&&!g[x])if(sM(_)||sz)i();else sD&&typeof window.requestAnimationFrame!=sV?window.requestAnimationFrame(i):setTimeout(i,1);return()=>{w.current=!0,n()}},[x]),sW(()=>{let e;function t(){let t=\"function\"==typeof h?h(E().data):h;t&&-1!==e&&(e=setTimeout(i,t))}function i(){!E().error&&(c||T.current.isVisible())&&(d||T.current.isOnline())?q(on).then(t):t()}return t(),()=>{e&&(clearTimeout(e),e=-1)}},[h,c,d,x]),(0,u.useDebugValue)($),s){let e=x&&sM(_);if(!sU&&sz&&e)throw Error(\"Fallback data is required when using Suspense in SSR.\");e&&(P.current=t,T.current=i,w.current=!1);let r=v[x];if(or(!sM(r)&&e?Y(r):os),!sM(I)&&e)throw I;let n=e?q(on):os;!sM($)&&e&&(n.status=\"fulfilled\",n.value=!0),or(n)}return{mutate:Y,get data(){return C.data=!0,$},get error(){return C.error=!0,I},get isValidating(){return C.isValidating=!0,W},get isLoading(){return C.isLoading=!0,H}}},function(...e){let t,i=(t=(0,u.useContext)(s8),(0,u.useMemo)(()=>sC(s4,t),[t])),[n,s,o]=\"function\"==typeof e[1]?[e[0],e[1],e[2]||{}]:[e[0],null,(null===e[1]?e[2]:e[1])||{}],a=s6(i,o),l=r,{use:h}=a,c=(h||[]).concat(oe);for(let e=c.length;e--;)l=c[e](l);return l(n,s||a.fetcher||null,a)});async function oa(...e){let t=await fetch(...e);return await t.json()}let ol={type:\"spring\",stiffness:80,damping:18},ou=\"M 0 192 C 8 192 18 28 48 16 S 96 14 128 22 S 192 52 248 102 S 320 162 400 188\",oh=[{label:\"STEP\",value:\"33.6\"},{label:\"GAIN\",value:\"×2.7\"},{label:\"DURATION\",value:\"4.35s\"}];function oc(){let e=sp();return(0,a.jsx)(sc.div,{className:\"hidden md:block w-[280px] lg:w-[320px] xl:w-[340px] shrink-0\",initial:!e&&{opacity:0,y:30},animate:{opacity:1,y:0},transition:{...ol,delay:.34},children:(0,a.jsxs)(sc.div,{className:\"relative rounded-[var(--radius-card)] glass shadow-elevated border border-white/10 overflow-hidden p-5\",style:{transformPerspective:1200},whileHover:e?{}:{rotateY:-3},transition:ol,children:[(0,a.jsx)(\"div\",{className:\"font-display text-[10px] tracking-[0.22em] uppercase text-white/45 mb-4\",children:\"Smooth Scroll Curve\"}),(0,a.jsx)(\"div\",{className:\"rounded-2xl border border-white/8 bg-black/30 overflow-hidden\",children:(0,a.jsxs)(\"svg\",{viewBox:\"0 0 400 200\",className:\"block w-full h-auto\",\"aria-hidden\":\"true\",children:[(0,a.jsx)(\"defs\",{children:(0,a.jsxs)(\"linearGradient\",{id:\"heroCurveFill\",x1:\"0\",y1:\"0\",x2:\"0\",y2:\"1\",children:[(0,a.jsx)(\"stop\",{offset:\"0%\",stopColor:\"rgba(255,255,255,0.14)\"}),(0,a.jsx)(\"stop\",{offset:\"100%\",stopColor:\"rgba(255,255,255,0)\"})]})}),(0,a.jsxs)(\"g\",{stroke:\"rgba(255,255,255,0.06)\",strokeWidth:\"1\",children:[[0,1,2,3].map(e=>(0,a.jsx)(\"line\",{x1:133*e,y1:\"8\",x2:133*e,y2:\"196\"},`vl-${e}`)),[0,1,2,3].map(e=>(0,a.jsx)(\"line\",{x1:\"0\",y1:8+62*e,x2:\"400\",y2:8+62*e},`hl-${e}`))]}),(0,a.jsx)(\"path\",{d:`${ou} L 400 192 L 0 192 Z`,fill:\"url(#heroCurveFill)\",opacity:\"0.9\"}),(0,a.jsx)(\"path\",{d:ou,fill:\"none\",stroke:\"rgba(255,255,255,0.90)\",strokeWidth:\"2\",strokeLinecap:\"round\",strokeLinejoin:\"round\",pathLength:1,strokeDasharray:1,strokeDashoffset:+!e,style:e?{}:{animation:\"stroke-in 1200ms var(--ease-out) 500ms both\"}})]})}),(0,a.jsx)(\"div\",{className:\"mt-4 grid grid-cols-3 gap-2\",children:oh.map(e=>(0,a.jsxs)(\"div\",{className:\"rounded-xl border border-white/8 bg-white/4 px-2.5 py-2\",children:[(0,a.jsx)(\"div\",{className:\"font-display text-[9px] tracking-[0.18em] uppercase text-white/40\",children:e.label}),(0,a.jsx)(\"div\",{className:\"mt-1 font-mono text-sm tabular-nums text-white/80\",children:e.value})]},e.label))})]})})}function od(e){let t=nI(()=>ew(e)),{isStatic:i}=(0,u.useContext)(nA);if(i){let[,i]=(0,u.useState)(e);(0,u.useEffect)(()=>t.on(\"change\",i),[])}return t}function op(e,t){let i=od(t()),r=()=>i.set(t());return r(),nF(()=>{let t=()=>eh.preRender(r,!1,!0),i=e.map(e=>e.on(\"change\",t));return()=>{i.forEach(e=>e()),ec(r)}}),i}function om(e,...t){let i=e.length;return op(t.filter(ej),function(){let r=\"\";for(let n=0;n<i;n++){r+=e[n];let i=t[n];i&&(r+=ej(i)?i.get():i)}return r})}function of(e){return\"number\"==typeof e?e:parseFloat(e)}function og(e,t={}){let{isStatic:i}=(0,u.useContext)(nA),r=(0,u.useRef)(null),n=od(ej(e)?of(e.get()):e),s=(0,u.useRef)(n.get()),o=(0,u.useRef)(()=>{}),a=()=>{let e=r.current;e&&0===e.time&&e.sample(ed.delta),l(),r.current=new ip({keyframes:[n.get(),s.current],velocity:n.getVelocity(),type:\"spring\",restDelta:.001,restSpeed:.01,...t,onUpdate:o.current})},l=()=>{r.current&&r.current.stop()};return(0,u.useInsertionEffect)(()=>n.attach((e,t)=>i?t(e):(s.current=e,o.current=t,eh.update(a),n.get()),l),[JSON.stringify(t)]),nF(()=>{if(ej(e))return e.on(\"change\",e=>n.set(of(e)))},[n]),n}function ov(e,t,i,r){if(\"function\"==typeof e){let t;return ey.current=[],e(),t=op(ey.current,e),ey.current=void 0,t}let n=\"function\"==typeof t?t:function(...e){var t;let i,r=!Array.isArray(e[0]),n=r?0:-1,s=e[0+n],o=e[1+n],a=e[2+n],l=e[3+n],u=il(o,a,{mixer:(i=t=a[0])&&\"object\"==typeof i&&i.mix?t.mix:void 0,...l});return r?u(s):u}(t,i,r);return Array.isArray(e)?ox(e,n):ox([e],([e])=>n(e))}function ox(e,t){let i=nI(()=>[]);return op(e,()=>{i.length=0;let r=e.length;for(let t=0;t<r;t++)i[t]=e[t].get();return t(i)})}let oy={stiffness:150,damping:30};function ob({children:e,className:t=\"\"}){let i=sp(),r=od(.5),n=od(.5),s=ov(n,[0,1],[4,-4]),o=ov(r,[0,1],[-6,6]),l=og(s,oy),u=og(o,oy),h=ov(r,[0,1],[0,100]),c=ov(n,[0,1],[0,100]),d=om`radial-gradient(480px circle at ${h}% ${c}%, rgba(255,255,255,0.08), transparent 60%)`;return(0,a.jsxs)(sc.div,{className:`group relative h-full rounded-[var(--radius-card)] glass shadow-elevated overflow-hidden border border-white/10 ${t}`,style:i?{}:{rotateX:l,rotateY:u,transformPerspective:1200},onMouseMove:e=>{if(i)return;let t=e.currentTarget.getBoundingClientRect();r.set((e.clientX-t.left)/t.width),n.set((e.clientY-t.top)/t.height)},onMouseLeave:()=>{r.set(.5),n.set(.5)},children:[(0,a.jsx)(sc.div,{className:\"pointer-events-none absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity duration-500\",style:{background:d}}),e]})}let ow=\"https://github.com/Caldis/Mos/releases/latest\",oj=[{id:\"xcode\",name:\"Xcode\",icon:\"/app-icons/xcode.png\",curve:{step:28,gain:2.3,duration:3.4},axes:{Y:{smooth:!0,reverse:!1},X:{smooth:!1,reverse:!1}}},{id:\"safari\",name:\"Safari\",icon:\"/app-icons/safari.png\",curve:{step:33.6,gain:2.7,duration:4.35},axes:{Y:{smooth:!0,reverse:!1},X:{smooth:!0,reverse:!1}}},{id:\"figma\",name:\"Figma\",icon:\"/app-icons/figma.png\",curve:{step:26,gain:2.1,duration:3.8},axes:{Y:{smooth:!0,reverse:!1},X:{smooth:!0,reverse:!0}}},{id:\"terminal\",name:\"Terminal\",icon:\"/app-icons/terminal.png\",curve:{step:18,gain:1.6,duration:2},axes:{Y:{smooth:!1,reverse:!1},X:{smooth:!1,reverse:!1}}},{id:\"notion\",name:\"Notion\",icon:\"/app-icons/notion.png\",curve:{step:30,gain:2.4,duration:4.8},axes:{Y:{smooth:!0,reverse:!1},X:{smooth:!1,reverse:!1}}},{id:\"chrome\",name:\"Chrome\",icon:\"/app-icons/chrome.png\",curve:{step:33.6,gain:2.9,duration:4.1},axes:{Y:{smooth:!0,reverse:!1},X:{smooth:!0,reverse:!1}}}];function oP({checked:e,onToggle:t,ariaLabel:i,disabled:r=!1}){return(0,a.jsx)(\"button\",{type:\"button\",role:\"switch\",\"aria-checked\":e,\"aria-disabled\":r,\"aria-label\":i,disabled:r,onClick:()=>{r||t()},className:`relative inline-flex h-6 w-11 shrink-0 items-center overflow-hidden rounded-full border p-[2px] transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-white/20 ${e?\"border-white/30 bg-white/28\":r?\"border-white/8 bg-white/4\":\"border-white/8 bg-white/4 hover:border-white/14 hover:bg-white/7\"} ${r?\"cursor-default\":\"cursor-pointer\"}`,children:(0,a.jsx)(\"span\",{\"aria-hidden\":\"true\",className:`h-5 w-5 rounded-full shadow-[0_6px_16px_rgba(0,0,0,0.45)] transition-[transform,background-color] duration-200 ease-out ${e?\"translate-x-5 bg-white\":\"translate-x-0 bg-white/50\"}`})})}let oT={type:\"spring\",stiffness:100,damping:20};function oS(e,t){return{initial:!t&&{opacity:0,y:24},animate:{opacity:1,y:0},transition:{...oT,delay:e}}}function oE(){var e,t;let{t:i}=(0,x.useI18n)(),r=sp(),{data:n}=oo(\"https://api.github.com/repos/Caldis/Mos/releases/latest\",oa,{dedupingInterval:18e5,revalidateOnFocus:!1,revalidateOnReconnect:!1,refreshInterval:0}),[s,o]=(0,u.useState)(()=>({Y:{smooth:!0,reverse:!1},X:{smooth:!1,reverse:!0}})),c=(0,u.useCallback)((e,t)=>{o(i=>({...i,[e]:{...i[e],[t]:!i[e][t]}}))},[]),d=(0,u.useMemo)(()=>{let e=n?.tag_name;return\"string\"==typeof e&&e.trim()?`v${e.replace(/^v/i,\"\")}`:null},[n?.tag_name]),m=(0,u.useMemo)(()=>(function(e){if(!e||\"object\"!=typeof e)return ow;let t=e.assets;if(!Array.isArray(t)||0===t.length)return ow;let i=t.map(e=>{if(!e||\"object\"!=typeof e)return null;let t=\"string\"==typeof e.name?e.name:null,i=\"string\"==typeof e.browser_download_url?e.browser_download_url:null;return t&&i?{name:t,url:i}:null}).filter(Boolean);if(0===i.length)return ow;let r=e=>i.find(t=>t.name.toLowerCase().endsWith(e));return r(\".zip\")?.url||r(\".dmg\")?.url||i[0]?.url||ow})(n),[n]),f=(0,u.useRef)(null),g=(0,u.useRef)(!1),y=(0,u.useRef)(null),w=(0,u.useRef)(null),j=(0,u.useCallback)((e=0)=>{let t=f.current;if(!t)return;y.current&&(window.clearTimeout(y.current),y.current=null),w.current&&(window.clearTimeout(w.current),w.current=null);let i=()=>{t.classList.remove(\"homebrew-highlight\"),t.offsetWidth,t.classList.add(\"homebrew-highlight\"),w.current=window.setTimeout(()=>{t.classList.remove(\"homebrew-highlight\"),w.current=null},1200)};e>0?y.current=window.setTimeout(()=>{y.current=null,i()},e):i()},[]);return(0,u.useEffect)(()=>{let e=f.current;if(!e)return;let t=new IntersectionObserver(e=>{let t=e[0];!t?.isIntersecting||g.current&&(g.current=!1,j(500))},{threshold:.35});return t.observe(e),()=>{t.disconnect(),y.current&&(window.clearTimeout(y.current),y.current=null),w.current&&(window.clearTimeout(w.current),w.current=null)}},[j]),(0,a.jsxs)(\"div\",{className:\"min-h-[100dvh] text-[color:var(--fg0)]\",children:[(0,a.jsx)(\"a\",{href:\"#content\",className:\"sr-only focus:not-sr-only focus:fixed focus:z-[100] focus:top-4 focus:left-4 focus:px-4 focus:py-2 focus:rounded-xl focus:bg-black/70 focus:text-white focus:outline-none\",children:i.a11y.skipToContent}),(0,a.jsxs)(\"div\",{className:\"fixed inset-0 -z-10 overflow-hidden\",children:[(0,a.jsx)(p,{className:\"absolute inset-0\"}),(0,a.jsx)(\"div\",{className:\"orb left-[-140px] top-[-120px] w-[380px] h-[380px] bg-[color:var(--accent)]\"}),(0,a.jsx)(\"div\",{className:\"orb right-[-180px] top-[10vh] w-[420px] h-[420px] bg-[color:var(--accent3)] [animation-delay:-1.2s]\"}),(0,a.jsx)(\"div\",{className:\"orb left-[12vw] bottom-[-220px] w-[520px] h-[520px] bg-[color:var(--accent2)] [animation-delay:-2.1s]\"})]}),(0,a.jsx)(\"header\",{className:\"fixed left-0 right-0 top-0 z-50 px-4 sm:px-6\",children:(0,a.jsx)(\"nav\",{className:\"mx-auto mt-4 sm:mt-6 max-w-6xl rounded-[var(--radius-xl)] glass ring-accent\",children:(0,a.jsxs)(\"div\",{className:\"flex items-center justify-between px-4 sm:px-5 py-3\",children:[(0,a.jsxs)(\"div\",{className:\"flex items-center gap-3\",children:[(0,a.jsx)(l.default,{src:h,alt:i.a11y.appIconAlt,width:40,height:40,className:\"object-contain rounded-[14px]\",priority:!0}),(0,a.jsx)(\"div\",{className:\"text-lg sm:text-xl font-extrabold tracking-[0.015em] text-white\",children:\"Mos\"})]}),(0,a.jsxs)(\"div\",{className:\"flex items-center gap-3\",children:[(0,a.jsx)(b,{}),(0,a.jsx)(v,{strength:14,children:(0,a.jsx)(\"a\",{href:\"https://github.com/Caldis/Mos\",target:\"_blank\",rel:\"noopener noreferrer\",className:\"group grid h-11 w-11 place-items-center rounded-2xl border border-white/5 bg-white/4 hover:bg-white/7 hover:border-white/9 transition-colors\",\"aria-label\":i.a11y.githubAria,title:i.nav.githubTitle,children:(0,a.jsx)(\"svg\",{\"aria-hidden\":\"true\",viewBox:\"0 0 24 24\",className:\"h-5 w-5 text-white/82 group-hover:text-white/92 transition-colors\",fill:\"currentColor\",children:(0,a.jsx)(\"path\",{d:\"M12 2c-5.52 0-10 4.58-10 10.23 0 4.52 2.87 8.35 6.84 9.7.5.1.68-.22.68-.48 0-.24-.01-.88-.01-1.72-2.78.62-3.37-1.37-3.37-1.37-.45-1.18-1.11-1.49-1.11-1.49-.91-.64.07-.63.07-.63 1.01.07 1.54 1.06 1.54 1.06.9 1.57 2.35 1.12 2.92.86.09-.67.35-1.12.64-1.38-2.22-.26-4.56-1.14-4.56-5.06 0-1.12.39-2.04 1.03-2.76-.1-.26-.45-1.3.1-2.72 0 0 .84-.28 2.75 1.05.8-.23 1.65-.35 2.5-.35.85 0 1.7.12 2.5.35 1.9-1.33 2.75-1.05 2.75-1.05.55 1.42.2 2.46.1 2.72.64.72 1.03 1.64 1.03 2.76 0 3.93-2.34 4.8-4.58 5.05.36.32.69.96.69 1.94 0 1.4-.01 2.52-.01 2.86 0 .26.18.58.69.48A10.3 10.3 0 0 0 22 12.23C22 6.58 17.52 2 12 2Z\"})})})})]})]})})}),(0,a.jsxs)(\"main\",{id:\"content\",className:\"mx-auto max-w-6xl px-4 sm:px-6\",children:[(0,a.jsxs)(\"section\",{className:\"relative min-h-[100dvh] pt-28 sm:pt-36 pb-10 sm:pb-12 flex flex-col\",children:[(0,a.jsx)(\"div\",{className:\"flex-1 flex items-center\",children:(0,a.jsxs)(\"div\",{className:\"w-full grid grid-cols-1 md:grid-cols-[1fr_auto] gap-12 lg:gap-20 items-center\",children:[(0,a.jsxs)(\"div\",{children:[(0,a.jsxs)(sc.div,{className:\"inline-flex items-center gap-3 rounded-full border border-white/10 bg-black/40 px-4 py-2 text-xs text-white/70 shadow-elevated\",...oS(0,r),children:[(0,a.jsxs)(\"span\",{className:\"inline-flex items-center gap-2\",children:[(0,a.jsx)(\"span\",{className:\"h-2 w-2 rounded-full bg-[color:var(--accent)] shadow-[0_0_22px_rgba(255,255,255,0.35)]\"}),i.hero.badgeLine1]}),(0,a.jsx)(\"span\",{className:\"hidden sm:inline text-white/35\",children:\"•\"}),(0,a.jsx)(\"span\",{className:\"hidden sm:inline font-mono text-white/45\",children:i.hero.badgeLine2})]}),(0,a.jsxs)(sc.h1,{className:\"mt-7 font-display text-balance text-[52px] leading-[0.95] tracking-[-0.02em] sm:text-[88px] md:text-[108px] lg:text-[124px] text-white\",...oS(.08,r),children:[i.hero.titleLine1,(0,a.jsxs)(\"span\",{className:\"block\",children:[i.hero.titleLine2Before,(0,a.jsx)(\"span\",{className:\"inline-block text-flow\",style:{textShadow:\"0 0 42px rgba(255,255,255,0.08)\"},children:i.hero.titleLine2Highlight}),i.hero.titleLine2After]})]}),(0,a.jsx)(sc.p,{className:\"mt-5 max-w-2xl text-balance text-[15px] sm:text-lg text-white/72 leading-[1.7]\",...oS(.18,r),children:i.hero.lead}),(0,a.jsxs)(sc.div,{className:\"mt-8 flex flex-col sm:flex-row sm:items-start gap-3 sm:gap-4\",...oS(.26,r),children:[(0,a.jsxs)(\"div\",{className:\"flex flex-col items-start w-fit\",children:[(0,a.jsx)(v,{strength:22,children:(0,a.jsxs)(\"a\",{href:m,target:\"_blank\",rel:\"noopener noreferrer\",className:\"group relative overflow-hidden rounded-[18px] px-6 py-3.5 text-sm sm:text-base font-semibold tracking-wide text-black shadow-elevated border border-black/10 inline-flex items-center justify-center\",style:{background:\"linear-gradient(180deg, rgba(255,255,255,0.96) 0%, rgba(255,255,255,0.84) 100%)\"},children:[(0,a.jsx)(\"span\",{className:\"relative z-10\",children:i.hero.ctaDownload}),(0,a.jsx)(\"span\",{className:\"absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity duration-500 [background:radial-gradient(800px_240px_at_30%_0%,rgba(0,0,0,0.18),transparent_55%)]\"})]})}),(0,a.jsx)(\"a\",{href:\"#homebrew\",onClick:e=>{e.preventDefault(),(()=>{let e=f.current??document.getElementById(\"homebrew\");if(!e)return;let t=window.matchMedia?.(\"(prefers-reduced-motion: reduce)\")?.matches??!1,i=e.getBoundingClientRect();i.top<.78*window.innerHeight&&i.bottom>.22*window.innerHeight?(g.current=!1,j(500)):g.current=!0,e.scrollIntoView({behavior:t?\"auto\":\"smooth\",block:\"start\"})})()},className:\"mt-2 self-center text-xs font-mono text-white/50 hover:text-white/75 transition-colors underline decoration-white/15 hover:decoration-white/35 underline-offset-4\",children:i.hero.ctaInstallHomebrew})]}),(0,a.jsx)(v,{strength:14,children:(0,a.jsxs)(\"a\",{href:\"https://github.com/Caldis/Mos\",target:\"_blank\",rel:\"noopener noreferrer\",className:\"group inline-flex items-center justify-center rounded-[18px] px-6 py-3.5 text-sm sm:text-base font-semibold tracking-wide text-white/85 border border-white/12 bg-white/5 hover:bg-white/8 transition-colors\",children:[(0,a.jsx)(\"span\",{className:\"mr-2 opacity-70 group-hover:opacity-100 transition-opacity\",children:\"↗\"}),(0,a.jsx)(\"span\",{children:i.hero.ctaViewGitHub})]})}),(0,a.jsxs)(\"div\",{className:\"sm:ml-auto sm:self-center text-xs text-white/45\",children:[(0,a.jsx)(\"div\",{className:\"font-mono tabular-nums\",children:i.hero.requirementsLine1}),(0,a.jsx)(\"div\",{className:\"font-mono\",children:i.hero.requirementsLine2})]})]})]}),(0,a.jsx)(oc,{})]})}),(0,a.jsxs)(\"div\",{className:\"mt-8 sm:mt-10 flex items-center gap-3 text-white/40\",children:[(0,a.jsx)(\"div\",{className:\"h-[1px] flex-1 hairline\"}),(0,a.jsx)(\"div\",{className:\"font-mono text-[11px] tracking-[0.18em] uppercase\",children:i.hero.scrollHint}),(0,a.jsx)(\"div\",{className:\"h-[1px] flex-1 hairline\"})]})]}),(0,a.jsxs)(\"section\",{className:\"py-16 sm:py-24\",children:[(0,a.jsx)(sg,{children:(0,a.jsx)(\"h2\",{className:\"font-display text-balance text-3xl sm:text-5xl text-white leading-[0.95] tracking-[-0.01em]\",children:i.sectionFeel.title})}),(0,a.jsx)(sg,{delayMs:90,children:(0,a.jsx)(\"p\",{className:\"mt-4 max-w-3xl text-white/68 leading-[1.7]\",children:i.sectionFeel.lead})}),(0,a.jsxs)(\"div\",{className:\"mt-10 grid grid-cols-1 md:grid-cols-12 gap-4\",children:[(0,a.jsx)(sg,{className:\"md:col-span-7 h-full\",delayMs:140,children:(0,a.jsx)(ob,{children:(0,a.jsxs)(\"div\",{className:\"relative p-6 sm:p-8\",children:[(0,a.jsx)(\"div\",{className:\"font-display text-[11px] tracking-[0.22em] uppercase text-white/50\",children:i.sectionFeel.cards.curves.kicker}),(0,a.jsx)(\"div\",{className:\"mt-4 text-2xl sm:text-3xl text-white font-semibold\",children:i.sectionFeel.cards.curves.title}),(0,a.jsx)(\"p\",{className:\"mt-3 text-white/62 leading-[1.7]\",children:i.sectionFeel.cards.curves.body}),(0,a.jsx)(sb,{className:\"mt-6\"})]})})}),(0,a.jsx)(sg,{className:\"md:col-span-5 h-full\",delayMs:200,children:(0,a.jsx)(ob,{children:(0,a.jsxs)(\"div\",{className:\"relative p-6 sm:p-8\",children:[(0,a.jsx)(\"div\",{className:\"font-display text-[11px] tracking-[0.22em] uppercase text-white/50\",children:i.sectionFeel.cards.axes.kicker}),(0,a.jsx)(\"div\",{className:\"mt-4 text-2xl sm:text-3xl text-white font-semibold\",children:i.sectionFeel.cards.axes.title}),(0,a.jsx)(\"p\",{className:\"mt-3 text-white/62 leading-[1.7]\",children:i.sectionFeel.cards.axes.body}),(0,a.jsx)(\"div\",{className:\"mt-6 rounded-2xl border border-white/10 bg-black/30 p-5\",children:(0,a.jsx)(\"div\",{className:\"space-y-3\",children:[\"Y\",\"X\"].map(e=>{let t=s[e];return(0,a.jsxs)(\"div\",{className:\"flex items-center gap-3\",children:[(0,a.jsx)(\"div\",{className:\"h-10 w-10 rounded-2xl border border-white/10 bg-white/5 grid place-items-center\",children:(0,a.jsx)(\"span\",{className:\"font-mono text-xs text-white/60\",children:e})}),(0,a.jsxs)(\"div\",{className:\"flex flex-1 flex-wrap gap-2\",children:[(0,a.jsxs)(\"div\",{className:\"flex min-w-[150px] flex-1 items-center justify-between rounded-xl border border-white/10 bg-white/5 px-3 py-2\",children:[(0,a.jsx)(\"span\",{className:\"font-mono text-[11px] text-white/60\",children:i.sectionFeel.cards.axes.smooth}),(0,a.jsx)(oP,{checked:t.smooth,onToggle:()=>c(e,\"smooth\"),ariaLabel:`${e} ${i.sectionFeel.cards.axes.smooth}`})]}),(0,a.jsxs)(\"div\",{className:\"flex min-w-[150px] flex-1 items-center justify-between rounded-xl border border-white/10 bg-white/5 px-3 py-2\",children:[(0,a.jsx)(\"span\",{className:\"font-mono text-[11px] text-white/60\",children:i.sectionFeel.cards.axes.reverse}),(0,a.jsx)(oP,{checked:t.reverse,onToggle:()=>c(e,\"reverse\"),ariaLabel:`${e} ${i.sectionFeel.cards.axes.reverse}`})]})]})]},e)})})})]})})}),(0,a.jsx)(sg,{className:\"md:col-span-5 h-full\",delayMs:260,children:(0,a.jsx)(ob,{children:(0,a.jsxs)(\"div\",{className:\"relative p-6 sm:p-8 min-h-[360px]\",children:[(0,a.jsx)(\"div\",{className:\"font-display text-[11px] tracking-[0.22em] uppercase text-white/50\",children:i.sectionFeel.cards.perApp.kicker}),(0,a.jsx)(\"div\",{className:\"mt-4 text-2xl sm:text-3xl text-white font-semibold\",children:i.sectionFeel.cards.perApp.title}),(0,a.jsx)(\"p\",{className:\"mt-3 text-white/62 leading-[1.7]\",children:i.sectionFeel.cards.perApp.body}),(0,a.jsx)(\"div\",{className:\"mt-6 grid grid-cols-2 gap-3\",children:oj.map(e=>(0,a.jsxs)(\"div\",{className:\"rounded-2xl border border-white/10 bg-white/5 p-3 flex items-center gap-3\",children:[(0,a.jsx)(\"div\",{className:\"h-12 w-12 shrink-0 rounded-xl border border-white/10 bg-black/20 overflow-hidden\",children:(0,a.jsx)(l.default,{src:e.icon,alt:\"\",width:48,height:48,className:\"h-full w-full object-cover\"})}),(0,a.jsxs)(\"div\",{children:[(0,a.jsx)(\"div\",{className:\"font-mono text-[11px] text-white/65\",children:e.name}),e.axes.Y.smooth&&(0,a.jsxs)(\"div\",{className:\"mt-0.5 inline-flex items-center gap-1 rounded-full bg-white/8 border border-white/10 px-1.5 py-0.5\",children:[(0,a.jsx)(\"span\",{className:\"h-1.5 w-1.5 rounded-full bg-white/60\"}),(0,a.jsx)(\"span\",{className:\"font-mono text-[9px] text-white/50\",children:\"smooth\"})]})]})]},e.id))})]})})}),(0,a.jsx)(sg,{className:\"md:col-span-7 h-full\",delayMs:320,children:(0,a.jsx)(ob,{children:(0,a.jsxs)(\"div\",{className:\"relative p-6 sm:p-8 min-h-[360px]\",children:[(0,a.jsx)(\"div\",{className:\"font-display text-[11px] tracking-[0.22em] uppercase text-white/50\",children:i.sectionFeel.cards.buttons.kicker}),(0,a.jsx)(\"div\",{className:\"mt-4 text-2xl sm:text-3xl text-white font-semibold\",children:i.sectionFeel.cards.buttons.title}),(0,a.jsx)(\"p\",{className:\"mt-3 text-white/62 leading-[1.7]\",children:i.sectionFeel.cards.buttons.body}),(0,a.jsxs)(\"div\",{className:\"mt-6 rounded-2xl border border-white/10 bg-black/30 p-5\",children:[(0,a.jsx)(\"div\",{className:\"font-mono text-xs text-white/45\",children:i.sectionFeel.cards.buttons.quickBind}),(0,a.jsxs)(\"div\",{className:\"mt-3 grid gap-2\",children:[[{k:i.sectionFeel.cards.buttons.rows.button4,v:i.sectionFeel.cards.buttons.rows.missionControl},{k:i.sectionFeel.cards.buttons.rows.button5,v:i.sectionFeel.cards.buttons.rows.nextSpace},{k:i.sectionFeel.cards.buttons.rows.wheelClick,v:i.sectionFeel.cards.buttons.rows.appSwitcher}].map(e=>(0,a.jsxs)(\"div\",{className:\"flex items-center justify-between rounded-xl border border-white/10 bg-white/5 px-3 py-2\",children:[(0,a.jsx)(\"div\",{className:\"font-mono text-xs text-white/75\",children:e.k}),(0,a.jsx)(\"div\",{className:\"font-mono text-xs text-white/45\",children:e.v})]},e.k)),(0,a.jsxs)(\"div\",{className:\"flex items-center justify-between rounded-xl border border-white/8 bg-white/3 px-3 py-2 opacity-60\",children:[(0,a.jsxs)(\"div\",{className:\"flex items-center gap-2\",children:[(0,a.jsxs)(\"span\",{className:\"relative flex h-1.5 w-1.5\",children:[(0,a.jsx)(\"span\",{className:\"motion-safe:animate-ping absolute inline-flex h-full w-full rounded-full bg-white/60 opacity-75\"}),(0,a.jsx)(\"span\",{className:\"relative inline-flex rounded-full h-1.5 w-1.5 bg-white/40\"})]}),(0,a.jsx)(\"div\",{className:\"font-mono text-xs text-white/45\",children:\"—\"})]}),(0,a.jsx)(\"div\",{className:\"font-mono text-[10px] text-white/30 italic\",children:\"recording…\"})]})]})]})]})})})]})]}),(0,a.jsx)(\"section\",{className:\"pt-0 pb-16 sm:pb-24\",children:(0,a.jsxs)(\"div\",{className:\"rounded-[28px] glass shadow-elevated border border-white/10 overflow-hidden\",children:[(0,a.jsxs)(\"div\",{className:\"px-6 sm:px-10 py-10 sm:py-14\",children:[(0,a.jsx)(sg,{children:(0,a.jsx)(\"h3\",{className:\"font-display text-balance text-3xl sm:text-6xl text-white leading-[0.95] tracking-[-0.015em]\",children:i.download.title})}),(0,a.jsx)(sg,{delayMs:90,children:(0,a.jsx)(\"p\",{className:\"mt-4 max-w-3xl text-white/68 leading-[1.7]\",children:i.download.body})}),(0,a.jsx)(sg,{delayMs:160,children:(0,a.jsxs)(\"div\",{className:\"mt-8 flex flex-col sm:flex-row sm:items-center gap-3\",children:[(0,a.jsx)(v,{strength:22,children:(0,a.jsxs)(\"a\",{href:m,target:\"_blank\",rel:\"noopener noreferrer\",className:\"group relative overflow-hidden rounded-[18px] px-6 py-3.5 text-sm sm:text-base font-semibold tracking-wide text-black shadow-elevated border border-black/10 inline-flex items-center justify-center\",style:{background:\"linear-gradient(180deg, rgba(255,255,255,0.96) 0%, rgba(255,255,255,0.84) 100%)\"},children:[(0,a.jsx)(\"span\",{className:\"relative z-10\",children:i.download.ctaDownload}),(0,a.jsx)(\"span\",{className:\"absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity duration-500 [background:radial-gradient(900px_260px_at_30%_0%,rgba(0,0,0,0.18),transparent_55%)]\"})]})}),(0,a.jsx)(v,{strength:14,children:(0,a.jsx)(\"a\",{href:\"https://github.com/Caldis/Mos/releases\",target:\"_blank\",rel:\"noopener noreferrer\",className:\"inline-flex items-center justify-center rounded-[18px] px-6 py-3.5 text-sm sm:text-base font-semibold tracking-wide text-white/85 border border-white/12 bg-white/5 hover:bg-white/8 transition-colors\",children:i.download.releaseNotes})}),(0,a.jsx)(v,{strength:14,children:(0,a.jsx)(\"a\",{href:\"https://github.com/Caldis/Mos/wiki\",target:\"_blank\",rel:\"noopener noreferrer\",className:\"inline-flex items-center justify-center rounded-[18px] px-6 py-3.5 text-sm sm:text-base font-semibold tracking-wide text-white/85 border border-white/12 bg-white/5 hover:bg-white/8 transition-colors\",children:i.download.docs})})]})}),(0,a.jsx)(sg,{delayMs:220,children:(0,a.jsxs)(\"div\",{id:\"homebrew\",ref:f,className:\"mt-8 scroll-mt-28 rounded-[22px] border border-white/10 bg-black/35 p-5 sm:p-6\",children:[(0,a.jsxs)(\"div\",{className:\"flex flex-col sm:flex-row sm:items-center justify-between gap-3\",children:[(0,a.jsxs)(\"div\",{children:[(0,a.jsx)(\"div\",{className:\"font-display text-sm tracking-[0.18em] uppercase text-white/70\",children:i.homebrew.title}),(0,a.jsx)(\"div\",{className:\"mt-2 font-mono text-sm text-white/75\",children:\"brew install --cask mos\"})]}),(0,a.jsx)(sj,{value:\"brew install --cask mos\",className:\"self-start sm:self-auto rounded-2xl px-4 py-2.5 text-sm font-semibold border border-white/12 bg-white/5 hover:bg-white/8 transition-colors text-white/85\",copiedLabel:i.homebrew.copied,children:i.homebrew.copy})]}),(0,a.jsx)(\"div\",{className:\"mt-4 font-mono text-xs text-white/45\",children:(()=>{let e=i.homebrew.tip,t=\"{cask}\",r=e.indexOf(t);if(-1===r)return e;let n=e.slice(0,r),s=e.slice(r+t.length);return(0,a.jsxs)(a.Fragment,{children:[n,(0,a.jsx)(\"span\",{className:\"text-white/70\",children:\"mos@beta\"}),s]})})()})]})})]}),(0,a.jsxs)(\"div\",{className:\"px-6 sm:px-10 py-6 border-t border-white/10 flex flex-col sm:flex-row sm:items-center justify-between gap-3 text-white/45\",children:[(0,a.jsx)(\"div\",{className:\"font-mono text-xs\",children:(d?(e=i.footer.latestVersion,t={version:d},e.replace(/\\{(\\w+)\\}/g,(e,i)=>{let r=t[i];return null==r?`{${i}}`:String(r)})):i.footer.latestRelease)+\" · \"+i.footer.requiresMacos}),(0,a.jsxs)(\"div\",{className:\"flex items-center gap-4 font-mono text-xs\",children:[(0,a.jsx)(\"a\",{href:\"https://github.com/Caldis/Mos\",target:\"_blank\",rel:\"noopener noreferrer\",className:\"hover:text-white/80 transition-colors\",children:i.footer.github}),(0,a.jsx)(\"a\",{href:\"https://github.com/Caldis/Mos/wiki\",target:\"_blank\",rel:\"noopener noreferrer\",className:\"hover:text-white/80 transition-colors\",children:i.footer.wiki}),(0,a.jsx)(\"a\",{href:\"https://github.com/Caldis/Mos/releases\",target:\"_blank\",rel:\"noopener noreferrer\",className:\"hover:text-white/80 transition-colors\",children:i.footer.releases})]})]})]})})]})]})}e.s([\"default\",()=>oE],61096)}]);"
  },
  {
    "path": "docs/_next/static/chunks/c62ecb7f1a587007.js",
    "content": "(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push([\"object\"==typeof document?document.currentScript:void 0,46424,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"warnOnce\",{enumerable:!0,get:function(){return n}});let n=e=>{}}]);"
  },
  {
    "path": "docs/_next/static/chunks/d95bda38d1a9ce53.js",
    "content": "(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push([\"object\"==typeof document?document.currentScript:void 0,46424,(e,t,n)=>{\"use strict\";Object.defineProperty(n,\"__esModule\",{value:!0}),Object.defineProperty(n,\"warnOnce\",{enumerable:!0,get:function(){return o}});let o=e=>{}},1933,e=>{e.v(\"/_next/static/media/logo-512.60619949.png\")}]);"
  },
  {
    "path": "docs/_next/static/chunks/f1a98b44d1dc31f1.js",
    "content": "(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push([\"object\"==typeof document?document.currentScript:void 0,17421,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"InvariantError\",{enumerable:!0,get:function(){return n}});class n extends Error{constructor(e,t){super(`Invariant: ${e.endsWith(\".\")?e:e+\".\"} This is a bug in Next.js.`,t),this.name=\"InvariantError\"}}},83025,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={BailoutToCSRError:function(){return o},isBailoutToCSRError:function(){return l}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=\"BAILOUT_TO_CLIENT_SIDE_RENDERING\";class o extends Error{constructor(e){super(`Bail out to client-side rendering: ${e}`),this.reason=e,this.digest=u}}function l(e){return\"object\"==typeof e&&null!==e&&\"digest\"in e&&e.digest===u}},17267,(e,t,r)=>{\"use strict\";var n=e.r(72491),a={stream:!0},u=Object.prototype.hasOwnProperty;function o(t){var r=e.r(t);return\"function\"!=typeof r.then||\"fulfilled\"===r.status?null:(r.then(function(e){r.status=\"fulfilled\",r.value=e},function(e){r.status=\"rejected\",r.reason=e}),r)}var l=new WeakSet,i=new WeakSet;function s(){}function c(t){for(var r=t[1],n=[],a=0;a<r.length;a++){var u=e.L(r[a]);if(i.has(u)||n.push(u),!l.has(u)){var c=i.add.bind(i,u);u.then(c,s),l.add(u)}}return 4===t.length?0===n.length?o(t[0]):Promise.all(n).then(function(){return o(t[0])}):0<n.length?Promise.all(n):null}function f(t){var r=e.r(t[0]);if(4===t.length&&\"function\"==typeof r.then)if(\"fulfilled\"===r.status)r=r.value;else throw r.reason;return\"*\"===t[2]?r:\"\"===t[2]?r.__esModule?r.default:r:u.call(r,t[2])?r[t[2]]:void 0}var d=n.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,p=Symbol.for(\"react.transitional.element\"),h=Symbol.for(\"react.lazy\"),y=Symbol.iterator,g=Symbol.asyncIterator,_=Array.isArray,v=Object.getPrototypeOf,b=Object.prototype,m=new WeakMap;function R(e,t,r){m.has(e)||m.set(e,{id:t,originalBind:e.bind,bound:r})}function E(e,t,r){this.status=e,this.value=t,this.reason=r}function P(e){switch(e.status){case\"resolved_model\":x(e);break;case\"resolved_module\":U(e)}switch(e.status){case\"fulfilled\":return e.value;case\"pending\":case\"blocked\":case\"halted\":throw e;default:throw e.reason}}function S(e,t,r,n){for(var a=0;a<t.length;a++){var u=t[a];\"function\"==typeof u?u(r):L(e,u,r,n)}}function O(e,t,r){for(var n=0;n<t.length;n++){var a=t[n];\"function\"==typeof a?a(r):H(e,a.handler,r)}}function T(e,t){var r=t.handler.chunk;if(null===r)return null;if(r===e)return t.handler;if(null!==(t=r.value))for(r=0;r<t.length;r++){var n=t[r];if(\"function\"!=typeof n&&null!==(n=T(e,n)))return n}return null}function j(e,t,r,n){switch(t.status){case\"fulfilled\":S(e,r,t.value,t);break;case\"blocked\":for(var a=0;a<r.length;a++){var u=r[a];if(\"function\"!=typeof u){var o=T(t,u);if(null!==o)switch(L(e,u,o.value,t),r.splice(a,1),a--,null!==n&&-1!==(u=n.indexOf(u))&&n.splice(u,1),t.status){case\"fulfilled\":S(e,r,t.value,t);return;case\"rejected\":null!==n&&O(e,n,t.reason);return}}}case\"pending\":if(t.value)for(e=0;e<r.length;e++)t.value.push(r[e]);else t.value=r;if(t.reason){if(n)for(r=0;r<n.length;r++)t.reason.push(n[r])}else t.reason=n;break;case\"rejected\":n&&O(e,n,t.reason)}}function w(e,t,r){if(\"pending\"!==t.status&&\"blocked\"!==t.status)t.reason.error(r);else{var n=t.reason;t.status=\"rejected\",t.reason=r,null!==n&&O(e,n,r)}}function A(e,t,r){return new E(\"resolved_model\",(r?'{\"done\":true,\"value\":':'{\"done\":false,\"value\":')+t+\"}\",e)}function M(e,t,r,n){N(e,t,(n?'{\"done\":true,\"value\":':'{\"done\":false,\"value\":')+r+\"}\")}function N(e,t,r){if(\"pending\"!==t.status)t.reason.enqueueModel(r);else{var n=t.value,a=t.reason;t.status=\"resolved_model\",t.value=r,t.reason=e,null!==n&&(x(t),j(e,t,n,a))}}function C(e,t,r){if(\"pending\"===t.status||\"blocked\"===t.status){var n=t.value,a=t.reason;t.status=\"resolved_module\",t.value=r,t.reason=null,null!==n&&(U(t),j(e,t,n,a))}}E.prototype=Object.create(Promise.prototype),E.prototype.then=function(e,t){switch(this.status){case\"resolved_model\":x(this);break;case\"resolved_module\":U(this)}switch(this.status){case\"fulfilled\":\"function\"==typeof e&&e(this.value);break;case\"pending\":case\"blocked\":\"function\"==typeof e&&(null===this.value&&(this.value=[]),this.value.push(e)),\"function\"==typeof t&&(null===this.reason&&(this.reason=[]),this.reason.push(t));break;case\"halted\":break;default:\"function\"==typeof t&&t(this.reason)}};var D=null;function x(e){var t=D;D=null;var r=e.value,n=e.reason;e.status=\"blocked\",e.value=null,e.reason=null;try{var a=JSON.parse(r,n._fromJSON),u=e.value;if(null!==u)for(e.value=null,e.reason=null,r=0;r<u.length;r++){var o=u[r];\"function\"==typeof o?o(a):L(n,o,a,e)}if(null!==D){if(D.errored)throw D.reason;if(0<D.deps){D.value=a,D.chunk=e;return}}e.status=\"fulfilled\",e.value=a}catch(t){e.status=\"rejected\",e.reason=t}finally{D=t}}function U(e){try{var t=f(e.value);e.status=\"fulfilled\",e.value=t}catch(t){e.status=\"rejected\",e.reason=t}}function k(e,t){e._closed=!0,e._closedReason=t,e._chunks.forEach(function(r){\"pending\"===r.status?w(e,r,t):\"fulfilled\"===r.status&&null!==r.reason&&r.reason.error(t)})}function I(e){return{$$typeof:h,_payload:e,_init:P}}function F(e,t){var r=e._chunks,n=r.get(t);return n||(n=e._closed?new E(\"rejected\",null,e._closedReason):new E(\"pending\",null,null),r.set(t,n)),n}function L(e,t,r){var n=t.handler,a=t.parentObject,o=t.key,l=t.map,i=t.path;try{for(var s=1;s<i.length;s++){for(;\"object\"==typeof r&&null!==r&&r.$$typeof===h;){var c=r._payload;if(c===n.chunk)r=n.value;else{switch(c.status){case\"resolved_model\":x(c);break;case\"resolved_module\":U(c)}switch(c.status){case\"fulfilled\":r=c.value;continue;case\"blocked\":var f=T(c,t);if(null!==f){r=f.value;continue}case\"pending\":i.splice(0,s-1),null===c.value?c.value=[t]:c.value.push(t),null===c.reason?c.reason=[t]:c.reason.push(t);return;case\"halted\":return;default:H(e,t.handler,c.reason);return}}}var d=i[s];if(\"object\"==typeof r&&null!==r&&u.call(r,d))r=r[d];else throw Error(\"Invalid reference.\")}for(;\"object\"==typeof r&&null!==r&&r.$$typeof===h;){var y=r._payload;if(y===n.chunk)r=n.value;else{switch(y.status){case\"resolved_model\":x(y);break;case\"resolved_module\":U(y)}if(\"fulfilled\"===y.status){r=y.value;continue}break}}var g=l(e,r,a,o);if(\"__proto__\"!==o&&(a[o]=g),\"\"===o&&null===n.value&&(n.value=g),a[0]===p&&\"object\"==typeof n.value&&null!==n.value&&n.value.$$typeof===p){var _=n.value;\"3\"===o&&(_.props=g)}}catch(r){H(e,t.handler,r);return}n.deps--,0===n.deps&&null!==(t=n.chunk)&&\"blocked\"===t.status&&(r=t.value,t.status=\"fulfilled\",t.value=n.value,t.reason=n.reason,null!==r&&S(e,r,n.value,t))}function H(e,t,r){t.errored||(t.errored=!0,t.value=null,t.reason=r,null!==(t=t.chunk)&&\"blocked\"===t.status&&w(e,t,r))}function $(e,t,r,n,a,u){return D?(n=D,n.deps++):n=D={parent:null,chunk:null,value:null,reason:null,deps:1,errored:!1},t={handler:n,parentObject:t,key:r,map:a,path:u},null===e.value?e.value=[t]:e.value.push(t),null===e.reason?e.reason=[t]:e.reason.push(t),null}function B(e,t,r,n){if(!e._serverReferenceConfig)return function(e,t){function r(){var e=Array.prototype.slice.call(arguments);return a?\"fulfilled\"===a.status?t(n,a.value.concat(e)):Promise.resolve(a).then(function(r){return t(n,r.concat(e))}):t(n,e)}var n=e.id,a=e.bound;return R(r,n,a),r}(t,e._callServer);var a=function(e,t){var r=\"\",n=e[t];if(n)r=n.name;else{var a=t.lastIndexOf(\"#\");if(-1!==a&&(r=t.slice(a+1),n=e[t.slice(0,a)]),!n)throw Error('Could not find the module \"'+t+'\" in the React Server Manifest. This is probably a bug in the React Server Components bundler.')}return n.async?[n.id,n.chunks,r,1]:[n.id,n.chunks,r]}(e._serverReferenceConfig,t.id),u=c(a);if(u)t.bound&&(u=Promise.all([u,t.bound]));else{if(!t.bound)return R(u=f(a),t.id,t.bound),u;u=Promise.resolve(t.bound)}if(D){var o=D;o.deps++}else o=D={parent:null,chunk:null,value:null,reason:null,deps:1,errored:!1};return u.then(function(){var u=f(a);if(t.bound){var l=t.bound.value.slice(0);l.unshift(null),u=u.bind.apply(u,l)}R(u,t.id,t.bound),\"__proto__\"!==n&&(r[n]=u),\"\"===n&&null===o.value&&(o.value=u),r[0]===p&&\"object\"==typeof o.value&&null!==o.value&&o.value.$$typeof===p&&(l=o.value,\"3\"===n)&&(l.props=u),o.deps--,0===o.deps&&null!==(u=o.chunk)&&\"blocked\"===u.status&&(l=u.value,u.status=\"fulfilled\",u.value=o.value,u.reason=null,null!==l&&S(e,l,o.value,u))},function(t){if(!o.errored){o.errored=!0,o.value=null,o.reason=t;var r=o.chunk;null!==r&&\"blocked\"===r.status&&w(e,r,t)}}),null}function X(e,t,r,n,a){var u=parseInt((t=t.split(\":\"))[0],16);switch((u=F(e,u)).status){case\"resolved_model\":x(u);break;case\"resolved_module\":U(u)}switch(u.status){case\"fulfilled\":u=u.value;for(var o=1;o<t.length;o++){for(;\"object\"==typeof u&&null!==u&&u.$$typeof===h;){switch((u=u._payload).status){case\"resolved_model\":x(u);break;case\"resolved_module\":U(u)}switch(u.status){case\"fulfilled\":u=u.value;break;case\"blocked\":case\"pending\":return $(u,r,n,e,a,t.slice(o-1));case\"halted\":return D?(e=D,e.deps++):D={parent:null,chunk:null,value:null,reason:null,deps:1,errored:!1},null;default:return D?(D.errored=!0,D.value=null,D.reason=u.reason):D={parent:null,chunk:null,value:null,reason:u.reason,deps:0,errored:!0},null}}u=u[t[o]]}for(;\"object\"==typeof u&&null!==u&&u.$$typeof===h;){switch((t=u._payload).status){case\"resolved_model\":x(t);break;case\"resolved_module\":U(t)}if(\"fulfilled\"===t.status){u=t.value;continue}break}return a(e,u,r,n);case\"pending\":case\"blocked\":return $(u,r,n,e,a,t);case\"halted\":return D?(e=D,e.deps++):D={parent:null,chunk:null,value:null,reason:null,deps:1,errored:!1},null;default:return D?(D.errored=!0,D.value=null,D.reason=u.reason):D={parent:null,chunk:null,value:null,reason:u.reason,deps:0,errored:!0},null}}function q(e,t){return new Map(t)}function W(e,t){return new Set(t)}function K(e,t){return new Blob(t.slice(1),{type:t[0]})}function V(e,t){e=new FormData;for(var r=0;r<t.length;r++)e.append(t[r][0],t[r][1]);return e}function G(e,t){return t[Symbol.iterator]()}function Y(e,t){return t}function z(){throw Error('Trying to call a function from \"use server\" but the callServer option was not implemented in your router runtime.')}function Q(e,t,r,n,a,u,o){var l,i=new Map;this._bundlerConfig=e,this._serverReferenceConfig=t,this._moduleLoading=r,this._callServer=void 0!==n?n:z,this._encodeFormAction=a,this._nonce=u,this._chunks=i,this._stringDecoder=new TextDecoder,this._fromJSON=null,this._closed=!1,this._closedReason=null,this._tempRefs=o,this._fromJSON=(l=this,function(e,t){if(\"__proto__\"!==e){if(\"string\"==typeof t){var r=l,n=this,a=e,u=t;if(\"$\"===u[0]){if(\"$\"===u)return null!==D&&\"0\"===a&&(D={parent:D,chunk:null,value:null,reason:null,deps:0,errored:!1}),p;switch(u[1]){case\"$\":return u.slice(1);case\"L\":return I(r=F(r,n=parseInt(u.slice(2),16)));case\"@\":return F(r,n=parseInt(u.slice(2),16));case\"S\":return Symbol.for(u.slice(2));case\"h\":return X(r,u=u.slice(2),n,a,B);case\"T\":if(n=\"$\"+u.slice(2),null==(r=r._tempRefs))throw Error(\"Missing a temporary reference set but the RSC response returned a temporary reference. Pass a temporaryReference option with the set that was used with the reply.\");return r.get(n);case\"Q\":return X(r,u=u.slice(2),n,a,q);case\"W\":return X(r,u=u.slice(2),n,a,W);case\"B\":return X(r,u=u.slice(2),n,a,K);case\"K\":return X(r,u=u.slice(2),n,a,V);case\"Z\":return en();case\"i\":return X(r,u=u.slice(2),n,a,G);case\"I\":return 1/0;case\"-\":return\"$-0\"===u?-0:-1/0;case\"N\":return NaN;case\"u\":return;case\"D\":return new Date(Date.parse(u.slice(2)));case\"n\":return BigInt(u.slice(2));default:return X(r,u=u.slice(1),n,a,Y)}}return u}if(\"object\"==typeof t&&null!==t){if(t[0]===p){if(e={$$typeof:p,type:t[1],key:t[2],ref:null,props:t[3]},null!==D){if(D=(t=D).parent,t.errored)e=I(e=new E(\"rejected\",null,t.reason));else if(0<t.deps){var o=new E(\"blocked\",null,null);t.value=e,t.chunk=o,e=I(o)}}}else e=t;return e}return t}})}function J(e,t,r){var n=(e=e._chunks).get(t);n&&\"pending\"!==n.status?n.reason.enqueueValue(r):(r=new E(\"fulfilled\",r,null),e.set(t,r))}function Z(e,t,r,n){var a=e._chunks,u=a.get(t);u?\"pending\"===u.status&&(t=u.value,u.status=\"fulfilled\",u.value=r,u.reason=n,null!==t&&S(e,t,u.value,u)):(e=new E(\"fulfilled\",r,n),a.set(t,e))}function ee(e,t,r){var n=null,a=!1;r=new ReadableStream({type:r,start:function(e){n=e}});var u=null;Z(e,t,r,{enqueueValue:function(e){null===u?n.enqueue(e):u.then(function(){n.enqueue(e)})},enqueueModel:function(t){if(null===u){var r=new E(\"resolved_model\",t,e);x(r),\"fulfilled\"===r.status?n.enqueue(r.value):(r.then(function(e){return n.enqueue(e)},function(e){return n.error(e)}),u=r)}else{r=u;var a=new E(\"pending\",null,null);a.then(function(e){return n.enqueue(e)},function(e){return n.error(e)}),u=a,r.then(function(){u===a&&(u=null),N(e,a,t)})}},close:function(){if(!a)if(a=!0,null===u)n.close();else{var e=u;u=null,e.then(function(){return n.close()})}},error:function(e){if(!a)if(a=!0,null===u)n.error(e);else{var t=u;u=null,t.then(function(){return n.error(e)})}}})}function et(){return this}function er(e,t,r){var n=[],a=!1,u=0,o={};o[g]=function(){var e,t=0;return(e={next:e=function(e){if(void 0!==e)throw Error(\"Values cannot be passed to next() of AsyncIterables passed to Client Components.\");if(t===n.length){if(a)return new E(\"fulfilled\",{done:!0,value:void 0},null);n[t]=new E(\"pending\",null,null)}return n[t++]}})[g]=et,e},Z(e,t,r?o[g]():o,{enqueueValue:function(t){if(u===n.length)n[u]=new E(\"fulfilled\",{done:!1,value:t},null);else{var r=n[u],a=r.value,o=r.reason;r.status=\"fulfilled\",r.value={done:!1,value:t},r.reason=null,null!==a&&j(e,r,a,o)}u++},enqueueModel:function(t){u===n.length?n[u]=A(e,t,!1):M(e,n[u],t,!1),u++},close:function(t){if(!a)for(a=!0,u===n.length?n[u]=A(e,t,!0):M(e,n[u],t,!0),u++;u<n.length;)M(e,n[u++],'\"$undefined\"',!0)},error:function(t){if(!a)for(a=!0,u===n.length&&(n[u]=new E(\"pending\",null,null));u<n.length;)w(e,n[u++],t)}})}function en(){var e=Error(\"An error occurred in the Server Components render. The specific message is omitted in production builds to avoid leaking sensitive details. A digest property is included on this error instance which may provide additional details about the nature of the error.\");return e.stack=\"Error: \"+e.message,e}function ea(e,t){for(var r=e.length,n=t.length,a=0;a<r;a++)n+=e[a].byteLength;n=new Uint8Array(n);for(var u=a=0;u<r;u++){var o=e[u];n.set(o,a),a+=o.byteLength}return n.set(t,a),n}function eu(e,t,r,n,a,u){J(e,t,a=new a((r=0===r.length&&0==n.byteOffset%u?n:ea(r,n)).buffer,r.byteOffset,r.byteLength/u))}function eo(e){k(e,Error(\"Connection closed.\"))}function el(e){return new Q(null,null,null,e&&e.callServer?e.callServer:void 0,void 0,void 0,e&&e.temporaryReferences?e.temporaryReferences:void 0)}function ei(e,t,r){function n(t){k(e,t)}var u={_rowState:0,_rowID:0,_rowTag:0,_rowLength:0,_buffer:[]},o=t.getReader();o.read().then(function t(l){var i=l.value;if(l.done)return r();var s=0,f=u._rowState;l=u._rowID;for(var p=u._rowTag,h=u._rowLength,y=u._buffer,g=i.length;s<g;){var _=-1;switch(f){case 0:58===(_=i[s++])?f=1:l=l<<4|(96<_?_-87:_-48);continue;case 1:84===(f=i[s])||65===f||79===f||111===f||98===f||85===f||83===f||115===f||76===f||108===f||71===f||103===f||77===f||109===f||86===f?(p=f,f=2,s++):64<f&&91>f||35===f||114===f||120===f?(p=f,f=3,s++):(p=0,f=3);continue;case 2:44===(_=i[s++])?f=4:h=h<<4|(96<_?_-87:_-48);continue;case 3:_=i.indexOf(10,s);break;case 4:(_=s+h)>i.length&&(_=-1)}var v=i.byteOffset+s;if(-1<_)h=new Uint8Array(i.buffer,v,_-s),98===p?J(e,l,_===g?h:h.slice()):function(e,t,r,n,u,o){switch(n){case 65:J(e,r,ea(u,o).buffer);return;case 79:eu(e,r,u,o,Int8Array,1);return;case 111:J(e,r,0===u.length?o:ea(u,o));return;case 85:eu(e,r,u,o,Uint8ClampedArray,1);return;case 83:eu(e,r,u,o,Int16Array,2);return;case 115:eu(e,r,u,o,Uint16Array,2);return;case 76:eu(e,r,u,o,Int32Array,4);return;case 108:eu(e,r,u,o,Uint32Array,4);return;case 71:eu(e,r,u,o,Float32Array,4);return;case 103:eu(e,r,u,o,Float64Array,8);return;case 77:eu(e,r,u,o,BigInt64Array,8);return;case 109:eu(e,r,u,o,BigUint64Array,8);return;case 86:eu(e,r,u,o,DataView,1);return}t=e._stringDecoder;for(var l=\"\",i=0;i<u.length;i++)l+=t.decode(u[i],a);switch(u=l+=t.decode(o),n){case 73:var s=e,f=r,p=u,h=s._chunks,y=h.get(f);p=JSON.parse(p,s._fromJSON);var g=function(e,t){if(e){var r=e[t[0]];if(e=r&&r[t[2]])r=e.name;else{if(!(e=r&&r[\"*\"]))throw Error('Could not find the module \"'+t[0]+'\" in the React Server Consumer Manifest. This is probably a bug in the React Server Components bundler.');r=t[2]}return 4===t.length?[e.id,e.chunks,r,1]:[e.id,e.chunks,r]}return t}(s._bundlerConfig,p);if(p=c(g)){if(y){var _=y;_.status=\"blocked\"}else _=new E(\"blocked\",null,null),h.set(f,_);p.then(function(){return C(s,_,g)},function(e){return w(s,_,e)})}else y?C(s,y,g):(y=new E(\"resolved_module\",g,null),h.set(f,y));break;case 72:switch(r=u[0],e=JSON.parse(u=u.slice(1),e._fromJSON),u=d.d,r){case\"D\":u.D(e);break;case\"C\":\"string\"==typeof e?u.C(e):u.C(e[0],e[1]);break;case\"L\":r=e[0],n=e[1],3===e.length?u.L(r,n,e[2]):u.L(r,n);break;case\"m\":\"string\"==typeof e?u.m(e):u.m(e[0],e[1]);break;case\"X\":\"string\"==typeof e?u.X(e):u.X(e[0],e[1]);break;case\"S\":\"string\"==typeof e?u.S(e):u.S(e[0],0===e[1]?void 0:e[1],3===e.length?e[2]:void 0);break;case\"M\":\"string\"==typeof e?u.M(e):u.M(e[0],e[1])}break;case 69:o=(n=e._chunks).get(r),u=JSON.parse(u),(t=en()).digest=u.digest,o?w(e,o,t):(e=new E(\"rejected\",null,t),n.set(r,e));break;case 84:(n=(e=e._chunks).get(r))&&\"pending\"!==n.status?n.reason.enqueueValue(u):(u=new E(\"fulfilled\",u,null),e.set(r,u));break;case 78:case 68:case 74:case 87:throw Error(\"Failed to read a RSC payload created by a development version of React on the server while using a production version on the client. Always use matching versions on the server and the client.\");case 82:ee(e,r,void 0);break;case 114:ee(e,r,\"bytes\");break;case 88:er(e,r,!1);break;case 120:er(e,r,!0);break;case 67:(r=e._chunks.get(r))&&\"fulfilled\"===r.status&&r.reason.close(\"\"===u?'\"$undefined\"':u);break;default:(o=(n=e._chunks).get(r))?N(e,o,u):(e=new E(\"resolved_model\",u,e),n.set(r,e))}}(e,u,l,p,y,h),s=_,3===f&&s++,h=l=p=f=0,y.length=0;else{i=new Uint8Array(i.buffer,v,i.byteLength-s),98===p?(h-=i.byteLength,J(e,l,i)):(y.push(i),h-=i.byteLength);break}}return u._rowState=f,u._rowID=l,u._rowTag=p,u._rowLength=h,o.read().then(t).catch(n)}).catch(n)}r.createFromFetch=function(e,t){var r=el(t);return e.then(function(e){ei(r,e.body,eo.bind(null,r))},function(e){k(r,e)}),F(r,0)},r.createFromReadableStream=function(e,t){return ei(t=el(t),e,eo.bind(null,t)),F(t,0)},r.createServerReference=function(e,t){function r(){var r=Array.prototype.slice.call(arguments);return t(e,r)}return R(r,e,null),r},r.createTemporaryReferenceSet=function(){return new Map},r.encodeReply=function(e,t){return new Promise(function(r,n){var a=function(e,t,r,n,a){function u(e,t){t=new Blob([new Uint8Array(t.buffer,t.byteOffset,t.byteLength)]);var r=i++;return null===c&&(c=new FormData),c.append(\"\"+r,t),\"$\"+e+r.toString(16)}function o(e,t){if(null===t)return null;if(\"object\"==typeof t){switch(t.$$typeof){case p:if(void 0!==r&&-1===e.indexOf(\":\")){var R,E,P,S,O,T=f.get(this);if(void 0!==T)return r.set(T+\":\"+e,t),\"$T\"}throw Error(\"React Element cannot be passed to Server Functions from the Client without a temporary reference set. Pass a TemporaryReferenceSet to the options.\");case h:T=t._payload;var j=t._init;null===c&&(c=new FormData),s++;try{var w=j(T),A=i++,M=l(w,A);return c.append(\"\"+A,M),\"$\"+A.toString(16)}catch(e){if(\"object\"==typeof e&&null!==e&&\"function\"==typeof e.then){s++;var N=i++;return T=function(){try{var e=l(t,N),r=c;r.append(\"\"+N,e),s--,0===s&&n(r)}catch(e){a(e)}},e.then(T,T),\"$\"+N.toString(16)}return a(e),null}finally{s--}}if(T=f.get(t),\"function\"==typeof t.then){if(void 0!==T)if(d!==t)return T;else d=null;null===c&&(c=new FormData),s++;var C=i++;return e=\"$@\"+C.toString(16),f.set(t,e),t.then(function(e){try{var t=f.get(e),r=void 0!==t?JSON.stringify(t):l(e,C);(e=c).append(\"\"+C,r),s--,0===s&&n(e)}catch(e){a(e)}},a),e}if(void 0!==T)if(d!==t)return T;else d=null;else -1===e.indexOf(\":\")&&void 0!==(T=f.get(this))&&(e=T+\":\"+e,f.set(t,e),void 0!==r&&r.set(e,t));if(_(t))return t;if(t instanceof FormData){null===c&&(c=new FormData);var D=c,x=\"\"+(e=i++)+\"_\";return t.forEach(function(e,t){D.append(x+t,e)}),\"$K\"+e.toString(16)}if(t instanceof Map)return e=i++,T=l(Array.from(t),e),null===c&&(c=new FormData),c.append(\"\"+e,T),\"$Q\"+e.toString(16);if(t instanceof Set)return e=i++,T=l(Array.from(t),e),null===c&&(c=new FormData),c.append(\"\"+e,T),\"$W\"+e.toString(16);if(t instanceof ArrayBuffer)return e=new Blob([t]),T=i++,null===c&&(c=new FormData),c.append(\"\"+T,e),\"$A\"+T.toString(16);if(t instanceof Int8Array)return u(\"O\",t);if(t instanceof Uint8Array)return u(\"o\",t);if(t instanceof Uint8ClampedArray)return u(\"U\",t);if(t instanceof Int16Array)return u(\"S\",t);if(t instanceof Uint16Array)return u(\"s\",t);if(t instanceof Int32Array)return u(\"L\",t);if(t instanceof Uint32Array)return u(\"l\",t);if(t instanceof Float32Array)return u(\"G\",t);if(t instanceof Float64Array)return u(\"g\",t);if(t instanceof BigInt64Array)return u(\"M\",t);if(t instanceof BigUint64Array)return u(\"m\",t);if(t instanceof DataView)return u(\"V\",t);if(\"function\"==typeof Blob&&t instanceof Blob)return null===c&&(c=new FormData),e=i++,c.append(\"\"+e,t),\"$B\"+e.toString(16);if(e=null===(R=t)||\"object\"!=typeof R?null:\"function\"==typeof(R=y&&R[y]||R[\"@@iterator\"])?R:null)return(T=e.call(t))===t?(e=i++,T=l(Array.from(T),e),null===c&&(c=new FormData),c.append(\"\"+e,T),\"$i\"+e.toString(16)):Array.from(T);if(\"function\"==typeof ReadableStream&&t instanceof ReadableStream)return function(e){try{var t,r,u,l,f,d,p,h=e.getReader({mode:\"byob\"})}catch(l){return t=e.getReader(),null===c&&(c=new FormData),r=c,s++,u=i++,t.read().then(function e(l){if(l.done)r.append(\"\"+u,\"C\"),0==--s&&n(r);else try{var i=JSON.stringify(l.value,o);r.append(\"\"+u,i),t.read().then(e,a)}catch(e){a(e)}},a),\"$R\"+u.toString(16)}return l=h,null===c&&(c=new FormData),f=c,s++,d=i++,p=[],l.read(new Uint8Array(1024)).then(function e(t){t.done?(t=i++,f.append(\"\"+t,new Blob(p)),f.append(\"\"+d,'\"$o'+t.toString(16)+'\"'),f.append(\"\"+d,\"C\"),0==--s&&n(f)):(p.push(t.value),l.read(new Uint8Array(1024)).then(e,a))},a),\"$r\"+d.toString(16)}(t);if(\"function\"==typeof(e=t[g]))return E=t,P=e.call(t),null===c&&(c=new FormData),S=c,s++,O=i++,E=E===P,P.next().then(function e(t){if(t.done){if(void 0===t.value)S.append(\"\"+O,\"C\");else try{var r=JSON.stringify(t.value,o);S.append(\"\"+O,\"C\"+r)}catch(e){a(e);return}0==--s&&n(S)}else try{var u=JSON.stringify(t.value,o);S.append(\"\"+O,u),P.next().then(e,a)}catch(e){a(e)}},a),\"$\"+(E?\"x\":\"X\")+O.toString(16);if((e=v(t))!==b&&(null===e||null!==v(e))){if(void 0===r)throw Error(\"Only plain objects, and a few built-ins, can be passed to Server Functions. Classes or null prototypes are not supported.\");return\"$T\"}return t}if(\"string\"==typeof t)return\"Z\"===t[t.length-1]&&this[e]instanceof Date?\"$D\"+t:e=\"$\"===t[0]?\"$\"+t:t;if(\"boolean\"==typeof t)return t;if(\"number\"==typeof t)return Number.isFinite(t)?0===t&&-1/0==1/t?\"$-0\":t:1/0===t?\"$Infinity\":-1/0===t?\"$-Infinity\":\"$NaN\";if(void 0===t)return\"$undefined\";if(\"function\"==typeof t){if(void 0!==(T=m.get(t)))return void 0!==(e=f.get(t))||(e=JSON.stringify({id:T.id,bound:T.bound},o),null===c&&(c=new FormData),T=i++,c.set(\"\"+T,e),e=\"$h\"+T.toString(16),f.set(t,e)),e;if(void 0!==r&&-1===e.indexOf(\":\")&&void 0!==(T=f.get(this)))return r.set(T+\":\"+e,t),\"$T\";throw Error(\"Client Functions cannot be passed directly to Server Functions. Only Functions passed from the Server can be passed back again.\")}if(\"symbol\"==typeof t){if(void 0!==r&&-1===e.indexOf(\":\")&&void 0!==(T=f.get(this)))return r.set(T+\":\"+e,t),\"$T\";throw Error(\"Symbols cannot be passed to a Server Function without a temporary reference set. Pass a TemporaryReferenceSet to the options.\")}if(\"bigint\"==typeof t)return\"$n\"+t.toString(10);throw Error(\"Type \"+typeof t+\" is not supported as an argument to a Server Function.\")}function l(e,t){return\"object\"==typeof e&&null!==e&&(t=\"$\"+t.toString(16),f.set(e,t),void 0!==r&&r.set(t,e)),d=e,JSON.stringify(e,o)}var i=1,s=0,c=null,f=new WeakMap,d=e,R=l(e,0);return null===c?n(R):(c.set(\"0\",R),0===s&&n(c)),function(){0<s&&(s=0,null===c?n(R):n(c))}}(e,0,t&&t.temporaryReferences?t.temporaryReferences:void 0,r,n);if(t&&t.signal){var u=t.signal;if(u.aborted)a(u.reason);else{var o=function(){a(u.reason),u.removeEventListener(\"abort\",o)};u.addEventListener(\"abort\",o)}}})},r.registerServerReference=function(e,t){return R(e,t,null),e}},91994,(e,t,r)=>{\"use strict\";t.exports=e.r(17267)},58662,(e,t,r)=>{\"use strict\";t.exports=e.r(91994)},38747,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={HTTPAccessErrorStatus:function(){return u},HTTP_ERROR_FALLBACK_ERROR_CODE:function(){return l},getAccessFallbackErrorTypeByStatus:function(){return c},getAccessFallbackHTTPStatus:function(){return s},isHTTPAccessFallbackError:function(){return i}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u={NOT_FOUND:404,FORBIDDEN:403,UNAUTHORIZED:401},o=new Set(Object.values(u)),l=\"NEXT_HTTP_ERROR_FALLBACK\";function i(e){if(\"object\"!=typeof e||null===e||!(\"digest\"in e)||\"string\"!=typeof e.digest)return!1;let[t,r]=e.digest.split(\";\");return t===l&&o.has(Number(r))}function s(e){return Number(e.digest.split(\";\")[1])}function c(e){switch(e){case 401:return\"unauthorized\";case 403:return\"forbidden\";case 404:return\"not-found\";default:return}}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},37338,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"RedirectStatusCode\",{enumerable:!0,get:function(){return a}});var n,a=((n={})[n.SeeOther=303]=\"SeeOther\",n[n.TemporaryRedirect=307]=\"TemporaryRedirect\",n[n.PermanentRedirect=308]=\"PermanentRedirect\",n);(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},58310,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n,a={REDIRECT_ERROR_CODE:function(){return l},RedirectType:function(){return i},isRedirectError:function(){return s}};for(var u in a)Object.defineProperty(r,u,{enumerable:!0,get:a[u]});let o=e.r(37338),l=\"NEXT_REDIRECT\";var i=((n={}).push=\"push\",n.replace=\"replace\",n);function s(e){if(\"object\"!=typeof e||null===e||!(\"digest\"in e)||\"string\"!=typeof e.digest)return!1;let t=e.digest.split(\";\"),[r,n]=t,a=t.slice(2,-2).join(\";\"),u=Number(t.at(-2));return r===l&&(\"replace\"===n||\"push\"===n)&&\"string\"==typeof a&&!isNaN(u)&&u in o.RedirectStatusCode}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},25626,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"isNextRouterError\",{enumerable:!0,get:function(){return u}});let n=e.r(38747),a=e.r(58310);function u(e){return(0,a.isRedirectError)(e)||(0,n.isHTTPAccessFallbackError)(e)}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},87909,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"ReadonlyURLSearchParams\",{enumerable:!0,get:function(){return a}});class n extends Error{constructor(){super(\"Method unavailable on `ReadonlyURLSearchParams`. Read more: https://nextjs.org/docs/app/api-reference/functions/use-search-params#updating-searchparams\")}}class a extends URLSearchParams{append(){throw new n}delete(){throw new n}set(){throw new n}sort(){throw new n}}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},53675,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={NavigationPromisesContext:function(){return c},PathParamsContext:function(){return s},PathnameContext:function(){return i},ReadonlyURLSearchParams:function(){return o.ReadonlyURLSearchParams},SearchParamsContext:function(){return l},createDevToolsInstrumentedPromise:function(){return f}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(33664),o=e.r(87909),l=(0,u.createContext)(null),i=(0,u.createContext)(null),s=(0,u.createContext)(null),c=(0,u.createContext)(null);function f(e,t){let r=Promise.resolve(t);return r.status=\"fulfilled\",r.value=t,r.displayName=`${e} (SSR)`,r}},91462,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"workUnitAsyncStorageInstance\",{enumerable:!0,get:function(){return n}});let n=(0,e.r(44186).createAsyncLocalStorage)()},19044,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={ACTION_HEADER:function(){return o},FLIGHT_HEADERS:function(){return h},NEXT_ACTION_NOT_FOUND_HEADER:function(){return R},NEXT_ACTION_REVALIDATED_HEADER:function(){return S},NEXT_DID_POSTPONE_HEADER:function(){return _},NEXT_HMR_REFRESH_HASH_COOKIE:function(){return f},NEXT_HMR_REFRESH_HEADER:function(){return c},NEXT_HTML_REQUEST_ID_HEADER:function(){return P},NEXT_IS_PRERENDER_HEADER:function(){return m},NEXT_REQUEST_ID_HEADER:function(){return E},NEXT_REWRITTEN_PATH_HEADER:function(){return v},NEXT_REWRITTEN_QUERY_HEADER:function(){return b},NEXT_ROUTER_PREFETCH_HEADER:function(){return i},NEXT_ROUTER_SEGMENT_PREFETCH_HEADER:function(){return s},NEXT_ROUTER_STALE_TIME_HEADER:function(){return g},NEXT_ROUTER_STATE_TREE_HEADER:function(){return l},NEXT_RSC_UNION_QUERY:function(){return y},NEXT_URL:function(){return d},RSC_CONTENT_TYPE_HEADER:function(){return p},RSC_HEADER:function(){return u}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=\"rsc\",o=\"next-action\",l=\"next-router-state-tree\",i=\"next-router-prefetch\",s=\"next-router-segment-prefetch\",c=\"next-hmr-refresh\",f=\"__next_hmr_refresh_hash__\",d=\"next-url\",p=\"text/x-component\",h=[u,l,i,c,s],y=\"_rsc\",g=\"x-nextjs-stale-time\",_=\"x-nextjs-postponed\",v=\"x-nextjs-rewritten-path\",b=\"x-nextjs-rewritten-query\",m=\"x-nextjs-prerender\",R=\"x-nextjs-action-not-found\",E=\"x-nextjs-request-id\",P=\"x-nextjs-html-request-id\",S=\"x-action-revalidated\";(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},73187,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={getCacheSignal:function(){return g},getDraftModeProviderForCacheScope:function(){return y},getHmrRefreshHash:function(){return d},getPrerenderResumeDataCache:function(){return c},getRenderResumeDataCache:function(){return f},getRuntimeStagePromise:function(){return _},getServerComponentsHmrCache:function(){return h},isHmrRefresh:function(){return p},throwForMissingRequestStore:function(){return i},throwInvariantForMissingStore:function(){return s},workUnitAsyncStorage:function(){return u.workUnitAsyncStorageInstance}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(91462),o=e.r(19044),l=e.r(17421);function i(e){throw Object.defineProperty(Error(`\\`${e}\\` was called outside a request scope. Read more: https://nextjs.org/docs/messages/next-dynamic-api-wrong-context`),\"__NEXT_ERROR_CODE\",{value:\"E251\",enumerable:!1,configurable:!0})}function s(){throw Object.defineProperty(new l.InvariantError(\"Expected workUnitAsyncStorage to have a store.\"),\"__NEXT_ERROR_CODE\",{value:\"E696\",enumerable:!1,configurable:!0})}function c(e){switch(e.type){case\"prerender\":case\"prerender-runtime\":case\"prerender-ppr\":case\"prerender-client\":return e.prerenderResumeDataCache;case\"request\":if(e.prerenderResumeDataCache)return e.prerenderResumeDataCache;case\"prerender-legacy\":case\"cache\":case\"private-cache\":case\"unstable-cache\":return null;default:return e}}function f(e){switch(e.type){case\"request\":case\"prerender\":case\"prerender-runtime\":case\"prerender-client\":if(e.renderResumeDataCache)return e.renderResumeDataCache;case\"prerender-ppr\":return e.prerenderResumeDataCache??null;case\"cache\":case\"private-cache\":case\"unstable-cache\":case\"prerender-legacy\":return null;default:return e}}function d(e,t){if(e.dev)switch(t.type){case\"cache\":case\"private-cache\":case\"prerender\":case\"prerender-runtime\":return t.hmrRefreshHash;case\"request\":var r;return null==(r=t.cookies.get(o.NEXT_HMR_REFRESH_HASH_COOKIE))?void 0:r.value}}function p(e,t){if(e.dev)switch(t.type){case\"cache\":case\"private-cache\":case\"request\":return t.isHmrRefresh??!1}return!1}function h(e,t){if(e.dev)switch(t.type){case\"cache\":case\"private-cache\":case\"request\":return t.serverComponentsHmrCache}}function y(e,t){if(e.isDraftMode)switch(t.type){case\"cache\":case\"private-cache\":case\"unstable-cache\":case\"prerender-runtime\":case\"request\":return t.draftMode}}function g(e){switch(e.type){case\"prerender\":case\"prerender-client\":case\"prerender-runtime\":return e.cacheSignal;case\"request\":if(e.cacheSignal)return e.cacheSignal;case\"prerender-ppr\":case\"prerender-legacy\":case\"cache\":case\"private-cache\":case\"unstable-cache\":return null;default:return e}}function _(e){switch(e.type){case\"prerender-runtime\":case\"private-cache\":return e.runtimeStagePromise;case\"prerender\":case\"prerender-client\":case\"prerender-ppr\":case\"prerender-legacy\":case\"request\":case\"cache\":case\"unstable-cache\":return null;default:return e}}},56668,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"useUntrackedPathname\",{enumerable:!0,get:function(){return u}});let n=e.r(33664),a=e.r(53675);function u(){return!function(){if(\"u\"<typeof window){let{workUnitAsyncStorage:t}=e.r(73187),r=t.getStore();if(!r)return!1;switch(r.type){case\"prerender\":case\"prerender-client\":case\"prerender-ppr\":let n=r.fallbackRouteParams;return!!n&&n.size>0}}return!1}()?(0,n.useContext)(a.PathnameContext):null}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},13425,(e,t,r)=>{\"use strict\";function n(e,t=!0){return e.pathname+e.search+(t?e.hash:\"\")}Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"createHrefFromUrl\",{enumerable:!0,get:function(){return n}}),(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},83985,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={handleHardNavError:function(){return o},useNavFailureHandler:function(){return l}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});e.r(33664);let u=e.r(13425);function o(e){return!!(e&&\"u\">typeof window)&&!!window.next.__pendingUrl&&(0,u.createHrefFromUrl)(new URL(window.location.href))!==(0,u.createHrefFromUrl)(window.next.__pendingUrl)&&(console.error(\"Error occurred during navigation, falling back to hard navigation\",e),window.location.href=window.next.__pendingUrl.toString(),!0)}function l(){}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},26545,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"HTML_LIMITED_BOT_UA_RE\",{enumerable:!0,get:function(){return n}});let n=/[\\w-]+-Google|Google-[\\w-]+|Chrome-Lighthouse|Slurp|DuckDuckBot|baiduspider|yandex|sogou|bitlybot|tumblr|vkShare|quora link preview|redditbot|ia_archiver|Bingbot|BingPreview|applebot|facebookexternalhit|facebookcatalog|Twitterbot|LinkedInBot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|Yeti|googleweblight/i},3753,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={HTML_LIMITED_BOT_UA_RE:function(){return u.HTML_LIMITED_BOT_UA_RE},HTML_LIMITED_BOT_UA_RE_STRING:function(){return l},getBotType:function(){return c},isBot:function(){return s}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(26545),o=/Googlebot(?!-)|Googlebot$/i,l=u.HTML_LIMITED_BOT_UA_RE.source;function i(e){return u.HTML_LIMITED_BOT_UA_RE.test(e)}function s(e){return o.test(e)||i(e)}function c(e){return o.test(e)?\"dom\":i(e)?\"html\":void 0}},74506,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={ErrorBoundary:function(){return h},ErrorBoundaryHandler:function(){return p}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(81258),o=e.r(964),l=u._(e.r(33664)),i=e.r(56668),s=e.r(25626);e.r(83985);let c=e.r(60364),f=e.r(3753),d=\"u\">typeof window&&(0,f.isBot)(window.navigator.userAgent);class p extends l.default.Component{constructor(e){super(e),this.reset=()=>{this.setState({error:null})},this.state={error:null,previousPathname:this.props.pathname}}static getDerivedStateFromError(e){if((0,s.isNextRouterError)(e))throw e;return{error:e}}static getDerivedStateFromProps(e,t){let{error:r}=t;return e.pathname!==t.previousPathname&&t.error?{error:null,previousPathname:e.pathname}:{error:t.error,previousPathname:e.pathname}}render(){return this.state.error&&!d?(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(c.HandleISRError,{error:this.state.error}),this.props.errorStyles,this.props.errorScripts,(0,o.jsx)(this.props.errorComponent,{error:this.state.error,reset:this.reset})]}):this.props.children}}function h({errorComponent:e,errorStyles:t,errorScripts:r,children:n}){let a=(0,i.useUntrackedPathname)();return e?(0,o.jsx)(p,{pathname:a,errorComponent:e,errorStyles:t,errorScripts:r,children:n}):(0,o.jsx)(o.Fragment,{children:n})}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},57695,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n,a={ACTION_HMR_REFRESH:function(){return c},ACTION_NAVIGATE:function(){return l},ACTION_REFRESH:function(){return o},ACTION_RESTORE:function(){return i},ACTION_SERVER_ACTION:function(){return f},ACTION_SERVER_PATCH:function(){return s},PrefetchKind:function(){return d}};for(var u in a)Object.defineProperty(r,u,{enumerable:!0,get:a[u]});let o=\"refresh\",l=\"navigate\",i=\"restore\",s=\"server-patch\",c=\"hmr-refresh\",f=\"server-action\";var d=((n={}).AUTO=\"auto\",n.FULL=\"full\",n);(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},204,(e,t,r)=>{\"use strict\";function n(e){return null!==e&&\"object\"==typeof e&&\"then\"in e&&\"function\"==typeof e.then}Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"isThenable\",{enumerable:!0,get:function(){return n}})},82183,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={dispatchAppRouterAction:function(){return i},useActionQueue:function(){return s}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(44066)._(e.r(33664)),o=e.r(204),l=null;function i(e){if(null===l)throw Object.defineProperty(Error(\"Internal Next.js error: Router action dispatched before initialization.\"),\"__NEXT_ERROR_CODE\",{value:\"E668\",enumerable:!1,configurable:!0});l(e)}function s(e){let[t,r]=u.default.useState(e.state);l=t=>e.dispatch(t,r);let n=(0,u.useMemo)(()=>t,[t]);return(0,o.isThenable)(n)?(0,u.use)(n):n}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},55748,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"callServer\",{enumerable:!0,get:function(){return o}});let n=e.r(33664),a=e.r(57695),u=e.r(82183);async function o(e,t){return new Promise((r,o)=>{(0,n.startTransition)(()=>{(0,u.dispatchAppRouterAction)({type:a.ACTION_SERVER_ACTION,actionId:e,actionArgs:t,resolve:r,reject:o})})})}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},3958,(e,t,r)=>{\"use strict\";let n;Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"findSourceMapURL\",{enumerable:!0,get:function(){return n}});(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},45755,(e,t,r)=>{\"use strict\";function n(e){return e.startsWith(\"/\")?e:`/${e}`}Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"ensureLeadingSlash\",{enumerable:!0,get:function(){return n}})},17403,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={DEFAULT_SEGMENT_KEY:function(){return f},NOT_FOUND_SEGMENT_KEY:function(){return d},PAGE_SEGMENT_KEY:function(){return c},addSearchParamsIfPageSegment:function(){return i},computeSelectedLayoutSegment:function(){return s},getSegmentValue:function(){return u},getSelectedLayoutSegmentPath:function(){return function e(t,r,n=!0,a=[]){let o;if(n)o=t[1][r];else{let e=t[1];o=e.children??Object.values(e)[0]}if(!o)return a;let l=u(o[0]);return!l||l.startsWith(c)?a:(a.push(l),e(o,r,!1,a))}},isGroupSegment:function(){return o},isParallelRouteSegment:function(){return l}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});function u(e){return Array.isArray(e)?e[1]:e}function o(e){return\"(\"===e[0]&&e.endsWith(\")\")}function l(e){return e.startsWith(\"@\")&&\"@children\"!==e}function i(e,t){if(e.includes(c)){let e=JSON.stringify(t);return\"{}\"!==e?c+\"?\"+e:c}return e}function s(e,t){if(!e||0===e.length)return null;let r=\"children\"===t?e[0]:e[e.length-1];return r===f?null:r}let c=\"__PAGE__\",f=\"__DEFAULT__\",d=\"/_not-found\"},2415,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={normalizeAppPath:function(){return l},normalizeRscURL:function(){return i}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(45755),o=e.r(17403);function l(e){return(0,u.ensureLeadingSlash)(e.split(\"/\").reduce((e,t,r,n)=>!t||(0,o.isGroupSegment)(t)||\"@\"===t[0]||(\"page\"===t||\"route\"===t)&&r===n.length-1?e:`${e}/${t}`,\"\"))}function i(e){return e.replace(/\\.rsc($|\\?)/,\"$1\")}},29499,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={INTERCEPTION_ROUTE_MARKERS:function(){return o},extractInterceptionRouteInformation:function(){return i},isInterceptionRouteAppPath:function(){return l}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(2415),o=[\"(..)(..)\",\"(.)\",\"(..)\",\"(...)\"];function l(e){return void 0!==e.split(\"/\").find(e=>o.find(t=>e.startsWith(t)))}function i(e){let t,r,n;for(let a of e.split(\"/\"))if(r=o.find(e=>a.startsWith(e))){[t,n]=e.split(r,2);break}if(!t||!r||!n)throw Object.defineProperty(Error(`Invalid interception route: ${e}. Must be in the format /<intercepting route>/(..|...|..)(..)/<intercepted route>`),\"__NEXT_ERROR_CODE\",{value:\"E269\",enumerable:!1,configurable:!0});switch(t=(0,u.normalizeAppPath)(t),r){case\"(.)\":n=\"/\"===t?`/${n}`:t+\"/\"+n;break;case\"(..)\":if(\"/\"===t)throw Object.defineProperty(Error(`Invalid interception route: ${e}. Cannot use (..) marker at the root level, use (.) instead.`),\"__NEXT_ERROR_CODE\",{value:\"E207\",enumerable:!1,configurable:!0});n=t.split(\"/\").slice(0,-1).concat(n).join(\"/\");break;case\"(...)\":n=\"/\"+n;break;case\"(..)(..)\":let a=t.split(\"/\");if(a.length<=2)throw Object.defineProperty(Error(`Invalid interception route: ${e}. Cannot use (..)(..) marker at the root level or one level up.`),\"__NEXT_ERROR_CODE\",{value:\"E486\",enumerable:!1,configurable:!0});n=a.slice(0,-2).concat(n).join(\"/\");break;default:throw Object.defineProperty(Error(\"Invariant: unexpected marker\"),\"__NEXT_ERROR_CODE\",{value:\"E112\",enumerable:!1,configurable:!0})}return{interceptingRoute:t,interceptedRoute:n}}},77617,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"matchSegment\",{enumerable:!0,get:function(){return n}});let n=(e,t)=>\"string\"==typeof e?\"string\"==typeof t&&e===t:\"string\"!=typeof t&&e[0]===t[0]&&e[1]===t[1];(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},7022,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={computeChangedPath:function(){return f},extractPathFromFlightRouterState:function(){return c},getSelectedParams:function(){return function e(t,r={}){for(let n of Object.values(t[1])){let t=n[0],a=Array.isArray(t),u=a?t[1]:t;!u||u.startsWith(o.PAGE_SEGMENT_KEY)||(a&&(\"c\"===t[2]||\"oc\"===t[2])?r[t[0]]=t[1].split(\"/\"):a&&(r[t[0]]=t[1]),r=e(n,r))}return r}}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(29499),o=e.r(17403),l=e.r(77617),i=e=>\"string\"==typeof e?\"children\"===e?\"\":e:e[1];function s(e){return e.reduce((e,t)=>{let r;return\"\"===(t=\"/\"===(r=t)[0]?r.slice(1):r)||(0,o.isGroupSegment)(t)?e:`${e}/${t}`},\"\")||\"/\"}function c(e){let t=Array.isArray(e[0])?e[0][1]:e[0];if(t===o.DEFAULT_SEGMENT_KEY||u.INTERCEPTION_ROUTE_MARKERS.some(e=>t.startsWith(e)))return;if(t.startsWith(o.PAGE_SEGMENT_KEY))return\"\";let r=[i(t)],n=e[1]??{},a=n.children?c(n.children):void 0;if(void 0!==a)r.push(a);else for(let[e,t]of Object.entries(n)){if(\"children\"===e)continue;let n=c(t);void 0!==n&&r.push(n)}return s(r)}function f(e,t){let r=function e(t,r){let[n,a]=t,[o,s]=r,f=i(n),d=i(o);if(u.INTERCEPTION_ROUTE_MARKERS.some(e=>f.startsWith(e)||d.startsWith(e)))return\"\";if(!(0,l.matchSegment)(n,o))return c(r)??\"\";for(let t in a)if(s[t]){let r=e(a[t],s[t]);if(null!==r)return`${i(o)}/${r}`}return null}(e,t);return null==r||\"/\"===r?r:s(r.split(\"/\"))}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},18924,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"handleMutable\",{enumerable:!0,get:function(){return u}});let n=e.r(7022);function a(e){return void 0!==e}function u(e,t){let r=t.shouldScroll??!0,u=e.previousNextUrl,o=e.nextUrl;if(a(t.patchedTree)){let r=(0,n.computeChangedPath)(e.tree,t.patchedTree);r?(u=o,o=r):o||(o=e.canonicalUrl)}return{canonicalUrl:t.canonicalUrl??e.canonicalUrl,renderedSearch:t.renderedSearch??e.renderedSearch,pushRef:{pendingPush:a(t.pendingPush)?t.pendingPush:e.pushRef.pendingPush,mpaNavigation:a(t.mpaNavigation)?t.mpaNavigation:e.pushRef.mpaNavigation,preserveCustomHistoryState:a(t.preserveCustomHistoryState)?t.preserveCustomHistoryState:e.pushRef.preserveCustomHistoryState},focusAndScrollRef:{apply:!!r&&(!!a(t?.scrollableSegments)||e.focusAndScrollRef.apply),onlyHashChange:t.onlyHashChange||!1,hashFragment:r?t.hashFragment&&\"\"!==t.hashFragment?decodeURIComponent(t.hashFragment.slice(1)):e.focusAndScrollRef.hashFragment:null,segmentPaths:r?t?.scrollableSegments??e.focusAndScrollRef.segmentPaths:[]},cache:t.cache?t.cache:e.cache,tree:a(t.patchedTree)?t.patchedTree:e.tree,nextUrl:o,previousNextUrl:u,debugInfo:t.collectedDebugInfo??null}}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},18364,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={HEAD_REQUEST_KEY:function(){return l},ROOT_SEGMENT_REQUEST_KEY:function(){return o},appendSegmentRequestKeyPart:function(){return s},convertSegmentPathToStaticExportFilename:function(){return d},createSegmentRequestKeyPart:function(){return i}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(17403),o=\"\",l=\"/_head\";function i(e){if(\"string\"==typeof e)return e.startsWith(u.PAGE_SEGMENT_KEY)?u.PAGE_SEGMENT_KEY:\"/_not-found\"===e?\"_not-found\":f(e);let t=e[0];return\"$\"+e[2]+\"$\"+f(t)}function s(e,t,r){return e+\"/\"+(\"children\"===t?r:`@${f(t)}/${r}`)}let c=/^[a-zA-Z0-9\\-_@]+$/;function f(e){return c.test(e)?e:\"!\"+btoa(e).replace(/\\+/g,\"-\").replace(/\\//g,\"_\").replace(/=+$/,\"\")}function d(e){return`__next${e.replace(/\\//g,\".\")}.txt`}},29136,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={doesStaticSegmentAppearInURL:function(){return f},getCacheKeyForDynamicParam:function(){return d},getParamValueFromCacheKey:function(){return h},getRenderedPathname:function(){return s},getRenderedSearch:function(){return i},parseDynamicParamFromURLPart:function(){return c},urlSearchParamsToParsedUrlQuery:function(){return y},urlToUrlWithoutFlightMarker:function(){return p}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(17403),o=e.r(18364),l=e.r(19044);function i(e){let t=e.headers.get(l.NEXT_REWRITTEN_QUERY_HEADER);return null!==t?\"\"===t?\"\":\"?\"+t:p(new URL(e.url)).search}function s(e){return e.headers.get(l.NEXT_REWRITTEN_PATH_HEADER)??p(new URL(e.url)).pathname}function c(e,t,r){switch(e){case\"c\":return r<t.length?t.slice(r).map(e=>encodeURIComponent(e)):[];case\"ci(..)(..)\":case\"ci(.)\":case\"ci(..)\":case\"ci(...)\":{let n=e.length-2;return r<t.length?t.slice(r).map((e,t)=>0===t?encodeURIComponent(e.slice(n)):encodeURIComponent(e)):[]}case\"oc\":return r<t.length?t.slice(r).map(e=>encodeURIComponent(e)):null;case\"d\":if(r>=t.length)return\"\";return encodeURIComponent(t[r]);case\"di(..)(..)\":case\"di(.)\":case\"di(..)\":case\"di(...)\":{let n=e.length-2;if(r>=t.length)return\"\";return encodeURIComponent(t[r].slice(n))}default:return\"\"}}function f(e){return!(e===o.ROOT_SEGMENT_REQUEST_KEY||e.startsWith(u.PAGE_SEGMENT_KEY)||\"(\"===e[0]&&e.endsWith(\")\"))&&e!==u.DEFAULT_SEGMENT_KEY&&\"/_not-found\"!==e}function d(e,t){return\"string\"==typeof e?(0,u.addSearchParamsIfPageSegment)(e,Object.fromEntries(new URLSearchParams(t))):null===e?\"\":e.join(\"/\")}function p(e){let t=new URL(e);if(t.searchParams.delete(l.NEXT_RSC_UNION_QUERY),t.pathname.endsWith(\".txt\")){let{pathname:e}=t,r=e.endsWith(\"/index.txt\")?10:4;t.pathname=e.slice(0,-r)}return t}function h(e,t){return\"c\"===t||\"oc\"===t?e.split(\"/\"):e}function y(e){let t={};for(let[r,n]of e.entries())void 0===t[r]?t[r]=n:Array.isArray(t[r])?t[r].push(n):t[r]=[t[r],n];return t}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},2860,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={createInitialRSCPayloadFromFallbackPrerender:function(){return s},getFlightDataPartsFromPath:function(){return i},getNextFlightSegmentPath:function(){return c},normalizeFlightData:function(){return f},prepareFlightRouterStateForRequest:function(){return d}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(17403),o=e.r(29136),l=e.r(13425);function i(e){let[t,r,n,a]=e.slice(-4),u=e.slice(0,-4);return{pathToSegment:u.slice(0,-1),segmentPath:u,segment:u[u.length-1]??\"\",tree:t,seedData:r,head:n,isHeadPartial:a,isRootRender:4===e.length}}function s(e,t){let r=(0,o.getRenderedPathname)(e),n=(0,o.getRenderedSearch)(e),a=(0,l.createHrefFromUrl)(new URL(location.href)),u=t.f[0],i=u[0];return{b:t.b,c:a.split(\"/\"),q:n,i:t.i,f:[[function e(t,r,n,a){let u,l,i=t[0];if(\"string\"==typeof i)u=i,l=(0,o.doesStaticSegmentAppearInURL)(i);else{let e=i[0],t=i[2],s=(0,o.parseDynamicParamFromURLPart)(t,n,a);u=[e,(0,o.getCacheKeyForDynamicParam)(s,r),t],l=!0}let s=l?a+1:a,c=t[1],f={};for(let t in c){let a=c[t];f[t]=e(a,r,n,s)}return[u,f,null,t[3],t[4]]}(i,n,r.split(\"/\").filter(e=>\"\"!==e),0),u[1],u[2],u[2]]],m:t.m,G:t.G,S:t.S}}function c(e){return e.slice(2)}function f(e){return\"string\"==typeof e?e:e.map(e=>i(e))}function d(e,t){return t?encodeURIComponent(JSON.stringify(e)):encodeURIComponent(JSON.stringify(function e(t){var r,n;let[a,o,l,i,s,c]=t,f=\"string\"==typeof(r=a)&&r.startsWith(u.PAGE_SEGMENT_KEY+\"?\")?u.PAGE_SEGMENT_KEY:r,d={};for(let[t,r]of Object.entries(o))d[t]=e(r);let p=[f,d,null,(n=i)&&\"refresh\"!==n?i:null];return void 0!==s&&(p[4]=s),void 0!==c&&(p[5]=c),p}(e)))}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},94275,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={getAppBuildId:function(){return l},setAppBuildId:function(){return o}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=\"\";function o(e){u=e}function l(){return u}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},76151,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={djb2Hash:function(){return u},hexHash:function(){return o}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});function u(e){let t=5381;for(let r=0;r<e.length;r++)t=(t<<5)+t+e.charCodeAt(r)|0;return t>>>0}function o(e){return u(e).toString(36).slice(0,5)}},10242,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"computeCacheBustingSearchParam\",{enumerable:!0,get:function(){return a}});let n=e.r(76151);function a(e,t,r,a){return(void 0===e||\"0\"===e)&&void 0===t&&void 0===r&&void 0===a?\"\":(0,n.hexHash)([e||\"0\",t||\"0\",r||\"0\",a||\"0\"].join(\",\"))}},69778,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={setCacheBustingSearchParam:function(){return l},setCacheBustingSearchParamWithHash:function(){return i}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(10242),o=e.r(19044),l=(e,t)=>{i(e,(0,u.computeCacheBustingSearchParam)(t[o.NEXT_ROUTER_PREFETCH_HEADER],t[o.NEXT_ROUTER_SEGMENT_PREFETCH_HEADER],t[o.NEXT_ROUTER_STATE_TREE_HEADER],t[o.NEXT_URL]))},i=(e,t)=>{let r=e.search,n=(r.startsWith(\"?\")?r.slice(1):r).split(\"&\").filter(e=>e&&!e.startsWith(`${o.NEXT_RSC_UNION_QUERY}=`));t.length>0?n.push(`${o.NEXT_RSC_UNION_QUERY}=${t}`):n.push(`${o.NEXT_RSC_UNION_QUERY}`),e.search=n.length?`?${n.join(\"&\")}`:\"\"};(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},15026,(e,t,r)=>{\"use strict\";let n;Object.defineProperty(r,\"__esModule\",{value:!0});var a={createFetch:function(){return m},createFromNextReadableStream:function(){return R},fetchServerResponse:function(){return b}};for(var u in a)Object.defineProperty(r,u,{enumerable:!0,get:a[u]});let o=e.r(58662),l=e.r(19044),i=e.r(55748),s=e.r(3958),c=e.r(2860),f=e.r(94275),d=e.r(69778),p=e.r(29136),h=e.r(77447),y=o.createFromReadableStream,g=o.createFromFetch;function _(e){return(0,p.urlToUrlWithoutFlightMarker)(new URL(e,location.origin)).toString()}let v=!1;async function b(e,t){let{flightRouterState:r,nextUrl:n}=t,a={[l.RSC_HEADER]:\"1\",[l.NEXT_ROUTER_STATE_TREE_HEADER]:(0,c.prepareFlightRouterStateForRequest)(r,t.isHmrRefresh)};n&&(a[l.NEXT_URL]=n);let u=e;try{(e=new URL(e)).pathname.endsWith(\"/\")?e.pathname+=\"index.txt\":e.pathname+=\".txt\";let t=await m(e,a,\"auto\",!0),r=(0,p.urlToUrlWithoutFlightMarker)(new URL(t.url)),n=t.redirected?r:u,o=t.headers.get(\"content-type\")||\"\",i=!!t.headers.get(\"vary\")?.includes(l.NEXT_URL),s=!!t.headers.get(l.NEXT_DID_POSTPONE_HEADER),d=t.headers.get(l.NEXT_ROUTER_STALE_TIME_HEADER),h=null!==d?1e3*parseInt(d,10):-1,y=o.startsWith(l.RSC_CONTENT_TYPE_HEADER);if(y||(y=o.startsWith(\"text/plain\")),!y||!t.ok||!t.body)return e.hash&&(r.hash=e.hash),_(r.toString());let g=t.flightResponse;if(null===g){let e,r=s?(e=t.body.getReader(),new ReadableStream({async pull(t){for(;;){let{done:r,value:n}=await e.read();if(!r){t.enqueue(n);continue}return}}})):t.body;g=R(r,a)}let v=await g;if((0,f.getAppBuildId)()!==v.b)return _(t.url);let b=(0,c.normalizeFlightData)(v.f);if(\"string\"==typeof b)return _(b);return{flightData:b,canonicalUrl:n,renderedSearch:(0,p.getRenderedSearch)(t),couldBeIntercepted:i,prerendered:v.S,postponed:s,staleTime:h,debugInfo:g._debugInfo??null}}catch(e){return v||console.error(`Failed to fetch RSC payload for ${u}. Falling back to browser navigation.`,e),u.toString()}}async function m(e,t,r,a,u){var o,c;let f=(0,h.getDeploymentId)();f&&(t[\"x-deployment-id\"]=f);let p=new URL(e);(0,d.setCacheBustingSearchParam)(p,t);let y=fetch(p,{credentials:\"same-origin\",headers:t,priority:r||void 0,signal:u}),_=a?(o=y,c=t,g(o,{callServer:i.callServer,findSourceMapURL:s.findSourceMapURL,debugChannel:n&&n(c)})):null,v=await y,b=v.redirected,m=new URL(v.url,p);return m.searchParams.delete(l.NEXT_RSC_UNION_QUERY),{url:m.href,redirected:b,ok:v.ok,headers:v.headers,body:v.body,status:v.status,flightResponse:_}}function R(e,t){return y(e,{callServer:i.callServer,findSourceMapURL:s.findSourceMapURL,debugChannel:n&&n(t)})}\"u\">typeof window&&(window.addEventListener(\"pagehide\",()=>{v=!0}),window.addEventListener(\"pageshow\",()=>{v=!1})),(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},75861,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"createRouterCacheKey\",{enumerable:!0,get:function(){return a}});let n=e.r(17403);function a(e,t=!1){return Array.isArray(e)?`${e[0]}|${e[1]}|${e[2]}`:t&&e.startsWith(n.PAGE_SEGMENT_KEY)?n.PAGE_SEGMENT_KEY:e}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},94573,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"isNavigatingToNewRootLayout\",{enumerable:!0,get:function(){return function e(t,r){let n=t[0],a=r[0];if(Array.isArray(n)&&Array.isArray(a)){if(n[0]!==a[0]||n[2]!==a[2])return!0}else if(n!==a)return!0;if(t[4])return!r[4];if(r[4])return!0;let u=Object.values(t[1])[0],o=Object.values(r[1])[0];return!u||!o||e(u,o)}}}),(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},46088,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n,a={FreshnessPolicy:function(){return g},createInitialCacheNodeForHydration:function(){return v},isDeferredRsc:function(){return C},spawnDynamicRequests:function(){return j},startPPRNavigation:function(){return b}};for(var u in a)Object.defineProperty(r,u,{enumerable:!0,get:a[u]});let o=e.r(17403),l=e.r(77617),i=e.r(13425),s=e.r(75861),c=e.r(15026),f=e.r(82183),d=e.r(57695),p=e.r(94573),h=e.r(1810),y=e.r(68008);var g=((n={})[n.Default=0]=\"Default\",n[n.Hydration=1]=\"Hydration\",n[n.HistoryTraversal=2]=\"HistoryTraversal\",n[n.RefreshAll=3]=\"RefreshAll\",n[n.HMRRefresh=4]=\"HMRRefresh\",n);let _=()=>{};function v(e,t,r,n){return m(e,t,void 0,1,r,n,null,null,!1,null,null,!1,{scrollableSegments:null,separateRefreshUrls:null}).node}function b(e,t,r,n,a,u,c,f,d,h,y,g,_){return function e(t,r,n,a,u,c,f,d,h,y,g,_,v,b,T,j,w,A){var M,N;let C,D,x,U=a[0],k=u[0];if(!(0,l.matchSegment)(k,U))return!f&&(0,p.isNavigatingToNewRootLayout)(a,u)||k===o.NOT_FOUND_SEGMENT_KEY||null===b||null===T?null:m(t,u,n,c,d,h,y,g,_,b,T,j,A);let I=null!==T&&null!==b?b.concat([T,k]):[],F=u[1],L=a[1],H=null!==d?d[1]:null,$=null!==y?y[1]:null,B=!0===u[4],X=f||B,q=void 0!==n?n.parallelRoutes:void 0,W=!1,K=!1;switch(c){case 0:case 2:case 1:W=!1,K=!1;break;case 3:case 4:W=!0,K=!0}let V=new Map(W?void 0:q),G=0===Object.keys(F).length;if(void 0===n||K||G&&v)if(null!==d&&null!==d[0]){let e=d[0],r=d[2],n=null===h;D=S(e,r,!1,h,n,G,V,t),x=G&&n}else if(null!==y){let e=y[0],r=y[2],n=y[3];D=S(e,r,n,g,_,G,V,t),x=n||G&&_}else D=O(V,G,t,c),x=!0;else D=P(!1,n,V),x=!1;let Y=u[2],z=\"string\"==typeof Y&&\"refresh\"===u[3]?Y:w;x&&null!==z&&(M=A,N=z,null===(C=M.separateRefreshUrls)?M.separateRefreshUrls=new Set([N]):C.add(N));let Q={},J=null,Z=!1,ee={};for(let n in F){let a=F[n],u=L[n];if(void 0===u)return null;let l=void 0!==q?q.get(n):void 0,f=null!==H?H[n]:null,d=null!==$?$[n]:null,p=a[0],y=h,b=g,m=_;2!==c&&p===o.DEFAULT_SEGMENT_KEY&&(p=(a=function(e,t){let r;return\"refresh\"===t[3]?r=t:((r=R(t,t[1]))[2]=(0,i.createHrefFromUrl)(e),r[3]=\"refresh\"),r}(r,u))[0],f=null,y=null,d=null,b=null,m=!1);let E=(0,s.createRouterCacheKey)(p),P=e(t,r,void 0!==l?l.get(E):void 0,u,a,c,X,f??null,y,d??null,b,m,v,I,n,j||x,z,A);if(null===P)return null;null===J&&(J=new Map),J.set(n,P);let S=P.node;if(null!==S){let e=new Map(W?void 0:l);e.set(E,S),V.set(n,e)}let O=P.route;Q[n]=O;let T=P.dynamicRequestTree;null!==T?(Z=!0,ee[n]=T):ee[n]=O}return{status:+!x,route:R(u,Q),node:D,dynamicRequestTree:E(u,ee,x,Z,j),refreshUrl:z,children:J}}(e,t,null!==r?r:void 0,n,a,u,!1,c,f,d,h,y,g,null,null,!1,null,_)}function m(e,t,r,n,a,u,o,l,i,c,f,d,p){let y,g,_=t[0],v=null!==f&&null!==c?c.concat([f,_]):[],b=t[1],T=null!==o?o[1]:null,j=null!==a?a[1]:null,w=void 0!==r?r.parallelRoutes:void 0,A=!1,M=!1,N=!1;switch(n){case 0:A=!1,M=void 0===r||e-r.navigatedAt>=h.DYNAMIC_STALETIME_MS,N=!1;break;case 1:M=!1,A=!1,N=!1;break;case 2:if(M=!1,M=!1,void 0!==r){let e=r.rsc;N=!C(e)||\"pending\"!==e.status}else N=!1;break;case 3:case 4:M=!0,A=!0,N=!1}let D=new Map(A?void 0:w),x=0===Object.keys(b).length;if(x&&(null===p.scrollableSegments&&(p.scrollableSegments=[]),p.scrollableSegments.push(v)),M||void 0===r)if(null!==a&&null!==a[0]){let t=a[0],r=a[2],o=null===u&&1!==n;y=S(t,r,!1,u,o,x,D,e),g=x&&o}else if(1===n&&x&&null!==u)y=S(null,null,!1,u,!1,x,D,e),g=!1;else if(1!==n&&null!==o){let t=o[0],r=o[2],n=o[3];y=S(t,r,n,l,i,x,D,e),g=n||x&&i}else y=O(D,x,e,n),g=!0;else y=P(N,r,D),g=!1;let U={},k=null,I=!1,F={};for(let t in b){let r=b[t],a=void 0!==w?w.get(t):void 0,o=null!==j?j[t]:null,c=null!==T?T[t]:null,f=r[0],h=(0,s.createRouterCacheKey)(f),y=m(e,r,void 0!==a?a.get(h):void 0,n,o??null,u,c??null,l,i,v,t,d||g,p);null===k&&(k=new Map),k.set(t,y);let _=y.node;if(null!==_){let e=new Map(A?void 0:a);e.set(h,_),D.set(t,e)}let R=y.route;U[t]=R;let E=y.dynamicRequestTree;null!==E?(I=!0,F[t]=E):F[t]=R}return{status:+!g,route:R(t,U),node:y,dynamicRequestTree:E(t,F,g,I,d),refreshUrl:null,children:k}}function R(e,t){let r=[e[0],t];return 2 in e&&(r[2]=e[2]),3 in e&&(r[3]=e[3]),4 in e&&(r[4]=e[4]),r}function E(e,t,r,n,a){let u=null;return r?(u=R(e,t),a||(u[3]=\"refetch\")):u=n?R(e,t):null,u}function P(e,t,r){return{rsc:t.rsc,prefetchRsc:e?null:t.prefetchRsc,head:t.head,prefetchHead:e?null:t.prefetchHead,loading:t.loading,parallelRoutes:r,navigatedAt:t.navigatedAt}}function S(e,t,r,n,a,u,o,l){let i,s,c,f;return r?(s=e,i=D()):(s=null,i=e),u?a?(c=n,f=D()):(c=null,f=n):(c=null,f=null),{rsc:i,prefetchRsc:s,head:f,prefetchHead:c,loading:t,parallelRoutes:o,navigatedAt:l}}function O(e,t,r,n){let a=1===n;return{rsc:a?null:D(),prefetchRsc:null,head:!a&&t?D():null,prefetchHead:null,loading:a?null:D(),parallelRoutes:e,navigatedAt:r}}let T=!1;function j(e,t,r,n,a){let u=e.dynamicRequestTree;if(null===u){T=!1;return}let o=M(e,u,t,r,n),l=a.separateRefreshUrls,s=null;if(null!==l){s=[];let a=(0,i.createHrefFromUrl)(t);for(let t of l)t!==a&&null!==u&&s.push(M(e,u,new URL(t,location.origin),r,n))}w(e,r,o,s).then(_,_)}async function w(e,t,r,n){var a,u;let o=await (a=r,u=n,new Promise(e=>{let t=t=>{0===t.exitStatus?0==--n&&e(0):e(t.exitStatus)},r=()=>e(2),n=1;a.then(t,r),null!==u&&(n+=u.length,u.forEach(e=>e.then(t,r)))}));switch(0===o&&(o=function e(t,r,n){var a,u,o;let l,i,s,c;0===t.status?(t.status=2,a=t.node,u=r,o=n,C(i=a.rsc)&&(null===u?i.resolve(null,o):i.reject(u,o)),C(s=a.loading)&&s.resolve(null,o),C(c=a.head)&&c.resolve(null,o),l=null===t.refreshUrl?1:2):l=0;let f=t.children;if(null!==f)for(let[,t]of f){let a=e(t,r,n);a>l&&(l=a)}return l}(e,null,null)),o){case 0:T=!1;return;case 1:{let n=await r;A(!1,n.url,t,n.seed,e.route);return}case 2:{let n=await r;A(!0,n.url,t,n.seed,e.route);return}default:return o}}function A(e,t,r,n,a){e=e||T,T=!0;let u={type:d.ACTION_SERVER_PATCH,previousTree:a,url:t,nextUrl:r,seed:n,mpa:e};(0,f.dispatchAppRouterAction)(u)}async function M(e,t,r,n,a){try{let u=await (0,c.fetchServerResponse)(r,{flightRouterState:t,nextUrl:n,isHmrRefresh:4===a});if(\"string\"==typeof u)return{exitStatus:2,url:new URL(u,location.origin),seed:null};let o=(0,y.convertServerPatchToFullTree)(e.route,u.flightData,u.renderedSearch);return{exitStatus:+!!function e(t,r,n,a,u){0===t.status&&null!==n&&(t.status=1,function(e,t,r,n){let a=e.rsc,u=t[0];if(null===u)return;null===a?e.rsc=u:C(a)&&a.resolve(u,n);let o=e.loading;if(C(o)){let e=t[2];o.resolve(e,n)}let l=e.head;C(l)&&l.resolve(r,n)}(t.node,n,a,u));let o=t.children,i=r[1],s=null!==n?n[1]:null,c=!1;if(null!==o)for(let t in i){let r=i[t],n=null!==s?s[t]:null,f=o.get(t);if(void 0===f)c=!0;else{let t=f.route[0];(0,l.matchSegment)(r[0],t)&&null!=n&&e(f,r,n,a,u)&&(c=!0)}}return c}(e,o.tree,o.data,o.head,u.debugInfo),url:new URL(u.canonicalUrl,location.origin),seed:o}}catch{return{exitStatus:2,url:r,seed:null}}}let N=Symbol();function C(e){return e&&\"object\"==typeof e&&e.tag===N}function D(){let e,t,r=[],n=new Promise((r,n)=>{e=r,t=n});return n.status=\"pending\",n.resolve=(t,a)=>{\"pending\"===n.status&&(n.status=\"fulfilled\",n.value=t,null!==a&&r.push.apply(r,a),e(t))},n.reject=(e,a)=>{\"pending\"===n.status&&(n.status=\"rejected\",n.reason=e,null!==a&&r.push.apply(r,a),t(e))},n.tag=N,n._debugInfo=r,n}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},76218,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"HasLoadingBoundary\",{enumerable:!0,get:function(){return a}});var n,a=((n={})[n.SegmentHasLoadingBoundary=1]=\"SegmentHasLoadingBoundary\",n[n.SubtreeHasLoadingBoundary=2]=\"SubtreeHasLoadingBoundary\",n[n.SubtreeHasNoLoadingBoundary=3]=\"SubtreeHasNoLoadingBoundary\",n)},20753,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n,a,u,o={FetchStrategy:function(){return c},NavigationResultTag:function(){return i},PrefetchPriority:function(){return s}};for(var l in o)Object.defineProperty(r,l,{enumerable:!0,get:o[l]});var i=((n={})[n.MPA=0]=\"MPA\",n[n.Success=1]=\"Success\",n[n.NoOp=2]=\"NoOp\",n[n.Async=3]=\"Async\",n),s=((a={})[a.Intent=2]=\"Intent\",a[a.Default=1]=\"Default\",a[a.Background=0]=\"Background\",a),c=((u={})[u.LoadingBoundary=0]=\"LoadingBoundary\",u[u.PPR=1]=\"PPR\",u[u.PPRRuntime=2]=\"PPRRuntime\",u[u.Full=3]=\"Full\",u);(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},25175,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={deleteFromLru:function(){return f},lruPut:function(){return s},updateLruSize:function(){return c}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(92097),o=null,l=!1,i=0;function s(e){if(o===e)return;let t=e.prev,r=e.next;if(null===r||null===t?(i+=e.size,d()):(t.next=r,r.prev=t),null===o)e.prev=e,e.next=e;else{let t=o.prev;e.prev=t,null!==t&&(t.next=e),e.next=o,o.prev=e}o=e}function c(e,t){let r=e.size;e.size=t,null!==e.next&&(i=i-r+t,d())}function f(e){let t=e.next,r=e.prev;null!==t&&null!==r&&(i-=e.size,e.next=null,e.prev=null,o===e?t===o?o=null:(o=t,r.next=t,t.prev=r):(r.next=t,t.prev=r))}function d(){l||i<=0x3200000||(l=!0,h(p))}function p(){l=!1;for(;i>0x2d00000&&null!==o;){let e=o.prev;null!==e&&(0,u.deleteMapEntry)(e)}}let h=\"function\"==typeof requestIdleCallback?requestIdleCallback:e=>setTimeout(e,0);(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},92097,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={Fallback:function(){return o},createCacheMap:function(){return i},deleteFromCacheMap:function(){return p},deleteMapEntry:function(){return h},getFromCacheMap:function(){return s},isValueExpired:function(){return c},setInCacheMap:function(){return f},setSizeInCacheMap:function(){return y}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(25175),o={},l={};function i(){return{parent:null,key:null,value:null,map:null,prev:null,next:null,size:0}}function s(e,t,r,n,a){let i=function e(t,r,n,a,u,i){let s,f;if(null!==a)s=a.value,f=a.parent;else if(u&&i!==l)s=l,f=null;else return null===n.value?n:c(t,r,n.value)?(h(n),null):n;let d=n.map;if(null!==d){let n=d.get(s);if(void 0!==n){let a=e(t,r,n,f,u,s);if(null!==a)return a}let a=d.get(o);if(void 0!==a)return e(t,r,a,f,u,s)}return null}(e,t,r,n,a,0);return null===i||null===i.value?null:((0,u.lruPut)(i),i.value)}function c(e,t,r){return r.staleAt<=e||r.version<t}function f(e,t,r,n){let a=function(e,t,r){let n=e,a=t,u=null;for(;;){let e=u;if(null!==a)u=a.value,a=a.parent;else if(r&&e!==l){if(null===n.value)return n;u=l}else break;let t=n.map;if(null!==t){let e=t.get(u);if(void 0!==e){n=e;continue}}else t=new Map,n.map=t;let o={parent:n,key:u,value:null,map:null,prev:null,next:null,size:0};t.set(u,o),n=o}return n}(e,t,n);d(a,r),(0,u.lruPut)(a),(0,u.updateLruSize)(a,r.size)}function d(e,t){null!==e.value&&(e.value.ref=null,e.value=null);let r=t.ref;e.value=t,t.ref=e,(0,u.updateLruSize)(e,t.size),null!==r&&r!==e&&r.value===t&&h(r)}function p(e){let t=e.ref;null!==t&&(e.ref=null,h(t))}function h(e){e.value=null,(0,u.deleteFromLru)(e);let t=e.map;if(null===t){let t=e.parent,r=e.key;for(;null!==t;){let e=t.map;if(null!==e&&(e.delete(r),0===e.size)&&(t.map=null,null===t.value)){r=t.key,t=t.parent;continue}break}}else{let r=t.get(l);void 0!==r&&null!==r.value&&d(e,r.value)}}function y(e,t){let r=e.ref;null!==r&&(e.size=t,(0,u.updateLruSize)(r,t))}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},5868,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={appendLayoutVaryPath:function(){return c},clonePageVaryPathWithNewSearchParams:function(){return y},finalizeLayoutVaryPath:function(){return f},finalizeMetadataVaryPath:function(){return p},finalizePageVaryPath:function(){return d},getFulfilledRouteVaryPath:function(){return s},getRouteVaryPath:function(){return i},getSegmentVaryPathForRequest:function(){return h}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(20753),o=e.r(92097),l=e.r(18364);function i(e,t,r){return{value:e,parent:{value:t,parent:{value:r,parent:null}}}}function s(e,t,r,n){return{value:e,parent:{value:t,parent:{value:n?r:o.Fallback,parent:null}}}}function c(e,t){return{value:t,parent:e}}function f(e,t){return{value:e,parent:t}}function d(e,t,r){return{value:e,parent:{value:t,parent:r}}}function p(e,t,r){return{value:e+l.HEAD_REQUEST_KEY,parent:{value:t,parent:r}}}function h(e,t){let r=t.varyPath;if(t.isPage&&e!==u.FetchStrategy.Full&&e!==u.FetchStrategy.PPRRuntime){let e=r.parent.parent;return{value:r.value,parent:{value:o.Fallback,parent:e}}}return r}function y(e,t){let r=e.parent;return{value:e.value,parent:{value:t,parent:r.parent}}}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},14238,(e,t,r)=>{\"use strict\";function n(e,t){let r=new URL(e);return{pathname:r.pathname,search:r.search,nextUrl:t}}Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"createCacheKey\",{enumerable:!0,get:function(){return n}}),(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},68946,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={cancelPrefetchTask:function(){return R},isPrefetchTaskDirty:function(){return P},pingPrefetchTask:function(){return A},reschedulePrefetchTask:function(){return E},schedulePrefetchTask:function(){return m},startRevalidationCooldown:function(){return b}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(76218),o=e.r(77617),l=e.r(31018),i=e.r(5868),s=e.r(14238),c=e.r(20753),f=e.r(17403),d=\"function\"==typeof queueMicrotask?queueMicrotask:e=>Promise.resolve().then(e).catch(e=>setTimeout(()=>{throw e})),p=[],h=0,y=0,g=!1,_=null,v=null;function b(){null!==v&&clearTimeout(v),v=setTimeout(()=>{v=null,O()},300)}function m(e,t,r,n,a){let u={key:e,treeAtTimeOfPrefetch:t,cacheVersion:(0,l.getCurrentCacheVersion)(),priority:n,phase:1,hasBackgroundWork:!1,spawnedRuntimePrefetches:null,fetchStrategy:r,sortId:y++,isCanceled:!1,onInvalidate:a,_heapIndex:-1};return S(u),$(p,u),O(),u}function R(e){e.isCanceled=!0,function(e,t){let r=t._heapIndex;if(-1!==r&&(t._heapIndex=-1,0!==e.length)){let n=e.pop();n!==t&&(e[r]=n,n._heapIndex=r,K(e,n,r))}}(p,e)}function E(e,t,r,n){e.isCanceled=!1,e.phase=1,e.sortId=y++,e.priority=e===_?c.PrefetchPriority.Intent:n,e.treeAtTimeOfPrefetch=t,e.fetchStrategy=r,S(e),-1!==e._heapIndex?q(p,e):$(p,e),O()}function P(e,t,r){let n=(0,l.getCurrentCacheVersion)();return e.cacheVersion!==n||e.treeAtTimeOfPrefetch!==r||e.key.nextUrl!==t}function S(e){e.priority===c.PrefetchPriority.Intent&&e!==_&&(null!==_&&_.priority!==c.PrefetchPriority.Background&&(_.priority=c.PrefetchPriority.Default,q(p,_)),_=e)}function O(){g||(g=!0,d(M))}function T(e){return null===v&&(e.priority===c.PrefetchPriority.Intent?h<12:h<4)}function j(e){return h++,e.then(e=>null===e?(w(),null):(e.closed.then(w),e.value))}function w(){h--,O()}function A(e){e.isCanceled||-1!==e._heapIndex||($(p,e),O())}function M(){g=!1;let e=Date.now(),t=B(p);for(;null!==t&&T(t);){t.cacheVersion=(0,l.getCurrentCacheVersion)();let r=function(e,t){let r=t.key,n=(0,l.readOrCreateRouteCacheEntry)(e,t,r),a=function(e,t,r){switch(r.status){case l.EntryStatus.Empty:j((0,l.fetchRouteOnCacheMiss)(r,t,t.key)),r.staleAt=e+6e4,r.status=l.EntryStatus.Pending;case l.EntryStatus.Pending:{let e=r.blockedTasks;return null===e?r.blockedTasks=new Set([t]):e.add(t),1}case l.EntryStatus.Rejected:break;case l.EntryStatus.Fulfilled:{if(0!==t.phase)return 2;if(!T(t))return 0;let i=r.tree,s=t.fetchStrategy===c.FetchStrategy.PPR?r.isPPREnabled?c.FetchStrategy.PPR:c.FetchStrategy.LoadingBoundary:t.fetchStrategy;switch(s){case c.FetchStrategy.PPR:{var n,a,o;if(x(n=e,a=t,o=r,(0,l.readOrCreateSegmentCacheEntry)(n,c.FetchStrategy.PPR,o,o.metadata),a.key,o.metadata),0===function e(t,r,n,a,u){let o=(0,l.readOrCreateSegmentCacheEntry)(t,r.fetchStrategy,n,u);x(t,r,n,o,r.key,u);let i=a[1],s=u.slots;if(null!==s)for(let a in s){if(!T(r))return 0;let u=s[a],o=u.segment,c=i[a],f=c?.[0];if(0===(void 0!==f&&L(n,o,f)?e(t,r,n,c,u):function e(t,r,n,a){if(a.hasRuntimePrefetch)return null===r.spawnedRuntimePrefetches?r.spawnedRuntimePrefetches=new Set([a.requestKey]):r.spawnedRuntimePrefetches.add(a.requestKey),2;let u=(0,l.readOrCreateSegmentCacheEntry)(t,r.fetchStrategy,n,a);if(x(t,r,n,u,r.key,a),null!==a.slots){if(!T(r))return 0;for(let u in a.slots)if(0===e(t,r,n,a.slots[u]))return 0}return 2}(t,r,n,u)))return 0}return 2}(e,t,r,t.treeAtTimeOfPrefetch,i))return 0;let u=t.spawnedRuntimePrefetches;if(null!==u){let n=new Map;C(e,t,r,n,c.FetchStrategy.PPRRuntime);let a=function e(t,r,n,a,u,o){if(u.has(a.requestKey))return D(t,r,n,a,!1,o,c.FetchStrategy.PPRRuntime);let l={},i=a.slots;if(null!==i)for(let a in i){let s=i[a];l[a]=e(t,r,n,s,u,o)}return[a.segment,l,null,null]}(e,t,r,i,u,n);n.size>0&&j((0,l.fetchSegmentPrefetchesUsingDynamicRequest)(t,r,c.FetchStrategy.PPRRuntime,a,n))}return 2}case c.FetchStrategy.Full:case c.FetchStrategy.PPRRuntime:case c.FetchStrategy.LoadingBoundary:{let n=new Map;C(e,t,r,n,s);let a=function e(t,r,n,a,o,i,s){let f=a[1],d=o.slots,p={};if(null!==d)for(let a in d){let o=d[a],h=o.segment,y=f[a],g=y?.[0];if(void 0!==g&&L(n,h,g)){let u=e(t,r,n,y,o,i,s);p[a]=u}else switch(s){case c.FetchStrategy.LoadingBoundary:{let e=o.hasLoadingBoundary!==u.HasLoadingBoundary.SubtreeHasNoLoadingBoundary?function e(t,r,n,a,o,i){let s=null===o?\"inside-shared-layout\":null,f=(0,l.readOrCreateSegmentCacheEntry)(t,r.fetchStrategy,n,a);switch(f.status){case l.EntryStatus.Empty:i.set(a.requestKey,(0,l.upgradeToPendingSegment)(f,c.FetchStrategy.LoadingBoundary)),\"refetch\"!==o&&(s=o=\"refetch\");break;case l.EntryStatus.Fulfilled:if(a.hasLoadingBoundary===u.HasLoadingBoundary.SegmentHasLoadingBoundary)return(0,l.convertRouteTreeToFlightRouterState)(a);case l.EntryStatus.Pending:case l.EntryStatus.Rejected:}let d={};if(null!==a.slots)for(let u in a.slots){let l=a.slots[u];d[u]=e(t,r,n,l,o,i)}return[a.segment,d,null,s,a.isRootLayout]}(t,r,n,o,null,i):(0,l.convertRouteTreeToFlightRouterState)(o);p[a]=e;break}case c.FetchStrategy.PPRRuntime:{let e=D(t,r,n,o,!1,i,s);p[a]=e;break}case c.FetchStrategy.Full:{let e=D(t,r,n,o,!1,i,s);p[a]=e}}}return[o.segment,p,null,null,o.isRootLayout]}(e,t,r,t.treeAtTimeOfPrefetch,i,n,s);return n.size>0&&j((0,l.fetchSegmentPrefetchesUsingDynamicRequest)(t,r,s,a,n)),2}}}}return 2}(e,t,n);if(0!==a&&\"\"!==r.search){let n=new URL(r.pathname,location.origin),a=(0,s.createCacheKey)(n.href,r.nextUrl),u=(0,l.readOrCreateRouteCacheEntry)(e,t,a);switch(u.status){case l.EntryStatus.Empty:N(t)&&(u.status=l.EntryStatus.Pending,j((0,l.fetchRouteOnCacheMiss)(u,t,a)));case l.EntryStatus.Pending:case l.EntryStatus.Fulfilled:case l.EntryStatus.Rejected:}}return a}(e,t),n=t.hasBackgroundWork;switch(t.hasBackgroundWork=!1,t.spawnedRuntimePrefetches=null,r){case 0:return;case 1:X(p),t=B(p);continue;case 2:1===t.phase?(t.phase=0,q(p,t)):n?(t.priority=c.PrefetchPriority.Background,q(p,t)):X(p),t=B(p);continue}}}function N(e){return e.priority===c.PrefetchPriority.Background||(e.hasBackgroundWork=!0,!1)}function C(e,t,r,n,a){D(e,t,r,r.metadata,!1,n,a===c.FetchStrategy.LoadingBoundary?c.FetchStrategy.Full:a)}function D(e,t,r,n,a,u,o){let i=(0,l.readOrCreateSegmentCacheEntry)(e,o,r,n),s=null;switch(i.status){case l.EntryStatus.Empty:s=(0,l.upgradeToPendingSegment)(i,o);break;case l.EntryStatus.Fulfilled:i.isPartial&&(0,l.canNewFetchStrategyProvideMoreContent)(i.fetchStrategy,o)&&(s=k(e,r,n,o));break;case l.EntryStatus.Pending:case l.EntryStatus.Rejected:(0,l.canNewFetchStrategyProvideMoreContent)(i.fetchStrategy,o)&&(s=k(e,r,n,o))}let c={};if(null!==n.slots)for(let l in n.slots){let i=n.slots[l];c[l]=D(e,t,r,i,a||null!==s,u,o)}null!==s&&u.set(n.requestKey,s);let f=a||null===s?null:\"refetch\";return[n.segment,c,null,f,n.isRootLayout]}function x(e,t,r,n,a,u){switch(n.status){case l.EntryStatus.Empty:j((0,l.fetchSegmentOnCacheMiss)(r,(0,l.upgradeToPendingSegment)(n,c.FetchStrategy.PPR),a,u));break;case l.EntryStatus.Pending:switch(n.fetchStrategy){case c.FetchStrategy.PPR:case c.FetchStrategy.PPRRuntime:case c.FetchStrategy.Full:break;case c.FetchStrategy.LoadingBoundary:N(t)&&U(e,r,a,u);break;default:n.fetchStrategy}break;case l.EntryStatus.Rejected:switch(n.fetchStrategy){case c.FetchStrategy.PPR:case c.FetchStrategy.PPRRuntime:case c.FetchStrategy.Full:break;case c.FetchStrategy.LoadingBoundary:U(e,r,a,u);break;default:n.fetchStrategy}case l.EntryStatus.Fulfilled:}}function U(e,t,r,n){let a=(0,l.readOrCreateRevalidatingSegmentEntry)(e,c.FetchStrategy.PPR,t,n);switch(a.status){case l.EntryStatus.Empty:F(j((0,l.fetchSegmentOnCacheMiss)(t,(0,l.upgradeToPendingSegment)(a,c.FetchStrategy.PPR),r,n)),(0,i.getSegmentVaryPathForRequest)(c.FetchStrategy.PPR,n));case l.EntryStatus.Pending:case l.EntryStatus.Fulfilled:case l.EntryStatus.Rejected:}}function k(e,t,r,n){let a=(0,l.readOrCreateRevalidatingSegmentEntry)(e,n,t,r);if(a.status===l.EntryStatus.Empty){let e=(0,l.upgradeToPendingSegment)(a,n);return F((0,l.waitForSegmentCacheEntry)(e),(0,i.getSegmentVaryPathForRequest)(n,r)),e}if((0,l.canNewFetchStrategyProvideMoreContent)(a.fetchStrategy,n)){let e=(0,l.overwriteRevalidatingSegmentCacheEntry)(n,t,r),a=(0,l.upgradeToPendingSegment)(e,n);return F((0,l.waitForSegmentCacheEntry)(a),(0,i.getSegmentVaryPathForRequest)(n,r)),a}switch(a.status){case l.EntryStatus.Pending:case l.EntryStatus.Fulfilled:case l.EntryStatus.Rejected:default:return null}}let I=()=>{};function F(e,t){e.then(e=>{null!==e&&(0,l.upsertSegmentEntry)(Date.now(),t,e)},I)}function L(e,t,r){return r===f.PAGE_SEGMENT_KEY?t===(0,f.addSearchParamsIfPageSegment)(f.PAGE_SEGMENT_KEY,Object.fromEntries(new URLSearchParams(e.renderedSearch))):(0,o.matchSegment)(r,t)}function H(e,t){let r=t.priority-e.priority;if(0!==r)return r;let n=t.phase-e.phase;return 0!==n?n:t.sortId-e.sortId}function $(e,t){let r=e.length;e.push(t),t._heapIndex=r,W(e,t,r)}function B(e){return 0===e.length?null:e[0]}function X(e){if(0===e.length)return null;let t=e[0];t._heapIndex=-1;let r=e.pop();return r!==t&&(e[0]=r,r._heapIndex=0,K(e,r,0)),t}function q(e,t){let r=t._heapIndex;-1!==r&&(0===r?K(e,t,0):H(e[r-1>>>1],t)>0?W(e,t,r):K(e,t,r))}function W(e,t,r){let n=r;for(;n>0;){let r=n-1>>>1,a=e[r];if(!(H(a,t)>0))return;e[r]=t,t._heapIndex=r,e[n]=a,a._heapIndex=n,n=r}}function K(e,t,r){let n=r,a=e.length,u=a>>>1;for(;n<u;){let r=(n+1)*2-1,u=e[r],o=r+1,l=e[o];if(0>H(u,t))o<a&&0>H(l,u)?(e[n]=l,l._heapIndex=n,e[o]=t,t._heapIndex=o,n=o):(e[n]=u,u._heapIndex=n,e[r]=t,t._heapIndex=r,n=r);else{if(!(o<a&&0>H(l,t)))return;e[n]=l,l._heapIndex=n,e[o]=t,t._heapIndex=o,n=o}}}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},59514,(e,t,r)=>{\"use strict\";function n(e){let t=e.indexOf(\"#\"),r=e.indexOf(\"?\"),n=r>-1&&(t<0||r<t);return n||t>-1?{pathname:e.substring(0,n?r:t),query:n?e.substring(r,t>-1?t:void 0):\"\",hash:t>-1?e.slice(t):\"\"}:{pathname:e,query:\"\",hash:\"\"}}Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"parsePath\",{enumerable:!0,get:function(){return n}})},23303,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"addPathPrefix\",{enumerable:!0,get:function(){return a}});let n=e.r(59514);function a(e,t){if(!e.startsWith(\"/\")||!t)return e;let{pathname:r,query:a,hash:u}=(0,n.parsePath)(e);return`${t}${r}${a}${u}`}},55523,(e,t,r)=>{\"use strict\";function n(e){return e.replace(/\\/$/,\"\")||\"/\"}Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"removeTrailingSlash\",{enumerable:!0,get:function(){return n}})},89308,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"normalizePathTrailingSlash\",{enumerable:!0,get:function(){return u}});let n=e.r(55523),a=e.r(59514),u=e=>{if(!e.startsWith(\"/\"))return e;let{pathname:t,query:r,hash:u}=(0,a.parsePath)(e);return/\\.[^/]+\\/?$/.test(t)?`${(0,n.removeTrailingSlash)(t)}${r}${u}`:t.endsWith(\"/\")?`${t}${r}${u}`:`${t}/${r}${u}`};(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},43293,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"addBasePath\",{enumerable:!0,get:function(){return u}});let n=e.r(23303),a=e.r(89308);function u(e,t){return(0,a.normalizePathTrailingSlash)((0,n.addPathPrefix)(e,\"\"))}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},82883,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={createPrefetchURL:function(){return i},isExternalURL:function(){return l}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(3753),o=e.r(43293);function l(e){return e.origin!==window.location.origin}function i(e){let t;if((0,u.isBot)(window.navigator.userAgent))return null;try{t=new URL((0,o.addBasePath)(e),window.location.href)}catch(t){throw Object.defineProperty(Error(`Cannot prefetch '${e}' because it cannot be converted to a URL.`),\"__NEXT_ERROR_CODE\",{value:\"E234\",enumerable:!1,configurable:!0})}return l(t)?null:t}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},21001,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={IDLE_LINK_STATUS:function(){return f},PENDING_LINK_STATUS:function(){return c},mountFormInstance:function(){return m},mountLinkInstance:function(){return b},onLinkVisibilityChanged:function(){return E},onNavigationIntent:function(){return P},pingVisibleLinks:function(){return O},setLinkForCurrentNavigation:function(){return d},unmountLinkForCurrentNavigation:function(){return p},unmountPrefetchableInstance:function(){return R}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(20753),o=e.r(14238),l=e.r(68946),i=e.r(33664),s=null,c={pending:!0},f={pending:!1};function d(e){(0,i.startTransition)(()=>{s?.setOptimisticLinkStatus(f),e?.setOptimisticLinkStatus(c),s=e})}function p(e){s===e&&(s=null)}let h=\"function\"==typeof WeakMap?new WeakMap:new Map,y=new Set,g=\"function\"==typeof IntersectionObserver?new IntersectionObserver(function(e){for(let t of e){let e=t.intersectionRatio>0;E(t.target,e)}},{rootMargin:\"200px\"}):null;function _(e,t){void 0!==h.get(e)&&R(e),h.set(e,t),null!==g&&g.observe(e)}function v(t){if(!(\"u\">typeof window))return null;{let{createPrefetchURL:r}=e.r(82883);try{return r(t)}catch{return(\"function\"==typeof reportError?reportError:console.error)(`Cannot prefetch '${t}' because it cannot be converted to a URL.`),null}}}function b(e,t,r,n,a,u){if(a){let a=v(t);if(null!==a){let t={router:r,fetchStrategy:n,isVisible:!1,prefetchTask:null,prefetchHref:a.href,setOptimisticLinkStatus:u};return _(e,t),t}}return{router:r,fetchStrategy:n,isVisible:!1,prefetchTask:null,prefetchHref:null,setOptimisticLinkStatus:u}}function m(e,t,r,n){let a=v(t);null===a||_(e,{router:r,fetchStrategy:n,isVisible:!1,prefetchTask:null,prefetchHref:a.href,setOptimisticLinkStatus:null})}function R(e){let t=h.get(e);if(void 0!==t){h.delete(e),y.delete(t);let r=t.prefetchTask;null!==r&&(0,l.cancelPrefetchTask)(r)}null!==g&&g.unobserve(e)}function E(e,t){let r=h.get(e);void 0!==r&&(r.isVisible=t,t?y.add(r):y.delete(r),S(r,u.PrefetchPriority.Default))}function P(e,t){let r=h.get(e);void 0!==r&&void 0!==r&&S(r,u.PrefetchPriority.Intent)}function S(t,r){if(\"u\">typeof window){let n=t.prefetchTask;if(!t.isVisible){null!==n&&(0,l.cancelPrefetchTask)(n);return}let{getCurrentAppRouterState:a}=e.r(12942),u=a();if(null!==u){let e=u.tree;if(null===n){let n=u.nextUrl,a=(0,o.createCacheKey)(t.prefetchHref,n);t.prefetchTask=(0,l.schedulePrefetchTask)(a,e,t.fetchStrategy,r,null)}else(0,l.reschedulePrefetchTask)(n,e,t.fetchStrategy,r)}}}function O(e,t){for(let r of y){let n=r.prefetchTask;if(null!==n&&!(0,l.isPrefetchTaskDirty)(n,e,t))continue;null!==n&&(0,l.cancelPrefetchTask)(n);let a=(0,o.createCacheKey)(r.prefetchHref,e);r.prefetchTask=(0,l.schedulePrefetchTask)(a,t,r.fetchStrategy,u.PrefetchPriority.Default,null)}}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},85131,(e,t,r)=>{\"use strict\";function n(){let e,t,r=new Promise((r,n)=>{e=r,t=n});return{resolve:e,reject:t,promise:r}}Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"createPromiseWithResolvers\",{enumerable:!0,get:function(){return n}})},31018,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n,a={EntryStatus:function(){return S},canNewFetchStrategyProvideMoreContent:function(){return en},convertRouteTreeToFlightRouterState:function(){return function e(t){let r={};if(null!==t.slots)for(let n in t.slots)r[n]=e(t.slots[n]);return[t.segment,r,null,null,t.isRootLayout]}},createDetachedSegmentCacheEntry:function(){return X},fetchRouteOnCacheMiss:function(){return Y},fetchSegmentOnCacheMiss:function(){return z},fetchSegmentPrefetchesUsingDynamicRequest:function(){return Q},getCurrentCacheVersion:function(){return M},getStaleTimeMs:function(){return P},overwriteRevalidatingSegmentCacheEntry:function(){return $},pingInvalidationListeners:function(){return C},readOrCreateRevalidatingSegmentEntry:function(){return H},readOrCreateRouteCacheEntry:function(){return k},readOrCreateSegmentCacheEntry:function(){return L},readRouteCacheEntry:function(){return D},readSegmentCacheEntry:function(){return x},requestOptimisticRouteCacheEntry:function(){return I},revalidateEntireCache:function(){return N},upgradeToPendingSegment:function(){return q},upsertSegmentEntry:function(){return B},waitForSegmentCacheEntry:function(){return U}};for(var u in a)Object.defineProperty(r,u,{enumerable:!0,get:a[u]});let o=e.r(76218),l=e.r(19044),i=e.r(15026),s=e.r(68946),c=e.r(5868),f=e.r(94275),d=e.r(13425),p=e.r(14238),h=e.r(29136),y=e.r(92097),g=e.r(18364),_=e.r(2860),v=e.r(1810),b=e.r(21001),m=e.r(17403),R=e.r(20753),E=e.r(85131);function P(e){return 1e3*Math.max(e,30)}var S=((n={})[n.Empty=0]=\"Empty\",n[n.Pending=1]=\"Pending\",n[n.Fulfilled=2]=\"Fulfilled\",n[n.Rejected=3]=\"Rejected\",n);let O=[\"\",{},null,\"metadata-only\"],T=(0,y.createCacheMap)(),j=(0,y.createCacheMap)(),w=null,A=0;function M(){return A}function N(e,t){A++,(0,s.startRevalidationCooldown)(),(0,b.pingVisibleLinks)(e,t),C(e,t)}function C(e,t){if(null!==w){let r=w;for(let n of(w=null,r))(0,s.isPrefetchTaskDirty)(n,e,t)&&function(e){let t=e.onInvalidate;if(null!==t){e.onInvalidate=null;try{t()}catch(e){\"function\"==typeof reportError?reportError(e):console.error(e)}}}(n)}}function D(e,t){let r=(0,c.getRouteVaryPath)(t.pathname,t.search,t.nextUrl);return(0,y.getFromCacheMap)(e,A,T,r,!1)}function x(e,t){return(0,y.getFromCacheMap)(e,A,j,t,!1)}function U(e){let t=e.promise;return null===t&&(t=e.promise=(0,E.createPromiseWithResolvers)()),t.promise}function k(e,t,r){null!==t.onInvalidate&&(null===w?w=new Set([t]):w.add(t));let n=D(e,r);if(null!==n)return n;let a={canonicalUrl:null,status:0,blockedTasks:null,tree:null,metadata:null,couldBeIntercepted:!0,isPPREnabled:!1,renderedSearch:null,ref:null,size:0,staleAt:1/0,version:A},u=(0,c.getRouteVaryPath)(r.pathname,r.search,r.nextUrl);return(0,y.setInCacheMap)(T,u,a,!1),a}function I(e,t,r){let n=t.search;if(\"\"===n)return null;let a=new URL(t);a.search=\"\";let u=D(e,(0,p.createCacheKey)(a.href,r));if(null===u||2!==u.status)return null;let o=new URL(u.canonicalUrl,t.origin),l=\"\"!==o.search?o.search:n,i=\"\"!==u.renderedSearch?u.renderedSearch:n,s=new URL(u.canonicalUrl,location.origin);return s.search=l,{canonicalUrl:(0,d.createHrefFromUrl)(s),status:2,blockedTasks:null,tree:F(u.tree,i),metadata:F(u.metadata,i),couldBeIntercepted:u.couldBeIntercepted,isPPREnabled:u.isPPREnabled,renderedSearch:i,ref:null,size:0,staleAt:u.staleAt,version:u.version}}function F(e,t){let r=null,n=e.slots;if(null!==n)for(let e in r={},n){let a=n[e];r[e]=F(a,t)}return e.isPage?{requestKey:e.requestKey,segment:e.segment,varyPath:(0,c.clonePageVaryPathWithNewSearchParams)(e.varyPath,t),isPage:!0,slots:r,isRootLayout:e.isRootLayout,hasLoadingBoundary:e.hasLoadingBoundary,hasRuntimePrefetch:e.hasRuntimePrefetch}:{requestKey:e.requestKey,segment:e.segment,varyPath:e.varyPath,isPage:!1,slots:r,isRootLayout:e.isRootLayout,hasLoadingBoundary:e.hasLoadingBoundary,hasRuntimePrefetch:e.hasRuntimePrefetch}}function L(e,t,r,n){let a=x(e,n.varyPath);if(null!==a)return a;let u=(0,c.getSegmentVaryPathForRequest)(t,n),o=X(r.staleAt);return(0,y.setInCacheMap)(j,u,o,!1),o}function H(e,t,r,n){var a;let u=(a=n.varyPath,(0,y.getFromCacheMap)(e,A,j,a,!0));if(null!==u)return u;let o=(0,c.getSegmentVaryPathForRequest)(t,n),l=X(r.staleAt);return(0,y.setInCacheMap)(j,o,l,!0),l}function $(e,t,r){let n=(0,c.getSegmentVaryPathForRequest)(e,r),a=X(t.staleAt);return(0,y.setInCacheMap)(j,n,a,!0),a}function B(e,t,r){if((0,y.isValueExpired)(e,A,r))return null;let n=x(e,t);if(null!==n){var a;if(r.fetchStrategy!==n.fetchStrategy&&(a=n.fetchStrategy,!(a<r.fetchStrategy))||!n.isPartial&&r.isPartial)return r.status=3,r.loading=null,r.rsc=null,null;(0,y.deleteFromCacheMap)(n)}return(0,y.setInCacheMap)(j,t,r,!1),r}function X(e){return{status:0,fetchStrategy:R.FetchStrategy.PPR,rsc:null,loading:null,isPartial:!0,promise:null,ref:null,size:0,staleAt:e,version:0}}function q(e,t){return e.status=1,e.fetchStrategy=t,t===R.FetchStrategy.Full&&(e.isPartial=!1),e.version=A,e}function W(e){let t=e.blockedTasks;if(null!==t){for(let e of t)(0,s.pingPrefetchTask)(e);e.blockedTasks=null}}function K(e,t,r,n,a){return e.status=2,e.rsc=t,e.loading=r,e.staleAt=n,e.isPartial=a,null!==e.promise&&(e.promise.resolve(e),e.promise=null),e}function V(e,t){e.status=3,e.staleAt=t,W(e)}function G(e,t){e.status=3,e.staleAt=t,null!==e.promise&&(e.promise.resolve(null),e.promise=null)}async function Y(e,t,r){let n=r.pathname,a=r.search,u=r.nextUrl,s=\"/_tree\",p={[l.RSC_HEADER]:\"1\",[l.NEXT_ROUTER_PREFETCH_HEADER]:\"1\",[l.NEXT_ROUTER_SEGMENT_PREFETCH_HEADER]:s};null!==u&&(p[l.NEXT_URL]=u);try{let t,r,v=new URL(n+a,location.origin);{let n=await fetch(v,{method:\"HEAD\"});if(n.status<200||n.status>=400)return V(e,Date.now()+1e4),null;r=n.redirected?new URL(n.url):v,t=await ee(er(r,s),p)}if(!t||!t.ok||204===t.status||!t.body)return V(e,Date.now()+1e4),null;let b=(0,d.createHrefFromUrl)(r),R=t.headers.get(\"vary\"),S=null!==R&&R.includes(l.NEXT_URL),O=(0,E.createPromiseWithResolvers)(),j=\"2\"===t.headers.get(l.NEXT_DID_POSTPONE_HEADER)||!0;{var _;let r,n,a,u=et(t.body,O.resolve,function(t){(0,y.setSizeInCacheMap)(e,t)}),l=await (0,i.createFromNextReadableStream)(u,p);if(l.buildId!==(0,f.getAppBuildId)())return V(e,Date.now()+1e4),null;let s=(0,h.getRenderedPathname)(t),d=(0,h.getRenderedSearch)(t),v={metadataVaryPath:null},R=(r=s.split(\"/\").filter(e=>\"\"!==e),n=g.ROOT_SEGMENT_REQUEST_KEY,function e(t,r,n,a,u,l,i,s){let f,d,p=null,y=t.slots;if(null!==y)for(let t in f=!1,d=(0,c.finalizeLayoutVaryPath)(a,n),p={},y){let r,o,f,d=y[t],_=d.name,v=d.paramType,b=d.paramKey;if(null!==v){let e=(0,h.parseDynamicParamFromURLPart)(v,u,l),t=null!==b?b:(0,h.getCacheKeyForDynamicParam)(e,\"\");f=(0,c.appendLayoutVaryPath)(n,t),o=[_,t,v],r=!0}else f=n,o=_,r=(0,h.doesStaticSegmentAppearInURL)(_);let m=r?l+1:l,R=(0,g.createSegmentRequestKeyPart)(o),E=(0,g.appendSegmentRequestKeyPart)(a,t,R);p[t]=e(d,o,f,E,u,m,i,s)}else a.endsWith(m.PAGE_SEGMENT_KEY)?(f=!0,d=(0,c.finalizePageVaryPath)(a,i,n),null===s.metadataVaryPath&&(s.metadataVaryPath=(0,c.finalizeMetadataVaryPath)(a,i,n))):(f=!1,d=(0,c.finalizeLayoutVaryPath)(a,n));return{requestKey:a,segment:r,varyPath:d,isPage:f,slots:p,isRootLayout:t.isRootLayout,hasLoadingBoundary:o.HasLoadingBoundary.SegmentHasLoadingBoundary,hasRuntimePrefetch:t.hasRuntimePrefetch}}(l.tree,n,null,g.ROOT_SEGMENT_REQUEST_KEY,r,0,d,v)),E=v.metadataVaryPath;if(null===E)return V(e,Date.now()+1e4),null;let T=P(l.staleTime);_=Date.now()+T,a={requestKey:g.HEAD_REQUEST_KEY,segment:g.HEAD_REQUEST_KEY,varyPath:E,isPage:!0,slots:null,isRootLayout:!1,hasLoadingBoundary:o.HasLoadingBoundary.SubtreeHasNoLoadingBoundary,hasRuntimePrefetch:!1},e.status=2,e.tree=R,e.metadata=a,e.staleAt=_,e.couldBeIntercepted=S,e.canonicalUrl=b,e.renderedSearch=d,e.isPPREnabled=j,W(e)}if(!S){let t=(0,c.getFulfilledRouteVaryPath)(n,a,u,S);(0,y.setInCacheMap)(T,t,e,!1)}return{value:null,closed:O.promise}}catch(t){return V(e,Date.now()+1e4),null}}async function z(e,t,r,n){let a=new URL(e.canonicalUrl,location.origin),u=r.nextUrl,o=n.requestKey,s=o===g.ROOT_SEGMENT_REQUEST_KEY?\"/_index\":o,c={[l.RSC_HEADER]:\"1\",[l.NEXT_ROUTER_PREFETCH_HEADER]:\"1\",[l.NEXT_ROUTER_SEGMENT_PREFETCH_HEADER]:s};null!==u&&(c[l.NEXT_URL]=u);let d=er(a,s);try{let r=await ee(d,c);if(!r||!r.ok||204===r.status||\"2\"!==r.headers.get(l.NEXT_DID_POSTPONE_HEADER)&&0||!r.body)return G(t,Date.now()+1e4),null;let n=(0,E.createPromiseWithResolvers)(),a=et(r.body,n.resolve,function(e){(0,y.setSizeInCacheMap)(t,e)}),u=await (0,i.createFromNextReadableStream)(a,c);if(u.buildId!==(0,f.getAppBuildId)())return G(t,Date.now()+1e4),null;return{value:K(t,u.rsc,u.loading,e.staleAt,u.isPartial),closed:n.promise}}catch(e){return G(t,Date.now()+1e4),null}}async function Q(e,t,r,n,a){let u=e.key,o=new URL(t.canonicalUrl,location.origin),s=u.nextUrl;1===a.size&&a.has(t.metadata.requestKey)&&(n=O);let c={[l.RSC_HEADER]:\"1\",[l.NEXT_ROUTER_STATE_TREE_HEADER]:(0,_.prepareFlightRouterStateForRequest)(n)};switch(null!==s&&(c[l.NEXT_URL]=s),r){case R.FetchStrategy.Full:break;case R.FetchStrategy.PPRRuntime:c[l.NEXT_ROUTER_PREFETCH_HEADER]=\"2\";break;case R.FetchStrategy.LoadingBoundary:c[l.NEXT_ROUTER_PREFETCH_HEADER]=\"1\"}try{let n=await ee(o,c);if(!n||!n.ok||!n.body||(0,h.getRenderedSearch)(n)!==t.renderedSearch)return J(a,Date.now()+1e4),null;let u=(0,E.createPromiseWithResolvers)(),s=null,d=et(n.body,u.resolve,function(e){if(null===s)return;let t=e/s.length;for(let e of s)(0,y.setSizeInCacheMap)(e,t)}),p=await (0,i.createFromNextReadableStream)(d,c),g=r===R.FetchStrategy.PPRRuntime&&p.rp?.[0]===!0;return s=function(e,t,r,n,a,u,o,i){if(a.b!==(0,f.getAppBuildId)())return null!==i&&J(i,e+1e4),null;let s=(0,_.normalizeFlightData)(a.f);if(\"string\"==typeof s)return null;let c=\"number\"==typeof a.rp?.[1]?a.rp[1]:parseInt(n.headers.get(l.NEXT_ROUTER_STALE_TIME_HEADER)??\"\",10),d=e+(isNaN(c)?v.STATIC_STALETIME_MS:P(c));for(let n of s){let a=n.seedData;if(null!==a){let l=n.segmentPath,s=o.tree;for(let t=0;t<l.length;t+=2){let r=l[t];if(s?.slots?.[r]===void 0)return null!==i&&J(i,e+1e4),null;s=s.slots[r]}!function e(t,r,n,a,u,o,l,i,s){let c=l[0],f=l[2];Z(t,n,a,c,f,null===c||i,o,u,s);let d=u.slots;if(null!==d){let u=l[1];for(let l in d){let c=d[l],f=u[l];null!=f&&e(t,r,n,a,c,o,f,i,s)}}}(e,t,r,o,s,d,a,u,i)}let l=n.head;null!==l&&Z(e,r,o,l,null,n.isHeadPartial,d,o.metadata,i)}return null!==i?J(i,e+1e4):null}(Date.now(),e,r,n,p,g,t,a),{value:null,closed:u.promise}}catch(e){return J(a,Date.now()+1e4),null}}function J(e,t){let r=[];for(let n of e.values())1===n.status?G(n,t):2===n.status&&r.push(n);return r}function Z(e,t,r,n,a,u,o,l,i){let s=null!==i?i.get(l.requestKey):void 0;if(void 0!==s)K(s,n,a,o,u);else{let i=L(e,t,r,l);if(0===i.status)K(q(i,t),n,a,o,u);else{let r=K(q(X(o),t),n,a,o,u);B(e,(0,c.getSegmentVaryPathForRequest)(t,l),r)}}}async function ee(e,t){let r=await (0,i.createFetch)(e,t,\"low\",!1);return r.ok?r:null}function et(e,t,r){let n=0,a=e.getReader();return new ReadableStream({async pull(e){for(;;){let{done:u,value:o}=await a.read();if(!u){e.enqueue(o),r(n+=o.byteLength);continue}t();return}}})}function er(e,t){{let r=new URL(e),n=r.pathname.endsWith(\"/\")?r.pathname.slice(0,-1):r.pathname,a=(0,g.convertSegmentPathToStaticExportFilename)(t);return r.pathname=`${n}/${a}`,r}}function en(e,t){return e<t}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},68008,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={convertServerPatchToFullTree:function(){return m},navigate:function(){return d},navigateToSeededRoute:function(){return p}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(15026),o=e.r(46088),l=e.r(13425),i=e.r(31018),s=e.r(14238),c=e.r(17403),f=e.r(20753);function d(e,t,r,n,a,u,o,l){let c=Date.now(),d=e.href,p=d===t.href,y=(0,s.createCacheKey)(d,a),v=(0,i.readRouteCacheEntry)(c,y);if(null!==v&&v.status===i.EntryStatus.Fulfilled){let l=g(c,v,v.tree),i=l.flightRouterState,s=l.seedData,f=_(c,v),d=f.rsc,y=f.isPartial,b=v.canonicalUrl+e.hash;return h(c,e,t,a,p,r,n,i,s,d,y,b,v.renderedSearch,u,o)}if(null===v||v.status!==i.EntryStatus.Rejected){let l=(0,i.requestOptimisticRouteCacheEntry)(c,e,a);if(null!==l){let i=g(c,l,l.tree),s=i.flightRouterState,f=i.seedData,d=_(c,l),y=d.rsc,v=d.isPartial,b=l.canonicalUrl+e.hash;return h(c,e,t,a,p,r,n,s,f,y,v,b,l.renderedSearch,u,o)}}let m=l.collectedDebugInfo??[];return void 0===l.collectedDebugInfo&&(m=l.collectedDebugInfo=[]),{tag:f.NavigationResultTag.Async,data:b(c,e,t,a,r,n,u,o,m)}}function p(e,t,r,n,a,u,l,i,s,c){let d={scrollableSegments:null,separateRefreshUrls:null},p=t.href===a.href,h=(0,o.startPPRNavigation)(e,a,u,l,n.tree,i,n.data,n.head,null,null,!1,p,d);return null!==h?((0,o.spawnDynamicRequests)(h,t,s,i,d),y(h,r,n.renderedSearch,d.scrollableSegments,c,t.hash)):{tag:f.NavigationResultTag.MPA,data:r}}function h(e,t,r,n,a,u,l,i,s,c,d,p,h,g,_){let v={scrollableSegments:null,separateRefreshUrls:null},b=(0,o.startPPRNavigation)(e,r,u,l,i,g,null,null,s,c,d,a,v);return null!==b?((0,o.spawnDynamicRequests)(b,t,n,g,v),y(b,p,h,v.scrollableSegments,_,t.hash)):{tag:f.NavigationResultTag.MPA,data:p}}function y(e,t,r,n,a,u){return{tag:f.NavigationResultTag.Success,data:{flightRouterState:e.route,cacheNode:e.node,canonicalUrl:t,renderedSearch:r,scrollableSegments:n,shouldScroll:a,hash:u}}}function g(e,t,r){let n={},a={},u=r.slots;if(null!==u)for(let r in u){let o=g(e,t,u[r]);n[r]=o.flightRouterState,a[r]=o.seedData}let o=null,l=null,s=!0,f=(0,i.readSegmentCacheEntry)(e,r.varyPath);if(null!==f)switch(f.status){case i.EntryStatus.Fulfilled:o=f.rsc,l=f.loading,s=f.isPartial;break;case i.EntryStatus.Pending:{let e=(0,i.waitForSegmentCacheEntry)(f);o=e.then(e=>null!==e?e.rsc:null),l=e.then(e=>null!==e?e.loading:null),s=f.isPartial}case i.EntryStatus.Empty:case i.EntryStatus.Rejected:}return{flightRouterState:[(0,c.addSearchParamsIfPageSegment)(r.segment,Object.fromEntries(new URLSearchParams(t.renderedSearch))),n,null,null,r.isRootLayout],seedData:[o,a,l,s,!1]}}function _(e,t){let r=null,n=!0,a=(0,i.readSegmentCacheEntry)(e,t.metadata.varyPath);if(null!==a)switch(a.status){case i.EntryStatus.Fulfilled:r=a.rsc,n=a.isPartial;break;case i.EntryStatus.Pending:r=(0,i.waitForSegmentCacheEntry)(a).then(e=>null!==e?e.rsc:null),n=a.isPartial;case i.EntryStatus.Empty:case i.EntryStatus.Rejected:}return{rsc:r,isPartial:n}}let v=[\"\",{},null,\"refetch\"];async function b(e,t,r,n,a,i,s,c,d){let h;switch(s){case o.FreshnessPolicy.Default:case o.FreshnessPolicy.HistoryTraversal:h=i;break;case o.FreshnessPolicy.Hydration:case o.FreshnessPolicy.RefreshAll:case o.FreshnessPolicy.HMRRefresh:h=v;break;default:h=i}let y=(0,u.fetchServerResponse)(t,{flightRouterState:h,nextUrl:n}),g=await y;if(\"string\"==typeof g)return{tag:f.NavigationResultTag.MPA,data:g};let{flightData:_,canonicalUrl:b,renderedSearch:R,debugInfo:E}=g;null!==E&&d.push(...E);let P=m(i,_,R);return p(e,t,(0,l.createHrefFromUrl)(b),P,r,a,i,s,n,c)}function m(e,t,r){let n=e,a=null,u=null;for(let{segmentPath:e,tree:r,seedData:o,head:l}of t){let t=function e(t,r,n,a,u,o){let l;if(o===u.length)return{tree:n,data:a};let i=u[o],s=t[1],c=null!==r?r[1]:null,f={},d={};for(let t in s){let r=s[t],l=null!==c?c[t]??null:null;if(t===i){let i=e(r,l,n,a,u,o+2);f[t]=i.tree,d[t]=i.data}else f[t]=r,d[t]=l}return l=[t[0],f],2 in t&&(l[2]=t[2]),3 in t&&(l[3]=t[3]),4 in t&&(l[4]=t[4]),{tree:l,data:[null,d,null,!0,!1]}}(n,a,r,o,e,0);n=t.tree,a=t.data,u=l}return{tree:n,data:a,renderedSearch:r,head:u}}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},1810,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={DYNAMIC_STALETIME_MS:function(){return f},STATIC_STALETIME_MS:function(){return d},generateSegmentsFromPatch:function(){return function e(t){let r=[],[n,a]=t;if(0===Object.keys(a).length)return[[n]];for(let[t,u]of Object.entries(a))for(let a of e(u))\"\"===n?r.push([t,...a]):r.push([n,t,...a]);return r}},handleExternalUrl:function(){return p},handleNavigationResult:function(){return h},navigateReducer:function(){return y}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(13425),o=e.r(18924),l=e.r(68008),i=e.r(20753),s=e.r(31018),c=e.r(46088),f=1e3*Number(\"0\"),d=(0,s.getStaleTimeMs)(Number(\"300\"));function p(e,t,r,n){return t.mpaNavigation=!0,t.canonicalUrl=r,t.pendingPush=n,t.scrollableSegments=void 0,(0,o.handleMutable)(e,t)}function h(e,t,r,n,a){switch(a.tag){case i.NavigationResultTag.MPA:return p(t,r,a.data,n);case i.NavigationResultTag.Success:{r.cache=a.data.cacheNode,r.patchedTree=a.data.flightRouterState,r.renderedSearch=a.data.renderedSearch,r.canonicalUrl=a.data.canonicalUrl,r.scrollableSegments=a.data.scrollableSegments??void 0,r.shouldScroll=a.data.shouldScroll,r.hashFragment=a.data.hash;let n=new URL(t.canonicalUrl,e);return e.pathname===n.pathname&&e.search===n.search&&e.hash!==n.hash&&(r.onlyHashChange=!0,r.shouldScroll=a.data.shouldScroll,r.hashFragment=e.hash,r.scrollableSegments=[]),(0,o.handleMutable)(t,r)}case i.NavigationResultTag.Async:return a.data.then(a=>h(e,t,r,n,a),()=>t);default:return t}}function y(e,t){let{url:r,isExternalUrl:n,navigateType:a,shouldScroll:o}=t,i={},s=(0,u.createHrefFromUrl)(r),f=\"push\"===a;if(i.preserveCustomHistoryState=!1,i.pendingPush=f,n)return p(e,i,r.toString(),f);if(document.getElementById(\"__next-page-redirect\"))return p(e,i,s,f);let d=new URL(e.canonicalUrl,location.origin),y=(0,l.navigate)(r,d,e.cache,e.tree,e.nextUrl,c.FreshnessPolicy.Default,o,i);return h(r,e,i,f,y)}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},9380,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"hasInterceptionRouteInCurrentTree\",{enumerable:!0,get:function(){return function e([t,r]){if(Array.isArray(t)&&(\"di(..)(..)\"===t[2]||\"ci(..)(..)\"===t[2]||\"di(.)\"===t[2]||\"ci(.)\"===t[2]||\"di(..)\"===t[2]||\"ci(..)\"===t[2]||\"di(...)\"===t[2]||\"ci(...)\"===t[2])||\"string\"==typeof t&&(0,n.isInterceptionRouteAppPath)(t))return!0;if(r){for(let t in r)if(e(r[t]))return!0}return!1}}});let n=e.r(29499);(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},64419,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={refreshDynamicData:function(){return f},refreshReducer:function(){return c}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(1810),o=e.r(68008),l=e.r(31018),i=e.r(9380),s=e.r(46088);function c(e){let t=e.nextUrl,r=e.tree;return(0,l.revalidateEntireCache)(t,r),f(e,s.FreshnessPolicy.RefreshAll)}function f(e,t){let r=e.nextUrl,n=(0,i.hasInterceptionRouteInCurrentTree)(e.tree)?e.previousNextUrl||r:null,a=e.canonicalUrl,l=new URL(a,location.origin),s=e.tree,c={tree:e.tree,renderedSearch:e.renderedSearch,data:null,head:null},f=Date.now(),d=(0,o.navigateToSeededRoute)(f,l,a,c,l,e.cache,s,t,n,!0),p={};return p.preserveCustomHistoryState=!1,(0,u.handleNavigationResult)(l,e,p,!1,d)}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},85544,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"serverPatchReducer\",{enumerable:!0,get:function(){return i}});let n=e.r(13425),a=e.r(1810),u=e.r(68008),o=e.r(64419),l=e.r(46088);function i(e,t){let r={};r.preserveCustomHistoryState=!1;let i=t.mpa,s=new URL(t.url,location.origin),c=t.seed;if(i||null===c)return(0,a.handleExternalUrl)(e,r,s.href,!1);let f=new URL(e.canonicalUrl,location.origin);if(t.previousTree!==e.tree)return(0,o.refreshReducer)(e);let d=(0,n.createHrefFromUrl)(s),p=t.nextUrl,h=Date.now(),y=(0,u.navigateToSeededRoute)(h,s,d,c,f,e.cache,e.tree,l.FreshnessPolicy.RefreshAll,p,!0);return(0,a.handleNavigationResult)(s,e,r,!1,y)}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},98502,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"restoreReducer\",{enumerable:!0,get:function(){return l}});let n=e.r(13425),a=e.r(7022),u=e.r(46088),o=e.r(1810);function l(e,t){let r,l,i=t.historyState;i?(r=i.tree,l=i.renderedSearch):(r=e.tree,l=e.renderedSearch);let s=new URL(e.canonicalUrl,location.origin),c=t.url,f=(0,n.createHrefFromUrl)(c),d=(0,a.extractPathFromFlightRouterState)(r)??c.pathname,p=Date.now(),h={scrollableSegments:null,separateRefreshUrls:null},y=(0,u.startPPRNavigation)(p,s,e.cache,e.tree,r,u.FreshnessPolicy.HistoryTraversal,null,null,null,null,!1,!1,h);return null===y?(0,o.handleExternalUrl)(e,{preserveCustomHistoryState:!0},f,!1):((0,u.spawnDynamicRequests)(y,c,d,u.FreshnessPolicy.HistoryTraversal,h),{canonicalUrl:f,renderedSearch:l,pushRef:{pendingPush:!1,mpaNavigation:!1,preserveCustomHistoryState:!0},focusAndScrollRef:e.focusAndScrollRef,cache:y.node,tree:r,nextUrl:d,previousNextUrl:null,debugInfo:null})}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},30737,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"hmrRefreshReducer\",{enumerable:!0,get:function(){return u}});let n=e.r(64419),a=e.r(46088);function u(e){return(0,n.refreshDynamicData)(e,a.FreshnessPolicy.HMRRefresh)}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},58112,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={UnrecognizedActionError:function(){return u},unstable_isUnrecognizedActionError:function(){return o}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});class u extends Error{constructor(...e){super(...e),this.name=\"UnrecognizedActionError\"}}function o(e){return!!(e&&\"object\"==typeof e&&e instanceof u)}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},35655,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"assignLocation\",{enumerable:!0,get:function(){return a}});let n=e.r(43293);function a(e,t){if(e.startsWith(\".\")){let r=t.origin+t.pathname;return new URL((r.endsWith(\"/\")?r:r+\"/\")+e)}return new URL((0,n.addBasePath)(e),t.href)}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},44843,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"actionAsyncStorageInstance\",{enumerable:!0,get:function(){return n}});let n=(0,e.r(44186).createAsyncLocalStorage)()},30431,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"actionAsyncStorage\",{enumerable:!0,get:function(){return n.actionAsyncStorageInstance}});let n=e.r(44843)},62595,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={getRedirectError:function(){return i},getRedirectStatusCodeFromError:function(){return p},getRedirectTypeFromError:function(){return d},getURLFromRedirectError:function(){return f},permanentRedirect:function(){return c},redirect:function(){return s}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(37338),o=e.r(58310),l=\"u\"<typeof window?e.r(30431).actionAsyncStorage:void 0;function i(e,t,r=u.RedirectStatusCode.TemporaryRedirect){let n=Object.defineProperty(Error(o.REDIRECT_ERROR_CODE),\"__NEXT_ERROR_CODE\",{value:\"E394\",enumerable:!1,configurable:!0});return n.digest=`${o.REDIRECT_ERROR_CODE};${t};${e};${r};`,n}function s(e,t){throw i(e,t??=l?.getStore()?.isAction?o.RedirectType.push:o.RedirectType.replace,u.RedirectStatusCode.TemporaryRedirect)}function c(e,t=o.RedirectType.replace){throw i(e,t,u.RedirectStatusCode.PermanentRedirect)}function f(e){return(0,o.isRedirectError)(e)?e.digest.split(\";\").slice(2,-2).join(\";\"):null}function d(e){if(!(0,o.isRedirectError)(e))throw Object.defineProperty(Error(\"Not a redirect error\"),\"__NEXT_ERROR_CODE\",{value:\"E260\",enumerable:!1,configurable:!0});return e.digest.split(\";\",2)[1]}function p(e){if(!(0,o.isRedirectError)(e))throw Object.defineProperty(Error(\"Not a redirect error\"),\"__NEXT_ERROR_CODE\",{value:\"E260\",enumerable:!1,configurable:!0});return Number(e.digest.split(\";\").at(-2))}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},21247,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"pathHasPrefix\",{enumerable:!0,get:function(){return a}});let n=e.r(59514);function a(e,t){if(\"string\"!=typeof e)return!1;let{pathname:r}=(0,n.parsePath)(e);return r===t||r.startsWith(t+\"/\")}},24208,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"hasBasePath\",{enumerable:!0,get:function(){return a}});let n=e.r(21247);function a(e){return(0,n.pathHasPrefix)(e,\"\")}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},17117,(e,t,r)=>{\"use strict\";function n(e){return e}Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"removeBasePath\",{enumerable:!0,get:function(){return n}}),e.r(24208),(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},45350,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={extractInfoFromServerReferenceId:function(){return u},omitUnusedArgs:function(){return o}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});function u(e){let t=parseInt(e.slice(0,2),16),r=t>>1&63,n=Array(6);for(let e=0;e<6;e++){let t=r>>5-e&1;n[e]=1===t}return{type:1==(t>>7&1)?\"use-cache\":\"server-action\",usedArgs:n,hasRestArgs:1==(1&t)}}function o(e,t){let r=Array(e.length);for(let n=0;n<e.length;n++)(n<6&&t.usedArgs[n]||n>=6&&t.hasRestArgs)&&(r[n]=e[n]);return r}},42297,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={ActionDidNotRevalidate:function(){return u},ActionDidRevalidateDynamicOnly:function(){return l},ActionDidRevalidateStaticAndDynamic:function(){return o}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=0,o=1,l=2},4642,(e,t,r)=>{\"use strict\";let n;Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"serverActionReducer\",{enumerable:!0,get:function(){return j}});let a=e.r(55748),u=e.r(3958),o=e.r(19044),l=e.r(58112),i=e.r(58662),s=e.r(35655),c=e.r(13425),f=e.r(1810),d=e.r(9380),p=e.r(2860),h=e.r(62595),y=e.r(58310),g=e.r(17117),_=e.r(24208),v=e.r(45350),b=e.r(31018),m=e.r(77447),R=e.r(68008),E=e.r(42297),P=e.r(82883),S=e.r(46088),O=i.createFromFetch;async function T(e,t,{actionId:r,actionArgs:c}){let f,d,h,g,_,b=(0,i.createTemporaryReferenceSet)(),R=(0,v.extractInfoFromServerReferenceId)(r),P=\"use-cache\"===R.type?(0,v.omitUnusedArgs)(c,R):c,S=await (0,i.encodeReply)(P,{temporaryReferences:b}),T={Accept:o.RSC_CONTENT_TYPE_HEADER,[o.ACTION_HEADER]:r,[o.NEXT_ROUTER_STATE_TREE_HEADER]:(0,p.prepareFlightRouterStateForRequest)(e.tree)},j=(0,m.getDeploymentId)();j&&(T[\"x-deployment-id\"]=j),t&&(T[o.NEXT_URL]=t);let w=await fetch(e.canonicalUrl,{method:\"POST\",headers:T,body:S});if(\"1\"===w.headers.get(o.NEXT_ACTION_NOT_FOUND_HEADER))throw Object.defineProperty(new l.UnrecognizedActionError(`Server Action \"${r}\" was not found on the server. \nRead more: https://nextjs.org/docs/messages/failed-to-find-server-action`),\"__NEXT_ERROR_CODE\",{value:\"E715\",enumerable:!1,configurable:!0});let A=w.headers.get(\"x-action-redirect\"),[M,N]=A?.split(\";\")||[];switch(N){case\"push\":f=y.RedirectType.push;break;case\"replace\":f=y.RedirectType.replace;break;default:f=void 0}let C=!!w.headers.get(o.NEXT_IS_PRERENDER_HEADER),D=E.ActionDidNotRevalidate;try{let e=w.headers.get(\"x-action-revalidated\");if(e){let t=JSON.parse(e);(t===E.ActionDidRevalidateStaticAndDynamic||t===E.ActionDidRevalidateDynamicOnly)&&(D=t)}}catch{}let x=M?(0,s.assignLocation)(M,new URL(e.canonicalUrl,window.location.href)):void 0,U=w.headers.get(\"content-type\"),k=!!(U&&U.startsWith(o.RSC_CONTENT_TYPE_HEADER));if(!k&&!x)throw Object.defineProperty(Error(w.status>=400&&\"text/plain\"===U?await w.text():\"An unexpected response was received from the server.\"),\"__NEXT_ERROR_CODE\",{value:\"E394\",enumerable:!1,configurable:!0});if(k){let e=await O(Promise.resolve(w),{callServer:a.callServer,findSourceMapURL:u.findSourceMapURL,temporaryReferences:b,debugChannel:n&&n(T)});d=x?void 0:e.a;let t=(0,p.normalizeFlightData)(e.f);\"\"!==t&&(h=t,g=e.q,_=e.i)}else d=void 0,h=void 0,g=void 0,_=void 0;return{actionResult:d,actionFlightData:h,actionFlightDataRenderedSearch:g,actionFlightDataCouldBeIntercepted:_,redirectLocation:x,redirectType:f,revalidationKind:D,isPrerender:C}}function j(e,t){let{resolve:r,reject:n}=t,a={};a.preserveCustomHistoryState=!1;let u=(e.previousNextUrl||e.nextUrl)&&(0,d.hasInterceptionRouteInCurrentTree)(e.tree)?e.previousNextUrl||e.nextUrl:null;return T(e,u,t).then(async({revalidationKind:o,actionResult:l,actionFlightData:i,actionFlightDataRenderedSearch:s,actionFlightDataCouldBeIntercepted:d,redirectLocation:p,redirectType:h})=>{o!==E.ActionDidNotRevalidate&&(t.didRevalidate=!0,o===E.ActionDidRevalidateStaticAndDynamic&&(0,b.revalidateEntireCache)(u,e.tree));let v=h!==y.RedirectType.replace;if(e.pushRef.pendingPush=v,a.pendingPush=v,void 0!==p){let t=h||y.RedirectType.push;if((0,P.isExternalURL)(p)){let r=p.href;return n(w(r,t)),(0,f.handleExternalUrl)(e,a,r,v)}{let e=(0,c.createHrefFromUrl)(p,!1);n(w((0,_.hasBasePath)(e)?(0,g.removeBasePath)(e):e,t))}}else r(l);if(void 0===p&&o===E.ActionDidNotRevalidate&&void 0===i)return e;if(void 0===i&&void 0!==p)return(0,f.handleExternalUrl)(e,a,p.href,v);if(\"string\"==typeof i)return(0,f.handleExternalUrl)(e,a,i,v);let m=new URL(e.canonicalUrl,location.origin),O=void 0!==p?p:m,T=e.tree,j=o===E.ActionDidNotRevalidate?S.FreshnessPolicy.Default:S.FreshnessPolicy.RefreshAll;if(void 0!==i){let t=i[0];if(void 0!==t&&t.isRootRender&&void 0!==s&&void 0!==d){let r=(0,c.createHrefFromUrl)(O),n={tree:t.tree,renderedSearch:s,data:t.seedData,head:t.head},o=Date.now(),l=(0,R.navigateToSeededRoute)(o,O,r,n,m,e.cache,T,j,u,!0);return(0,f.handleNavigationResult)(O,e,a,v,l)}}let A=(0,R.navigate)(O,m,e.cache,T,u,j,!0,a);return(0,f.handleNavigationResult)(O,e,a,v,A)},t=>(n(t),e))}function w(e,t){let r=(0,h.getRedirectError)(e,t);return r.handled=!0,r}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},43034,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"reducer\",{enumerable:!0,get:function(){return c}});let n=e.r(57695),a=e.r(1810),u=e.r(85544),o=e.r(98502),l=e.r(64419),i=e.r(30737),s=e.r(4642),c=\"u\"<typeof window?function(e,t){return e}:function(e,t){switch(t.type){case n.ACTION_NAVIGATE:return(0,a.navigateReducer)(e,t);case n.ACTION_SERVER_PATCH:return(0,u.serverPatchReducer)(e,t);case n.ACTION_RESTORE:return(0,o.restoreReducer)(e,t);case n.ACTION_REFRESH:return(0,l.refreshReducer)(e);case n.ACTION_HMR_REFRESH:return(0,i.hmrRefreshReducer)(e);case n.ACTION_SERVER_ACTION:return(0,s.serverActionReducer)(e,t);default:throw Object.defineProperty(Error(\"Unknown action\"),\"__NEXT_ERROR_CODE\",{value:\"E295\",enumerable:!1,configurable:!0})}};(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},88404,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"prefetch\",{enumerable:!0,get:function(){return l}});let n=e.r(82883),a=e.r(14238),u=e.r(68946),o=e.r(20753);function l(e,t,r,l,i){let s=(0,n.createPrefetchURL)(e);if(null===s)return;let c=(0,a.createCacheKey)(s.href,t);(0,u.schedulePrefetchTask)(c,r,l,o.PrefetchPriority.Default,i)}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},12942,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={createMutableActionQueue:function(){return v},dispatchNavigateAction:function(){return R},dispatchTraverseAction:function(){return E},getCurrentAppRouterState:function(){return b},publicAppRouterInstance:function(){return P}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(57695),o=e.r(43034),l=e.r(33664),i=e.r(204),s=e.r(20753),c=e.r(88404),f=e.r(82183),d=e.r(43293),p=e.r(82883),h=e.r(21001);function y(e,t){null!==e.pending?(e.pending=e.pending.next,null!==e.pending&&g({actionQueue:e,action:e.pending,setState:t})):e.needsRefresh&&(e.needsRefresh=!1,e.dispatch({type:u.ACTION_REFRESH},t))}async function g({actionQueue:e,action:t,setState:r}){let n=e.state;e.pending=t;let a=t.payload,o=e.action(n,a);function l(n){if(t.discarded){t.payload.type===u.ACTION_SERVER_ACTION&&t.payload.didRevalidate&&(e.needsRefresh=!0),y(e,r);return}e.state=n,y(e,r),t.resolve(n)}(0,i.isThenable)(o)?o.then(l,n=>{y(e,r),t.reject(n)}):l(o)}let _=null;function v(e,t){let r={state:e,dispatch:(e,t)=>(function(e,t,r){let n={resolve:r,reject:()=>{}};if(t.type!==u.ACTION_RESTORE){let e=new Promise((e,t)=>{n={resolve:e,reject:t}});(0,l.startTransition)(()=>{r(e)})}let a={payload:t,next:null,resolve:n.resolve,reject:n.reject};null===e.pending?(e.last=a,g({actionQueue:e,action:a,setState:r})):t.type===u.ACTION_NAVIGATE||t.type===u.ACTION_RESTORE?(e.pending.discarded=!0,a.next=e.pending.next,g({actionQueue:e,action:a,setState:r})):(null!==e.last&&(e.last.next=a),e.last=a)})(r,e,t),action:async(e,t)=>(0,o.reducer)(e,t),pending:null,last:null,onRouterTransitionStart:null!==t&&\"function\"==typeof t.onRouterTransitionStart?t.onRouterTransitionStart:null};if(\"u\">typeof window){if(null!==_)throw Object.defineProperty(Error(\"Internal Next.js Error: createMutableActionQueue was called more than once\"),\"__NEXT_ERROR_CODE\",{value:\"E624\",enumerable:!1,configurable:!0});_=r}return r}function b(){return null!==_?_.state:null}function m(){return null!==_?_.onRouterTransitionStart:null}function R(e,t,r,n){let a=new URL((0,d.addBasePath)(e),location.href);(0,h.setLinkForCurrentNavigation)(n);let o=m();null!==o&&o(e,t),(0,f.dispatchAppRouterAction)({type:u.ACTION_NAVIGATE,url:a,isExternalUrl:(0,p.isExternalURL)(a),locationSearch:location.search,shouldScroll:r,navigateType:t})}function E(e,t){let r=m();null!==r&&r(e,\"traverse\"),(0,f.dispatchAppRouterAction)({type:u.ACTION_RESTORE,url:new URL(e),historyState:t})}let P={back:()=>window.history.back(),forward:()=>window.history.forward(),prefetch:(e,t)=>{let r,n=function(){if(null===_)throw Object.defineProperty(Error(\"Internal Next.js error: Router action dispatched before initialization.\"),\"__NEXT_ERROR_CODE\",{value:\"E668\",enumerable:!1,configurable:!0});return _}();switch(t?.kind??u.PrefetchKind.AUTO){case u.PrefetchKind.AUTO:r=s.FetchStrategy.PPR;break;case u.PrefetchKind.FULL:r=s.FetchStrategy.Full;break;default:r=s.FetchStrategy.PPR}(0,c.prefetch)(e,n.state.nextUrl,n.state.tree,r,t?.onInvalidate??null)},replace:(e,t)=>{(0,l.startTransition)(()=>{R(e,\"replace\",t?.scroll??!0,null)})},push:(e,t)=>{(0,l.startTransition)(()=>{R(e,\"push\",t?.scroll??!0,null)})},refresh:()=>{(0,l.startTransition)(()=>{(0,f.dispatchAppRouterAction)({type:u.ACTION_REFRESH})})},hmrRefresh:()=>{throw Object.defineProperty(Error(\"hmrRefresh can only be used in development mode. Please use refresh instead.\"),\"__NEXT_ERROR_CODE\",{value:\"E485\",enumerable:!1,configurable:!0})}};\"u\">typeof window&&window.next&&(window.next.router=P),(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},7e4,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={AppRouterContext:function(){return o},GlobalLayoutRouterContext:function(){return i},LayoutRouterContext:function(){return l},MissingSlotContext:function(){return c},TemplateContext:function(){return s}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(81258)._(e.r(33664)),o=u.default.createContext(null),l=u.default.createContext(null),i=u.default.createContext(null),s=u.default.createContext(null),c=u.default.createContext(new Set)},2634,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={ServerInsertedHTMLContext:function(){return o},useServerInsertedHTML:function(){return l}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(44066)._(e.r(33664)),o=u.default.createContext(null);function l(e){let t=(0,u.useContext)(o);t&&t(e)}},2983,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"notFound\",{enumerable:!0,get:function(){return u}});let n=e.r(38747),a=`${n.HTTP_ERROR_FALLBACK_ERROR_CODE};404`;function u(){let e=Object.defineProperty(Error(a),\"__NEXT_ERROR_CODE\",{value:\"E394\",enumerable:!1,configurable:!0});throw e.digest=a,e}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},50700,(e,t,r)=>{\"use strict\";function n(){throw Object.defineProperty(Error(\"`forbidden()` is experimental and only allowed to be enabled when `experimental.authInterrupts` is enabled.\"),\"__NEXT_ERROR_CODE\",{value:\"E488\",enumerable:!1,configurable:!0})}Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"forbidden\",{enumerable:!0,get:function(){return n}}),e.r(38747).HTTP_ERROR_FALLBACK_ERROR_CODE,(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},25866,(e,t,r)=>{\"use strict\";function n(){throw Object.defineProperty(Error(\"`unauthorized()` is experimental and only allowed to be used when `experimental.authInterrupts` is enabled.\"),\"__NEXT_ERROR_CODE\",{value:\"E411\",enumerable:!1,configurable:!0})}Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"unauthorized\",{enumerable:!0,get:function(){return n}}),e.r(38747).HTTP_ERROR_FALLBACK_ERROR_CODE,(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},27438,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"unstable_rethrow\",{enumerable:!0,get:function(){return function e(t){if((0,a.isNextRouterError)(t)||(0,n.isBailoutToCSRError)(t))throw t;t instanceof Error&&\"cause\"in t&&e(t.cause)}}});let n=e.r(83025),a=e.r(25626);(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},20176,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={isHangingPromiseRejectionError:function(){return u},makeDevtoolsIOAwarePromise:function(){return f},makeHangingPromise:function(){return s}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});function u(e){return\"object\"==typeof e&&null!==e&&\"digest\"in e&&e.digest===o}let o=\"HANGING_PROMISE_REJECTION\";class l extends Error{constructor(e,t){super(`During prerendering, ${t} rejects when the prerender is complete. Typically these errors are handled by React but if you move ${t} to a different context by using \\`setTimeout\\`, \\`after\\`, or similar functions you may observe this error and you should handle it in that context. This occurred at route \"${e}\".`),this.route=e,this.expression=t,this.digest=o}}let i=new WeakMap;function s(e,t,r){if(e.aborted)return Promise.reject(new l(t,r));{let n=new Promise((n,a)=>{let u=a.bind(null,new l(t,r)),o=i.get(e);if(o)o.push(u);else{let t=[u];i.set(e,t),e.addEventListener(\"abort\",()=>{for(let e=0;e<t.length;e++)t[e]()},{once:!0})}});return n.catch(c),n}}function c(){}function f(e,t,r){return t.stagedRendering?t.stagedRendering.delayUntilStage(r,void 0,e):new Promise(t=>{setTimeout(()=>{t(e)},0)})}},21818,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"isPostpone\",{enumerable:!0,get:function(){return a}});let n=Symbol.for(\"react.postpone\");function a(e){return\"object\"==typeof e&&null!==e&&e.$$typeof===n}},84350,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={DynamicServerError:function(){return o},isDynamicServerError:function(){return l}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=\"DYNAMIC_SERVER_USAGE\";class o extends Error{constructor(e){super(`Dynamic server usage: ${e}`),this.description=e,this.digest=u}}function l(e){return\"object\"==typeof e&&null!==e&&\"digest\"in e&&\"string\"==typeof e.digest&&e.digest===u}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},90636,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={StaticGenBailoutError:function(){return o},isStaticGenBailoutError:function(){return l}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=\"NEXT_STATIC_GEN_BAILOUT\";class o extends Error{constructor(...e){super(...e),this.code=u}}function l(e){return\"object\"==typeof e&&null!==e&&\"code\"in e&&e.code===u}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},47333,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={METADATA_BOUNDARY_NAME:function(){return u},OUTLET_BOUNDARY_NAME:function(){return l},ROOT_LAYOUT_BOUNDARY_NAME:function(){return i},VIEWPORT_BOUNDARY_NAME:function(){return o}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=\"__next_metadata_boundary__\",o=\"__next_viewport_boundary__\",l=\"__next_outlet_boundary__\",i=\"__next_root_layout_boundary__\"},65502,(e,t,r)=>{\"use strict\";var n=e.i(96171);Object.defineProperty(r,\"__esModule\",{value:!0});var a={atLeastOneTask:function(){return i},scheduleImmediate:function(){return l},scheduleOnNextTick:function(){return o},waitAtLeastOneReactRenderTask:function(){return s}};for(var u in a)Object.defineProperty(r,u,{enumerable:!0,get:a[u]});let o=e=>{Promise.resolve().then(()=>{n.default.nextTick(e)})},l=e=>{setImmediate(e)};function i(){return new Promise(e=>l(e))}function s(){return new Promise(e=>setImmediate(e))}},57119,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n,a,u={Postpone:function(){return j},PreludeState:function(){return J},abortAndThrowOnSynchronousRequestDataAccess:function(){return T},abortOnSynchronousPlatformIOAccess:function(){return O},accessedDynamicData:function(){return U},annotateDynamicAccess:function(){return H},consumeDynamicAccess:function(){return k},createDynamicTrackingState:function(){return v},createDynamicValidationState:function(){return b},createHangingInputAbortSignal:function(){return L},createRenderInBrowserAbortSignal:function(){return F},delayUntilRuntimeStage:function(){return er},formatDynamicAPIAccesses:function(){return I},getFirstDynamicReason:function(){return m},getStaticShellDisallowedDynamicReasons:function(){return et},isDynamicPostpone:function(){return M},isPrerenderInterruptedError:function(){return x},logDisallowedDynamicError:function(){return Z},markCurrentScopeAsDynamic:function(){return R},postponeWithTracking:function(){return w},throwIfDisallowedDynamic:function(){return ee},throwToInterruptStaticGeneration:function(){return E},trackAllowedDynamicAccess:function(){return G},trackDynamicDataInDynamicRender:function(){return P},trackDynamicHoleInRuntimeShell:function(){return Y},trackDynamicHoleInStaticShell:function(){return z},useDynamicRouteParams:function(){return $},useDynamicSearchParams:function(){return B}};for(var o in u)Object.defineProperty(r,o,{enumerable:!0,get:u[o]});let l=(n=e.r(33664))&&n.__esModule?n:{default:n},i=e.r(84350),s=e.r(90636),c=e.r(73187),f=e.r(30946),d=e.r(20176),p=e.r(47333),h=e.r(65502),y=e.r(83025),g=e.r(17421),_=\"function\"==typeof l.default.unstable_postpone;function v(e){return{isDebugDynamicAccesses:e,dynamicAccesses:[],syncDynamicErrorWithStack:null}}function b(){return{hasSuspenseAboveBody:!1,hasDynamicMetadata:!1,dynamicMetadata:null,hasDynamicViewport:!1,hasAllowedDynamic:!1,dynamicErrors:[]}}function m(e){var t;return null==(t=e.dynamicAccesses[0])?void 0:t.expression}function R(e,t,r){if(t)switch(t.type){case\"cache\":case\"unstable-cache\":case\"private-cache\":return}if(!e.forceDynamic&&!e.forceStatic){if(e.dynamicShouldError)throw Object.defineProperty(new s.StaticGenBailoutError(`Route ${e.route} with \\`dynamic = \"error\"\\` couldn't be rendered statically because it used \\`${r}\\`. See more info here: https://nextjs.org/docs/app/building-your-application/rendering/static-and-dynamic#dynamic-rendering`),\"__NEXT_ERROR_CODE\",{value:\"E553\",enumerable:!1,configurable:!0});if(t)switch(t.type){case\"prerender-ppr\":return w(e.route,r,t.dynamicTracking);case\"prerender-legacy\":t.revalidate=0;let n=Object.defineProperty(new i.DynamicServerError(`Route ${e.route} couldn't be rendered statically because it used ${r}. See more info here: https://nextjs.org/docs/messages/dynamic-server-error`),\"__NEXT_ERROR_CODE\",{value:\"E550\",enumerable:!1,configurable:!0});throw e.dynamicUsageDescription=r,e.dynamicUsageStack=n.stack,n}}}function E(e,t,r){let n=Object.defineProperty(new i.DynamicServerError(`Route ${t.route} couldn't be rendered statically because it used \\`${e}\\`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error`),\"__NEXT_ERROR_CODE\",{value:\"E558\",enumerable:!1,configurable:!0});throw r.revalidate=0,t.dynamicUsageDescription=e,t.dynamicUsageStack=n.stack,n}function P(e){switch(e.type){case\"cache\":case\"unstable-cache\":case\"private-cache\":return}}function S(e,t,r){let n=D(`Route ${e} needs to bail out of prerendering at this point because it used ${t}.`);r.controller.abort(n);let a=r.dynamicTracking;a&&a.dynamicAccesses.push({stack:a.isDebugDynamicAccesses?Error().stack:void 0,expression:t})}function O(e,t,r,n){let a=n.dynamicTracking;S(e,t,n),a&&null===a.syncDynamicErrorWithStack&&(a.syncDynamicErrorWithStack=r)}function T(e,t,r,n){if(!1===n.controller.signal.aborted){S(e,t,n);let a=n.dynamicTracking;a&&null===a.syncDynamicErrorWithStack&&(a.syncDynamicErrorWithStack=r)}throw D(`Route ${e} needs to bail out of prerendering at this point because it used ${t}.`)}function j({reason:e,route:t}){let r=c.workUnitAsyncStorage.getStore();w(t,e,r&&\"prerender-ppr\"===r.type?r.dynamicTracking:null)}function w(e,t,r){(function(){if(!_)throw Object.defineProperty(Error(\"Invariant: React.unstable_postpone is not defined. This suggests the wrong version of React was loaded. This is a bug in Next.js\"),\"__NEXT_ERROR_CODE\",{value:\"E224\",enumerable:!1,configurable:!0})})(),r&&r.dynamicAccesses.push({stack:r.isDebugDynamicAccesses?Error().stack:void 0,expression:t}),l.default.unstable_postpone(A(e,t))}function A(e,t){return`Route ${e} needs to bail out of prerendering at this point because it used ${t}. React throws this special object to indicate where. It should not be caught by your own try/catch. Learn more: https://nextjs.org/docs/messages/ppr-caught-error`}function M(e){return\"object\"==typeof e&&null!==e&&\"string\"==typeof e.message&&N(e.message)}function N(e){return e.includes(\"needs to bail out of prerendering at this point because it used\")&&e.includes(\"Learn more: https://nextjs.org/docs/messages/ppr-caught-error\")}if(!1===N(A(\"%%%\",\"^^^\")))throw Object.defineProperty(Error(\"Invariant: isDynamicPostpone misidentified a postpone reason. This is a bug in Next.js\"),\"__NEXT_ERROR_CODE\",{value:\"E296\",enumerable:!1,configurable:!0});let C=\"NEXT_PRERENDER_INTERRUPTED\";function D(e){let t=Object.defineProperty(Error(e),\"__NEXT_ERROR_CODE\",{value:\"E394\",enumerable:!1,configurable:!0});return t.digest=C,t}function x(e){return\"object\"==typeof e&&null!==e&&e.digest===C&&\"name\"in e&&\"message\"in e&&e instanceof Error}function U(e){return e.length>0}function k(e,t){return e.dynamicAccesses.push(...t.dynamicAccesses),e.dynamicAccesses}function I(e){return e.filter(e=>\"string\"==typeof e.stack&&e.stack.length>0).map(({expression:e,stack:t})=>(t=t.split(\"\\n\").slice(4).filter(e=>!(e.includes(\"node_modules/next/\")||e.includes(\" (<anonymous>)\")||e.includes(\" (node:\"))).join(\"\\n\"),`Dynamic API Usage Debug - ${e}:\n${t}`))}function F(){let e=new AbortController;return e.abort(Object.defineProperty(new y.BailoutToCSRError(\"Render in Browser\"),\"__NEXT_ERROR_CODE\",{value:\"E721\",enumerable:!1,configurable:!0})),e.signal}function L(e){switch(e.type){case\"prerender\":case\"prerender-runtime\":let t=new AbortController;if(e.cacheSignal)e.cacheSignal.inputReady().then(()=>{t.abort()});else{let r=(0,c.getRuntimeStagePromise)(e);r?r.then(()=>(0,h.scheduleOnNextTick)(()=>t.abort())):(0,h.scheduleOnNextTick)(()=>t.abort())}return t.signal;case\"prerender-client\":case\"prerender-ppr\":case\"prerender-legacy\":case\"request\":case\"cache\":case\"private-cache\":case\"unstable-cache\":return}}function H(e,t){let r=t.dynamicTracking;r&&r.dynamicAccesses.push({stack:r.isDebugDynamicAccesses?Error().stack:void 0,expression:e})}function $(e){let t=f.workAsyncStorage.getStore(),r=c.workUnitAsyncStorage.getStore();if(t&&r)switch(r.type){case\"prerender-client\":case\"prerender\":{let n=r.fallbackRouteParams;n&&n.size>0&&l.default.use((0,d.makeHangingPromise)(r.renderSignal,t.route,e));break}case\"prerender-ppr\":{let n=r.fallbackRouteParams;if(n&&n.size>0)return w(t.route,e,r.dynamicTracking);break}case\"prerender-runtime\":throw Object.defineProperty(new g.InvariantError(`\\`${e}\\` was called during a runtime prerender. Next.js should be preventing ${e} from being included in server components statically, but did not in this case.`),\"__NEXT_ERROR_CODE\",{value:\"E771\",enumerable:!1,configurable:!0});case\"cache\":case\"private-cache\":throw Object.defineProperty(new g.InvariantError(`\\`${e}\\` was called inside a cache scope. Next.js should be preventing ${e} from being included in server components statically, but did not in this case.`),\"__NEXT_ERROR_CODE\",{value:\"E745\",enumerable:!1,configurable:!0})}}function B(e){let t=f.workAsyncStorage.getStore(),r=c.workUnitAsyncStorage.getStore();if(t)switch(!r&&(0,c.throwForMissingRequestStore)(e),r.type){case\"prerender-client\":l.default.use((0,d.makeHangingPromise)(r.renderSignal,t.route,e));break;case\"prerender-legacy\":case\"prerender-ppr\":if(t.forceStatic)return;throw Object.defineProperty(new y.BailoutToCSRError(e),\"__NEXT_ERROR_CODE\",{value:\"E394\",enumerable:!1,configurable:!0});case\"prerender\":case\"prerender-runtime\":throw Object.defineProperty(new g.InvariantError(`\\`${e}\\` was called from a Server Component. Next.js should be preventing ${e} from being included in server components statically, but did not in this case.`),\"__NEXT_ERROR_CODE\",{value:\"E795\",enumerable:!1,configurable:!0});case\"cache\":case\"unstable-cache\":case\"private-cache\":throw Object.defineProperty(new g.InvariantError(`\\`${e}\\` was called inside a cache scope. Next.js should be preventing ${e} from being included in server components statically, but did not in this case.`),\"__NEXT_ERROR_CODE\",{value:\"E745\",enumerable:!1,configurable:!0});case\"request\":return}}let X=/\\n\\s+at Suspense \\(<anonymous>\\)/,q=RegExp(`\\\\n\\\\s+at Suspense \\\\(<anonymous>\\\\)(?:(?!\\\\n\\\\s+at (?:body|div|main|section|article|aside|header|footer|nav|form|p|span|h1|h2|h3|h4|h5|h6) \\\\(<anonymous>\\\\))[\\\\s\\\\S])*?\\\\n\\\\s+at ${p.ROOT_LAYOUT_BOUNDARY_NAME} \\\\([^\\\\n]*\\\\)`),W=RegExp(`\\\\n\\\\s+at ${p.METADATA_BOUNDARY_NAME}[\\\\n\\\\s]`),K=RegExp(`\\\\n\\\\s+at ${p.VIEWPORT_BOUNDARY_NAME}[\\\\n\\\\s]`),V=RegExp(`\\\\n\\\\s+at ${p.OUTLET_BOUNDARY_NAME}[\\\\n\\\\s]`);function G(e,t,r,n){if(!V.test(t)){if(W.test(t)){r.hasDynamicMetadata=!0;return}if(K.test(t)){r.hasDynamicViewport=!0;return}if(q.test(t)){r.hasAllowedDynamic=!0,r.hasSuspenseAboveBody=!0;return}else if(X.test(t)){r.hasAllowedDynamic=!0;return}else{if(n.syncDynamicErrorWithStack)return void r.dynamicErrors.push(n.syncDynamicErrorWithStack);let a=Q(`Route \"${e.route}\": Uncached data was accessed outside of <Suspense>. This delays the entire page from rendering, resulting in a slow user experience. Learn more: https://nextjs.org/docs/messages/blocking-route`,t);return void r.dynamicErrors.push(a)}}}function Y(e,t,r,n){if(!V.test(t)){if(W.test(t)){r.dynamicMetadata=Q(`Route \"${e.route}\": Uncached data or \\`connection()\\` was accessed inside \\`generateMetadata\\`. Except for this instance, the page would have been entirely prerenderable which may have been the intended behavior. See more info here: https://nextjs.org/docs/messages/next-prerender-dynamic-metadata`,t);return}if(K.test(t)){let n=Q(`Route \"${e.route}\": Uncached data or \\`connection()\\` was accessed inside \\`generateViewport\\`. This delays the entire page from rendering, resulting in a slow user experience. Learn more: https://nextjs.org/docs/messages/next-prerender-dynamic-viewport`,t);r.dynamicErrors.push(n);return}if(q.test(t)){r.hasAllowedDynamic=!0,r.hasSuspenseAboveBody=!0;return}else if(X.test(t)){r.hasAllowedDynamic=!0;return}else{if(n.syncDynamicErrorWithStack)return void r.dynamicErrors.push(n.syncDynamicErrorWithStack);let a=Q(`Route \"${e.route}\": Uncached data or \\`connection()\\` was accessed outside of \\`<Suspense>\\`. This delays the entire page from rendering, resulting in a slow user experience. Learn more: https://nextjs.org/docs/messages/blocking-route`,t);return void r.dynamicErrors.push(a)}}}function z(e,t,r,n){if(!V.test(t)){if(W.test(t)){r.dynamicMetadata=Q(`Route \"${e.route}\": Runtime data such as \\`cookies()\\`, \\`headers()\\`, \\`params\\`, or \\`searchParams\\` was accessed inside \\`generateMetadata\\` or you have file-based metadata such as icons that depend on dynamic params segments. Except for this instance, the page would have been entirely prerenderable which may have been the intended behavior. See more info here: https://nextjs.org/docs/messages/next-prerender-dynamic-metadata`,t);return}if(K.test(t)){let n=Q(`Route \"${e.route}\": Runtime data such as \\`cookies()\\`, \\`headers()\\`, \\`params\\`, or \\`searchParams\\` was accessed inside \\`generateViewport\\`. This delays the entire page from rendering, resulting in a slow user experience. Learn more: https://nextjs.org/docs/messages/next-prerender-dynamic-viewport`,t);r.dynamicErrors.push(n);return}if(q.test(t)){r.hasAllowedDynamic=!0,r.hasSuspenseAboveBody=!0;return}else if(X.test(t)){r.hasAllowedDynamic=!0;return}else{if(n.syncDynamicErrorWithStack)return void r.dynamicErrors.push(n.syncDynamicErrorWithStack);let a=Q(`Route \"${e.route}\": Runtime data such as \\`cookies()\\`, \\`headers()\\`, \\`params\\`, or \\`searchParams\\` was accessed outside of \\`<Suspense>\\`. This delays the entire page from rendering, resulting in a slow user experience. Learn more: https://nextjs.org/docs/messages/blocking-route`,t);return void r.dynamicErrors.push(a)}}}function Q(e,t){let r=Object.defineProperty(Error(e),\"__NEXT_ERROR_CODE\",{value:\"E394\",enumerable:!1,configurable:!0});return r.stack=r.name+\": \"+e+t,r}var J=((a={})[a.Full=0]=\"Full\",a[a.Empty=1]=\"Empty\",a[a.Errored=2]=\"Errored\",a);function Z(e,t){console.error(t),e.dev||(e.hasReadableErrorStacks?console.error(`To get a more detailed stack trace and pinpoint the issue, start the app in development mode by running \\`next dev\\`, then open \"${e.route}\" in your browser to investigate the error.`):console.error(`To get a more detailed stack trace and pinpoint the issue, try one of the following:\n  - Start the app in development mode by running \\`next dev\\`, then open \"${e.route}\" in your browser to investigate the error.\n  - Rerun the production build with \\`next build --debug-prerender\\` to generate better stack traces.`))}function ee(e,t,r,n){if(n.syncDynamicErrorWithStack)throw Z(e,n.syncDynamicErrorWithStack),new s.StaticGenBailoutError;if(0!==t){if(r.hasSuspenseAboveBody)return;let n=r.dynamicErrors;if(n.length>0){for(let t=0;t<n.length;t++)Z(e,n[t]);throw new s.StaticGenBailoutError}if(r.hasDynamicViewport)throw console.error(`Route \"${e.route}\" has a \\`generateViewport\\` that depends on Request data (\\`cookies()\\`, etc...) or uncached external data (\\`fetch(...)\\`, etc...) without explicitly allowing fully dynamic rendering. See more info here: https://nextjs.org/docs/messages/next-prerender-dynamic-viewport`),new s.StaticGenBailoutError;if(1===t)throw console.error(`Route \"${e.route}\" did not produce a static shell and Next.js was unable to determine a reason. This is a bug in Next.js.`),new s.StaticGenBailoutError}else if(!1===r.hasAllowedDynamic&&r.hasDynamicMetadata)throw console.error(`Route \"${e.route}\" has a \\`generateMetadata\\` that depends on Request data (\\`cookies()\\`, etc...) or uncached external data (\\`fetch(...)\\`, etc...) when the rest of the route does not. See more info here: https://nextjs.org/docs/messages/next-prerender-dynamic-metadata`),new s.StaticGenBailoutError}function et(e,t,r){if(r.hasSuspenseAboveBody)return[];if(0!==t){let n=r.dynamicErrors;if(n.length>0)return n;if(1===t)return[Object.defineProperty(new g.InvariantError(`Route \"${e.route}\" did not produce a static shell and Next.js was unable to determine a reason.`),\"__NEXT_ERROR_CODE\",{value:\"E936\",enumerable:!1,configurable:!0})]}else if(!1===r.hasAllowedDynamic&&0===r.dynamicErrors.length&&r.dynamicMetadata)return[r.dynamicMetadata];return[]}function er(e,t){return e.runtimeStagePromise?e.runtimeStagePromise.then(()=>t):t}},51471,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"unstable_rethrow\",{enumerable:!0,get:function(){return function e(t){if((0,o.isNextRouterError)(t)||(0,u.isBailoutToCSRError)(t)||(0,i.isDynamicServerError)(t)||(0,l.isDynamicPostpone)(t)||(0,a.isPostpone)(t)||(0,n.isHangingPromiseRejectionError)(t)||(0,l.isPrerenderInterruptedError)(t))throw t;t instanceof Error&&\"cause\"in t&&e(t.cause)}}});let n=e.r(20176),a=e.r(21818),u=e.r(83025),o=e.r(25626),l=e.r(57119),i=e.r(84350);(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},36308,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"unstable_rethrow\",{enumerable:!0,get:function(){return n}});let n=\"u\"<typeof window?e.r(51471).unstable_rethrow:e.r(27438).unstable_rethrow;(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},94965,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={ReadonlyURLSearchParams:function(){return u.ReadonlyURLSearchParams},RedirectType:function(){return l.RedirectType},forbidden:function(){return s.forbidden},notFound:function(){return i.notFound},permanentRedirect:function(){return o.permanentRedirect},redirect:function(){return o.redirect},unauthorized:function(){return c.unauthorized},unstable_isUnrecognizedActionError:function(){return d},unstable_rethrow:function(){return f.unstable_rethrow}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(87909),o=e.r(62595),l=e.r(58310),i=e.r(2983),s=e.r(50700),c=e.r(25866),f=e.r(36308);function d(){throw Object.defineProperty(Error(\"`unstable_isUnrecognizedActionError` can only be used on the client.\"),\"__NEXT_ERROR_CODE\",{value:\"E776\",enumerable:!1,configurable:!0})}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},2335,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={ReadonlyURLSearchParams:function(){return l.ReadonlyURLSearchParams},RedirectType:function(){return f.RedirectType},ServerInsertedHTMLContext:function(){return s.ServerInsertedHTMLContext},forbidden:function(){return f.forbidden},notFound:function(){return f.notFound},permanentRedirect:function(){return f.permanentRedirect},redirect:function(){return f.redirect},unauthorized:function(){return f.unauthorized},unstable_isUnrecognizedActionError:function(){return c.unstable_isUnrecognizedActionError},unstable_rethrow:function(){return f.unstable_rethrow},useParams:function(){return _},usePathname:function(){return y},useRouter:function(){return g},useSearchParams:function(){return h},useSelectedLayoutSegment:function(){return b},useSelectedLayoutSegments:function(){return v},useServerInsertedHTML:function(){return s.useServerInsertedHTML}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(44066)._(e.r(33664)),o=e.r(7e4),l=e.r(53675),i=e.r(17403),s=e.r(2634),c=e.r(58112),f=e.r(94965),d=\"u\"<typeof window?e.r(57119).useDynamicRouteParams:void 0,p=\"u\"<typeof window?e.r(57119).useDynamicSearchParams:void 0;function h(){p?.(\"useSearchParams()\");let e=(0,u.useContext)(l.SearchParamsContext);return(0,u.useMemo)(()=>e?new l.ReadonlyURLSearchParams(e):null,[e])}function y(){return d?.(\"usePathname()\"),(0,u.useContext)(l.PathnameContext)}function g(){let e=(0,u.useContext)(o.AppRouterContext);if(null===e)throw Object.defineProperty(Error(\"invariant expected app router to be mounted\"),\"__NEXT_ERROR_CODE\",{value:\"E238\",enumerable:!1,configurable:!0});return e}function _(){return d?.(\"useParams()\"),(0,u.useContext)(l.PathParamsContext)}function v(e=\"children\"){d?.(\"useSelectedLayoutSegments()\");let t=(0,u.useContext)(o.LayoutRouterContext);return t?(0,i.getSelectedLayoutSegmentPath)(t.parentTree,e):null}function b(e=\"children\"){d?.(\"useSelectedLayoutSegment()\"),(0,u.useContext)(l.NavigationPromisesContext);let t=v(e);return(0,i.computeSelectedLayoutSegment)(t,e)}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},13409,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={RedirectBoundary:function(){return p},RedirectErrorBoundary:function(){return d}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(44066),o=e.r(964),l=u._(e.r(33664)),i=e.r(2335),s=e.r(62595),c=e.r(58310);function f({redirect:e,reset:t,redirectType:r}){let n=(0,i.useRouter)();return(0,l.useEffect)(()=>{l.default.startTransition(()=>{r===c.RedirectType.push?n.push(e,{}):n.replace(e,{}),t()})},[e,r,t,n]),null}class d extends l.default.Component{constructor(e){super(e),this.state={redirect:null,redirectType:null}}static getDerivedStateFromError(e){if((0,c.isRedirectError)(e)){let t=(0,s.getURLFromRedirectError)(e),r=(0,s.getRedirectTypeFromError)(e);return\"handled\"in e?{redirect:null,redirectType:null}:{redirect:t,redirectType:r}}throw e}render(){let{redirect:e,redirectType:t}=this.state;return null!==e&&null!==t?(0,o.jsx)(f,{redirect:e,redirectType:t,reset:()=>this.setState({redirect:null})}):this.props.children}}function p({children:e}){let t=(0,i.useRouter)();return(0,o.jsx)(d,{router:t,children:e})}(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},81814,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"unresolvedThenable\",{enumerable:!0,get:function(){return n}});let n={then:()=>{}};(\"function\"==typeof r.default||\"object\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\"__esModule\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},45924,(e,t,r)=>{\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var n={MetadataBoundary:function(){return l},OutletBoundary:function(){return s},RootLayoutBoundary:function(){return c},ViewportBoundary:function(){return i}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let u=e.r(47333),o={[u.METADATA_BOUNDARY_NAME]:function({children:e}){return e},[u.VIEWPORT_BOUNDARY_NAME]:function({children:e}){return e},[u.OUTLET_BOUNDARY_NAME]:function({children:e}){return e},[u.ROOT_LAYOUT_BOUNDARY_NAME]:function({children:e}){return e}},l=o[u.METADATA_BOUNDARY_NAME.slice(0)],i=o[u.VIEWPORT_BOUNDARY_NAME.slice(0)],s=o[u.OUTLET_BOUNDARY_NAME.slice(0)],c=o[u.ROOT_LAYOUT_BOUNDARY_NAME.slice(0)]}]);"
  },
  {
    "path": "docs/_next/static/chunks/turbopack-98aeb181aa636c3c.js",
    "content": "(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push([\"object\"==typeof document?document.currentScript:void 0,{otherChunks:[\"static/chunks/12c422bc11762090.js\",\"static/chunks/b4611851359555bd.js\",\"static/chunks/f1a98b44d1dc31f1.js\"],runtimeModuleIds:[39324]}]),(()=>{let e;if(!Array.isArray(globalThis.TURBOPACK))return;let t=\"/_next/\",r=(self.TURBOPACK_CHUNK_SUFFIX??document?.currentScript?.getAttribute?.(\"src\")?.replace(/^(.*(?=\\?)|^.*$)/,\"\"))||\"\",n=new WeakMap;function o(e,t){this.m=e,this.e=t}let l=o.prototype,i=Object.prototype.hasOwnProperty,s=\"u\">typeof Symbol&&Symbol.toStringTag;function u(e,t,r){i.call(e,t)||Object.defineProperty(e,t,r)}function c(e,t){let r=e[t];return r||(r=a(t),e[t]=r),r}function a(e){return{exports:{},error:void 0,id:e,namespaceObject:void 0}}function f(e,t){u(e,\"__esModule\",{value:!0}),s&&u(e,s,{value:\"Module\"});let r=0;for(;r<t.length;){let n=t[r++],o=t[r++];if(\"number\"==typeof o)if(0===o)u(e,n,{value:t[r++],enumerable:!0,writable:!1});else throw Error(`unexpected tag: ${o}`);else\"function\"==typeof t[r]?u(e,n,{get:o,set:t[r++],enumerable:!0}):u(e,n,{get:o,enumerable:!0})}Object.seal(e)}l.s=function(e,t){let r,n;null!=t?n=(r=c(this.c,t)).exports:(r=this.m,n=this.e),r.namespaceObject=n,f(n,e)},l.j=function(e,t){var r,o;let l,s,u;null!=t?s=(l=c(this.c,t)).exports:(l=this.m,s=this.e);let a=(r=l,o=s,(u=n.get(r))||(n.set(r,u=[]),r.exports=r.namespaceObject=new Proxy(o,{get(e,t){if(i.call(e,t)||\"default\"===t||\"__esModule\"===t)return Reflect.get(e,t);for(let e of u){let r=Reflect.get(e,t);if(void 0!==r)return r}},ownKeys(e){let t=Reflect.ownKeys(e);for(let e of u)for(let r of Reflect.ownKeys(e))\"default\"===r||t.includes(r)||t.push(r);return t}})),u);\"object\"==typeof e&&null!==e&&a.push(e)},l.v=function(e,t){(null!=t?c(this.c,t):this.m).exports=e},l.n=function(e,t){let r;(r=null!=t?c(this.c,t):this.m).exports=r.namespaceObject=e};let p=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,h=[null,p({}),p([]),p(p)];function d(e,t,r){let n=[],o=-1;for(let t=e;(\"object\"==typeof t||\"function\"==typeof t)&&!h.includes(t);t=p(t))for(let r of Object.getOwnPropertyNames(t))n.push(r,function(e,t){return()=>e[t]}(e,r)),-1===o&&\"default\"===r&&(o=n.length-1);return r&&o>=0||(o>=0?n.splice(o,1,0,e):n.push(\"default\",0,e)),f(t,n),t}function m(e){let t=B(e,this.m);if(t.namespaceObject)return t.namespaceObject;let r=t.exports;return t.namespaceObject=d(r,\"function\"==typeof r?function(...e){return r.apply(this,e)}:Object.create(null),r&&r.__esModule)}function b(e){let t=e.indexOf(\"#\");-1!==t&&(e=e.substring(0,t));let r=e.indexOf(\"?\");return -1!==r&&(e=e.substring(0,r)),e}function y(){let e,t;return{promise:new Promise((r,n)=>{t=n,e=r}),resolve:e,reject:t}}l.i=m,l.A=function(e){return this.r(e)(m.bind(this))},l.t=\"function\"==typeof require?require:function(){throw Error(\"Unexpected use of runtime require\")},l.r=function(e){return B(e,this.m).exports},l.f=function(e){function t(t){if(t=b(t),i.call(e,t))return e[t].module();let r=Error(`Cannot find module '${t}'`);throw r.code=\"MODULE_NOT_FOUND\",r}return t.keys=()=>Object.keys(e),t.resolve=t=>{if(t=b(t),i.call(e,t))return e[t].id();let r=Error(`Cannot find module '${t}'`);throw r.code=\"MODULE_NOT_FOUND\",r},t.import=async e=>await t(e),t};let O=Symbol(\"turbopack queues\"),g=Symbol(\"turbopack exports\"),w=Symbol(\"turbopack error\");function C(e){e&&1!==e.status&&(e.status=1,e.forEach(e=>e.queueCount--),e.forEach(e=>e.queueCount--?e.queueCount++:e()))}l.a=function(e,t){let r=this.m,n=t?Object.assign([],{status:-1}):void 0,o=new Set,{resolve:l,reject:i,promise:s}=y(),u=Object.assign(s,{[g]:r.exports,[O]:e=>{n&&e(n),o.forEach(e),u.catch(()=>{})}}),c={get:()=>u,set(e){e!==u&&(u[g]=e)}};Object.defineProperty(r,\"exports\",c),Object.defineProperty(r,\"namespaceObject\",c),e(function(e){let t=e.map(e=>{if(null!==e&&\"object\"==typeof e){if(O in e)return e;if(null!=e&&\"object\"==typeof e&&\"then\"in e&&\"function\"==typeof e.then){let t=Object.assign([],{status:0}),r={[g]:{},[O]:e=>e(t)};return e.then(e=>{r[g]=e,C(t)},e=>{r[w]=e,C(t)}),r}}return{[g]:e,[O]:()=>{}}}),r=()=>t.map(e=>{if(e[w])throw e[w];return e[g]}),{promise:l,resolve:i}=y(),s=Object.assign(()=>i(r),{queueCount:0});function u(e){e!==n&&!o.has(e)&&(o.add(e),e&&0===e.status&&(s.queueCount++,e.push(s)))}return t.map(e=>e[O](u)),s.queueCount?l:r()},function(e){e?i(u[w]=e):l(u[g]),C(n)}),n&&-1===n.status&&(n.status=0)};let U=function(e){let t=new URL(e,\"x:/\"),r={};for(let e in t)r[e]=t[e];for(let t in r.href=e,r.pathname=e.replace(/[?#].*/,\"\"),r.origin=r.protocol=\"\",r.toString=r.toJSON=(...t)=>e,r)Object.defineProperty(this,t,{enumerable:!0,configurable:!0,value:r[t]})};function R(e,t){throw Error(`Invariant: ${t(e)}`)}U.prototype=URL.prototype,l.U=U,l.z=function(e){throw Error(\"dynamic usage of require is not supported\")},l.g=globalThis;let j=o.prototype;var _,k=((_=k||{})[_.Runtime=0]=\"Runtime\",_[_.Parent=1]=\"Parent\",_[_.Update=2]=\"Update\",_);let v=new Map;l.M=v;let $=new Map,P=new Map;async function S(e,t,r){let n;if(\"string\"==typeof r)return E(e,t,K(r));let o=r.included||[],l=o.map(e=>!!v.has(e)||$.get(e));if(l.length>0&&l.every(e=>e))return void await Promise.all(l);let i=r.moduleChunks||[],s=i.map(e=>P.get(e)).filter(e=>e);if(s.length>0){if(s.length===i.length)return void await Promise.all(s);let r=new Set;for(let e of i)P.has(e)||r.add(e);for(let n of r){let r=E(e,t,K(n));P.set(n,r),s.push(r)}n=Promise.all(s)}else{for(let o of(n=E(e,t,K(r.path)),i))P.has(o)||P.set(o,n)}for(let e of o)$.has(e)||$.set(e,n);await n}j.l=function(e){return S(1,this.m.id,e)};let T=Promise.resolve(void 0),A=new WeakMap;function E(t,r,n){let o=e.loadChunkCached(t,n),l=A.get(o);if(void 0===l){let e=A.set.bind(A,o,T);l=o.then(e).catch(e=>{let o;switch(t){case 0:o=`as a runtime dependency of chunk ${r}`;break;case 1:o=`from module ${r}`;break;case 2:o=\"from an HMR update\";break;default:R(t,e=>`Unknown source type: ${e}`)}let l=Error(`Failed to load chunk ${n} ${o}${e?`: ${e}`:\"\"}`,e?{cause:e}:void 0);throw l.name=\"ChunkLoadError\",l}),A.set(o,l)}return l}function K(e){return`${t}${e.split(\"/\").map(e=>encodeURIComponent(e)).join(\"/\")}${r}`}j.L=function(e){return E(1,this.m.id,e)},j.R=function(e){let t=this.r(e);return t?.default??t},j.P=function(e){return`/ROOT/${e??\"\"}`},j.b=function(e){let t=new Blob([`self.TURBOPACK_WORKER_LOCATION = ${JSON.stringify(location.origin)};\nself.TURBOPACK_CHUNK_SUFFIX = ${JSON.stringify(r)};\nself.TURBOPACK_NEXT_CHUNK_URLS = ${JSON.stringify(e.reverse().map(K),null,2)};\nimportScripts(...self.TURBOPACK_NEXT_CHUNK_URLS.map(c => self.TURBOPACK_WORKER_LOCATION + c).reverse());`],{type:\"text/javascript\"});return URL.createObjectURL(t)};let x=/\\.js(?:\\?[^#]*)?(?:#.*)?$/,N=/\\.css(?:\\?[^#]*)?(?:#.*)?$/;function M(e){return N.test(e)}l.w=function(t,r,n){return e.loadWebAssembly(1,this.m.id,t,r,n)},l.u=function(t,r){return e.loadWebAssemblyModule(1,this.m.id,t,r)};let L={};l.c=L;let B=(e,t)=>{let r=L[e];if(r){if(r.error)throw r.error;return r}return q(e,k.Parent,t.id)};function q(e,t,r){let n=v.get(e);if(\"function\"!=typeof n)throw Error(function(e,t,r){let n;switch(t){case 0:n=`as a runtime entry of chunk ${r}`;break;case 1:n=`because it was required from module ${r}`;break;case 2:n=\"because of an HMR update\";break;default:R(t,e=>`Unknown source type: ${e}`)}return`Module ${e} was instantiated ${n}, but the module factory is not available.`}(e,t,r));let l=a(e),i=l.exports;L[e]=l;let s=new o(l,i);try{n(s,l,i)}catch(e){throw l.error=e,e}return l.namespaceObject&&l.exports!==l.namespaceObject&&d(l.exports,l.namespaceObject),l}function I(r){let n,o=function(e){if(\"string\"==typeof e)return e;let r=decodeURIComponent((\"u\">typeof TURBOPACK_NEXT_CHUNK_URLS?TURBOPACK_NEXT_CHUNK_URLS.pop():e.getAttribute(\"src\")).replace(/[?#].*$/,\"\"));return r.startsWith(t)?r.slice(t.length):r}(r[0]);return 2===r.length?n=r[1]:(n=void 0,!function(e,t,r,n){let o=1;for(;o<e.length;){let t=e[o],n=o+1;for(;n<e.length&&\"function\"!=typeof e[n];)n++;if(n===e.length)throw Error(\"malformed chunk format, expected a factory function\");if(!r.has(t)){let l=e[n];for(Object.defineProperty(l,\"name\",{value:\"module evaluation\"});o<n;o++)t=e[o],r.set(t,l)}o=n+1}}(r,0,v)),e.registerChunk(o,n)}let W=new Map;function H(e){let t=W.get(e);if(!t){let r,n;t={resolved:!1,loadingStarted:!1,promise:new Promise((e,t)=>{r=e,n=t}),resolve:()=>{t.resolved=!0,r()},reject:n},W.set(e,t)}return t}e={async registerChunk(e,t){if(H(K(e)).resolve(),null!=t){for(let e of t.otherChunks)H(K(\"string\"==typeof e?e:e.path));if(await Promise.all(t.otherChunks.map(t=>S(0,e,t))),t.runtimeModuleIds.length>0)for(let r of t.runtimeModuleIds)!function(e,t){let r=L[t];if(r){if(r.error)throw r.error;return}q(t,k.Runtime,e)}(e,r)}},loadChunkCached:(e,t)=>(function(e,t){let r=H(t);if(r.loadingStarted)return r.promise;if(e===k.Runtime)return r.loadingStarted=!0,M(t)&&r.resolve(),r.promise;if(\"function\"==typeof importScripts)if(M(t));else if(x.test(t))self.TURBOPACK_NEXT_CHUNK_URLS.push(t),importScripts(TURBOPACK_WORKER_LOCATION+t);else throw Error(`can't infer type of chunk from URL ${t} in worker`);else{let e=decodeURI(t);if(M(t))if(document.querySelectorAll(`link[rel=stylesheet][href=\"${t}\"],link[rel=stylesheet][href^=\"${t}?\"],link[rel=stylesheet][href=\"${e}\"],link[rel=stylesheet][href^=\"${e}?\"]`).length>0)r.resolve();else{let e=document.createElement(\"link\");e.rel=\"stylesheet\",e.href=t,e.onerror=()=>{r.reject()},e.onload=()=>{r.resolve()},document.head.appendChild(e)}else if(x.test(t)){let n=document.querySelectorAll(`script[src=\"${t}\"],script[src^=\"${t}?\"],script[src=\"${e}\"],script[src^=\"${e}?\"]`);if(n.length>0)for(let e of Array.from(n))e.addEventListener(\"error\",()=>{r.reject()});else{let e=document.createElement(\"script\");e.src=t,e.onerror=()=>{r.reject()},document.head.appendChild(e)}}else throw Error(`can't infer type of chunk from URL ${t}`)}return r.loadingStarted=!0,r.promise})(e,t),async loadWebAssembly(e,t,r,n,o){let l=fetch(K(r)),{instance:i}=await WebAssembly.instantiateStreaming(l,o);return i.exports},async loadWebAssemblyModule(e,t,r,n){let o=fetch(K(r));return await WebAssembly.compileStreaming(o)}};let F=globalThis.TURBOPACK;globalThis.TURBOPACK={push:I},F.forEach(I)})();"
  },
  {
    "path": "docs/_not-found/__next._full.txt",
    "content": "1:\"$Sreact.fragment\"\n3:I[96923,[\"/_next/static/chunks/19717b1d18b1c046.js\"],\"Providers\"]\n4:I[33720,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"default\"]\n5:I[16458,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"default\"]\n6:I[13154,[\"/_next/static/chunks/19717b1d18b1c046.js\"],\"\"]\nb:I[70566,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"default\"]\n:HL[\"/_next/static/chunks/543732a8392562b4.css\",\"style\"]\n2:[\"$\",\"style\",null,{\"children\":\"html.js .reveal{opacity:1!important;transform:none!important;filter:none!important}\"}]\n0:{\"P\":null,\"b\":\"4xlWUdmYkOQZmVpTO2yEI\",\"c\":[\"\",\"_not-found\",\"\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/543732a8392562b4.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/19717b1d18b1c046.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"js\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"script\",null,{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@graph\\\":[{\\\"@type\\\":\\\"WebSite\\\",\\\"@id\\\":\\\"https://mos.caldis.me/#website\\\",\\\"url\\\":\\\"https://mos.caldis.me/\\\",\\\"name\\\":\\\"Mos\\\",\\\"description\\\":\\\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\\\",\\\"inLanguage\\\":\\\"en\\\"},{\\\"@type\\\":\\\"SoftwareApplication\\\",\\\"@id\\\":\\\"https://mos.caldis.me/#software\\\",\\\"name\\\":\\\"Mos\\\",\\\"url\\\":\\\"https://mos.caldis.me/\\\",\\\"operatingSystem\\\":\\\"macOS\\\",\\\"applicationCategory\\\":\\\"UtilitiesApplication\\\",\\\"description\\\":\\\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\\\",\\\"downloadUrl\\\":\\\"https://github.com/Caldis/Mos/releases/latest\\\",\\\"softwareHelp\\\":\\\"https://github.com/Caldis/Mos/wiki\\\",\\\"sameAs\\\":[\\\"https://github.com/Caldis/Mos\\\"],\\\"license\\\":\\\"https://creativecommons.org/licenses/by-nc/4.0/\\\",\\\"offers\\\":{\\\"@type\\\":\\\"Offer\\\",\\\"price\\\":\\\"0\\\",\\\"priceCurrency\\\":\\\"USD\\\"}}]}\"}}],[\"$\",\"noscript\",null,{\"children\":\"$2\"}]]}],[\"$\",\"body\",null,{\"className\":\"syne_d93b7706-module__Y_KGdq__variable space_grotesk_8677877b-module__OT3qGa__variable ibm_plex_mono_e0f5f7ea-module__w-hdTq__variable antialiased\",\"children\":[[\"$\",\"$L3\",null,{\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}],[\"$\",\"$L6\",null,{\"src\":\"https://www.googletagmanager.com/gtag/js?id=G-9M7WPLB8BR\",\"strategy\":\"afterInteractive\"}],[\"$\",\"$L6\",null,{\"id\":\"ga4\",\"strategy\":\"afterInteractive\",\"children\":\"\\n            window.dataLayer = window.dataLayer || [];\\n            function gtag(){dataLayer.push(arguments);}\\n            gtag('js', new Date());\\n            gtag('config', 'G-9M7WPLB8BR');\\n          \"}]]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:0:props:children:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],\"$L7\",\"$L8\"]}]}]],null,\"$L9\"]}],{},null,false,false]},null,false,false]},null,false,false],\"$La\",false]],\"m\":\"$undefined\",\"G\":[\"$b\",\"$undefined\"],\"S\":true}\nc:I[45924,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"OutletBoundary\"]\nd:\"$Sreact.suspense\"\nf:I[45924,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"ViewportBoundary\"]\n11:I[45924,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"MetadataBoundary\"]\n7:[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:0:props:children:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}]\n8:[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:0:props:children:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:0:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]\n9:[\"$\",\"$Lc\",null,{\"children\":[\"$\",\"$d\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@e\"}]}]\na:[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$Lf\",null,{\"children\":\"$L10\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L11\",null,{\"children\":[\"$\",\"$d\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L12\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}]\n10:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n13:I[46886,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"IconMark\"]\ne:null\n12:[[\"$\",\"link\",\"0\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.6def09c8.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$L13\",\"1\",{}]]\n"
  },
  {
    "path": "docs/_not-found/__next._head.txt",
    "content": "1:\"$Sreact.fragment\"\n2:I[45924,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"ViewportBoundary\"]\n3:I[45924,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"MetadataBoundary\"]\n4:\"$Sreact.suspense\"\n5:I[46886,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"IconMark\"]\n0:{\"buildId\":\"4xlWUdmYkOQZmVpTO2yEI\",\"rsc\":[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L2\",null,{\"children\":[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L3\",null,{\"children\":[\"$\",\"$4\",null,{\"name\":\"Next.Metadata\",\"children\":[[\"$\",\"link\",\"0\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.6def09c8.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$L5\",\"1\",{}]]}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],\"loading\":null,\"isPartial\":false}\n"
  },
  {
    "path": "docs/_not-found/__next._index.txt",
    "content": "1:\"$Sreact.fragment\"\n3:I[96923,[\"/_next/static/chunks/19717b1d18b1c046.js\"],\"Providers\"]\n4:I[33720,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"default\"]\n5:I[16458,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"default\"]\n6:I[13154,[\"/_next/static/chunks/19717b1d18b1c046.js\"],\"\"]\n:HL[\"/_next/static/chunks/543732a8392562b4.css\",\"style\"]\n2:[\"$\",\"style\",null,{\"children\":\"html.js .reveal{opacity:1!important;transform:none!important;filter:none!important}\"}]\n0:{\"buildId\":\"4xlWUdmYkOQZmVpTO2yEI\",\"rsc\":[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/543732a8392562b4.css\",\"precedence\":\"next\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/19717b1d18b1c046.js\",\"async\":true}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"js\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"script\",null,{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@graph\\\":[{\\\"@type\\\":\\\"WebSite\\\",\\\"@id\\\":\\\"https://mos.caldis.me/#website\\\",\\\"url\\\":\\\"https://mos.caldis.me/\\\",\\\"name\\\":\\\"Mos\\\",\\\"description\\\":\\\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\\\",\\\"inLanguage\\\":\\\"en\\\"},{\\\"@type\\\":\\\"SoftwareApplication\\\",\\\"@id\\\":\\\"https://mos.caldis.me/#software\\\",\\\"name\\\":\\\"Mos\\\",\\\"url\\\":\\\"https://mos.caldis.me/\\\",\\\"operatingSystem\\\":\\\"macOS\\\",\\\"applicationCategory\\\":\\\"UtilitiesApplication\\\",\\\"description\\\":\\\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\\\",\\\"downloadUrl\\\":\\\"https://github.com/Caldis/Mos/releases/latest\\\",\\\"softwareHelp\\\":\\\"https://github.com/Caldis/Mos/wiki\\\",\\\"sameAs\\\":[\\\"https://github.com/Caldis/Mos\\\"],\\\"license\\\":\\\"https://creativecommons.org/licenses/by-nc/4.0/\\\",\\\"offers\\\":{\\\"@type\\\":\\\"Offer\\\",\\\"price\\\":\\\"0\\\",\\\"priceCurrency\\\":\\\"USD\\\"}}]}\"}}],[\"$\",\"noscript\",null,{\"children\":\"$2\"}]]}],[\"$\",\"body\",null,{\"className\":\"syne_d93b7706-module__Y_KGdq__variable space_grotesk_8677877b-module__OT3qGa__variable ibm_plex_mono_e0f5f7ea-module__w-hdTq__variable antialiased\",\"children\":[[\"$\",\"$L3\",null,{\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"template\":[\"$\",\"$L5\",null,{}],\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]]}]}],[\"$\",\"$L6\",null,{\"src\":\"https://www.googletagmanager.com/gtag/js?id=G-9M7WPLB8BR\",\"strategy\":\"afterInteractive\"}],[\"$\",\"$L6\",null,{\"id\":\"ga4\",\"strategy\":\"afterInteractive\",\"children\":\"\\n            window.dataLayer = window.dataLayer || [];\\n            function gtag(){dataLayer.push(arguments);}\\n            gtag('js', new Date());\\n            gtag('config', 'G-9M7WPLB8BR');\\n          \"}]]}]]}]]}],\"loading\":null,\"isPartial\":false}\n"
  },
  {
    "path": "docs/_not-found/__next._not-found.__PAGE__.txt",
    "content": "1:\"$Sreact.fragment\"\n2:I[45924,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"OutletBoundary\"]\n3:\"$Sreact.suspense\"\n0:{\"buildId\":\"4xlWUdmYkOQZmVpTO2yEI\",\"rsc\":[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$3\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@4\"}]}]]}],\"loading\":null,\"isPartial\":false}\n4:null\n"
  },
  {
    "path": "docs/_not-found/__next._not-found.txt",
    "content": "1:\"$Sreact.fragment\"\n2:I[33720,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"default\"]\n3:I[16458,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"default\"]\n0:{\"buildId\":\"4xlWUdmYkOQZmVpTO2yEI\",\"rsc\":[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"template\":[\"$\",\"$L3\",null,{}]}]]}],\"loading\":null,\"isPartial\":false}\n"
  },
  {
    "path": "docs/_not-found/__next._tree.txt",
    "content": ":HL[\"/_next/static/chunks/543732a8392562b4.css\",\"style\"]\n0:{\"buildId\":\"4xlWUdmYkOQZmVpTO2yEI\",\"tree\":{\"name\":\"\",\"paramType\":null,\"paramKey\":\"\",\"hasRuntimePrefetch\":false,\"slots\":{\"children\":{\"name\":\"/_not-found\",\"paramType\":null,\"paramKey\":\"/_not-found\",\"hasRuntimePrefetch\":false,\"slots\":{\"children\":{\"name\":\"__PAGE__\",\"paramType\":null,\"paramKey\":\"__PAGE__\",\"hasRuntimePrefetch\":false,\"slots\":null,\"isRootLayout\":false}},\"isRootLayout\":false}},\"isRootLayout\":true},\"staleTime\":300}\n"
  },
  {
    "path": "docs/_not-found/index.html",
    "content": "<!DOCTYPE html><!--4xlWUdmYkOQZmVpTO2yEI--><html lang=\"en\" class=\"js\"><head><meta charSet=\"utf-8\"/><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/><link rel=\"stylesheet\" href=\"/_next/static/chunks/543732a8392562b4.css\" data-precedence=\"next\"/><link rel=\"preload\" as=\"script\" fetchPriority=\"low\" href=\"/_next/static/chunks/12c422bc11762090.js\"/><script src=\"/_next/static/chunks/b4611851359555bd.js\" async=\"\"></script><script src=\"/_next/static/chunks/f1a98b44d1dc31f1.js\" async=\"\"></script><script src=\"/_next/static/chunks/turbopack-98aeb181aa636c3c.js\" async=\"\"></script><script src=\"/_next/static/chunks/19717b1d18b1c046.js\" async=\"\"></script><script src=\"/_next/static/chunks/c62ecb7f1a587007.js\" async=\"\"></script><script src=\"/_next/static/chunks/2f0565a65fa02d97.js\" async=\"\"></script><link rel=\"preload\" href=\"https://www.googletagmanager.com/gtag/js?id=G-9M7WPLB8BR\" as=\"script\"/><title>404: This page could not be found.</title><meta name=\"robots\" content=\"noindex\"/><meta name=\"next-size-adjust\" content=\"\"/><link rel=\"icon\" href=\"/favicon.ico?favicon.6def09c8.ico\" sizes=\"256x256\" type=\"image/x-icon\"/><script type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https://mos.caldis.me/#website\",\"url\":\"https://mos.caldis.me/\",\"name\":\"Mos\",\"description\":\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\",\"inLanguage\":\"en\"},{\"@type\":\"SoftwareApplication\",\"@id\":\"https://mos.caldis.me/#software\",\"name\":\"Mos\",\"url\":\"https://mos.caldis.me/\",\"operatingSystem\":\"macOS\",\"applicationCategory\":\"UtilitiesApplication\",\"description\":\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\",\"downloadUrl\":\"https://github.com/Caldis/Mos/releases/latest\",\"softwareHelp\":\"https://github.com/Caldis/Mos/wiki\",\"sameAs\":[\"https://github.com/Caldis/Mos\"],\"license\":\"https://creativecommons.org/licenses/by-nc/4.0/\",\"offers\":{\"@type\":\"Offer\",\"price\":\"0\",\"priceCurrency\":\"USD\"}}]}</script><noscript><style>html.js .reveal{opacity:1!important;transform:none!important;filter:none!important}</style></noscript><script src=\"/_next/static/chunks/a6dad97d9634a72d.js\" noModule=\"\"></script></head><body class=\"syne_d93b7706-module__Y_KGdq__variable space_grotesk_8677877b-module__OT3qGa__variable ibm_plex_mono_e0f5f7ea-module__w-hdTq__variable antialiased\"><div hidden=\"\"><!--$--><!--/$--></div><div style=\"font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center\"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class=\"next-error-h1\" style=\"display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px\">404</h1><div style=\"display:inline-block\"><h2 style=\"font-size:14px;font-weight:400;line-height:49px;margin:0\">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src=\"/_next/static/chunks/12c422bc11762090.js\" id=\"_R_\" async=\"\"></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,\"1:\\\"$Sreact.fragment\\\"\\n3:I[96923,[\\\"/_next/static/chunks/19717b1d18b1c046.js\\\"],\\\"Providers\\\"]\\n4:I[33720,[\\\"/_next/static/chunks/c62ecb7f1a587007.js\\\",\\\"/_next/static/chunks/2f0565a65fa02d97.js\\\"],\\\"default\\\"]\\n5:I[16458,[\\\"/_next/static/chunks/c62ecb7f1a587007.js\\\",\\\"/_next/static/chunks/2f0565a65fa02d97.js\\\"],\\\"default\\\"]\\n6:I[13154,[\\\"/_next/static/chunks/19717b1d18b1c046.js\\\"],\\\"\\\"]\\nb:I[70566,[\\\"/_next/static/chunks/c62ecb7f1a587007.js\\\",\\\"/_next/static/chunks/2f0565a65fa02d97.js\\\"],\\\"default\\\"]\\n:HL[\\\"/_next/static/chunks/543732a8392562b4.css\\\",\\\"style\\\"]\\n2:[\\\"$\\\",\\\"style\\\",null,{\\\"children\\\":\\\"html.js .reveal{opacity:1!important;transform:none!important;filter:none!important}\\\"}]\\n\"])</script><script>self.__next_f.push([1,\"0:{\\\"P\\\":null,\\\"b\\\":\\\"4xlWUdmYkOQZmVpTO2yEI\\\",\\\"c\\\":[\\\"\\\",\\\"_not-found\\\",\\\"\\\"],\\\"q\\\":\\\"\\\",\\\"i\\\":false,\\\"f\\\":[[[\\\"\\\",{\\\"children\\\":[\\\"/_not-found\\\",{\\\"children\\\":[\\\"__PAGE__\\\",{}]}]},\\\"$undefined\\\",\\\"$undefined\\\",true],[[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[[[\\\"$\\\",\\\"link\\\",\\\"0\\\",{\\\"rel\\\":\\\"stylesheet\\\",\\\"href\\\":\\\"/_next/static/chunks/543732a8392562b4.css\\\",\\\"precedence\\\":\\\"next\\\",\\\"crossOrigin\\\":\\\"$undefined\\\",\\\"nonce\\\":\\\"$undefined\\\"}],[\\\"$\\\",\\\"script\\\",\\\"script-0\\\",{\\\"src\\\":\\\"/_next/static/chunks/19717b1d18b1c046.js\\\",\\\"async\\\":true,\\\"nonce\\\":\\\"$undefined\\\"}]],[\\\"$\\\",\\\"html\\\",null,{\\\"lang\\\":\\\"en\\\",\\\"className\\\":\\\"js\\\",\\\"children\\\":[[\\\"$\\\",\\\"head\\\",null,{\\\"children\\\":[[\\\"$\\\",\\\"script\\\",null,{\\\"type\\\":\\\"application/ld+json\\\",\\\"dangerouslySetInnerHTML\\\":{\\\"__html\\\":\\\"{\\\\\\\"@context\\\\\\\":\\\\\\\"https://schema.org\\\\\\\",\\\\\\\"@graph\\\\\\\":[{\\\\\\\"@type\\\\\\\":\\\\\\\"WebSite\\\\\\\",\\\\\\\"@id\\\\\\\":\\\\\\\"https://mos.caldis.me/#website\\\\\\\",\\\\\\\"url\\\\\\\":\\\\\\\"https://mos.caldis.me/\\\\\\\",\\\\\\\"name\\\\\\\":\\\\\\\"Mos\\\\\\\",\\\\\\\"description\\\\\\\":\\\\\\\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\\\\\\\",\\\\\\\"inLanguage\\\\\\\":\\\\\\\"en\\\\\\\"},{\\\\\\\"@type\\\\\\\":\\\\\\\"SoftwareApplication\\\\\\\",\\\\\\\"@id\\\\\\\":\\\\\\\"https://mos.caldis.me/#software\\\\\\\",\\\\\\\"name\\\\\\\":\\\\\\\"Mos\\\\\\\",\\\\\\\"url\\\\\\\":\\\\\\\"https://mos.caldis.me/\\\\\\\",\\\\\\\"operatingSystem\\\\\\\":\\\\\\\"macOS\\\\\\\",\\\\\\\"applicationCategory\\\\\\\":\\\\\\\"UtilitiesApplication\\\\\\\",\\\\\\\"description\\\\\\\":\\\\\\\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\\\\\\\",\\\\\\\"downloadUrl\\\\\\\":\\\\\\\"https://github.com/Caldis/Mos/releases/latest\\\\\\\",\\\\\\\"softwareHelp\\\\\\\":\\\\\\\"https://github.com/Caldis/Mos/wiki\\\\\\\",\\\\\\\"sameAs\\\\\\\":[\\\\\\\"https://github.com/Caldis/Mos\\\\\\\"],\\\\\\\"license\\\\\\\":\\\\\\\"https://creativecommons.org/licenses/by-nc/4.0/\\\\\\\",\\\\\\\"offers\\\\\\\":{\\\\\\\"@type\\\\\\\":\\\\\\\"Offer\\\\\\\",\\\\\\\"price\\\\\\\":\\\\\\\"0\\\\\\\",\\\\\\\"priceCurrency\\\\\\\":\\\\\\\"USD\\\\\\\"}}]}\\\"}}],[\\\"$\\\",\\\"noscript\\\",null,{\\\"children\\\":\\\"$2\\\"}]]}],[\\\"$\\\",\\\"body\\\",null,{\\\"className\\\":\\\"syne_d93b7706-module__Y_KGdq__variable space_grotesk_8677877b-module__OT3qGa__variable ibm_plex_mono_e0f5f7ea-module__w-hdTq__variable antialiased\\\",\\\"children\\\":[[\\\"$\\\",\\\"$L3\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"$L4\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L5\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"notFound\\\":[[[\\\"$\\\",\\\"title\\\",null,{\\\"children\\\":\\\"404: This page could not be found.\\\"}],[\\\"$\\\",\\\"div\\\",null,{\\\"style\\\":{\\\"fontFamily\\\":\\\"system-ui,\\\\\\\"Segoe UI\\\\\\\",Roboto,Helvetica,Arial,sans-serif,\\\\\\\"Apple Color Emoji\\\\\\\",\\\\\\\"Segoe UI Emoji\\\\\\\"\\\",\\\"height\\\":\\\"100vh\\\",\\\"textAlign\\\":\\\"center\\\",\\\"display\\\":\\\"flex\\\",\\\"flexDirection\\\":\\\"column\\\",\\\"alignItems\\\":\\\"center\\\",\\\"justifyContent\\\":\\\"center\\\"},\\\"children\\\":[\\\"$\\\",\\\"div\\\",null,{\\\"children\\\":[[\\\"$\\\",\\\"style\\\",null,{\\\"dangerouslySetInnerHTML\\\":{\\\"__html\\\":\\\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\\\"}}],[\\\"$\\\",\\\"h1\\\",null,{\\\"className\\\":\\\"next-error-h1\\\",\\\"style\\\":{\\\"display\\\":\\\"inline-block\\\",\\\"margin\\\":\\\"0 20px 0 0\\\",\\\"padding\\\":\\\"0 23px 0 0\\\",\\\"fontSize\\\":24,\\\"fontWeight\\\":500,\\\"verticalAlign\\\":\\\"top\\\",\\\"lineHeight\\\":\\\"49px\\\"},\\\"children\\\":404}],[\\\"$\\\",\\\"div\\\",null,{\\\"style\\\":{\\\"display\\\":\\\"inline-block\\\"},\\\"children\\\":[\\\"$\\\",\\\"h2\\\",null,{\\\"style\\\":{\\\"fontSize\\\":14,\\\"fontWeight\\\":400,\\\"lineHeight\\\":\\\"49px\\\",\\\"margin\\\":0},\\\"children\\\":\\\"This page could not be found.\\\"}]}]]}]}]],[]],\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]}],[\\\"$\\\",\\\"$L6\\\",null,{\\\"src\\\":\\\"https://www.googletagmanager.com/gtag/js?id=G-9M7WPLB8BR\\\",\\\"strategy\\\":\\\"afterInteractive\\\"}],[\\\"$\\\",\\\"$L6\\\",null,{\\\"id\\\":\\\"ga4\\\",\\\"strategy\\\":\\\"afterInteractive\\\",\\\"children\\\":\\\"\\\\n            window.dataLayer = window.dataLayer || [];\\\\n            function gtag(){dataLayer.push(arguments);}\\\\n            gtag('js', new Date());\\\\n            gtag('config', 'G-9M7WPLB8BR');\\\\n          \\\"}]]}]]}]]}],{\\\"children\\\":[[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"$L4\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L5\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]]}],{\\\"children\\\":[[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[[[\\\"$\\\",\\\"title\\\",null,{\\\"children\\\":\\\"404: This page could not be found.\\\"}],[\\\"$\\\",\\\"div\\\",null,{\\\"style\\\":\\\"$0:f:0:1:0:props:children:1:props:children:1:props:children:0:props:children:props:notFound:0:1:props:style\\\",\\\"children\\\":[\\\"$\\\",\\\"div\\\",null,{\\\"children\\\":[[\\\"$\\\",\\\"style\\\",null,{\\\"dangerouslySetInnerHTML\\\":{\\\"__html\\\":\\\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\\\"}}],\\\"$L7\\\",\\\"$L8\\\"]}]}]],null,\\\"$L9\\\"]}],{},null,false,false]},null,false,false]},null,false,false],\\\"$La\\\",false]],\\\"m\\\":\\\"$undefined\\\",\\\"G\\\":[\\\"$b\\\",\\\"$undefined\\\"],\\\"S\\\":true}\\n\"])</script><script>self.__next_f.push([1,\"c:I[45924,[\\\"/_next/static/chunks/c62ecb7f1a587007.js\\\",\\\"/_next/static/chunks/2f0565a65fa02d97.js\\\"],\\\"OutletBoundary\\\"]\\nd:\\\"$Sreact.suspense\\\"\\nf:I[45924,[\\\"/_next/static/chunks/c62ecb7f1a587007.js\\\",\\\"/_next/static/chunks/2f0565a65fa02d97.js\\\"],\\\"ViewportBoundary\\\"]\\n11:I[45924,[\\\"/_next/static/chunks/c62ecb7f1a587007.js\\\",\\\"/_next/static/chunks/2f0565a65fa02d97.js\\\"],\\\"MetadataBoundary\\\"]\\n7:[\\\"$\\\",\\\"h1\\\",null,{\\\"className\\\":\\\"next-error-h1\\\",\\\"style\\\":\\\"$0:f:0:1:0:props:children:1:props:children:1:props:children:0:props:children:props:notFound:0:1:props:children:props:children:1:props:style\\\",\\\"children\\\":404}]\\n8:[\\\"$\\\",\\\"div\\\",null,{\\\"style\\\":\\\"$0:f:0:1:0:props:children:1:props:children:1:props:children:0:props:children:props:notFound:0:1:props:children:props:children:2:props:style\\\",\\\"children\\\":[\\\"$\\\",\\\"h2\\\",null,{\\\"style\\\":\\\"$0:f:0:1:0:props:children:1:props:children:1:props:children:0:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\\\",\\\"children\\\":\\\"This page could not be found.\\\"}]}]\\n9:[\\\"$\\\",\\\"$Lc\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"$d\\\",null,{\\\"name\\\":\\\"Next.MetadataOutlet\\\",\\\"children\\\":\\\"$@e\\\"}]}]\\na:[\\\"$\\\",\\\"$1\\\",\\\"h\\\",{\\\"children\\\":[[\\\"$\\\",\\\"meta\\\",null,{\\\"name\\\":\\\"robots\\\",\\\"content\\\":\\\"noindex\\\"}],[\\\"$\\\",\\\"$Lf\\\",null,{\\\"children\\\":\\\"$L10\\\"}],[\\\"$\\\",\\\"div\\\",null,{\\\"hidden\\\":true,\\\"children\\\":[\\\"$\\\",\\\"$L11\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"$d\\\",null,{\\\"name\\\":\\\"Next.Metadata\\\",\\\"children\\\":\\\"$L12\\\"}]}]}],[\\\"$\\\",\\\"meta\\\",null,{\\\"name\\\":\\\"next-size-adjust\\\",\\\"content\\\":\\\"\\\"}]]}]\\n\"])</script><script>self.__next_f.push([1,\"10:[[\\\"$\\\",\\\"meta\\\",\\\"0\\\",{\\\"charSet\\\":\\\"utf-8\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"1\\\",{\\\"name\\\":\\\"viewport\\\",\\\"content\\\":\\\"width=device-width, initial-scale=1\\\"}]]\\n\"])</script><script>self.__next_f.push([1,\"13:I[46886,[\\\"/_next/static/chunks/c62ecb7f1a587007.js\\\",\\\"/_next/static/chunks/2f0565a65fa02d97.js\\\"],\\\"IconMark\\\"]\\ne:null\\n12:[[\\\"$\\\",\\\"link\\\",\\\"0\\\",{\\\"rel\\\":\\\"icon\\\",\\\"href\\\":\\\"/favicon.ico?favicon.6def09c8.ico\\\",\\\"sizes\\\":\\\"256x256\\\",\\\"type\\\":\\\"image/x-icon\\\"}],[\\\"$\\\",\\\"$L13\\\",\\\"1\\\",{}]]\\n\"])</script></body></html>"
  },
  {
    "path": "docs/_not-found/index.txt",
    "content": "1:\"$Sreact.fragment\"\n3:I[96923,[\"/_next/static/chunks/19717b1d18b1c046.js\"],\"Providers\"]\n4:I[33720,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"default\"]\n5:I[16458,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"default\"]\n6:I[13154,[\"/_next/static/chunks/19717b1d18b1c046.js\"],\"\"]\nb:I[70566,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"default\"]\n:HL[\"/_next/static/chunks/543732a8392562b4.css\",\"style\"]\n2:[\"$\",\"style\",null,{\"children\":\"html.js .reveal{opacity:1!important;transform:none!important;filter:none!important}\"}]\n0:{\"P\":null,\"b\":\"4xlWUdmYkOQZmVpTO2yEI\",\"c\":[\"\",\"_not-found\",\"\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/543732a8392562b4.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/19717b1d18b1c046.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"js\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"script\",null,{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@graph\\\":[{\\\"@type\\\":\\\"WebSite\\\",\\\"@id\\\":\\\"https://mos.caldis.me/#website\\\",\\\"url\\\":\\\"https://mos.caldis.me/\\\",\\\"name\\\":\\\"Mos\\\",\\\"description\\\":\\\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\\\",\\\"inLanguage\\\":\\\"en\\\"},{\\\"@type\\\":\\\"SoftwareApplication\\\",\\\"@id\\\":\\\"https://mos.caldis.me/#software\\\",\\\"name\\\":\\\"Mos\\\",\\\"url\\\":\\\"https://mos.caldis.me/\\\",\\\"operatingSystem\\\":\\\"macOS\\\",\\\"applicationCategory\\\":\\\"UtilitiesApplication\\\",\\\"description\\\":\\\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\\\",\\\"downloadUrl\\\":\\\"https://github.com/Caldis/Mos/releases/latest\\\",\\\"softwareHelp\\\":\\\"https://github.com/Caldis/Mos/wiki\\\",\\\"sameAs\\\":[\\\"https://github.com/Caldis/Mos\\\"],\\\"license\\\":\\\"https://creativecommons.org/licenses/by-nc/4.0/\\\",\\\"offers\\\":{\\\"@type\\\":\\\"Offer\\\",\\\"price\\\":\\\"0\\\",\\\"priceCurrency\\\":\\\"USD\\\"}}]}\"}}],[\"$\",\"noscript\",null,{\"children\":\"$2\"}]]}],[\"$\",\"body\",null,{\"className\":\"syne_d93b7706-module__Y_KGdq__variable space_grotesk_8677877b-module__OT3qGa__variable ibm_plex_mono_e0f5f7ea-module__w-hdTq__variable antialiased\",\"children\":[[\"$\",\"$L3\",null,{\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}],[\"$\",\"$L6\",null,{\"src\":\"https://www.googletagmanager.com/gtag/js?id=G-9M7WPLB8BR\",\"strategy\":\"afterInteractive\"}],[\"$\",\"$L6\",null,{\"id\":\"ga4\",\"strategy\":\"afterInteractive\",\"children\":\"\\n            window.dataLayer = window.dataLayer || [];\\n            function gtag(){dataLayer.push(arguments);}\\n            gtag('js', new Date());\\n            gtag('config', 'G-9M7WPLB8BR');\\n          \"}]]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:0:props:children:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],\"$L7\",\"$L8\"]}]}]],null,\"$L9\"]}],{},null,false,false]},null,false,false]},null,false,false],\"$La\",false]],\"m\":\"$undefined\",\"G\":[\"$b\",\"$undefined\"],\"S\":true}\nc:I[45924,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"OutletBoundary\"]\nd:\"$Sreact.suspense\"\nf:I[45924,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"ViewportBoundary\"]\n11:I[45924,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"MetadataBoundary\"]\n7:[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:0:props:children:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}]\n8:[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:0:props:children:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:0:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]\n9:[\"$\",\"$Lc\",null,{\"children\":[\"$\",\"$d\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@e\"}]}]\na:[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$Lf\",null,{\"children\":\"$L10\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L11\",null,{\"children\":[\"$\",\"$d\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L12\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}]\n10:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n13:I[46886,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"IconMark\"]\ne:null\n12:[[\"$\",\"link\",\"0\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.6def09c8.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$L13\",\"1\",{}]]\n"
  },
  {
    "path": "docs/appcast.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<rss version=\"2.0\"\n    xmlns:sparkle=\"http://www.andymatuschak.org/xml-namespaces/sparkle\"\n    xmlns:dc=\"http://purl.org/dc/elements/1.1/\">\n  <channel>\n    <title>Mos</title>\n    <link>https://mos.caldis.me/</link>\n    <description>Mos Updates</description>\n    <language>en</language>\n\n    <item>\n      <title>Mos 4.0.2</title>\n\n      <description><![CDATA[<h2>修复</h2>\n<ul>\n<li>进一步尝试修复平滑滚动导致的崩溃问题 (感谢 #868, #826, #699, #687, #665, #510, #512, #499, #368, #597, #859 提供的日志)</li>\n</ul>\n\n<hr/>\n\n<h2>Fixes</h2>\n<ul>\n<li>Fix crash caused by smooth scrolling (#868, #826, #699, #687, #665, #510, #512, #499, #368, #597, #859)</li>\n</ul>]]></description>\n      <pubDate>Sun, 08 Mar 2026 15:35:15 +0000</pubDate>\n\n      <enclosure\n        url=\"https://github.com/Caldis/Mos/releases/download/4.0.2/Mos.Versions.4.0.2-20260308.2.zip\"\n        length=\"11313875\"\n        type=\"application/octet-stream\"\n        sparkle:shortVersionString=\"4.0.2\"\n        sparkle:version=\"20260308.2\"\n        sparkle:edSignature=\"98EXQAvp+JrYQJ+2Nkj9XKMt3ap3ZTa650Tl2cm+kbVLhTeKEli8fjsz2ueovDJ0E7kZdqxSb116Xnzk/lOpAQ==\"\n      />\n    </item>\n\n    <item>\n      <title>Mos 4.0.1</title>\n\n      <description><![CDATA[<h2>新功能</h2>\n<ul>\n<li>添加 UU 远程桌面（UU远程桌面）支持，防止主机与客户端同时安装 Mos 时出现双重平滑问题，感谢 @jijiamoer (#879)</li>\n</ul>\n\n<h2>修复</h2>\n<ul>\n<li>修复滚动事件派发问题，引入 ScrollDispatchContext 重构 ScrollPoster，解决部分场景下滚动异常 (#868, #826)</li>\n<li>修复 macOS 26+ 上 LaunchPad 检测逻辑，避免影响 Dock 文件夹弹出视图，感谢 @Lezheng2333 反馈 (#878)</li>\n</ul>\n\n<hr/>\n\n<h2>New Features</h2>\n<ul>\n<li>Added UU Remote Desktop (UU远程桌面) support to prevent double-smoothing when both host and client have Mos installed, thanks @jijiamoer (#879)</li>\n</ul>\n\n<h2>Fixes</h2>\n<ul>\n<li>Fixed scroll event dispatching by introducing ScrollDispatchContext and refactoring ScrollPoster, resolving scroll anomalies in certain scenarios (#868, #826)</li>\n<li>Fixed LaunchPad detection on macOS 26+, avoiding interference with Dock folder popup views, thanks @Lezheng2333 for reporting (#878)</li>\n</ul>]]></description>\n      <pubDate>Sat, 08 Mar 2026 00:00:00 +0000</pubDate>\n\n      <enclosure\n        url=\"https://github.com/Caldis/Mos/releases/download/4.0.1/Mos.Versions.4.0.1-20260308.1.zip\"\n        length=\"11313837\"\n        type=\"application/octet-stream\"\n        sparkle:shortVersionString=\"4.0.1\"\n        sparkle:version=\"20260308.1\"\n        sparkle:edSignature=\"9nQoJKJHbkgtO0uLU/89EW8OnetCaoti+yNJv7klZH6TisZRWq66nwq0V6rnnsJcF7nO7czcsm57tpqVm0zJAQ==\"\n      />\n    </item>\n\n    <item>\n      <title>Mos 4.0.0</title>\n\n      <description><![CDATA[<h2>新功能</h2>\n<ul>\n<li>全新「按钮」模块：将鼠标按键绑定到任意系统快捷操作。</li>\n<li>新增「模拟触控板 (Beta)」滚动模式。</li>\n<li>滚动方向反转现在支持垂直、水平方向独立设置。</li>\n<li>新增应用内更新检查（power by Sparkle）。</li>\n<li>新增远程桌面滚动事件检测, 如果发起端和受控端都安装了 Mos, 也不会冲突。</li>\n<li>滚动功能键现在支持自定义录制绑定。</li>\n</ul>\n\n<h2>优化</h2>\n<ul>\n<li>欢迎引导窗口 UI 翻新。</li>\n<li>全新应用图标与状态栏图标。</li>\n<li>滚动选项面板整合优化。</li>\n<li>适配 macOS 26 视觉风格。</li>\n<li>翻译系统迁移至 String Catalogs。</li>\n<li>新增法语翻译, 感谢 @EricPujolBRGM</li>\n<li>新增波兰语翻译, 感谢 @MaciejkaG</li>\n<li>新增印尼语翻译, 感谢 @harun-alrosyid</li>\n<li>日语本地化补全, 感谢 @ulyssas</li>\n<li>日语、印尼语文本校对, 感谢 @ulyssas @harun-alrosyid</li>\n<li>波兰语、英文文本校对, 感谢 @MaciejkaG</li>\n</ul>\n\n<h2>修复</h2>\n<ul>\n<li>修复多个滚动平滑相关问题。</li>\n<li>修复鼠标按键映射与辅助功能授权状态异常。</li>\n<li>修复非美式键盘快捷键问题, 感谢 @salakis</li>\n<li>修复鼠标中键映射问题, 感谢 @GonzFC</li>\n<li>修复其他已知问题。</li>\n</ul>\n\n<hr/>\n\n<h2>New Features</h2>\n<ul>\n<li>Brand-new Buttons module: bind mouse buttons to any system shortcut.</li>\n<li>Added Simulate Trackpad scrolling mode.</li>\n<li>Scroll direction reversal can now be set independently for vertical and horizontal axes.</li>\n<li>Added in-app update checking via Sparkle, with an optional beta channel.</li>\n<li>Added remote desktop scroll event detection, if both remote host and client are installed Mos still work fine.</li>\n<li>Scroll hotkeys can now be recorded and bound to custom keys.</li>\n</ul>\n\n<h2>Improvements</h2>\n<ul>\n<li>Refreshed the welcome guide UI.</li>\n<li>New app icon and menu bar icon.</li>\n<li>Consolidated scroll options panel.</li>\n<li>Adapted visual style for macOS 26.</li>\n<li>Migrated translations to String Catalogs.</li>\n<li>Added French translation, thanks to @EricPujolBRGM</li>\n<li>Added Polish translation, thanks to @MaciejkaG</li>\n<li>Added Indonesian translation, thanks to @harun-alrosyid</li>\n<li>Japanese localization completion, thanks to @ulyssas</li>\n<li>Japanese &amp; Indonesian text proofreading, thanks to @ulyssas @harun-alrosyid</li>\n<li>Polish &amp; English text proofreading, thanks to @MaciejkaG</li>\n</ul>\n\n<h2>Fixes</h2>\n<ul>\n<li>Fixed multiple smooth scrolling issues.</li>\n<li>Fixed mouse button mapping and accessibility authorization state issues.</li>\n<li>Fixed shortcuts on non-US keyboard layouts, thanks to @salakis</li>\n<li>Fixed middle mouse button mapping, thanks to @GonzFC</li>\n<li>Fixed other known issues.</li>\n</ul>]]></description>\n      <pubDate>Thu, 20 Feb 2026 00:00:00 +0000</pubDate>\n\n      <enclosure\n        url=\"https://github.com/Caldis/Mos/releases/download/4.0.0/Mos.Versions.4.0.0-20260220.1.zip\"\n        length=\"11334806\"\n        type=\"application/octet-stream\"\n        sparkle:shortVersionString=\"4.0.0\"\n        sparkle:version=\"20260220.1\"\n        sparkle:edSignature=\"N1UZ25aHNADhPOBiqw5v+1rKhC28QXKzWFBQdcZq8oHN9brvZ1Rh3Hu2mQm/UveFSaK2RnqEFvyrbkziJy7eBw==\"\n      />\n    </item>\n  </channel>\n</rss>"
  },
  {
    "path": "docs/index.html",
    "content": "<!DOCTYPE html><!--4xlWUdmYkOQZmVpTO2yEI--><html lang=\"en\" class=\"js\"><head><meta charSet=\"utf-8\"/><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/><link rel=\"preload\" href=\"/_next/static/media/0c795a286deabae8-s.p.b6c48e4e.woff2\" as=\"font\" crossorigin=\"\" type=\"font/woff2\"/><link rel=\"preload\" href=\"/_next/static/media/0c89a48fa5027cee-s.p.4564287c.woff2\" as=\"font\" crossorigin=\"\" type=\"font/woff2\"/><link rel=\"preload\" href=\"/_next/static/media/23b7a97ae3b5c134-s.p.2902b61f.woff2\" as=\"font\" crossorigin=\"\" type=\"font/woff2\"/><link rel=\"preload\" href=\"/_next/static/media/99e609270109b47d-s.p.64b9304e.woff2\" as=\"font\" crossorigin=\"\" type=\"font/woff2\"/><link rel=\"preload\" href=\"/_next/static/media/effe91970fc4db64-s.p.19510058.woff2\" as=\"font\" crossorigin=\"\" type=\"font/woff2\"/><link rel=\"preload\" as=\"image\" href=\"/_next/static/media/logo-512.60619949.png\"/><link rel=\"stylesheet\" href=\"/_next/static/chunks/543732a8392562b4.css\" data-precedence=\"next\"/><link rel=\"preload\" as=\"script\" fetchPriority=\"low\" href=\"/_next/static/chunks/12c422bc11762090.js\"/><script src=\"/_next/static/chunks/b4611851359555bd.js\" async=\"\"></script><script src=\"/_next/static/chunks/f1a98b44d1dc31f1.js\" async=\"\"></script><script src=\"/_next/static/chunks/turbopack-98aeb181aa636c3c.js\" async=\"\"></script><script src=\"/_next/static/chunks/19717b1d18b1c046.js\" async=\"\"></script><script src=\"/_next/static/chunks/c62ecb7f1a587007.js\" async=\"\"></script><script src=\"/_next/static/chunks/2f0565a65fa02d97.js\" async=\"\"></script><script src=\"/_next/static/chunks/d95bda38d1a9ce53.js\" async=\"\"></script><script src=\"/_next/static/chunks/b492b32695e3b282.js\" async=\"\"></script><link rel=\"preload\" href=\"https://www.googletagmanager.com/gtag/js?id=G-9M7WPLB8BR\" as=\"script\"/><meta name=\"next-size-adjust\" content=\"\"/><title>Mos | Turn the mouse into flow</title><meta name=\"description\" content=\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\"/><link rel=\"canonical\" href=\"https://mos.caldis.me/\"/><meta property=\"og:title\" content=\"Mos | Turn the mouse into flow\"/><meta property=\"og:description\" content=\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\"/><meta property=\"og:url\" content=\"https://mos.caldis.me/\"/><meta property=\"og:site_name\" content=\"Mos\"/><meta property=\"og:image\" content=\"https://mos.caldis.me/og.svg\"/><meta property=\"og:image:width\" content=\"1200\"/><meta property=\"og:image:height\" content=\"630\"/><meta property=\"og:image:alt\" content=\"Mos | Turn the mouse into flow\"/><meta property=\"og:type\" content=\"website\"/><meta name=\"twitter:card\" content=\"summary_large_image\"/><meta name=\"twitter:title\" content=\"Mos | Turn the mouse into flow\"/><meta name=\"twitter:description\" content=\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\"/><meta name=\"twitter:image\" content=\"https://mos.caldis.me/og.svg\"/><link rel=\"icon\" href=\"/favicon.ico?favicon.6def09c8.ico\" sizes=\"256x256\" type=\"image/x-icon\"/><script type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https://mos.caldis.me/#website\",\"url\":\"https://mos.caldis.me/\",\"name\":\"Mos\",\"description\":\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\",\"inLanguage\":\"en\"},{\"@type\":\"SoftwareApplication\",\"@id\":\"https://mos.caldis.me/#software\",\"name\":\"Mos\",\"url\":\"https://mos.caldis.me/\",\"operatingSystem\":\"macOS\",\"applicationCategory\":\"UtilitiesApplication\",\"description\":\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\",\"downloadUrl\":\"https://github.com/Caldis/Mos/releases/latest\",\"softwareHelp\":\"https://github.com/Caldis/Mos/wiki\",\"sameAs\":[\"https://github.com/Caldis/Mos\"],\"license\":\"https://creativecommons.org/licenses/by-nc/4.0/\",\"offers\":{\"@type\":\"Offer\",\"price\":\"0\",\"priceCurrency\":\"USD\"}}]}</script><noscript><style>html.js .reveal{opacity:1!important;transform:none!important;filter:none!important}</style></noscript><script src=\"/_next/static/chunks/a6dad97d9634a72d.js\" noModule=\"\"></script></head><body class=\"syne_d93b7706-module__Y_KGdq__variable space_grotesk_8677877b-module__OT3qGa__variable ibm_plex_mono_e0f5f7ea-module__w-hdTq__variable antialiased\"><div hidden=\"\"><!--$--><!--/$--></div><div class=\"min-h-[100dvh] text-[color:var(--fg0)]\"><a href=\"#content\" class=\"sr-only focus:not-sr-only focus:fixed focus:z-[100] focus:top-4 focus:left-4 focus:px-4 focus:py-2 focus:rounded-xl focus:bg-black/70 focus:text-white focus:outline-none\">Skip to content</a><div class=\"fixed inset-0 -z-10 overflow-hidden\"><canvas class=\"block w-full h-full pointer-events-none absolute inset-0\" aria-hidden=\"true\"></canvas><div class=\"orb left-[-140px] top-[-120px] w-[380px] h-[380px] bg-[color:var(--accent)]\"></div><div class=\"orb right-[-180px] top-[10vh] w-[420px] h-[420px] bg-[color:var(--accent3)] [animation-delay:-1.2s]\"></div><div class=\"orb left-[12vw] bottom-[-220px] w-[520px] h-[520px] bg-[color:var(--accent2)] [animation-delay:-2.1s]\"></div></div><header class=\"fixed left-0 right-0 top-0 z-50 px-4 sm:px-6\"><nav class=\"mx-auto mt-4 sm:mt-6 max-w-6xl rounded-[var(--radius-xl)] glass ring-accent\"><div class=\"flex items-center justify-between px-4 sm:px-5 py-3\"><div class=\"flex items-center gap-3\"><img alt=\"Mos app icon\" width=\"40\" height=\"40\" decoding=\"async\" data-nimg=\"1\" class=\"object-contain rounded-[14px]\" style=\"color:transparent\" src=\"/_next/static/media/logo-512.60619949.png\"/><div class=\"text-lg sm:text-xl font-extrabold tracking-[0.015em] text-white\">Mos</div></div><div class=\"flex items-center gap-3\"><div class=\"inline-block \"><div style=\"will-change:transform\"><button type=\"button\" class=\"group grid h-11 w-11 place-items-center rounded-2xl border border-white/5 bg-white/4 hover:bg-white/7 hover:border-white/9 transition-colors\" aria-label=\"Select Language\" title=\"English\"><svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" class=\"h-5 w-5 text-white/82 group-hover:text-white/92 transition-colors\" fill=\"currentColor\"><path d=\"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z\"></path></svg></button></div></div><div class=\"inline-block \"><div style=\"will-change:transform\"><a href=\"https://github.com/Caldis/Mos\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"group grid h-11 w-11 place-items-center rounded-2xl border border-white/5 bg-white/4 hover:bg-white/7 hover:border-white/9 transition-colors\" aria-label=\"Mos on GitHub\" title=\"GitHub\"><svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" class=\"h-5 w-5 text-white/82 group-hover:text-white/92 transition-colors\" fill=\"currentColor\"><path d=\"M12 2c-5.52 0-10 4.58-10 10.23 0 4.52 2.87 8.35 6.84 9.7.5.1.68-.22.68-.48 0-.24-.01-.88-.01-1.72-2.78.62-3.37-1.37-3.37-1.37-.45-1.18-1.11-1.49-1.11-1.49-.91-.64.07-.63.07-.63 1.01.07 1.54 1.06 1.54 1.06.9 1.57 2.35 1.12 2.92.86.09-.67.35-1.12.64-1.38-2.22-.26-4.56-1.14-4.56-5.06 0-1.12.39-2.04 1.03-2.76-.1-.26-.45-1.3.1-2.72 0 0 .84-.28 2.75 1.05.8-.23 1.65-.35 2.5-.35.85 0 1.7.12 2.5.35 1.9-1.33 2.75-1.05 2.75-1.05.55 1.42.2 2.46.1 2.72.64.72 1.03 1.64 1.03 2.76 0 3.93-2.34 4.8-4.58 5.05.36.32.69.96.69 1.94 0 1.4-.01 2.52-.01 2.86 0 .26.18.58.69.48A10.3 10.3 0 0 0 22 12.23C22 6.58 17.52 2 12 2Z\"></path></svg></a></div></div></div></div></nav></header><main id=\"content\" class=\"mx-auto max-w-6xl px-4 sm:px-6\"><section class=\"relative min-h-[100dvh] pt-28 sm:pt-36 pb-10 sm:pb-12 flex flex-col\"><div class=\"flex-1 flex items-center\"><div class=\"w-full grid grid-cols-1 md:grid-cols-[1fr_auto] gap-12 lg:gap-20 items-center\"><div><div class=\"inline-flex items-center gap-3 rounded-full border border-white/10 bg-black/40 px-4 py-2 text-xs text-white/70 shadow-elevated\" style=\"opacity:0;transform:translateY(24px)\"><span class=\"inline-flex items-center gap-2\"><span class=\"h-2 w-2 rounded-full bg-[color:var(--accent)] shadow-[0_0_22px_rgba(255,255,255,0.35)]\"></span>Smooth scrolling for mouse wheels on macOS</span><span class=\"hidden sm:inline text-white/35\">•</span><span class=\"hidden sm:inline font-mono text-white/45\">per-app profiles · independent axes · buttons &amp; shortcuts</span></div><h1 class=\"mt-7 font-display text-balance text-[52px] leading-[0.95] tracking-[-0.02em] sm:text-[88px] md:text-[108px] lg:text-[124px] text-white\" style=\"opacity:0;transform:translateY(24px)\">Turn the mouse<span class=\"block\">into <span class=\"inline-block text-flow\" style=\"text-shadow:0 0 42px rgba(255,255,255,0.08)\">flow</span>.</span></h1><p class=\"mt-5 max-w-2xl text-balance text-[15px] sm:text-lg text-white/72 leading-[1.7]\" style=\"opacity:0;transform:translateY(24px)\">Mos is a free, open-source macOS utility that makes wheel scrolling feel closer to a trackpad, without getting in your way. Tune curves, split axes, and override behavior per app.</p><div class=\"mt-8 flex flex-col sm:flex-row sm:items-start gap-3 sm:gap-4\" style=\"opacity:0;transform:translateY(24px)\"><div class=\"flex flex-col items-start w-fit\"><div class=\"inline-block \"><div style=\"will-change:transform\"><a href=\"https://github.com/Caldis/Mos/releases/latest\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"group relative overflow-hidden rounded-[18px] px-6 py-3.5 text-sm sm:text-base font-semibold tracking-wide text-black shadow-elevated border border-black/10 inline-flex items-center justify-center\" style=\"background:linear-gradient(180deg, rgba(255,255,255,0.96) 0%, rgba(255,255,255,0.84) 100%)\"><span class=\"relative z-10\">Download Mos</span><span class=\"absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity duration-500 [background:radial-gradient(800px_240px_at_30%_0%,rgba(0,0,0,0.18),transparent_55%)]\"></span></a></div></div><a href=\"#homebrew\" class=\"mt-2 self-center text-xs font-mono text-white/50 hover:text-white/75 transition-colors underline decoration-white/15 hover:decoration-white/35 underline-offset-4\">Install via Homebrew</a></div><div class=\"inline-block \"><div style=\"will-change:transform\"><a href=\"https://github.com/Caldis/Mos\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"group inline-flex items-center justify-center rounded-[18px] px-6 py-3.5 text-sm sm:text-base font-semibold tracking-wide text-white/85 border border-white/12 bg-white/5 hover:bg-white/8 transition-colors\"><span class=\"mr-2 opacity-70 group-hover:opacity-100 transition-opacity\">↗</span><span>View on GitHub</span></a></div></div><div class=\"sm:ml-auto sm:self-center text-xs text-white/45\"><div class=\"font-mono tabular-nums\">Requires macOS 10.13+</div><div class=\"font-mono\">Free · Open source</div></div></div></div><div class=\"hidden md:block w-[280px] lg:w-[320px] xl:w-[340px] shrink-0\" style=\"opacity:0;transform:translateY(30px)\"><div class=\"relative rounded-[var(--radius-card)] glass shadow-elevated border border-white/10 overflow-hidden p-5\" style=\"transform:perspective(1200px)\"><div class=\"font-display text-[10px] tracking-[0.22em] uppercase text-white/45 mb-4\">Smooth Scroll Curve</div><div class=\"rounded-2xl border border-white/8 bg-black/30 overflow-hidden\"><svg viewBox=\"0 0 400 200\" class=\"block w-full h-auto\" aria-hidden=\"true\"><defs><linearGradient id=\"heroCurveFill\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop offset=\"0%\" stop-color=\"rgba(255,255,255,0.14)\"></stop><stop offset=\"100%\" stop-color=\"rgba(255,255,255,0)\"></stop></linearGradient></defs><g stroke=\"rgba(255,255,255,0.06)\" stroke-width=\"1\"><line x1=\"0\" y1=\"8\" x2=\"0\" y2=\"196\"></line><line x1=\"133\" y1=\"8\" x2=\"133\" y2=\"196\"></line><line x1=\"266\" y1=\"8\" x2=\"266\" y2=\"196\"></line><line x1=\"399\" y1=\"8\" x2=\"399\" y2=\"196\"></line><line x1=\"0\" y1=\"8\" x2=\"400\" y2=\"8\"></line><line x1=\"0\" y1=\"70\" x2=\"400\" y2=\"70\"></line><line x1=\"0\" y1=\"132\" x2=\"400\" y2=\"132\"></line><line x1=\"0\" y1=\"194\" x2=\"400\" y2=\"194\"></line></g><path d=\"M 0 192 C 8 192 18 28 48 16 S 96 14 128 22 S 192 52 248 102 S 320 162 400 188 L 400 192 L 0 192 Z\" fill=\"url(#heroCurveFill)\" opacity=\"0.9\"></path><path d=\"M 0 192 C 8 192 18 28 48 16 S 96 14 128 22 S 192 52 248 102 S 320 162 400 188\" fill=\"none\" stroke=\"rgba(255,255,255,0.90)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" pathLength=\"1\" stroke-dasharray=\"1\" stroke-dashoffset=\"1\" style=\"animation:stroke-in 1200ms var(--ease-out) 500ms both\"></path></svg></div><div class=\"mt-4 grid grid-cols-3 gap-2\"><div class=\"rounded-xl border border-white/8 bg-white/4 px-2.5 py-2\"><div class=\"font-display text-[9px] tracking-[0.18em] uppercase text-white/40\">STEP</div><div class=\"mt-1 font-mono text-sm tabular-nums text-white/80\">33.6</div></div><div class=\"rounded-xl border border-white/8 bg-white/4 px-2.5 py-2\"><div class=\"font-display text-[9px] tracking-[0.18em] uppercase text-white/40\">GAIN</div><div class=\"mt-1 font-mono text-sm tabular-nums text-white/80\">×2.7</div></div><div class=\"rounded-xl border border-white/8 bg-white/4 px-2.5 py-2\"><div class=\"font-display text-[9px] tracking-[0.18em] uppercase text-white/40\">DURATION</div><div class=\"mt-1 font-mono text-sm tabular-nums text-white/80\">4.35s</div></div></div></div></div></div></div><div class=\"mt-8 sm:mt-10 flex items-center gap-3 text-white/40\"><div class=\"h-[1px] flex-1 hairline\"></div><div class=\"font-mono text-[11px] tracking-[0.18em] uppercase\">Scroll to explore</div><div class=\"h-[1px] flex-1 hairline\"></div></div></section><section class=\"py-16 sm:py-24\"><div class=\"\" style=\"opacity:0;transform:translateY(24px)\"><h2 class=\"font-display text-balance text-3xl sm:text-5xl text-white leading-[0.95] tracking-[-0.01em]\">Deterministic scroll. Tunable feel.</h2></div><div class=\"\" style=\"opacity:0;transform:translateY(24px)\"><p class=\"mt-4 max-w-3xl text-white/68 leading-[1.7]\">Mos turns raw wheel deltas into predictable motion. Keep the same feel across apps, and override it when you need to.</p></div><div class=\"mt-10 grid grid-cols-1 md:grid-cols-12 gap-4\"><div class=\"md:col-span-7 h-full\" style=\"opacity:0;transform:translateY(24px)\"><div class=\"group relative h-full rounded-[var(--radius-card)] glass shadow-elevated overflow-hidden border border-white/10 \" style=\"transform:perspective(1200px)\"><div class=\"pointer-events-none absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity duration-500\" style=\"background:radial-gradient(480px circle at 50% 50%, rgba(255,255,255,0.08), transparent 60%)\"></div><div class=\"relative p-6 sm:p-8\"><div class=\"font-display text-[11px] tracking-[0.22em] uppercase text-white/50\">Curves &amp; Acceleration</div><div class=\"mt-4 text-2xl sm:text-3xl text-white font-semibold\">Shape the feel.</div><p class=\"mt-3 text-white/62 leading-[1.7]\">Smoothness is a curve. Adjust step, gain, and duration, and see how raw wheel deltas turn into controlled motion.</p><div class=\"mt-6\"><div class=\"rounded-2xl border border-white/10 bg-black/35 overflow-hidden\"><svg viewBox=\"0 0 860 280\" class=\"block w-full h-auto\" aria-label=\"Scroll curve graph\"><defs><linearGradient id=\"easeFill\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop offset=\"0%\" stop-color=\"rgba(255,255,255,0.14)\"></stop><stop offset=\"100%\" stop-color=\"rgba(255,255,255,0)\"></stop></linearGradient></defs><g stroke=\"rgba(255,255,255,0.08)\" stroke-width=\"1\"><line x1=\"56\" y1=\"18\" x2=\"56\" y2=\"236\"></line><line x1=\"187\" y1=\"18\" x2=\"187\" y2=\"236\"></line><line x1=\"318\" y1=\"18\" x2=\"318\" y2=\"236\"></line><line x1=\"449\" y1=\"18\" x2=\"449\" y2=\"236\"></line><line x1=\"580\" y1=\"18\" x2=\"580\" y2=\"236\"></line><line x1=\"711\" y1=\"18\" x2=\"711\" y2=\"236\"></line><line x1=\"842\" y1=\"18\" x2=\"842\" y2=\"236\"></line><line x1=\"56\" y1=\"18\" x2=\"842\" y2=\"18\"></line><line x1=\"56\" y1=\"72.5\" x2=\"842\" y2=\"72.5\"></line><line x1=\"56\" y1=\"127\" x2=\"842\" y2=\"127\"></line><line x1=\"56\" y1=\"181.5\" x2=\"842\" y2=\"181.5\"></line><line x1=\"56\" y1=\"236\" x2=\"842\" y2=\"236\"></line></g><path d=\"M 56.00 236.00 L 64.83 229.56 L 73.66 218.70 L 82.49 204.94 L 91.33 189.41 L 100.16 172.94 L 108.99 156.12 L 117.82 139.39 L 126.65 123.05 L 135.48 107.30 L 144.31 92.27 L 153.15 84.50 L 161.98 81.98 L 170.81 83.22 L 179.64 87.08 L 188.47 92.71 L 197.30 99.48 L 206.13 106.91 L 214.97 114.68 L 223.80 122.52 L 232.63 130.26 L 241.46 137.79 L 250.29 145.01 L 259.12 151.87 L 267.96 158.35 L 276.79 164.44 L 285.62 170.13 L 294.45 175.42 L 303.28 180.33 L 312.11 184.88 L 320.94 189.09 L 329.78 192.97 L 338.61 196.54 L 347.44 199.83 L 356.27 202.86 L 365.10 205.64 L 373.93 208.19 L 382.76 210.53 L 391.60 212.68 L 400.43 214.65 L 409.26 216.45 L 418.09 218.11 L 426.92 219.62 L 435.75 221.01 L 444.58 222.28 L 453.42 223.44 L 462.25 224.51 L 471.08 225.48 L 479.91 226.38 L 488.74 227.19 L 497.57 227.94 L 506.40 228.63 L 515.24 229.25 L 524.07 229.83 L 532.90 230.35 L 541.73 230.83 L 550.56 231.27 L 559.39 231.67 L 568.22 232.04 L 577.06 236.00 L 585.89 236.00 L 594.72 236.00 L 603.55 236.00 L 612.38 236.00 L 621.21 236.00 L 630.04 236.00 L 638.88 236.00 L 647.71 236.00 L 656.54 236.00 L 665.37 236.00 L 674.20 236.00 L 683.03 236.00 L 691.87 236.00 L 700.70 236.00 L 709.53 236.00 L 718.36 236.00 L 727.19 236.00 L 736.02 236.00 L 744.85 236.00 L 753.69 236.00 L 762.52 236.00 L 771.35 236.00 L 780.18 236.00 L 789.01 236.00 L 797.84 236.00 L 806.67 236.00 L 815.51 236.00 L 824.34 236.00 L 833.17 236.00 L 842.00 236.00 L 842.00 236.00 L 56.00 236.00 Z\" fill=\"url(#easeFill)\" opacity=\"0.9\"></path><path d=\"M 56.00 236.00 L 64.83 229.56 L 73.66 218.70 L 82.49 204.94 L 91.33 189.41 L 100.16 172.94 L 108.99 156.12 L 117.82 139.39 L 126.65 123.05 L 135.48 107.30 L 144.31 92.27 L 153.15 84.50 L 161.98 81.98 L 170.81 83.22 L 179.64 87.08 L 188.47 92.71 L 197.30 99.48 L 206.13 106.91 L 214.97 114.68 L 223.80 122.52 L 232.63 130.26 L 241.46 137.79 L 250.29 145.01 L 259.12 151.87 L 267.96 158.35 L 276.79 164.44 L 285.62 170.13 L 294.45 175.42 L 303.28 180.33 L 312.11 184.88 L 320.94 189.09 L 329.78 192.97 L 338.61 196.54 L 347.44 199.83 L 356.27 202.86 L 365.10 205.64 L 373.93 208.19 L 382.76 210.53 L 391.60 212.68 L 400.43 214.65 L 409.26 216.45 L 418.09 218.11 L 426.92 219.62 L 435.75 221.01 L 444.58 222.28 L 453.42 223.44 L 462.25 224.51 L 471.08 225.48 L 479.91 226.38 L 488.74 227.19 L 497.57 227.94 L 506.40 228.63 L 515.24 229.25 L 524.07 229.83 L 532.90 230.35 L 541.73 230.83 L 550.56 231.27 L 559.39 231.67 L 568.22 232.04 L 577.06 236.00 L 585.89 236.00 L 594.72 236.00 L 603.55 236.00 L 612.38 236.00 L 621.21 236.00 L 630.04 236.00 L 638.88 236.00 L 647.71 236.00 L 656.54 236.00 L 665.37 236.00 L 674.20 236.00 L 683.03 236.00 L 691.87 236.00 L 700.70 236.00 L 709.53 236.00 L 718.36 236.00 L 727.19 236.00 L 736.02 236.00 L 744.85 236.00 L 753.69 236.00 L 762.52 236.00 L 771.35 236.00 L 780.18 236.00 L 789.01 236.00 L 797.84 236.00 L 806.67 236.00 L 815.51 236.00 L 824.34 236.00 L 833.17 236.00 L 842.00 236.00\" fill=\"none\" stroke=\"rgba(255,255,255,0.92)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" pathLength=\"1\" stroke-dasharray=\"1\" stroke-dashoffset=\"1\" style=\"animation:stroke-in 900ms var(--ease-out) both\"></path><circle cx=\"56\" cy=\"236\" r=\"4.2\" fill=\"rgba(255,255,255,0.95)\"></circle><circle cx=\"56\" cy=\"236\" r=\"2\" fill=\"rgba(255,255,255,0.55)\" opacity=\"0.7\"></circle></svg></div><div class=\"mt-4 grid gap-4 md:grid-cols-3\"><div class=\"rounded-2xl border border-white/10 bg-black/35 p-4\"><div class=\"flex items-center justify-between\"><div class=\"font-display text-sm tracking-[0.18em] uppercase text-white/70\">Step</div><div class=\"font-mono text-xs text-white/55\">33.60</div></div><input class=\"mt-3 w-full range\" type=\"range\" min=\"0.01\" max=\"100\" step=\"0.01\" aria-label=\"Step\" value=\"33.6\"/><div class=\"mt-2 font-mono text-[11px] text-white/40\">Quantization floor for wheel deltas.</div></div><div class=\"rounded-2xl border border-white/10 bg-black/35 p-4\"><div class=\"flex items-center justify-between\"><div class=\"font-display text-sm tracking-[0.18em] uppercase text-white/70\">Gain</div><div class=\"font-mono text-xs text-white/55\">×<!-- -->2.70</div></div><input class=\"mt-3 w-full range\" type=\"range\" min=\"1\" max=\"10\" step=\"0.01\" aria-label=\"Gain\" value=\"2.7\"/><div class=\"mt-2 font-mono text-[11px] text-white/40\">Scales distance per tick and how fast the curve ramps.</div></div><div class=\"rounded-2xl border border-white/10 bg-black/35 p-4\"><div class=\"flex items-center justify-between\"><div class=\"font-display text-sm tracking-[0.18em] uppercase text-white/70\">Duration</div><div class=\"font-mono text-xs text-white/55\">4.35</div></div><input class=\"mt-3 w-full range\" type=\"range\" min=\"1\" max=\"5\" step=\"0.01\" aria-label=\"Duration\" value=\"4.35\"/><div class=\"mt-2 font-mono text-[11px] text-white/40\">Smoothing time constant (higher means longer tail).</div></div></div><div class=\"mt-3 font-mono text-[11px] tracking-[0.18em] uppercase text-white/40\">ScrollCore curve</div></div></div></div></div><div class=\"md:col-span-5 h-full\" style=\"opacity:0;transform:translateY(24px)\"><div class=\"group relative h-full rounded-[var(--radius-card)] glass shadow-elevated overflow-hidden border border-white/10 \" style=\"transform:perspective(1200px)\"><div class=\"pointer-events-none absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity duration-500\" style=\"background:radial-gradient(480px circle at 50% 50%, rgba(255,255,255,0.08), transparent 60%)\"></div><div class=\"relative p-6 sm:p-8\"><div class=\"font-display text-[11px] tracking-[0.22em] uppercase text-white/50\">Independent Axes</div><div class=\"mt-4 text-2xl sm:text-3xl text-white font-semibold\">Split X and Y.</div><p class=\"mt-3 text-white/62 leading-[1.7]\">Treat vertical and horizontal scroll as separate axes. Toggle smoothing and reverse independently for each.</p><div class=\"mt-6 rounded-2xl border border-white/10 bg-black/30 p-5\"><div class=\"space-y-3\"><div class=\"flex items-center gap-3\"><div class=\"h-10 w-10 rounded-2xl border border-white/10 bg-white/5 grid place-items-center\"><span class=\"font-mono text-xs text-white/60\">Y</span></div><div class=\"flex flex-1 flex-wrap gap-2\"><div class=\"flex min-w-[150px] flex-1 items-center justify-between rounded-xl border border-white/10 bg-white/5 px-3 py-2\"><span class=\"font-mono text-[11px] text-white/60\">Smooth</span><button type=\"button\" role=\"switch\" aria-checked=\"true\" aria-disabled=\"false\" aria-label=\"Y Smooth\" class=\"relative inline-flex h-6 w-11 shrink-0 items-center overflow-hidden rounded-full border p-[2px] transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-white/20 border-white/30 bg-white/28 cursor-pointer\"><span aria-hidden=\"true\" class=\"h-5 w-5 rounded-full shadow-[0_6px_16px_rgba(0,0,0,0.45)] transition-[transform,background-color] duration-200 ease-out translate-x-5 bg-white\"></span></button></div><div class=\"flex min-w-[150px] flex-1 items-center justify-between rounded-xl border border-white/10 bg-white/5 px-3 py-2\"><span class=\"font-mono text-[11px] text-white/60\">Reverse</span><button type=\"button\" role=\"switch\" aria-checked=\"false\" aria-disabled=\"false\" aria-label=\"Y Reverse\" class=\"relative inline-flex h-6 w-11 shrink-0 items-center overflow-hidden rounded-full border p-[2px] transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-white/20 border-white/8 bg-white/4 hover:border-white/14 hover:bg-white/7 cursor-pointer\"><span aria-hidden=\"true\" class=\"h-5 w-5 rounded-full shadow-[0_6px_16px_rgba(0,0,0,0.45)] transition-[transform,background-color] duration-200 ease-out translate-x-0 bg-white/50\"></span></button></div></div></div><div class=\"flex items-center gap-3\"><div class=\"h-10 w-10 rounded-2xl border border-white/10 bg-white/5 grid place-items-center\"><span class=\"font-mono text-xs text-white/60\">X</span></div><div class=\"flex flex-1 flex-wrap gap-2\"><div class=\"flex min-w-[150px] flex-1 items-center justify-between rounded-xl border border-white/10 bg-white/5 px-3 py-2\"><span class=\"font-mono text-[11px] text-white/60\">Smooth</span><button type=\"button\" role=\"switch\" aria-checked=\"false\" aria-disabled=\"false\" aria-label=\"X Smooth\" class=\"relative inline-flex h-6 w-11 shrink-0 items-center overflow-hidden rounded-full border p-[2px] transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-white/20 border-white/8 bg-white/4 hover:border-white/14 hover:bg-white/7 cursor-pointer\"><span aria-hidden=\"true\" class=\"h-5 w-5 rounded-full shadow-[0_6px_16px_rgba(0,0,0,0.45)] transition-[transform,background-color] duration-200 ease-out translate-x-0 bg-white/50\"></span></button></div><div class=\"flex min-w-[150px] flex-1 items-center justify-between rounded-xl border border-white/10 bg-white/5 px-3 py-2\"><span class=\"font-mono text-[11px] text-white/60\">Reverse</span><button type=\"button\" role=\"switch\" aria-checked=\"true\" aria-disabled=\"false\" aria-label=\"X Reverse\" class=\"relative inline-flex h-6 w-11 shrink-0 items-center overflow-hidden rounded-full border p-[2px] transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-white/20 border-white/30 bg-white/28 cursor-pointer\"><span aria-hidden=\"true\" class=\"h-5 w-5 rounded-full shadow-[0_6px_16px_rgba(0,0,0,0.45)] transition-[transform,background-color] duration-200 ease-out translate-x-5 bg-white\"></span></button></div></div></div></div></div></div></div></div><div class=\"md:col-span-5 h-full\" style=\"opacity:0;transform:translateY(24px)\"><div class=\"group relative h-full rounded-[var(--radius-card)] glass shadow-elevated overflow-hidden border border-white/10 \" style=\"transform:perspective(1200px)\"><div class=\"pointer-events-none absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity duration-500\" style=\"background:radial-gradient(480px circle at 50% 50%, rgba(255,255,255,0.08), transparent 60%)\"></div><div class=\"relative p-6 sm:p-8 min-h-[360px]\"><div class=\"font-display text-[11px] tracking-[0.22em] uppercase text-white/50\">Per-app Profiles</div><div class=\"mt-4 text-2xl sm:text-3xl text-white font-semibold\">Different apps, different feel.</div><p class=\"mt-3 text-white/62 leading-[1.7]\">Let each app inherit defaults, or override scroll and button rules. Precision where it matters, smooth everywhere else.</p><div class=\"mt-6 grid grid-cols-2 gap-3\"><div class=\"rounded-2xl border border-white/10 bg-white/5 p-3 flex items-center gap-3\"><div class=\"h-12 w-12 shrink-0 rounded-xl border border-white/10 bg-black/20 overflow-hidden\"><img alt=\"\" loading=\"lazy\" width=\"48\" height=\"48\" decoding=\"async\" data-nimg=\"1\" class=\"h-full w-full object-cover\" style=\"color:transparent\" src=\"/app-icons/xcode.png\"/></div><div><div class=\"font-mono text-[11px] text-white/65\">Xcode</div><div class=\"mt-0.5 inline-flex items-center gap-1 rounded-full bg-white/8 border border-white/10 px-1.5 py-0.5\"><span class=\"h-1.5 w-1.5 rounded-full bg-white/60\"></span><span class=\"font-mono text-[9px] text-white/50\">smooth</span></div></div></div><div class=\"rounded-2xl border border-white/10 bg-white/5 p-3 flex items-center gap-3\"><div class=\"h-12 w-12 shrink-0 rounded-xl border border-white/10 bg-black/20 overflow-hidden\"><img alt=\"\" loading=\"lazy\" width=\"48\" height=\"48\" decoding=\"async\" data-nimg=\"1\" class=\"h-full w-full object-cover\" style=\"color:transparent\" src=\"/app-icons/safari.png\"/></div><div><div class=\"font-mono text-[11px] text-white/65\">Safari</div><div class=\"mt-0.5 inline-flex items-center gap-1 rounded-full bg-white/8 border border-white/10 px-1.5 py-0.5\"><span class=\"h-1.5 w-1.5 rounded-full bg-white/60\"></span><span class=\"font-mono text-[9px] text-white/50\">smooth</span></div></div></div><div class=\"rounded-2xl border border-white/10 bg-white/5 p-3 flex items-center gap-3\"><div class=\"h-12 w-12 shrink-0 rounded-xl border border-white/10 bg-black/20 overflow-hidden\"><img alt=\"\" loading=\"lazy\" width=\"48\" height=\"48\" decoding=\"async\" data-nimg=\"1\" class=\"h-full w-full object-cover\" style=\"color:transparent\" src=\"/app-icons/figma.png\"/></div><div><div class=\"font-mono text-[11px] text-white/65\">Figma</div><div class=\"mt-0.5 inline-flex items-center gap-1 rounded-full bg-white/8 border border-white/10 px-1.5 py-0.5\"><span class=\"h-1.5 w-1.5 rounded-full bg-white/60\"></span><span class=\"font-mono text-[9px] text-white/50\">smooth</span></div></div></div><div class=\"rounded-2xl border border-white/10 bg-white/5 p-3 flex items-center gap-3\"><div class=\"h-12 w-12 shrink-0 rounded-xl border border-white/10 bg-black/20 overflow-hidden\"><img alt=\"\" loading=\"lazy\" width=\"48\" height=\"48\" decoding=\"async\" data-nimg=\"1\" class=\"h-full w-full object-cover\" style=\"color:transparent\" src=\"/app-icons/terminal.png\"/></div><div><div class=\"font-mono text-[11px] text-white/65\">Terminal</div></div></div><div class=\"rounded-2xl border border-white/10 bg-white/5 p-3 flex items-center gap-3\"><div class=\"h-12 w-12 shrink-0 rounded-xl border border-white/10 bg-black/20 overflow-hidden\"><img alt=\"\" loading=\"lazy\" width=\"48\" height=\"48\" decoding=\"async\" data-nimg=\"1\" class=\"h-full w-full object-cover\" style=\"color:transparent\" src=\"/app-icons/notion.png\"/></div><div><div class=\"font-mono text-[11px] text-white/65\">Notion</div><div class=\"mt-0.5 inline-flex items-center gap-1 rounded-full bg-white/8 border border-white/10 px-1.5 py-0.5\"><span class=\"h-1.5 w-1.5 rounded-full bg-white/60\"></span><span class=\"font-mono text-[9px] text-white/50\">smooth</span></div></div></div><div class=\"rounded-2xl border border-white/10 bg-white/5 p-3 flex items-center gap-3\"><div class=\"h-12 w-12 shrink-0 rounded-xl border border-white/10 bg-black/20 overflow-hidden\"><img alt=\"\" loading=\"lazy\" width=\"48\" height=\"48\" decoding=\"async\" data-nimg=\"1\" class=\"h-full w-full object-cover\" style=\"color:transparent\" src=\"/app-icons/chrome.png\"/></div><div><div class=\"font-mono text-[11px] text-white/65\">Chrome</div><div class=\"mt-0.5 inline-flex items-center gap-1 rounded-full bg-white/8 border border-white/10 px-1.5 py-0.5\"><span class=\"h-1.5 w-1.5 rounded-full bg-white/60\"></span><span class=\"font-mono text-[9px] text-white/50\">smooth</span></div></div></div></div></div></div></div><div class=\"md:col-span-7 h-full\" style=\"opacity:0;transform:translateY(24px)\"><div class=\"group relative h-full rounded-[var(--radius-card)] glass shadow-elevated overflow-hidden border border-white/10 \" style=\"transform:perspective(1200px)\"><div class=\"pointer-events-none absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity duration-500\" style=\"background:radial-gradient(480px circle at 50% 50%, rgba(255,255,255,0.08), transparent 60%)\"></div><div class=\"relative p-6 sm:p-8 min-h-[360px]\"><div class=\"font-display text-[11px] tracking-[0.22em] uppercase text-white/50\">Buttons &amp; Shortcuts</div><div class=\"mt-4 text-2xl sm:text-3xl text-white font-semibold\">Bind, record, repeat.</div><p class=\"mt-3 text-white/62 leading-[1.7]\">Record mouse or keyboard events and bind them to system shortcuts. Use the live monitor to see what your devices are sending.</p><div class=\"mt-6 rounded-2xl border border-white/10 bg-black/30 p-5\"><div class=\"font-mono text-xs text-white/45\">Quick Bind</div><div class=\"mt-3 grid gap-2\"><div class=\"flex items-center justify-between rounded-xl border border-white/10 bg-white/5 px-3 py-2\"><div class=\"font-mono text-xs text-white/75\">Button 4</div><div class=\"font-mono text-xs text-white/45\">Mission Control</div></div><div class=\"flex items-center justify-between rounded-xl border border-white/10 bg-white/5 px-3 py-2\"><div class=\"font-mono text-xs text-white/75\">Button 5</div><div class=\"font-mono text-xs text-white/45\">Next Space</div></div><div class=\"flex items-center justify-between rounded-xl border border-white/10 bg-white/5 px-3 py-2\"><div class=\"font-mono text-xs text-white/75\">Wheel Click</div><div class=\"font-mono text-xs text-white/45\">App Switcher</div></div><div class=\"flex items-center justify-between rounded-xl border border-white/8 bg-white/3 px-3 py-2 opacity-60\"><div class=\"flex items-center gap-2\"><span class=\"relative flex h-1.5 w-1.5\"><span class=\"motion-safe:animate-ping absolute inline-flex h-full w-full rounded-full bg-white/60 opacity-75\"></span><span class=\"relative inline-flex rounded-full h-1.5 w-1.5 bg-white/40\"></span></span><div class=\"font-mono text-xs text-white/45\">—</div></div><div class=\"font-mono text-[10px] text-white/30 italic\">recording…</div></div></div></div></div></div></div></div></section><section class=\"pt-0 pb-16 sm:pb-24\"><div class=\"rounded-[28px] glass shadow-elevated border border-white/10 overflow-hidden\"><div class=\"px-6 sm:px-10 py-10 sm:py-14\"><div class=\"\" style=\"opacity:0;transform:translateY(24px)\"><h3 class=\"font-display text-balance text-3xl sm:text-6xl text-white leading-[0.95] tracking-[-0.015em]\">Download Mos. Tune your scroll.</h3></div><div class=\"\" style=\"opacity:0;transform:translateY(24px)\"><p class=\"mt-4 max-w-3xl text-white/68 leading-[1.7]\">Install in seconds, tweak it when you need to, and keep your scroll behavior consistent across the apps you live in.</p></div><div class=\"\" style=\"opacity:0;transform:translateY(24px)\"><div class=\"mt-8 flex flex-col sm:flex-row sm:items-center gap-3\"><div class=\"inline-block \"><div style=\"will-change:transform\"><a href=\"https://github.com/Caldis/Mos/releases/latest\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"group relative overflow-hidden rounded-[18px] px-6 py-3.5 text-sm sm:text-base font-semibold tracking-wide text-black shadow-elevated border border-black/10 inline-flex items-center justify-center\" style=\"background:linear-gradient(180deg, rgba(255,255,255,0.96) 0%, rgba(255,255,255,0.84) 100%)\"><span class=\"relative z-10\">Download</span><span class=\"absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity duration-500 [background:radial-gradient(900px_260px_at_30%_0%,rgba(0,0,0,0.18),transparent_55%)]\"></span></a></div></div><div class=\"inline-block \"><div style=\"will-change:transform\"><a href=\"https://github.com/Caldis/Mos/releases\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"inline-flex items-center justify-center rounded-[18px] px-6 py-3.5 text-sm sm:text-base font-semibold tracking-wide text-white/85 border border-white/12 bg-white/5 hover:bg-white/8 transition-colors\">Release notes</a></div></div><div class=\"inline-block \"><div style=\"will-change:transform\"><a href=\"https://github.com/Caldis/Mos/wiki\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"inline-flex items-center justify-center rounded-[18px] px-6 py-3.5 text-sm sm:text-base font-semibold tracking-wide text-white/85 border border-white/12 bg-white/5 hover:bg-white/8 transition-colors\">Docs</a></div></div></div></div><div class=\"\" style=\"opacity:0;transform:translateY(24px)\"><div id=\"homebrew\" class=\"mt-8 scroll-mt-28 rounded-[22px] border border-white/10 bg-black/35 p-5 sm:p-6\"><div class=\"flex flex-col sm:flex-row sm:items-center justify-between gap-3\"><div><div class=\"font-display text-sm tracking-[0.18em] uppercase text-white/70\">Homebrew</div><div class=\"mt-2 font-mono text-sm text-white/75\">brew install --cask mos</div></div><button type=\"button\" class=\"self-start sm:self-auto rounded-2xl px-4 py-2.5 text-sm font-semibold border border-white/12 bg-white/5 hover:bg-white/8 transition-colors text-white/85\">Copy</button></div><div class=\"mt-4 font-mono text-xs text-white/45\">Tip: If you’re on beta, your cask might be <span class=\"text-white/70\">mos@beta</span>.</div></div></div></div><div class=\"px-6 sm:px-10 py-6 border-t border-white/10 flex flex-col sm:flex-row sm:items-center justify-between gap-3 text-white/45\"><div class=\"font-mono text-xs\">Latest release · Requires macOS 10.13+</div><div class=\"flex items-center gap-4 font-mono text-xs\"><a href=\"https://github.com/Caldis/Mos\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"hover:text-white/80 transition-colors\">GitHub</a><a href=\"https://github.com/Caldis/Mos/wiki\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"hover:text-white/80 transition-colors\">Wiki</a><a href=\"https://github.com/Caldis/Mos/releases\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"hover:text-white/80 transition-colors\">Releases</a></div></div></div></section></main></div><!--$--><!--/$--><script src=\"/_next/static/chunks/12c422bc11762090.js\" id=\"_R_\" async=\"\"></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,\"1:\\\"$Sreact.fragment\\\"\\n3:I[96923,[\\\"/_next/static/chunks/19717b1d18b1c046.js\\\"],\\\"Providers\\\"]\\n4:I[33720,[\\\"/_next/static/chunks/c62ecb7f1a587007.js\\\",\\\"/_next/static/chunks/2f0565a65fa02d97.js\\\"],\\\"default\\\"]\\n5:I[16458,[\\\"/_next/static/chunks/c62ecb7f1a587007.js\\\",\\\"/_next/static/chunks/2f0565a65fa02d97.js\\\"],\\\"default\\\"]\\n6:I[13154,[\\\"/_next/static/chunks/19717b1d18b1c046.js\\\"],\\\"\\\"]\\n7:I[61096,[\\\"/_next/static/chunks/19717b1d18b1c046.js\\\",\\\"/_next/static/chunks/d95bda38d1a9ce53.js\\\",\\\"/_next/static/chunks/b492b32695e3b282.js\\\"],\\\"default\\\"]\\n8:I[45924,[\\\"/_next/static/chunks/c62ecb7f1a587007.js\\\",\\\"/_next/static/chunks/2f0565a65fa02d97.js\\\"],\\\"OutletBoundary\\\"]\\n9:\\\"$Sreact.suspense\\\"\\nb:I[45924,[\\\"/_next/static/chunks/c62ecb7f1a587007.js\\\",\\\"/_next/static/chunks/2f0565a65fa02d97.js\\\"],\\\"ViewportBoundary\\\"]\\nd:I[45924,[\\\"/_next/static/chunks/c62ecb7f1a587007.js\\\",\\\"/_next/static/chunks/2f0565a65fa02d97.js\\\"],\\\"MetadataBoundary\\\"]\\nf:I[70566,[],\\\"default\\\"]\\n:HL[\\\"/_next/static/chunks/543732a8392562b4.css\\\",\\\"style\\\"]\\n:HL[\\\"/_next/static/media/0c795a286deabae8-s.p.b6c48e4e.woff2\\\",\\\"font\\\",{\\\"crossOrigin\\\":\\\"\\\",\\\"type\\\":\\\"font/woff2\\\"}]\\n:HL[\\\"/_next/static/media/0c89a48fa5027cee-s.p.4564287c.woff2\\\",\\\"font\\\",{\\\"crossOrigin\\\":\\\"\\\",\\\"type\\\":\\\"font/woff2\\\"}]\\n:HL[\\\"/_next/static/media/23b7a97ae3b5c134-s.p.2902b61f.woff2\\\",\\\"font\\\",{\\\"crossOrigin\\\":\\\"\\\",\\\"type\\\":\\\"font/woff2\\\"}]\\n:HL[\\\"/_next/static/media/99e609270109b47d-s.p.64b9304e.woff2\\\",\\\"font\\\",{\\\"crossOrigin\\\":\\\"\\\",\\\"type\\\":\\\"font/woff2\\\"}]\\n:HL[\\\"/_next/static/media/effe91970fc4db64-s.p.19510058.woff2\\\",\\\"font\\\",{\\\"crossOrigin\\\":\\\"\\\",\\\"type\\\":\\\"font/woff2\\\"}]\\n2:[\\\"$\\\",\\\"style\\\",null,{\\\"children\\\":\\\"html.js .reveal{opacity:1!important;transform:none!important;filter:none!important}\\\"}]\\n\"])</script><script>self.__next_f.push([1,\"0:{\\\"P\\\":null,\\\"b\\\":\\\"4xlWUdmYkOQZmVpTO2yEI\\\",\\\"c\\\":[\\\"\\\",\\\"\\\"],\\\"q\\\":\\\"\\\",\\\"i\\\":false,\\\"f\\\":[[[\\\"\\\",{\\\"children\\\":[\\\"__PAGE__\\\",{}]},\\\"$undefined\\\",\\\"$undefined\\\",true],[[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[[[\\\"$\\\",\\\"link\\\",\\\"0\\\",{\\\"rel\\\":\\\"stylesheet\\\",\\\"href\\\":\\\"/_next/static/chunks/543732a8392562b4.css\\\",\\\"precedence\\\":\\\"next\\\",\\\"crossOrigin\\\":\\\"$undefined\\\",\\\"nonce\\\":\\\"$undefined\\\"}],[\\\"$\\\",\\\"script\\\",\\\"script-0\\\",{\\\"src\\\":\\\"/_next/static/chunks/19717b1d18b1c046.js\\\",\\\"async\\\":true,\\\"nonce\\\":\\\"$undefined\\\"}]],[\\\"$\\\",\\\"html\\\",null,{\\\"lang\\\":\\\"en\\\",\\\"className\\\":\\\"js\\\",\\\"children\\\":[[\\\"$\\\",\\\"head\\\",null,{\\\"children\\\":[[\\\"$\\\",\\\"script\\\",null,{\\\"type\\\":\\\"application/ld+json\\\",\\\"dangerouslySetInnerHTML\\\":{\\\"__html\\\":\\\"{\\\\\\\"@context\\\\\\\":\\\\\\\"https://schema.org\\\\\\\",\\\\\\\"@graph\\\\\\\":[{\\\\\\\"@type\\\\\\\":\\\\\\\"WebSite\\\\\\\",\\\\\\\"@id\\\\\\\":\\\\\\\"https://mos.caldis.me/#website\\\\\\\",\\\\\\\"url\\\\\\\":\\\\\\\"https://mos.caldis.me/\\\\\\\",\\\\\\\"name\\\\\\\":\\\\\\\"Mos\\\\\\\",\\\\\\\"description\\\\\\\":\\\\\\\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\\\\\\\",\\\\\\\"inLanguage\\\\\\\":\\\\\\\"en\\\\\\\"},{\\\\\\\"@type\\\\\\\":\\\\\\\"SoftwareApplication\\\\\\\",\\\\\\\"@id\\\\\\\":\\\\\\\"https://mos.caldis.me/#software\\\\\\\",\\\\\\\"name\\\\\\\":\\\\\\\"Mos\\\\\\\",\\\\\\\"url\\\\\\\":\\\\\\\"https://mos.caldis.me/\\\\\\\",\\\\\\\"operatingSystem\\\\\\\":\\\\\\\"macOS\\\\\\\",\\\\\\\"applicationCategory\\\\\\\":\\\\\\\"UtilitiesApplication\\\\\\\",\\\\\\\"description\\\\\\\":\\\\\\\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\\\\\\\",\\\\\\\"downloadUrl\\\\\\\":\\\\\\\"https://github.com/Caldis/Mos/releases/latest\\\\\\\",\\\\\\\"softwareHelp\\\\\\\":\\\\\\\"https://github.com/Caldis/Mos/wiki\\\\\\\",\\\\\\\"sameAs\\\\\\\":[\\\\\\\"https://github.com/Caldis/Mos\\\\\\\"],\\\\\\\"license\\\\\\\":\\\\\\\"https://creativecommons.org/licenses/by-nc/4.0/\\\\\\\",\\\\\\\"offers\\\\\\\":{\\\\\\\"@type\\\\\\\":\\\\\\\"Offer\\\\\\\",\\\\\\\"price\\\\\\\":\\\\\\\"0\\\\\\\",\\\\\\\"priceCurrency\\\\\\\":\\\\\\\"USD\\\\\\\"}}]}\\\"}}],[\\\"$\\\",\\\"noscript\\\",null,{\\\"children\\\":\\\"$2\\\"}]]}],[\\\"$\\\",\\\"body\\\",null,{\\\"className\\\":\\\"syne_d93b7706-module__Y_KGdq__variable space_grotesk_8677877b-module__OT3qGa__variable ibm_plex_mono_e0f5f7ea-module__w-hdTq__variable antialiased\\\",\\\"children\\\":[[\\\"$\\\",\\\"$L3\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"$L4\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L5\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"notFound\\\":[[[\\\"$\\\",\\\"title\\\",null,{\\\"children\\\":\\\"404: This page could not be found.\\\"}],[\\\"$\\\",\\\"div\\\",null,{\\\"style\\\":{\\\"fontFamily\\\":\\\"system-ui,\\\\\\\"Segoe UI\\\\\\\",Roboto,Helvetica,Arial,sans-serif,\\\\\\\"Apple Color Emoji\\\\\\\",\\\\\\\"Segoe UI Emoji\\\\\\\"\\\",\\\"height\\\":\\\"100vh\\\",\\\"textAlign\\\":\\\"center\\\",\\\"display\\\":\\\"flex\\\",\\\"flexDirection\\\":\\\"column\\\",\\\"alignItems\\\":\\\"center\\\",\\\"justifyContent\\\":\\\"center\\\"},\\\"children\\\":[\\\"$\\\",\\\"div\\\",null,{\\\"children\\\":[[\\\"$\\\",\\\"style\\\",null,{\\\"dangerouslySetInnerHTML\\\":{\\\"__html\\\":\\\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\\\"}}],[\\\"$\\\",\\\"h1\\\",null,{\\\"className\\\":\\\"next-error-h1\\\",\\\"style\\\":{\\\"display\\\":\\\"inline-block\\\",\\\"margin\\\":\\\"0 20px 0 0\\\",\\\"padding\\\":\\\"0 23px 0 0\\\",\\\"fontSize\\\":24,\\\"fontWeight\\\":500,\\\"verticalAlign\\\":\\\"top\\\",\\\"lineHeight\\\":\\\"49px\\\"},\\\"children\\\":404}],[\\\"$\\\",\\\"div\\\",null,{\\\"style\\\":{\\\"display\\\":\\\"inline-block\\\"},\\\"children\\\":[\\\"$\\\",\\\"h2\\\",null,{\\\"style\\\":{\\\"fontSize\\\":14,\\\"fontWeight\\\":400,\\\"lineHeight\\\":\\\"49px\\\",\\\"margin\\\":0},\\\"children\\\":\\\"This page could not be found.\\\"}]}]]}]}]],[]],\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]}],[\\\"$\\\",\\\"$L6\\\",null,{\\\"src\\\":\\\"https://www.googletagmanager.com/gtag/js?id=G-9M7WPLB8BR\\\",\\\"strategy\\\":\\\"afterInteractive\\\"}],[\\\"$\\\",\\\"$L6\\\",null,{\\\"id\\\":\\\"ga4\\\",\\\"strategy\\\":\\\"afterInteractive\\\",\\\"children\\\":\\\"\\\\n            window.dataLayer = window.dataLayer || [];\\\\n            function gtag(){dataLayer.push(arguments);}\\\\n            gtag('js', new Date());\\\\n            gtag('config', 'G-9M7WPLB8BR');\\\\n          \\\"}]]}]]}]]}],{\\\"children\\\":[[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[[\\\"$\\\",\\\"$L7\\\",null,{}],[[\\\"$\\\",\\\"script\\\",\\\"script-0\\\",{\\\"src\\\":\\\"/_next/static/chunks/d95bda38d1a9ce53.js\\\",\\\"async\\\":true,\\\"nonce\\\":\\\"$undefined\\\"}],[\\\"$\\\",\\\"script\\\",\\\"script-1\\\",{\\\"src\\\":\\\"/_next/static/chunks/b492b32695e3b282.js\\\",\\\"async\\\":true,\\\"nonce\\\":\\\"$undefined\\\"}]],[\\\"$\\\",\\\"$L8\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"$9\\\",null,{\\\"name\\\":\\\"Next.MetadataOutlet\\\",\\\"children\\\":\\\"$@a\\\"}]}]]}],{},null,false,false]},null,false,false],[\\\"$\\\",\\\"$1\\\",\\\"h\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"$Lb\\\",null,{\\\"children\\\":\\\"$Lc\\\"}],[\\\"$\\\",\\\"div\\\",null,{\\\"hidden\\\":true,\\\"children\\\":[\\\"$\\\",\\\"$Ld\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"$9\\\",null,{\\\"name\\\":\\\"Next.Metadata\\\",\\\"children\\\":\\\"$Le\\\"}]}]}],[\\\"$\\\",\\\"meta\\\",null,{\\\"name\\\":\\\"next-size-adjust\\\",\\\"content\\\":\\\"\\\"}]]}],false]],\\\"m\\\":\\\"$undefined\\\",\\\"G\\\":[\\\"$f\\\",[]],\\\"S\\\":true}\\n\"])</script><script>self.__next_f.push([1,\"c:[[\\\"$\\\",\\\"meta\\\",\\\"0\\\",{\\\"charSet\\\":\\\"utf-8\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"1\\\",{\\\"name\\\":\\\"viewport\\\",\\\"content\\\":\\\"width=device-width, initial-scale=1\\\"}]]\\n\"])</script><script>self.__next_f.push([1,\"10:I[46886,[\\\"/_next/static/chunks/c62ecb7f1a587007.js\\\",\\\"/_next/static/chunks/2f0565a65fa02d97.js\\\"],\\\"IconMark\\\"]\\na:null\\n\"])</script><script>self.__next_f.push([1,\"e:[[\\\"$\\\",\\\"title\\\",\\\"0\\\",{\\\"children\\\":\\\"Mos | Turn the mouse into flow\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"1\\\",{\\\"name\\\":\\\"description\\\",\\\"content\\\":\\\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\\\"}],[\\\"$\\\",\\\"link\\\",\\\"2\\\",{\\\"rel\\\":\\\"canonical\\\",\\\"href\\\":\\\"https://mos.caldis.me/\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"3\\\",{\\\"property\\\":\\\"og:title\\\",\\\"content\\\":\\\"Mos | Turn the mouse into flow\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"4\\\",{\\\"property\\\":\\\"og:description\\\",\\\"content\\\":\\\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"5\\\",{\\\"property\\\":\\\"og:url\\\",\\\"content\\\":\\\"https://mos.caldis.me/\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"6\\\",{\\\"property\\\":\\\"og:site_name\\\",\\\"content\\\":\\\"Mos\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"7\\\",{\\\"property\\\":\\\"og:image\\\",\\\"content\\\":\\\"https://mos.caldis.me/og.svg\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"8\\\",{\\\"property\\\":\\\"og:image:width\\\",\\\"content\\\":\\\"1200\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"9\\\",{\\\"property\\\":\\\"og:image:height\\\",\\\"content\\\":\\\"630\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"10\\\",{\\\"property\\\":\\\"og:image:alt\\\",\\\"content\\\":\\\"Mos | Turn the mouse into flow\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"11\\\",{\\\"property\\\":\\\"og:type\\\",\\\"content\\\":\\\"website\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"12\\\",{\\\"name\\\":\\\"twitter:card\\\",\\\"content\\\":\\\"summary_large_image\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"13\\\",{\\\"name\\\":\\\"twitter:title\\\",\\\"content\\\":\\\"Mos | Turn the mouse into flow\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"14\\\",{\\\"name\\\":\\\"twitter:description\\\",\\\"content\\\":\\\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"15\\\",{\\\"name\\\":\\\"twitter:image\\\",\\\"content\\\":\\\"https://mos.caldis.me/og.svg\\\"}],[\\\"$\\\",\\\"link\\\",\\\"16\\\",{\\\"rel\\\":\\\"icon\\\",\\\"href\\\":\\\"/favicon.ico?favicon.6def09c8.ico\\\",\\\"sizes\\\":\\\"256x256\\\",\\\"type\\\":\\\"image/x-icon\\\"}],[\\\"$\\\",\\\"$L10\\\",\\\"17\\\",{}]]\\n\"])</script></body></html>"
  },
  {
    "path": "docs/index.txt",
    "content": "1:\"$Sreact.fragment\"\n3:I[96923,[\"/_next/static/chunks/19717b1d18b1c046.js\"],\"Providers\"]\n4:I[33720,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"default\"]\n5:I[16458,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"default\"]\n6:I[13154,[\"/_next/static/chunks/19717b1d18b1c046.js\"],\"\"]\n7:I[61096,[\"/_next/static/chunks/19717b1d18b1c046.js\",\"/_next/static/chunks/d95bda38d1a9ce53.js\",\"/_next/static/chunks/b492b32695e3b282.js\"],\"default\"]\n8:I[45924,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"OutletBoundary\"]\n9:\"$Sreact.suspense\"\nb:I[45924,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"ViewportBoundary\"]\nd:I[45924,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"MetadataBoundary\"]\nf:I[70566,[],\"default\"]\n:HL[\"/_next/static/chunks/543732a8392562b4.css\",\"style\"]\n:HL[\"/_next/static/media/0c795a286deabae8-s.p.b6c48e4e.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/0c89a48fa5027cee-s.p.4564287c.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/23b7a97ae3b5c134-s.p.2902b61f.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/99e609270109b47d-s.p.64b9304e.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/effe91970fc4db64-s.p.19510058.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n2:[\"$\",\"style\",null,{\"children\":\"html.js .reveal{opacity:1!important;transform:none!important;filter:none!important}\"}]\n0:{\"P\":null,\"b\":\"4xlWUdmYkOQZmVpTO2yEI\",\"c\":[\"\",\"\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]},\"$undefined\",\"$undefined\",true],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/543732a8392562b4.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/19717b1d18b1c046.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"js\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"script\",null,{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@graph\\\":[{\\\"@type\\\":\\\"WebSite\\\",\\\"@id\\\":\\\"https://mos.caldis.me/#website\\\",\\\"url\\\":\\\"https://mos.caldis.me/\\\",\\\"name\\\":\\\"Mos\\\",\\\"description\\\":\\\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\\\",\\\"inLanguage\\\":\\\"en\\\"},{\\\"@type\\\":\\\"SoftwareApplication\\\",\\\"@id\\\":\\\"https://mos.caldis.me/#software\\\",\\\"name\\\":\\\"Mos\\\",\\\"url\\\":\\\"https://mos.caldis.me/\\\",\\\"operatingSystem\\\":\\\"macOS\\\",\\\"applicationCategory\\\":\\\"UtilitiesApplication\\\",\\\"description\\\":\\\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\\\",\\\"downloadUrl\\\":\\\"https://github.com/Caldis/Mos/releases/latest\\\",\\\"softwareHelp\\\":\\\"https://github.com/Caldis/Mos/wiki\\\",\\\"sameAs\\\":[\\\"https://github.com/Caldis/Mos\\\"],\\\"license\\\":\\\"https://creativecommons.org/licenses/by-nc/4.0/\\\",\\\"offers\\\":{\\\"@type\\\":\\\"Offer\\\",\\\"price\\\":\\\"0\\\",\\\"priceCurrency\\\":\\\"USD\\\"}}]}\"}}],[\"$\",\"noscript\",null,{\"children\":\"$2\"}]]}],[\"$\",\"body\",null,{\"className\":\"syne_d93b7706-module__Y_KGdq__variable space_grotesk_8677877b-module__OT3qGa__variable ibm_plex_mono_e0f5f7ea-module__w-hdTq__variable antialiased\",\"children\":[[\"$\",\"$L3\",null,{\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}],[\"$\",\"$L6\",null,{\"src\":\"https://www.googletagmanager.com/gtag/js?id=G-9M7WPLB8BR\",\"strategy\":\"afterInteractive\"}],[\"$\",\"$L6\",null,{\"id\":\"ga4\",\"strategy\":\"afterInteractive\",\"children\":\"\\n            window.dataLayer = window.dataLayer || [];\\n            function gtag(){dataLayer.push(arguments);}\\n            gtag('js', new Date());\\n            gtag('config', 'G-9M7WPLB8BR');\\n          \"}]]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L7\",null,{}],[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/d95bda38d1a9ce53.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/b492b32695e3b282.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L8\",null,{\"children\":[\"$\",\"$9\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@a\"}]}]]}],{},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$Lb\",null,{\"children\":\"$Lc\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Ld\",null,{\"children\":[\"$\",\"$9\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Le\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$f\",[]],\"S\":true}\nc:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n10:I[46886,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\"IconMark\"]\na:null\ne:[[\"$\",\"title\",\"0\",{\"children\":\"Mos | Turn the mouse into flow\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\"}],[\"$\",\"link\",\"2\",{\"rel\":\"canonical\",\"href\":\"https://mos.caldis.me/\"}],[\"$\",\"meta\",\"3\",{\"property\":\"og:title\",\"content\":\"Mos | Turn the mouse into flow\"}],[\"$\",\"meta\",\"4\",{\"property\":\"og:description\",\"content\":\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\"}],[\"$\",\"meta\",\"5\",{\"property\":\"og:url\",\"content\":\"https://mos.caldis.me/\"}],[\"$\",\"meta\",\"6\",{\"property\":\"og:site_name\",\"content\":\"Mos\"}],[\"$\",\"meta\",\"7\",{\"property\":\"og:image\",\"content\":\"https://mos.caldis.me/og.svg\"}],[\"$\",\"meta\",\"8\",{\"property\":\"og:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"9\",{\"property\":\"og:image:height\",\"content\":\"630\"}],[\"$\",\"meta\",\"10\",{\"property\":\"og:image:alt\",\"content\":\"Mos | Turn the mouse into flow\"}],[\"$\",\"meta\",\"11\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"$\",\"meta\",\"12\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"13\",{\"name\":\"twitter:title\",\"content\":\"Mos | Turn the mouse into flow\"}],[\"$\",\"meta\",\"14\",{\"name\":\"twitter:description\",\"content\":\"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\"}],[\"$\",\"meta\",\"15\",{\"name\":\"twitter:image\",\"content\":\"https://mos.caldis.me/og.svg\"}],[\"$\",\"link\",\"16\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.6def09c8.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$L10\",\"17\",{}]]\n"
  },
  {
    "path": "docs/llms.txt",
    "content": "# Mos (macOS)\n\nMos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\n\n## Official links\n\n- Homepage: https://mos.caldis.me/\n- GitHub: https://github.com/Caldis/Mos\n- Docs (Wiki): https://github.com/Caldis/Mos/wiki\n- Releases: https://github.com/Caldis/Mos/releases\n- Latest release: https://github.com/Caldis/Mos/releases/latest\n\n## Install\n\n- Homebrew (beta cask): `brew install --cask mos@beta`\n\n## Notes\n\n- License: CC BY-NC 4.0 (https://creativecommons.org/licenses/by-nc/4.0/)\n- Mos is not intended to be distributed via the Mac App Store (per project license notes).\n\n"
  },
  {
    "path": "docs/release-notes/4.0.0-beta-20260108.1.en.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\" />\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n  <title>Mos Release Notes</title>\n  <style>\n    body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;line-height:1.5;padding:20px;max-width:900px;margin:0 auto;}\n    h2{margin:18px 0 8px 0;}\n    ul{margin:6px 0 14px 18px;}\n    code{background:#f3f4f6;padding:0 4px;border-radius:4px;}\n    a{color:#2563eb;text-decoration:none;}\n    a:hover{text-decoration:underline;}\n  </style>\n</head>\n<body>\n<h2>New Feature</h2>\n<ul><li>Added in-app update checking via Sparkle, with an optional beta channel toggle.</li></ul>\n\n<h2>Improvements</h2>\n<ul><li>Updated French localization.</li></ul>\n\n<h2>Fixes</h2>\n<ul><li>Allowed binding the middle mouse button without modifier keys.</li><li>Fixed some shortcut issues on non‑US keyboard layouts.</li></ul>\n</body>\n</html>\n"
  },
  {
    "path": "docs/release-notes/4.0.0-beta-20260108.1.zh.html",
    "content": "<!doctype html>\n<html lang=\"zh\">\n<head>\n  <meta charset=\"utf-8\" />\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n  <title>Mos Release Notes</title>\n  <style>\n    body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;line-height:1.5;padding:20px;max-width:900px;margin:0 auto;}\n    h2{margin:18px 0 8px 0;}\n    ul{margin:6px 0 14px 18px;}\n    code{background:#f3f4f6;padding:0 4px;border-radius:4px;}\n    a{color:#2563eb;text-decoration:none;}\n    a:hover{text-decoration:underline;}\n  </style>\n</head>\n<body>\n<h2>新功能</h2>\n<ul><li>新增应用内更新检查（Sparkle），并支持 Beta 渠道开关。</li></ul>\n\n<h2>改进</h2>\n<ul><li>更新法语本地化翻译。</li></ul>\n\n<h2>修复</h2>\n<ul><li>允许在不按修饰键的情况下绑定鼠标中键。</li><li>修复部分非 US 键盘布局下的快捷键问题。</li></ul>\n</body>\n</html>\n"
  },
  {
    "path": "docs/release-notes/4.0.0-beta-20260201.1.en.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\" />\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n  <title>Mos Release Notes</title>\n  <style>\n    body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;line-height:1.5;padding:20px;max-width:900px;margin:0 auto;}\n    h2{margin:18px 0 8px 0;}\n    ul{margin:6px 0 14px 18px;}\n    code{background:#f3f4f6;padding:0 4px;border-radius:4px;}\n    a{color:#2563eb;text-decoration:none;}\n    a:hover{text-decoration:underline;}\n  </style>\n</head>\n<body>\n<h2>New Feature</h2>\n<ul><li>Added in-app update checking via Sparkle, with an optional beta channel toggle.</li><li>Scroll hotkeys can now be bound to any key.</li></ul>\n\n<h2>Improvements</h2>\n<ul><li>Refined other localization strings.</li></ul>\n\n<h2>Fixes</h2>\n<ul><li>Fixed shortcut issues on non‑US keyboard layouts.</li><li>Fixed smooth scrolling not working properly with Remote Desktop or some special devices.</li></ul>\n</body>\n</html>\n"
  },
  {
    "path": "docs/release-notes/4.0.0-beta-20260201.1.md",
    "content": "> 这是测试版本, 一些功能或内容可能会在正式版本中变更\n>\n> 如果应用无法启动或遇到权限问题, 请参考 [Wiki: 如果应用无法正常运行](https://github.com/Caldis/Mos/wiki/%E5%A6%82%E6%9E%9C%E5%BA%94%E7%94%A8%E6%97%A0%E6%B3%95%E6%AD%A3%E5%B8%B8%E8%BF%90%E8%A1%8C)\n\n### 新功能\n- 新增应用内更新检查（Sparkle），并支持可选的 Beta 渠道。\n- 滚动功能键现在支持绑定任意热键。\n\n### 改进\n- 补充并修正部分本地化内容。\n\n### 修复\n- 修复部分非 US 键盘布局下的快捷键问题。\n- 修复远程桌面或部分特殊设备的滚动输入无法被正确平滑的问题。\n\n---\n\n> This is a beta version, some features or content may change in the official release.\n>\n> If the application fails to start or encounters permission issues, please refer [Wiki: If the App not work properly](https://github.com/Caldis/Mos/wiki/If-the-App-not-work-properly)\n\n### New Feature\n- Added in-app update checking via Sparkle, with an optional beta channel toggle.\n- Scroll hotkeys can now be bound to any key.\n\n### Improvements\n- Refined other localization strings.\n\n### Fixes\n- Fixed shortcut issues on non‑US keyboard layouts.\n- Fixed smooth scrolling not working properly with Remote Desktop or some special devices.\n"
  },
  {
    "path": "docs/release-notes/4.0.0-beta-20260201.1.zh.html",
    "content": "<!doctype html>\n<html lang=\"zh\">\n<head>\n  <meta charset=\"utf-8\" />\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n  <title>Mos Release Notes</title>\n  <style>\n    body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;line-height:1.5;padding:20px;max-width:900px;margin:0 auto;}\n    h2{margin:18px 0 8px 0;}\n    ul{margin:6px 0 14px 18px;}\n    code{background:#f3f4f6;padding:0 4px;border-radius:4px;}\n    a{color:#2563eb;text-decoration:none;}\n    a:hover{text-decoration:underline;}\n  </style>\n</head>\n<body>\n<h2>新功能</h2>\n<ul><li>新增应用内更新检查（Sparkle），并支持可选的 Beta 渠道。</li><li>滚动功能键现在支持绑定任意热键。</li></ul>\n\n<h2>改进</h2>\n<ul><li>补充并修正部分本地化内容。</li></ul>\n\n<h2>修复</h2>\n<ul><li>修复部分非 US 键盘布局下的快捷键问题。</li><li>修复远程桌面或部分特殊设备的滚动输入无法被正确平滑的问题。</li></ul>\n</body>\n</html>\n"
  },
  {
    "path": "docs/release-notes/4.0.0-beta-20260203.1.en.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\" />\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n  <title>Mos Release Notes</title>\n  <style>\n    body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;line-height:1.5;padding:20px;max-width:900px;margin:0 auto;}\n    h2{margin:18px 0 8px 0;}\n    ul{margin:6px 0 14px 18px;}\n    code{background:#f3f4f6;padding:0 4px;border-radius:4px;}\n    a{color:#2563eb;text-decoration:none;}\n    a:hover{text-decoration:underline;}\n  </style>\n</head>\n<body>\n<h2>Improvements</h2>\n<ul><li>Updated localization.</li></ul>\n</body>\n</html>\n"
  },
  {
    "path": "docs/release-notes/4.0.0-beta-20260203.1.zh.html",
    "content": "<!doctype html>\n<html lang=\"zh\">\n<head>\n  <meta charset=\"utf-8\" />\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n  <title>Mos Release Notes</title>\n  <style>\n    body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;line-height:1.5;padding:20px;max-width:900px;margin:0 auto;}\n    h2{margin:18px 0 8px 0;}\n    ul{margin:6px 0 14px 18px;}\n    code{background:#f3f4f6;padding:0 4px;border-radius:4px;}\n    a{color:#2563eb;text-decoration:none;}\n    a:hover{text-decoration:underline;}\n  </style>\n</head>\n<body>\n<h2>改进</h2>\n<ul><li>更新本地化翻译。</li></ul>\n</body>\n</html>\n"
  },
  {
    "path": "docs/release-notes/beta.en.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\" />\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n  <title>Mos Release Notes</title>\n  <style>\n    body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;line-height:1.5;padding:20px;max-width:900px;margin:0 auto;}\n    .version{padding:16px 0;border-bottom:1px solid #e5e7eb;}\n    .version:last-of-type{border-bottom:0;}\n    .version.sparkle-installed-version{opacity:0.55;}\n    .version.sparkle-installed-version ~ .version{display:none;}\n    h1{margin:0 0 14px 0;font-size:22px;}\n    h2{margin:18px 0 8px 0;}\n    ul{margin:6px 0 14px 18px;}\n    code{background:#f3f4f6;padding:0 4px;border-radius:4px;}\n    a{color:#2563eb;text-decoration:none;}\n    a:hover{text-decoration:underline;}\n  </style>\n</head>\n<body>\n<div class=\"version\" data-sparkle-version=\"20260203.1\">\n<h1>Mos 4.0.0-beta (20260203.1)</h1>\n<h2>Improvements</h2>\n<ul><li>Updated localization.</li></ul>\n</div>\n\n<div class=\"version\" data-sparkle-version=\"20260201.1\">\n<h1>Mos 4.0.0-beta (20260201.1)</h1>\n<h2>New Feature</h2>\n<ul><li>Added in-app update checking via Sparkle, with an optional beta channel toggle.</li><li>Scroll hotkeys can now be bound to any key.</li></ul>\n\n<h2>Improvements</h2>\n<ul><li>Refined other localization strings.</li></ul>\n\n<h2>Fixes</h2>\n<ul><li>Fixed shortcut issues on non‑US keyboard layouts.</li><li>Fixed smooth scrolling not working properly with Remote Desktop or some special devices.</li></ul>\n</div>\n\n<div class=\"version\" data-sparkle-version=\"20260108.1\">\n<h1>Mos 4.0.0-beta (20260108.1)</h1>\n<h2>New Feature</h2>\n<ul><li>Added in-app update checking via Sparkle, with an optional beta channel toggle.</li></ul>\n\n<h2>Improvements</h2>\n<ul><li>Updated French localization.</li></ul>\n\n<h2>Fixes</h2>\n<ul><li>Allowed binding the middle mouse button without modifier keys.</li><li>Fixed some shortcut issues on non‑US keyboard layouts.</li></ul>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "docs/release-notes/beta.zh.html",
    "content": "<!doctype html>\n<html lang=\"zh\">\n<head>\n  <meta charset=\"utf-8\" />\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n  <title>Mos Release Notes</title>\n  <style>\n    body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;line-height:1.5;padding:20px;max-width:900px;margin:0 auto;}\n    .version{padding:16px 0;border-bottom:1px solid #e5e7eb;}\n    .version:last-of-type{border-bottom:0;}\n    .version.sparkle-installed-version{opacity:0.55;}\n    .version.sparkle-installed-version ~ .version{display:none;}\n    h1{margin:0 0 14px 0;font-size:22px;}\n    h2{margin:18px 0 8px 0;}\n    ul{margin:6px 0 14px 18px;}\n    code{background:#f3f4f6;padding:0 4px;border-radius:4px;}\n    a{color:#2563eb;text-decoration:none;}\n    a:hover{text-decoration:underline;}\n  </style>\n</head>\n<body>\n<div class=\"version\" data-sparkle-version=\"20260203.1\">\n<h1>Mos 4.0.0-beta (20260203.1)</h1>\n<h2>改进</h2>\n<ul><li>更新本地化翻译。</li></ul>\n</div>\n\n<div class=\"version\" data-sparkle-version=\"20260201.1\">\n<h1>Mos 4.0.0-beta (20260201.1)</h1>\n<h2>新功能</h2>\n<ul><li>新增应用内更新检查（Sparkle），并支持可选的 Beta 渠道。</li><li>滚动功能键现在支持绑定任意热键。</li></ul>\n\n<h2>改进</h2>\n<ul><li>补充并修正部分本地化内容。</li></ul>\n\n<h2>修复</h2>\n<ul><li>修复部分非 US 键盘布局下的快捷键问题。</li><li>修复远程桌面或部分特殊设备的滚动输入无法被正确平滑的问题。</li></ul>\n</div>\n\n<div class=\"version\" data-sparkle-version=\"20260108.1\">\n<h1>Mos 4.0.0-beta (20260108.1)</h1>\n<h2>新功能</h2>\n<ul><li>新增应用内更新检查（Sparkle），并支持 Beta 渠道开关。</li></ul>\n\n<h2>改进</h2>\n<ul><li>更新法语本地化翻译。</li></ul>\n\n<h2>修复</h2>\n<ul><li>允许在不按修饰键的情况下绑定鼠标中键。</li><li>修复部分非 US 键盘布局下的快捷键问题。</li></ul>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "docs/robots.txt",
    "content": "User-Agent: *\nAllow: /\n\nSitemap: https://mos.caldis.me/sitemap.xml\n"
  },
  {
    "path": "docs/sitemap.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n<url>\n<loc>https://mos.caldis.me/</loc>\n<changefreq>monthly</changefreq>\n<priority>1</priority>\n</url>\n</urlset>\n"
  },
  {
    "path": "docs/superpowers/plans/2026-03-16-logitech-hid-integration.md",
    "content": "# Logitech HID++ 2.0 Hardware Button Integration Plan\n\n> **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.\n\n**Goal:** Add Logitech HID++ 2.0 hardware button identification to Mos, allowing users to bind Logitech-specific buttons (gesture, DPI, etc.) to system shortcuts.\n\n**Architecture:** Introduce MosInputEvent abstraction layer (Mode C) that unifies CGEventTap and HID++ event sources. Both sources feed into MosInputProcessor independently. LogitechHIDManager communicates with Logitech devices via IOKit HIDManager and HID++ 2.0 protocol.\n\n**Tech Stack:** Swift, IOKit (IOHIDManager), HID++ 2.0 protocol, existing Mos Interceptor/ButtonCore/KeyRecorder infrastructure.\n\n**Spec:** `docs/superpowers/specs/2026-03-16-logitech-hid-integration-design.md`\n\n**Important:** This is a macOS Xcode project (Mos.xcodeproj). New .swift files must be added to the Xcode project's target. After creating each new file, run `open Mos.xcodeproj` and add it via File > Add Files, or use the `ruby` script in the verification step. macOS Deployment Target is 10.13+.\n\n---\n\n## File Structure\n\n### New Files\n\n| File | Directory | Responsibility |\n|------|-----------|----------------|\n| `MosInputEvent.swift` | `Mos/InputEvent/` | MosInputEvent struct, MosInputPhase, MosInputSource, MosInputDevice, DeviceFilter, LogitechCIDMap |\n| `MosInputProcessor.swift` | `Mos/InputEvent/` | MosInputProcessor singleton, MosInputResult enum |\n| `LogitechHIDManager.swift` | `Mos/LogitechHID/` | IOKit HIDManager wrapper, device enumeration, lifecycle, notification constants |\n| `LogitechDeviceSession.swift` | `Mos/LogitechHID/` | HID++ 2.0 protocol: feature discovery, button divert, report parsing, event dispatch |\n\n### Modified Files\n\n| File | Key Changes |\n|------|-------------|\n| `Mos/Windows/PreferencesWindow/ButtonsView/RecordedEvent.swift` | Add `deviceFilter` to RecordedEvent, add `matchesMosInput()`, add `init(from: MosInputEvent)`, add `ScrollHotkey.init(from: MosInputEvent)` |\n| `Mos/Keys/KeyCode.swift` | Add Logitech button code display mappings (1000+ range) |\n| `Mos/ButtonCore/ButtonCore.swift` | Refactor callback to use MosInputProcessor |\n| `Mos/Keys/KeyRecorder.swift` | Change delegate protocol from @objc to Swift protocol, add HID++ event listening during recording, update handleRecordedEvent for dual-source |\n| `Mos/Windows/PreferencesWindow/ButtonsView/PreferencesButtonsViewController.swift` | Update delegate method signatures from CGEvent to MosInputEvent |\n| `Mos/Windows/PreferencesWindow/ScrollingView/PreferencesScrollingViewController.swift` | Update delegate method signatures from CGEvent to MosInputEvent |\n| `Mos/AppDelegate.swift` | Add LogitechHIDManager start/stop lifecycle calls |\n\n---\n\n## Chunk 1: Data Model Layer\n\n### Task 1: Create MosInputEvent\n\n**Files:**\n- Create: `Mos/InputEvent/MosInputEvent.swift`\n\n- [ ] **Step 1: Create directory and file**\n\n```bash\nmkdir -p /Users/caldis/Desktop/Code/Mos/Mos/InputEvent\n```\n\nWrite `Mos/InputEvent/MosInputEvent.swift`:\n\n```swift\n//\n//  MosInputEvent.swift\n//  Mos\n//  统一输入事件 - 抽象 CGEventTap 和 HID++ 两种事件源\n//  Created by Mos on 2026/3/16.\n//  Copyright © 2026 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\n// MARK: - MosInputPhase\n/// 事件阶段\nenum MosInputPhase {\n    case down\n    case up\n}\n\n// MARK: - MosInputSource\n/// 事件来源 - 携带源头特有的数据\n/// 注意: 因为 cgEvent 关联值包含 CGEvent (非 Codable), MosInputEvent 整体不可序列化\n/// 只有从中提取的 RecordedEvent 走持久化路径\nenum MosInputSource {\n    /// 来自 CGEventTap, 携带原始 CGEvent 用于 pass-through/consume\n    case cgEvent(CGEvent)\n    /// 来自 Logitech HID++ 协议\n    case hidPlusPlus\n}\n\n// MARK: - MosInputDevice\n/// 设备信息 (可序列化, 用于 DeviceFilter 匹配和 UI 展示)\nstruct MosInputDevice: Codable, Equatable {\n    let vendorId: UInt16      // USB Vendor ID (Logitech = 0x046D)\n    let productId: UInt16     // USB Product ID\n    let name: String          // 人类可读名称 (如 \"MX Master 3S\")\n}\n\n// MARK: - DeviceFilter\n/// 设备过滤器 - 用于 ButtonBinding 中限制触发设备\nstruct DeviceFilter: Codable, Equatable {\n    let vendorId: UInt16?     // nil = 不限厂商\n    let productId: UInt16?    // nil = 不限型号\n\n    func matches(_ device: MosInputDevice?) -> Bool {\n        guard let device = device else { return false }\n        if let vid = vendorId, vid != device.vendorId { return false }\n        if let pid = productId, pid != device.productId { return false }\n        return true\n    }\n}\n\n// MARK: - LogitechCIDMap\n/// Logitech CID -> Mos 按钮码映射\n/// 标准 CGEvent 鼠标按钮: 0~31, Logitech HID++ 专有: 1000+\nstruct LogitechCIDMap {\n    private static let cidToCode: [UInt16: UInt16] = [\n        0x00C3: 1000,  // Gesture Button\n        0x00C4: 1001,  // SmartShift\n        0x00D7: 1002,  // DPI Change Button\n    ]\n\n    static func toMosCode(_ cid: UInt16) -> UInt16 {\n        if let known = cidToCode[cid] { return known }\n        let mapped = UInt32(2000) + UInt32(cid)\n        return mapped <= UInt32(UInt16.max) ? UInt16(mapped) : UInt16(cid & 0x0FFF) + 2000\n    }\n\n    static func displayName(forCode code: UInt16) -> String {\n        switch code {\n        case 1000: return \"Gesture\"\n        case 1001: return \"SmartShift\"\n        case 1002: return \"DPI\"\n        default:   return \"Logi(\\(code))\"\n        }\n    }\n\n    /// 判断按钮码是否属于 Logitech HID++ 专有范围\n    static func isLogitechCode(_ code: UInt16) -> Bool {\n        return code >= 1000\n    }\n}\n\n// MARK: - MosInputEvent\n/// 统一输入事件 (运行时对象, 不可序列化)\nstruct MosInputEvent {\n    let type: EventType           // .keyboard 或 .mouse (复用现有枚举)\n    let code: UInt16              // 按键码 / 按钮码\n    let modifiers: CGEventFlags   // 修饰键状态\n    let phase: MosInputPhase      // 按下 / 抬起\n    let source: MosInputSource    // 事件来源\n    let device: MosInputDevice?   // 设备信息 (CGEventTap 来源为 nil)\n\n    /// 从 CGEvent 构造\n    /// 注意: .flagsChanged 事件也属于键盘域 (修饰键按下/抬起), 必须和 keyDown/keyUp 同类处理\n    /// 这与 ScrollHotkey.init(from: CGEvent) 和 RecordedEvent.init(from: CGEvent) 中的判断一致\n    init(fromCGEvent event: CGEvent) {\n        if event.isKeyboardEvent || event.type == .flagsChanged {\n            self.type = .keyboard\n            self.code = event.keyCode\n        } else {\n            self.type = .mouse\n            self.code = event.mouseCode\n        }\n        self.modifiers = event.flags\n        self.phase = event.isKeyDown ? .down : .up\n        self.source = .cgEvent(event)\n        self.device = nil\n    }\n\n    /// 从 HID++ 数据构造\n    init(type: EventType, code: UInt16, modifiers: CGEventFlags,\n         phase: MosInputPhase, source: MosInputSource, device: MosInputDevice?) {\n        self.type = type\n        self.code = code\n        self.modifiers = modifiers\n        self.phase = phase\n        self.source = source\n        self.device = device\n    }\n\n    // MARK: - Display\n\n    /// 构造展示用名称组件\n    var displayComponents: [String] {\n        var components: [String] = []\n        // 修饰键\n        if modifiers.rawValue & CGEventFlags.maskShift.rawValue != 0 { components.append(\"⇧\") }\n        if modifiers.rawValue & CGEventFlags.maskControl.rawValue != 0 { components.append(\"⌃\") }\n        if modifiers.rawValue & CGEventFlags.maskAlternate.rawValue != 0 { components.append(\"⌥\") }\n        if modifiers.rawValue & CGEventFlags.maskCommand.rawValue != 0 { components.append(\"⌘\") }\n        // 按键名称\n        switch type {\n        case .keyboard:\n            components.append(KeyCode.keyMap[code] ?? \"Key(\\(code))\")\n        case .mouse:\n            if LogitechCIDMap.isLogitechCode(code) {\n                components.append(LogitechCIDMap.displayName(forCode: code))\n            } else {\n                components.append(KeyCode.mouseMap[code] ?? \"Mouse(\\(code))\")\n            }\n        }\n        return components\n    }\n\n    /// 是否为键盘事件\n    var isKeyboardEvent: Bool { type == .keyboard }\n\n    /// 是否为鼠标事件\n    var isMouseEvent: Bool { type == .mouse }\n\n    /// 是否有修饰键\n    var hasModifiers: Bool {\n        return modifiers.rawValue & KeyCode.modifiersMask != 0\n    }\n\n    /// 事件是否可录制 (combination 模式)\n    var isRecordable: Bool {\n        switch type {\n        case .keyboard:\n            if KeyCode.functionKeys.contains(code) { return true }\n            if !hasModifiers { return false }\n            return true\n        case .mouse:\n            if LogitechCIDMap.isLogitechCode(code) { return true }\n            if KeyCode.mouseMainKeys.contains(code) { return hasModifiers }\n            return true\n        }\n    }\n\n    /// 事件是否可录制 (singleKey 模式)\n    /// 注意: 修饰键 (.flagsChanged) 只在 key-down 时录制, key-up 忽略\n    /// 这与原 KeyRecorder.isRecordableAsSingleKey 中 event.isKeyDown && event.isModifiers 逻辑一致\n    var isRecordableAsSingleKey: Bool {\n        switch type {\n        case .keyboard:\n            if KeyCode.modifierKeys.contains(code) {\n                return phase == .down\n            }\n            return true\n        case .mouse:\n            if KeyCode.mouseMainKeys.contains(code) { return false }\n            return true\n        }\n    }\n}\n```\n\n- [ ] **Step 2: Verify file compiles**\n\n```bash\ncd /Users/caldis/Desktop/Code/Mos && xcodebuild -project Mos.xcodeproj -scheme Mos -configuration Debug build 2>&1 | tail -5\n```\n\nNote: The file must first be added to Xcode project. If building from CLI fails because the file isn't in the project, add it manually or verify syntax by checking for obvious errors.\n\n- [ ] **Step 3: Commit**\n\n```bash\ngit add Mos/InputEvent/MosInputEvent.swift\ngit commit -m \"feat: add MosInputEvent unified input event abstraction\"\n```\n\n---\n\n### Task 2: Create MosInputProcessor\n\n**Files:**\n- Create: `Mos/InputEvent/MosInputProcessor.swift`\n\n- [ ] **Step 1: Write MosInputProcessor**\n\n```swift\n//\n//  MosInputProcessor.swift\n//  Mos\n//  统一事件处理器 - 接收 MosInputEvent, 匹配 ButtonBinding, 执行动作\n//  Created by Mos on 2026/3/16.\n//  Copyright © 2026 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\n// MARK: - MosInputResult\n/// 事件处理结果\nenum MosInputResult {\n    case consumed     // 事件已处理,不再传递\n    case passthrough  // 事件未匹配,继续传递\n}\n\n// MARK: - MosInputProcessor\n/// 统一事件处理器 (无状态单例)\n/// 从 ButtonUtils 获取绑定配置, 匹配 MosInputEvent, 执行 ShortcutExecutor\nclass MosInputProcessor {\n    static let shared = MosInputProcessor()\n    init() { NSLog(\"Module initialized: MosInputProcessor\") }\n\n    /// 处理输入事件\n    /// - Parameter event: 统一输入事件\n    /// - Returns: .consumed 表示事件已处理, .passthrough 表示未匹配\n    func process(_ event: MosInputEvent) -> MosInputResult {\n        // 只处理按下事件 (避免 down+up 触发两次)\n        guard event.phase == .down else { return .passthrough }\n\n        let bindings = ButtonUtils.shared.getButtonBindings()\n        guard let binding = bindings.first(where: {\n            $0.triggerEvent.matchesMosInput(event) && $0.isEnabled\n        }) else {\n            return .passthrough\n        }\n\n        ShortcutExecutor.shared.execute(named: binding.systemShortcutName)\n        return .consumed\n    }\n}\n```\n\n- [ ] **Step 2: Commit**\n\n```bash\ngit add Mos/InputEvent/MosInputProcessor.swift\ngit commit -m \"feat: add MosInputProcessor unified event processor\"\n```\n\n---\n\n### Task 3: Extend RecordedEvent with MosInputEvent support\n\n**Files:**\n- Modify: `Mos/Windows/PreferencesWindow/ButtonsView/RecordedEvent.swift`\n\n- [ ] **Step 1: Add `deviceFilter` field to RecordedEvent**\n\nIn `RecordedEvent.swift`, after line 99 (`let displayComponents: [String]`), add:\n\n```swift\n    // 设备过滤器 (optional, 向后兼容: 旧数据解码为 nil, 匹配所有设备)\n    let deviceFilter: DeviceFilter?\n```\n\n- [ ] **Step 2: Add `matchesMosInput` method**\n\nIn `RecordedEvent.swift`, after the existing `matches(_ event: CGEvent)` method (line 147), add:\n\n```swift\n    /// 匹配 MosInputEvent (供 MosInputProcessor 使用)\n    func matchesMosInput(_ event: MosInputEvent) -> Bool {\n        // 1. 修饰键匹配\n        guard UInt(event.modifiers.rawValue) == modifiers else { return false }\n        // 2. 类型匹配\n        guard event.type == type else { return false }\n        // 3. 按键码匹配\n        switch type {\n        case .keyboard:\n            guard event.phase == .down else { return false }\n            guard code == event.code else { return false }\n        case .mouse:\n            guard code == event.code else { return false }\n        }\n        // 4. 设备过滤 (可选)\n        if let filter = deviceFilter {\n            guard filter.matches(event.device) else { return false }\n        }\n        return true\n    }\n```\n\n- [ ] **Step 3: Add `init(from: MosInputEvent)` constructor**\n\nAfter the existing `init(from event: CGEvent)` (line 127), add:\n\n```swift\n    /// 从 MosInputEvent 构造\n    init(from event: MosInputEvent, deviceFilter: DeviceFilter? = nil) {\n        self.type = event.type\n        self.code = event.code\n        self.modifiers = UInt(event.modifiers.rawValue)\n        self.deviceFilter = deviceFilter\n        self.displayComponents = event.displayComponents\n    }\n```\n\n- [ ] **Step 4: Update existing `init(from event: CGEvent)` to include deviceFilter**\n\nChange the existing CGEvent init to also set `deviceFilter = nil`:\n\n```swift\n    init(from event: CGEvent) {\n        self.modifiers = UInt(event.flags.rawValue)\n        if event.isKeyboardEvent {\n            self.type = .keyboard\n            self.code = event.keyCode\n        } else {\n            self.type = .mouse\n            self.code = event.mouseCode\n        }\n        self.displayComponents = event.displayComponents\n        self.deviceFilter = nil\n    }\n```\n\n- [ ] **Step 5: Add `ScrollHotkey.init(from: MosInputEvent)` extension**\n\nAt the bottom of the file, add:\n\n```swift\n// MARK: - ScrollHotkey + MosInputEvent\nextension ScrollHotkey {\n    /// 从 MosInputEvent 构造\n    init(from event: MosInputEvent) {\n        self.type = event.type\n        self.code = event.code\n    }\n}\n```\n\n- [ ] **Step 6: Commit**\n\n```bash\ngit add Mos/Windows/PreferencesWindow/ButtonsView/RecordedEvent.swift\ngit commit -m \"feat: extend RecordedEvent with MosInputEvent support and DeviceFilter\"\n```\n\n---\n\n### Task 4: Extend KeyCode with Logitech button names\n\n**Files:**\n- Modify: `Mos/Keys/KeyCode.swift:157-167`\n\n- [ ] **Step 1: Add Logitech mouse map entries**\n\nIn `KeyCode.swift`, extend the `mouseMap` dictionary (line 157) to include Logitech codes. Add after the existing entries (before the closing `]` on line 165):\n\n```swift\n        // Logitech HID++ 专有按键\n        1000: \"Gesture\", 1001: \"SmartShift\", 1002: \"DPI\",\n```\n\n- [ ] **Step 2: Commit**\n\n```bash\ngit add Mos/Keys/KeyCode.swift\ngit commit -m \"feat: add Logitech HID++ button names to KeyCode map\"\n```\n\n---\n\n### Task 5: Refactor ButtonCore to use MosInputProcessor\n\n**Files:**\n- Modify: `Mos/ButtonCore/ButtonCore.swift:34-50`\n\n- [ ] **Step 1: Replace buttonEventCallBack implementation**\n\nReplace the entire `buttonEventCallBack` closure (lines 34-50) with:\n\n```swift\n    let buttonEventCallBack: CGEventTapCallBack = { (proxy, type, event, refcon) in\n        let mosEvent = MosInputEvent(fromCGEvent: event)\n        let result = MosInputProcessor.shared.process(mosEvent)\n        switch result {\n        case .consumed:\n            return nil\n        case .passthrough:\n            return Unmanaged.passUnretained(event)\n        }\n    }\n```\n\n- [ ] **Step 2: Verify existing button bindings still work**\n\nBuild and run. Test that existing button bindings (e.g., mouse button 3 -> Mission Control) still trigger correctly. The behavior should be identical to before.\n\n- [ ] **Step 3: Commit**\n\n```bash\ngit add Mos/ButtonCore/ButtonCore.swift\ngit commit -m \"refactor: ButtonCore callback uses MosInputProcessor\"\n```\n\n---\n\n### Task 6: Refactor KeyRecorder delegate and recording\n\n**Files:**\n- Modify: `Mos/Keys/KeyRecorder.swift`\n\nThis is the most complex modification. Three changes:\n1. Delegate protocol: `@objc protocol` -> Swift protocol + extension default\n2. `handleRecordedEvent`: support both CGEvent and MosInputEvent from notification\n3. Add HID++ event observer during recording\n\n- [ ] **Step 1: Change delegate protocol (lines 21-32)**\n\nReplace:\n\n```swift\n@objc protocol KeyRecorderDelegate: AnyObject {\n    /// 录制完成回调\n    func onEventRecorded(_ recorder: KeyRecorder, didRecordEvent event: CGEvent, isDuplicate: Bool)\n\n    @objc optional func validateRecordedEvent(_ recorder: KeyRecorder, event: CGEvent) -> Bool\n}\n```\n\nWith:\n\n```swift\nprotocol KeyRecorderDelegate: AnyObject {\n    /// 录制完成回调\n    func onEventRecorded(_ recorder: KeyRecorder, didRecordEvent event: MosInputEvent, isDuplicate: Bool)\n\n    /// 验证录制的事件是否为重复\n    func validateRecordedEvent(_ recorder: KeyRecorder, event: MosInputEvent) -> Bool\n}\n\n/// 默认实现 (替代 @objc optional 语义)\nextension KeyRecorderDelegate {\n    func validateRecordedEvent(_ recorder: KeyRecorder, event: MosInputEvent) -> Bool {\n        return true\n    }\n}\n```\n\n- [ ] **Step 2: Add HID++ event observer property (after line 48)**\n\nAdd to the private properties section:\n\n```swift\n    private var hidEventObserver: NSObjectProtocol?  // HID++ 事件监听 (录制期间)\n```\n\n- [ ] **Step 3: Update `startRecording` to add HID++ listener**\n\nAt the end of the `do` block in `startRecording` (after the interceptor creation, before `keyPopover = KeyPopover()`), add:\n\n```swift\n            // 监听 HID++ 事件 (如果 LogitechHIDManager 已启动)\n            hidEventObserver = NotificationCenter.default.addObserver(\n                forName: LogitechHIDManager.buttonEventNotification,\n                object: nil,\n                queue: .main\n            ) { [weak self] notification in\n                guard let self = self, self.isRecording, !self.isRecorded else { return }\n                guard let mosEvent = notification.userInfo?[\"event\"] as? MosInputEvent else { return }\n                guard mosEvent.phase == .down else { return }\n                NotificationCenter.default.post(\n                    name: KeyRecorder.FINISH_NOTI_NAME,\n                    object: mosEvent\n                )\n            }\n```\n\n- [ ] **Step 4: Update `stopRecording` to remove HID++ listener**\n\nIn `stopRecording()`, after the line removing `CANCEL_NOTI_NAME` observer (line 287), add:\n\n```swift\n        if let observer = hidEventObserver {\n            NotificationCenter.default.removeObserver(observer)\n            hidEventObserver = nil\n        }\n```\n\n- [ ] **Step 5: Rewrite `handleRecordedEvent` to support dual-source (lines 204-240)**\n\nReplace the entire method:\n\n```swift\n    @objc private func handleRecordedEvent(_ notification: NSNotification) {\n        guard isRecording else { return }\n\n        // 统一转换为 MosInputEvent\n        let mosEvent: MosInputEvent\n        if let cgEvent = notification.object as? CGEvent {\n            mosEvent = MosInputEvent(fromCGEvent: cgEvent)\n        } else if let hidEvent = notification.object as? MosInputEvent {\n            mosEvent = hidEvent\n        } else {\n            NSLog(\"[EventRecorder] Unknown event type in notification\")\n            return\n        }\n\n        // 检查事件有效性 (根据录制模式)\n        let isValid = recordingMode == .singleKey\n            ? mosEvent.isRecordableAsSingleKey\n            : mosEvent.isRecordable\n        guard isValid else {\n            NSLog(\"[EventRecorder] Invalid event ignored\")\n            keyPopover?.keyPreview.shakeWarning()\n            invalidKeyPressCount += 1\n            if invalidKeyPressCount >= invalidKeyThreshold {\n                keyPopover?.showEscHint()\n            }\n            return\n        }\n\n        guard !isRecorded else { return }\n        isRecorded = true\n\n        let isNew = self.delegate?.validateRecordedEvent(self, event: mosEvent) ?? true\n        let isDuplicate = !isNew\n        let status: KeyPreview.Status = isNew ? .recorded : .duplicate\n\n        keyPopover?.keyPreview\n            .update(from: mosEvent.displayComponents, status: status)\n        self.delegate?.onEventRecorded(self, didRecordEvent: mosEvent, isDuplicate: isDuplicate)\n\n        DispatchQueue.main.asyncAfter(deadline: .now() + 0.7) { [weak self] in\n            self?.stopRecording()\n        }\n    }\n```\n\n- [ ] **Step 6: Update `handleModifierFlagsChanged` to use MosInputEvent for singleKey recording**\n\nIn `handleModifierFlagsChanged` (line 172), the method posts to `FINISH_NOTI_NAME` with a CGEvent. This is fine -- `handleRecordedEvent` now handles both types. No change needed here since it posts a CGEvent that gets converted.\n\n- [ ] **Step 7: Remove the private `isRecordableAsSingleKey` method (lines 249-270)**\n\nThis logic is now in `MosInputEvent.isRecordableAsSingleKey`. Delete the method:\n\n```swift\n    // DELETE: private func isRecordableAsSingleKey(_ event: CGEvent) -> Bool { ... }\n```\n\n- [ ] **Step 8: Commit**\n\n```bash\ngit add Mos/Keys/KeyRecorder.swift\ngit commit -m \"refactor: KeyRecorder supports MosInputEvent dual-source recording\"\n```\n\n---\n\n### Task 7: Update PreferencesButtonsViewController delegate\n\n**Files:**\n- Modify: `Mos/Windows/PreferencesWindow/ButtonsView/PreferencesButtonsViewController.swift:228-243`\n\n- [ ] **Step 1: Update delegate methods**\n\nReplace the `KeyRecorderDelegate` extension (lines 228-243):\n\n```swift\n// MARK: - EventRecorderDelegate\nextension PreferencesButtonsViewController: KeyRecorderDelegate {\n    func validateRecordedEvent(_ recorder: KeyRecorder, event: MosInputEvent) -> Bool {\n        let recordedEvent = RecordedEvent(from: event)\n        return !buttonBindings.contains(where: { $0.triggerEvent == recordedEvent })\n    }\n\n    func onEventRecorded(_ recorder: KeyRecorder, didRecordEvent event: MosInputEvent, isDuplicate: Bool) {\n        DispatchQueue.main.asyncAfter(deadline: .now() + 0.66) { [weak self] in\n            self?.addRecordedEvent(event, isDuplicate: isDuplicate)\n        }\n    }\n}\n```\n\n- [ ] **Step 2: Update `addRecordedEvent` method signature (line 92)**\n\nChange from `private func addRecordedEvent(_ event: CGEvent, isDuplicate: Bool)` to:\n\n```swift\n    private func addRecordedEvent(_ event: MosInputEvent, isDuplicate: Bool) {\n        let recordedEvent = RecordedEvent(from: event)\n\n        if isDuplicate {\n            if let existing = buttonBindings.first(where: { $0.triggerEvent == recordedEvent }) {\n                highlightExistingRow(with: existing.id)\n            }\n            return\n        }\n\n        let binding = ButtonBinding(triggerEvent: recordedEvent, systemShortcutName: \"\", isEnabled: false)\n        buttonBindings.append(binding)\n        tableView.reloadData()\n        toggleNoDataHint()\n        syncViewWithOptions()\n    }\n```\n\n- [ ] **Step 3: Commit**\n\n```bash\ngit add Mos/Windows/PreferencesWindow/ButtonsView/PreferencesButtonsViewController.swift\ngit commit -m \"refactor: PreferencesButtonsViewController uses MosInputEvent\"\n```\n\n---\n\n### Task 8: Update PreferencesScrollingViewController delegate\n\n**Files:**\n- Modify: `Mos/Windows/PreferencesWindow/ScrollingView/PreferencesScrollingViewController.swift:328-347`\n\n- [ ] **Step 1: Update delegate method**\n\nReplace the `KeyRecorderDelegate` extension (lines 328-347):\n\n```swift\n// MARK: - KeyRecorderDelegate\nextension PreferencesScrollingViewController: KeyRecorderDelegate {\n    func onEventRecorded(_ recorder: KeyRecorder, didRecordEvent event: MosInputEvent, isDuplicate: Bool) {\n        guard let popup = currentRecordingPopup else { return }\n\n        let hotkey = ScrollHotkey(from: event)\n\n        if popup === dashKeyBindButton {\n            getTargetApplicationScrollOptions().dash = hotkey\n        } else if popup === toggleKeyBindButton {\n            getTargetApplicationScrollOptions().toggle = hotkey\n        } else if popup === disableKeyBindButton {\n            getTargetApplicationScrollOptions().block = hotkey\n        }\n\n        currentRecordingPopup = nil\n        syncViewWithOptions()\n    }\n}\n```\n\n- [ ] **Step 2: Commit**\n\n```bash\ngit add Mos/Windows/PreferencesWindow/ScrollingView/PreferencesScrollingViewController.swift\ngit commit -m \"refactor: PreferencesScrollingViewController uses MosInputEvent\"\n```\n\n---\n\n### Task 9: Verify all existing functionality\n\n- [ ] **Step 1: Build project**\n\n```bash\ncd /Users/caldis/Desktop/Code/Mos && xcodebuild -project Mos.xcodeproj -scheme Mos -configuration Debug build 2>&1 | tail -20\n```\n\nFix any compilation errors.\n\n- [ ] **Step 2: Manual testing checklist**\n\nRun the app and verify:\n- Scroll smoothing works as before\n- Existing button bindings trigger correctly\n- Recording new button bindings works (both combination and singleKey mode)\n- Scroll hotkey recording works (dash/toggle/block)\n- Per-app scroll settings work\n- ESC cancels recording\n- Duplicate detection works (blue highlight for repeat bindings)\n\n- [ ] **Step 3: Commit if any fixes were needed**\n\n```bash\ngit add -A && git commit -m \"fix: resolve compilation issues from MosInputEvent migration\"\n```\n\n---\n\n## Chunk 2: Logitech HID Module\n\n### Task 10: Create LogitechHIDManager\n\n**Files:**\n- Create: `Mos/LogitechHID/LogitechHIDManager.swift`\n\n- [ ] **Step 1: Create directory**\n\n```bash\nmkdir -p /Users/caldis/Desktop/Code/Mos/Mos/LogitechHID\n```\n\n- [ ] **Step 2: Write LogitechHIDManager**\n\n```swift\n//\n//  LogitechHIDManager.swift\n//  Mos\n//  Logitech HID 设备管理器 - 通过 IOKit 枚举和监控 Logitech 设备\n//  Created by Mos on 2026/3/16.\n//  Copyright © 2026 Caldis. All rights reserved.\n//\n\nimport Foundation\nimport IOKit\nimport IOKit.hid\n\nclass LogitechHIDManager {\n    static let shared = LogitechHIDManager()\n    init() { NSLog(\"Module initialized: LogitechHIDManager\") }\n\n    // MARK: - Constants\n    static let logitechVendorId: Int = 0x046D\n    static let buttonEventNotification = NSNotification.Name(\"LogitechHIDButtonEvent\")\n\n    // MARK: - State\n    private var hidManager: IOHIDManager?\n    private var sessions: [IOHIDDevice: LogitechDeviceSession] = [:]\n    private(set) var isActive = false\n\n    // MARK: - Lifecycle\n\n    func start() {\n        guard !isActive else { return }\n        NSLog(\"[LogitechHID] Starting\")\n\n        hidManager = IOHIDManagerCreate(kCFAllocatorDefault, IOOptionBits(kIOHIDOptionsTypeNone))\n        guard let manager = hidManager else {\n            NSLog(\"[LogitechHID] Failed to create IOHIDManager\")\n            return\n        }\n\n        // 只匹配 Logitech 设备\n        let matchDict: [String: Any] = [\n            kIOHIDVendorIDKey as String: LogitechHIDManager.logitechVendorId\n        ]\n        IOHIDManagerSetDeviceMatching(manager, matchDict as CFDictionary)\n\n        // 注册回调 (使用 C 函数指针 + context)\n        let context = Unmanaged.passUnretained(self).toOpaque()\n        IOHIDManagerRegisterDeviceMatchingCallback(manager, Self.deviceMatchedCallback, context)\n        IOHIDManagerRegisterDeviceRemovalCallback(manager, Self.deviceRemovedCallback, context)\n\n        // Schedule 到 main RunLoop (HID++ 事件低频, 避免线程同步)\n        IOHIDManagerScheduleWithRunLoop(manager, CFRunLoopGetMain(), CFRunLoopMode.commonModes.rawValue)\n\n        let result = IOHIDManagerOpen(manager, IOOptionBits(kIOHIDOptionsTypeNone))\n        if result != kIOReturnSuccess {\n            NSLog(\"[LogitechHID] Failed to open IOHIDManager: 0x%08x\", result)\n            return\n        }\n\n        isActive = true\n        NSLog(\"[LogitechHID] Started\")\n    }\n\n    func stop() {\n        guard isActive else { return }\n        NSLog(\"[LogitechHID] Stopping\")\n\n        // 清理所有设备会话\n        for (_, session) in sessions {\n            session.teardown()\n        }\n        sessions.removeAll()\n\n        if let manager = hidManager {\n            IOHIDManagerClose(manager, IOOptionBits(kIOHIDOptionsTypeNone))\n            IOHIDManagerUnscheduleFromRunLoop(manager, CFRunLoopGetMain(), CFRunLoopMode.commonModes.rawValue)\n        }\n        hidManager = nil\n        isActive = false\n        NSLog(\"[LogitechHID] Stopped\")\n    }\n\n    // MARK: - Device Callbacks (C function pointers)\n\n    private static let deviceMatchedCallback: IOHIDDeviceCallback = { context, result, sender, device in\n        guard let context = context else { return }\n        let manager = Unmanaged<LogitechHIDManager>.fromOpaque(context).takeUnretainedValue()\n        manager.deviceConnected(device)\n    }\n\n    private static let deviceRemovedCallback: IOHIDDeviceCallback = { context, result, sender, device in\n        guard let context = context else { return }\n        let manager = Unmanaged<LogitechHIDManager>.fromOpaque(context).takeUnretainedValue()\n        manager.deviceDisconnected(device)\n    }\n\n    // MARK: - Device Management\n\n    private func deviceConnected(_ device: IOHIDDevice) {\n        // 读取设备信息\n        let vendorId = IOHIDDeviceGetProperty(device, kIOHIDVendorIDKey as CFString) as? Int ?? 0\n        let productId = IOHIDDeviceGetProperty(device, kIOHIDProductIDKey as CFString) as? Int ?? 0\n        let productName = IOHIDDeviceGetProperty(device, kIOHIDProductKey as CFString) as? String ?? \"Unknown\"\n\n        NSLog(\"[LogitechHID] Device connected: %@ (VID: 0x%04X, PID: 0x%04X)\", productName, vendorId, productId)\n\n        // 避免重复会话\n        guard sessions[device] == nil else { return }\n\n        // 创建会话\n        let session = LogitechDeviceSession(hidDevice: device)\n        sessions[device] = session\n        session.setup()\n    }\n\n    private func deviceDisconnected(_ device: IOHIDDevice) {\n        guard let session = sessions.removeValue(forKey: device) else { return }\n        NSLog(\"[LogitechHID] Device disconnected: %@\", session.deviceInfo.name)\n        session.teardown()\n    }\n\n    // MARK: - Query\n\n    /// 获取当前已连接的 Logitech 设备列表\n    var connectedDevices: [MosInputDevice] {\n        return sessions.values.map { $0.deviceInfo }\n    }\n}\n```\n\n- [ ] **Step 3: Commit**\n\n```bash\ngit add Mos/LogitechHID/LogitechHIDManager.swift\ngit commit -m \"feat: add LogitechHIDManager for IOKit device enumeration\"\n```\n\n---\n\n### Task 11: Create LogitechDeviceSession\n\n**Files:**\n- Create: `Mos/LogitechHID/LogitechDeviceSession.swift`\n\n- [ ] **Step 1: Write LogitechDeviceSession**\n\n```swift\n//\n//  LogitechDeviceSession.swift\n//  Mos\n//  单个 Logitech 设备的 HID++ 2.0 通信会话\n//  实现 Feature Discovery, Button Divert, 事件解析\n//  Created by Mos on 2026/3/16.\n//  Copyright © 2026 Caldis. All rights reserved.\n//\n\nimport Foundation\nimport IOKit\nimport IOKit.hid\n\nclass LogitechDeviceSession {\n\n    // MARK: - Public\n    let hidDevice: IOHIDDevice\n    let deviceInfo: MosInputDevice\n\n    // MARK: - HID++ State\n    private var featureIndex: [UInt16: UInt8] = [:]\n    private var divertedCIDs: Set<UInt16> = []\n    private var lastActiveCIDs: Set<UInt16> = []\n    private var deviceIndex: UInt8 = 0x01\n\n    // MARK: - Report Buffer\n    // 必须用堆指针, Swift Array 是 value type, copy-on-write 时地址会变\n    private var reportBufferPtr: UnsafeMutablePointer<UInt8>?\n    private static let reportBufferSize = 64\n\n    // MARK: - Async Discovery\n    private var pendingDiscovery: [UInt16: (UInt8?) -> Void] = [:]\n    private var discoveryTimer: Timer?\n    private static let discoveryTimeout: TimeInterval = 5.0\n\n    // MARK: - HID++ Constants\n    private static let featureIRoot: UInt16 = 0x0000\n    private static let featureReprogV4: UInt16 = 0x1B04\n    private static let hidppShortReportId: UInt8 = 0x10\n    private static let hidppLongReportId: UInt8 = 0x11\n    private static let hidppErrorFeatureIdx: UInt8 = 0xFF\n\n    // MARK: - Init\n\n    init(hidDevice: IOHIDDevice) {\n        self.hidDevice = hidDevice\n        self.deviceInfo = MosInputDevice(\n            vendorId: UInt16(IOHIDDeviceGetProperty(hidDevice, kIOHIDVendorIDKey as CFString) as? Int ?? 0),\n            productId: UInt16(IOHIDDeviceGetProperty(hidDevice, kIOHIDProductIDKey as CFString) as? Int ?? 0),\n            name: IOHIDDeviceGetProperty(hidDevice, kIOHIDProductKey as CFString) as? String ?? \"Unknown\"\n        )\n    }\n\n    deinit {\n        reportBufferPtr?.deallocate()\n    }\n\n    // MARK: - Setup / Teardown\n\n    func setup() {\n        NSLog(\"[LogitechHID:%@] Setting up session\", deviceInfo.name)\n\n        // 分配稳定的 report buffer\n        reportBufferPtr = .allocate(capacity: Self.reportBufferSize)\n        reportBufferPtr!.initialize(repeating: 0, count: Self.reportBufferSize)\n\n        // 注册 Input Report 回调\n        let context = Unmanaged.passUnretained(self).toOpaque()\n        IOHIDDeviceRegisterInputReportCallback(\n            hidDevice,\n            reportBufferPtr!,\n            Self.reportBufferSize,\n            Self.inputReportCallback,\n            context\n        )\n\n        // Feature Discovery: 查找 REPROG_CONTROLS_V4\n        discoverFeature(featureId: Self.featureReprogV4) { [weak self] index in\n            guard let self = self, let index = index else {\n                NSLog(\"[LogitechHID] Device does not support REPROG_CONTROLS_V4, skipping button divert\")\n                return\n            }\n            self.featureIndex[Self.featureReprogV4] = index\n            NSLog(\"[LogitechHID:%@] REPROG_CONTROLS_V4 at index 0x%02X\", self.deviceInfo.name, index)\n            self.queryAndDivertButtons(featureIndex: index)\n        }\n    }\n\n    func teardown() {\n        NSLog(\"[LogitechHID:%@] Tearing down session\", deviceInfo.name)\n        discoveryTimer?.invalidate()\n        discoveryTimer = nil\n        pendingDiscovery.removeAll()\n\n        // 取消 divert (恢复按键的默认行为)\n        if let reprogIdx = featureIndex[Self.featureReprogV4] {\n            for cid in divertedCIDs {\n                setControlReporting(featureIndex: reprogIdx, cid: cid, divert: false)\n            }\n        }\n        divertedCIDs.removeAll()\n        lastActiveCIDs.removeAll()\n    }\n\n    // MARK: - Input Report Callback (C function pointer)\n\n    static let inputReportCallback: IOHIDReportCallback = { context, result, sender, type, reportID, report, reportLength in\n        guard let context = context else { return }\n        let session = Unmanaged<LogitechDeviceSession>.fromOpaque(context).takeUnretainedValue()\n        let data = Array(UnsafeBufferPointer(start: report, count: reportLength))\n        session.handleInputReport(data)\n    }\n\n    // MARK: - HID++ Send\n\n    private func sendShortRequest(featureIndex: UInt8, functionId: UInt8, params: [UInt8] = []) {\n        var report = [UInt8](repeating: 0, count: 7)\n        report[0] = Self.hidppShortReportId\n        report[1] = deviceIndex\n        report[2] = featureIndex\n        report[3] = (functionId << 4) | 0x01  // FuncID | SwID\n        for (i, p) in params.prefix(3).enumerated() {\n            report[4 + i] = p\n        }\n        let result = IOHIDDeviceSetReport(\n            hidDevice,\n            IOHIDReportType(kIOHIDReportTypeOutput),\n            CFIndex(report[0]),\n            report,\n            report.count\n        )\n        if result != kIOReturnSuccess {\n            NSLog(\"[LogitechHID:%@] SetReport failed: 0x%08x\", deviceInfo.name, result)\n        }\n    }\n\n    // MARK: - Feature Discovery\n\n    private func discoverFeature(featureId: UInt16, completion: @escaping (UInt8?) -> Void) {\n        let params: [UInt8] = [UInt8(featureId >> 8), UInt8(featureId & 0xFF)]\n        sendShortRequest(featureIndex: 0x00, functionId: 0, params: params)\n        pendingDiscovery[featureId] = completion\n\n        discoveryTimer?.invalidate()\n        discoveryTimer = Timer.scheduledTimer(withTimeInterval: Self.discoveryTimeout, repeats: false) { [weak self] _ in\n            guard let self = self else { return }\n            if let pending = self.pendingDiscovery.removeValue(forKey: featureId) {\n                NSLog(\"[LogitechHID:%@] Feature discovery timed out for 0x%04X\", self.deviceInfo.name, featureId)\n                pending(nil)\n            }\n        }\n    }\n\n    // MARK: - Button Divert\n\n    private func queryAndDivertButtons(featureIndex: UInt8) {\n        // GetControlCount: function 0\n        sendShortRequest(featureIndex: featureIndex, functionId: 0)\n        // 响应在 handleInputReport 中处理 (会触发后续的 GetControlInfo + SetControlReporting)\n    }\n\n    private func setControlReporting(featureIndex: UInt8, cid: UInt16, divert: Bool) {\n        // SetControlReporting: function 3\n        // Params: CID_MSB, CID_LSB, flags (bit 0 = divert)\n        let flags: UInt8 = divert ? 0x01 : 0x00\n        let params: [UInt8] = [UInt8(cid >> 8), UInt8(cid & 0xFF), flags]\n        sendShortRequest(featureIndex: featureIndex, functionId: 3, params: params)\n        if divert {\n            divertedCIDs.insert(cid)\n        } else {\n            divertedCIDs.remove(cid)\n        }\n        NSLog(\"[LogitechHID:%@] CID 0x%04X divert=%@\", deviceInfo.name, cid, divert ? \"ON\" : \"OFF\")\n    }\n\n    // MARK: - Report Parsing\n\n    func handleInputReport(_ report: [UInt8]) {\n        guard report.count >= 7 else { return }\n        guard report[0] == Self.hidppShortReportId || report[0] == Self.hidppLongReportId else { return }\n\n        let featureIdx = report[2]\n\n        // Error report\n        if featureIdx == Self.hidppErrorFeatureIdx {\n            let errorCode = report.count > 6 ? report[6] : 0\n            NSLog(\"[LogitechHID:%@] Error report: featureIdx=0x%02X errorCode=0x%02X\",\n                  deviceInfo.name, report[3], errorCode)\n            // 清理对应的 pending discovery\n            for (featureId, callback) in pendingDiscovery {\n                callback(nil)\n                pendingDiscovery.removeValue(forKey: featureId)\n            }\n            return\n        }\n\n        // IRoot response (feature discovery)\n        if featureIdx == 0x00 {\n            handleDiscoveryResponse(report)\n            return\n        }\n\n        // REPROG_CONTROLS_V4 events\n        if let reprogIdx = featureIndex[Self.featureReprogV4], featureIdx == reprogIdx {\n            handleReprogEvent(report)\n            return\n        }\n    }\n\n    private func handleDiscoveryResponse(_ report: [UInt8]) {\n        // IRoot.GetFeature response: params[0] = featureIndex, params[1] = featureType\n        let discoveredIndex = report[4]\n\n        // 尝试匹配 pending discovery\n        // 由于我们发送了 feature ID 作为参数, 这里简化处理: 取第一个 pending\n        if let (featureId, callback) = pendingDiscovery.first {\n            discoveryTimer?.invalidate()\n            pendingDiscovery.removeValue(forKey: featureId)\n            if discoveredIndex == 0 {\n                // Index 0 = not found\n                callback(nil)\n            } else {\n                callback(discoveredIndex)\n            }\n        }\n    }\n\n    private func handleReprogEvent(_ report: [UInt8]) {\n        let functionId = report[3] >> 4\n\n        // divertedButtonsEvent notification (function varies by firmware, typically event index 0)\n        // Parse CID pairs from params\n        var activeCIDs: Set<UInt16> = []\n        var offset = 4\n        while offset + 1 < report.count {\n            let cid = (UInt16(report[offset]) << 8) | UInt16(report[offset + 1])\n            if cid == 0 { break }\n            activeCIDs.insert(cid)\n            offset += 2\n        }\n\n        // 差分检测\n        let newlyPressed = activeCIDs.subtracting(lastActiveCIDs)\n        let newlyReleased = lastActiveCIDs.subtracting(activeCIDs)\n        lastActiveCIDs = activeCIDs\n\n        for cid in newlyPressed {\n            dispatchButtonEvent(cid: cid, isDown: true)\n        }\n        for cid in newlyReleased {\n            dispatchButtonEvent(cid: cid, isDown: false)\n        }\n    }\n\n    // MARK: - Event Dispatch\n\n    private func dispatchButtonEvent(cid: UInt16, isDown: Bool) {\n        let currentFlags = CGEventSource.flagsState(.combinedSessionState)\n\n        let mosEvent = MosInputEvent(\n            type: .mouse,\n            code: LogitechCIDMap.toMosCode(cid),\n            modifiers: currentFlags,\n            phase: isDown ? .down : .up,\n            source: .hidPlusPlus,\n            device: deviceInfo\n        )\n\n        // 处理事件\n        let _ = MosInputProcessor.shared.process(mosEvent)\n\n        // 发送通知 (供 KeyRecorder 录制监听)\n        NotificationCenter.default.post(\n            name: LogitechHIDManager.buttonEventNotification,\n            object: nil,\n            userInfo: [\"event\": mosEvent]\n        )\n    }\n}\n```\n\n- [ ] **Step 2: Commit**\n\n```bash\ngit add Mos/LogitechHID/LogitechDeviceSession.swift\ngit commit -m \"feat: add LogitechDeviceSession for HID++ 2.0 protocol communication\"\n```\n\n---\n\n### Task 12: Integrate LogitechHIDManager into AppDelegate\n\n**Files:**\n- Modify: `Mos/AppDelegate.swift`\n\n- [ ] **Step 1: Add LogitechHIDManager.start() after ButtonCore.enable()**\n\nIn `startWithAccessibilityPermissionsChecker` (lines 69-96), add `LogitechHIDManager.shared.start()` after every `ButtonCore.shared.enable()` call.\n\nLine 76 (after first `ButtonCore.shared.enable()`):\n```swift\n                LogitechHIDManager.shared.start()\n```\n\nLine 82 (after second `ButtonCore.shared.enable()`):\n```swift\n                LogitechHIDManager.shared.start()\n```\n\n- [ ] **Step 2: Add LogitechHIDManager.stop() in applicationWillTerminate**\n\nIn `applicationWillTerminate` (line 62), add before `ScrollCore.shared.disable()`:\n```swift\n        LogitechHIDManager.shared.stop()\n```\n\n- [ ] **Step 3: Add LogitechHIDManager lifecycle in session callbacks**\n\nIn `sessionDidActive` (line 99), add after `ButtonCore.shared.enable()`:\n```swift\n        LogitechHIDManager.shared.start()\n```\n\nIn `sessionDidResign` (line 103), add before `ScrollCore.shared.disable()`:\n```swift\n        LogitechHIDManager.shared.stop()\n```\n\n- [ ] **Step 4: Commit**\n\n```bash\ngit add Mos/AppDelegate.swift\ngit commit -m \"feat: integrate LogitechHIDManager lifecycle into AppDelegate\"\n```\n\n---\n\n### Task 13: Final build and integration test\n\n- [ ] **Step 1: Ensure all new files are in Xcode project**\n\nNew files that must be added to the Mos target in Xcode:\n- `Mos/InputEvent/MosInputEvent.swift`\n- `Mos/InputEvent/MosInputProcessor.swift`\n- `Mos/LogitechHID/LogitechHIDManager.swift`\n- `Mos/LogitechHID/LogitechDeviceSession.swift`\n\n- [ ] **Step 2: Full build**\n\n```bash\ncd /Users/caldis/Desktop/Code/Mos && xcodebuild -project Mos.xcodeproj -scheme Mos -configuration Debug build 2>&1 | tail -20\n```\n\n- [ ] **Step 3: Manual testing - existing features**\n\n- Scroll smoothing: mouse wheel in any app\n- Scroll reverse: toggle in preferences\n- Button binding: record mouse button 3, bind to Mission Control, verify trigger\n- Scroll hotkey: set dash key, verify amplification works\n- Per-app settings: add exception for an app, verify independent scroll config\n- ESC cancels recording\n- Monitor window: verify scroll event visualization\n\n- [ ] **Step 4: Manual testing - Logitech HID (requires Logitech mouse)**\n\n- Check Console.app logs for `[LogitechHID] Device connected: ...`\n- If Logitech Options+ is running, quit it first\n- Verify gesture button press appears in logs as `[LogitechHID] CID 0x00C3 divert=ON`\n- Open Preferences > Buttons, click Add, press gesture button -> should appear as \"Gesture\"\n- Bind gesture button to a system shortcut, verify it triggers\n\n- [ ] **Step 5: Final commit**\n\n```bash\ngit add -A && git commit -m \"feat: complete Logitech HID++ 2.0 hardware button integration\"\n```\n"
  },
  {
    "path": "docs/superpowers/specs/2026-03-16-logitech-hid-integration-design.md",
    "content": "# Logitech HID++ 2.0 硬件按键集成设计\n\n## 概述\n\n为 Mos 新增 Logitech 鼠标硬件层面的按键识别能力。通过 IOKit HIDManager 实现 HID++ 2.0 协议通信,捕获 CGEventTap 无法感知的 Logitech 专有按键(手势按钮、DPI 按钮等),并以最小侵入方式整合到现有按键绑定系统中。\n\n### 目标\n\n- 识别并捕获 Logitech HID++ 鼠标上的专有硬件按键\n- 用户可将这些按键绑定到系统快捷键(复用现有 ButtonBinding 机制)\n- 兼容未来新增的 Logitech HID++ 设备\n- 不影响现有滚动/按键/分应用/Remote 检测等全部功能\n- 现有用户配置数据自动兼容,无需迁移\n\n### 非目标\n\n- 不替代 CGEventTap(两者互补)\n- 不处理 Logitech 滚动数据(ScrollCore 保持不变)\n- 不支持非 Logitech 的 HID 设备\n- 不实现 DPI 控制、电池状态等非按键功能\n\n---\n\n## 背景知识\n\n### HID++ 2.0 协议\n\nHID++ 2.0 是 Logitech 的私有扩展协议,基于标准 USB HID 的 vendor-specific usage page 传输。跨平台(Windows/macOS/Linux),非 Apple 专有。\n\n**关键概念:**\n- **IRoot (Feature 0x0000)**: 所有 HID++ 2.0 设备必有的根特征,用于动态发现其他特征的 index\n- **REPROG_CONTROLS_V4 (Feature 0x1B04)**: 按键重编程特征,支持按键 divert(将按键事件从标准 OS 路径转移到 HID++ 通道)\n- **报文格式**: Short (7 bytes, Report ID 0x10), Long (20 bytes, Report ID 0x11)\n- **Feature Discovery**: 通过 IRoot 的 GetFeature() 查询 Feature ID → Feature Index 映射\n\n### 为什么需要 HID++\n\nLogitech 鼠标上的某些按键(手势按钮、DPI 切换等)不会产生标准 CGEvent。这些按键的信号只在 HID++ 通道中可见。CGEventTap 对这类按键完全透明。\n\n### macOS 访问路径\n\nmacOS 上通过 IOKit 框架的 `IOHIDManager` API 访问底层 HID 设备。无需第三方库(Mouser 项目用的 Python `hidapi` 底层也是 IOKit)。\n\n---\n\n## 架构设计\n\n### 设计原则\n\n1. **互补而非替代**: HID++ 是 CGEventTap 的补充事件源,不改变现有事件处理流程\n2. **统一抽象**: 引入 MosInputEvent 统一两种来源的事件表示\n3. **状态隔离**: 各模块只拥有自己的状态,单向依赖,无循环引用\n4. **向后兼容**: 新增字段全部 optional,旧数据自动兼容\n\n### 分层架构\n\n```\n+---------------------------------------------------------------+\n|                     Event Source Layer                         |\n|                  (互相完全不知道对方存在)                         |\n|                                                               |\n|  +-------------------------+  +-----------------------------+ |\n|  | CGEventTap Adapter      |  | LogitechHIDManager          | |\n|  | (现有 Interceptor)       |  | (新增, IOKit HIDManager)    | |\n|  |                         |  |                             | |\n|  | 职责:                    |  | 职责:                       | |\n|  | - 拦截系统级事件          |  | - 枚举 Logitech HID 设备    | |\n|  | - 转换为 MosInputEvent   |  | - HID++ 2.0 协议通信        | |\n|  | - 处理 consume/pass      |  | - 按钮 divert 和事件监听    | |\n|  |                         |  | - 设备连接/断开生命周期      | |\n|  +------------+------------+  +-------------+---------------+ |\n|               | MosInputEvent               | MosInputEvent   |\n+---------------+-----------------------------+-----------------+\n                |                             |\n                v                             v\n+---------------------------------------------------------------+\n|                   Processing Layer                            |\n|                                                               |\n|  +----------------------------------------------------------+ |\n|  | MosInputProcessor (单例, 无状态)                           | |\n|  |                                                          | |\n|  | 输入: MosInputEvent                                       | |\n|  | 输出: MosInputResult (.consumed / .passthrough)           | |\n|  |                                                          | |\n|  | 逻辑:                                                     | |\n|  | 1. ButtonUtils.shared.getButtonBindings()                 | |\n|  | 2. 遍历匹配 triggerEvent.matches(mosEvent)                | |\n|  | 3. 匹配成功: ShortcutExecutor.execute() -> .consumed      | |\n|  | 4. 无匹配: .passthrough                                   | |\n|  +----------------------------------------------------------+ |\n+---------------------------------------------------------------+\n                |\n                v\n+---------------------------------------------------------------+\n|                   Action Layer (现有, 不变)                     |\n|                                                               |\n|  ShortcutExecutor -> 合成 CGEvent -> post 到系统               |\n+---------------------------------------------------------------+\n```\n\n### 控制流详解\n\n#### CGEventTap 路径 (同步,必须立即返回)\n\n```swift\n// ButtonCore.buttonEventCallBack 改造:\nlet buttonEventCallBack: CGEventTapCallBack = { (proxy, type, event, refcon) in\n    let mosEvent = MosInputEvent(fromCGEvent: event)\n    let result = MosInputProcessor.shared.process(mosEvent)\n    switch result {\n    case .consumed:    return nil\n    case .passthrough: return Unmanaged.passUnretained(event)\n    }\n}\n```\n\n#### HID++ 路径 (同步,无 pass-through)\n\n```swift\n// LogitechHIDManager 内部:\nfunc onHIDButtonEvent(cid: UInt16, isDown: Bool, device: MosInputDevice) {\n    let mosEvent = MosInputEvent(\n        type: .mouse,\n        code: LogitechCIDMap.toMosCode(cid),\n        modifiers: currentModifierFlags(),\n        phase: isDown ? .down : .up,\n        source: .hidPlusPlus,\n        device: device\n    )\n    // 结果被忽略 -- HID++ 按键不存在 \"pass-through\" 语义\n    // 因为这些按键本来就不会产生系统事件\n    let _ = MosInputProcessor.shared.process(mosEvent)\n}\n```\n\n---\n\n## 数据模型\n\n### MosInputEvent (新增)\n\n**设计约束**: `MosInputEvent` 是纯运行时对象,不遵循 Codable。因为 `MosInputSource.cgEvent(CGEvent)` 中的 CGEvent 不可序列化。只有从中提取的 `RecordedEvent` 走持久化路径。\n\n```swift\n/// 事件阶段\nenum MosInputPhase {\n    case down\n    case up\n}\n\n/// 事件来源\nenum MosInputSource {\n    /// 来自 CGEventTap, 携带原始 CGEvent 用于 pass-through/consume\n    case cgEvent(CGEvent)\n    /// 来自 Logitech HID++ 协议\n    case hidPlusPlus\n}\n\n/// 设备信息 (可序列化, 用于 DeviceFilter 匹配和 UI 展示)\nstruct MosInputDevice: Codable, Equatable {\n    let vendorId: UInt16      // USB Vendor ID (Logitech = 0x046D)\n    let productId: UInt16     // USB Product ID\n    let name: String          // 人类可读名称 (如 \"MX Master 3S\")\n}\n\n/// 统一输入事件 (运行时对象, 不可序列化)\nstruct MosInputEvent {\n    let type: EventType           // .keyboard 或 .mouse (复用现有枚举)\n    let code: UInt16              // 按键码 / 按钮码\n    let modifiers: CGEventFlags   // 修饰键状态\n    let phase: MosInputPhase      // 按下 / 抬起\n    let source: MosInputSource    // 事件来源\n    let device: MosInputDevice?   // 设备信息 (CGEventTap 来源为 nil)\n\n    /// 从 CGEvent 构造\n    init(fromCGEvent event: CGEvent) {\n        if event.isKeyboardEvent {\n            self.type = .keyboard\n            self.code = event.keyCode\n        } else {\n            self.type = .mouse\n            self.code = event.mouseCode\n        }\n        self.modifiers = event.flags\n        self.phase = event.isKeyDown ? .down : .up\n        self.source = .cgEvent(event)\n        self.device = nil\n    }\n\n    /// 从 HID++ 数据构造\n    init(type: EventType, code: UInt16, modifiers: CGEventFlags,\n         phase: MosInputPhase, source: MosInputSource, device: MosInputDevice?) {\n        self.type = type\n        self.code = code\n        self.modifiers = modifiers\n        self.phase = phase\n        self.source = source\n        self.device = device\n    }\n\n    /// 构造展示用名称组件\n    static func buildDisplayComponents(_ event: MosInputEvent) -> [String] {\n        var components: [String] = []\n        // 修饰键\n        let flags = NSEvent.ModifierFlags(rawValue: UInt(event.modifiers.rawValue))\n        if flags.contains(.control) { components.append(KeyCode.modifierMap[0x3B] ?? \"^\") }\n        if flags.contains(.option) { components.append(KeyCode.modifierMap[0x3A] ?? \"~\") }\n        if flags.contains(.shift) { components.append(KeyCode.modifierMap[0x38] ?? \"$\") }\n        if flags.contains(.command) { components.append(KeyCode.modifierMap[0x37] ?? \"@\") }\n        // 按键名称\n        switch event.type {\n        case .keyboard:\n            components.append(KeyCode.keyMap[event.code] ?? \"Key \\(event.code)\")\n        case .mouse:\n            if event.code >= 1000 {\n                components.append(LogitechCIDMap.displayName(forCode: event.code))\n            } else {\n                components.append(KeyCode.mouseMap[event.code] ?? \"Button \\(event.code)\")\n            }\n        }\n        return components\n    }\n}\n```\n\n### MosInputProcessor (新增)\n\n```swift\n/// 处理结果\nenum MosInputResult {\n    case consumed     // 事件已处理,不再传递\n    case passthrough  // 事件未匹配,继续传递\n}\n\n/// 统一事件处理器 (无状态单例)\nclass MosInputProcessor {\n    static let shared = MosInputProcessor()\n\n    func process(_ event: MosInputEvent) -> MosInputResult {\n        let bindings = ButtonUtils.shared.getButtonBindings()\n        guard let binding = bindings.first(where: {\n            $0.triggerEvent.matchesMosInput(event) && $0.isEnabled\n        }) else {\n            return .passthrough\n        }\n        ShortcutExecutor.shared.execute(named: binding.systemShortcutName)\n        return .consumed\n    }\n}\n```\n\n### RecordedEvent 扩展 (修改)\n\n```swift\nstruct RecordedEvent: Codable, Equatable {\n    // 现有字段 (不变)\n    let type: EventType\n    let code: UInt16\n    let modifiers: UInt\n    let displayComponents: [String]\n\n    // 新增字段 (optional, 向后兼容)\n    let deviceFilter: DeviceFilter?\n\n    // 新增: 匹配 MosInputEvent\n    func matchesMosInput(_ event: MosInputEvent) -> Bool {\n        // 1. 修饰键匹配\n        guard UInt(event.modifiers.rawValue) == modifiers else { return false }\n        // 2. 类型匹配\n        guard event.type == type else { return false }\n        // 3. 按键码匹配\n        switch type {\n        case .keyboard:\n            guard event.phase == .down else { return false }\n            guard code == event.code else { return false }\n        case .mouse:\n            guard code == event.code else { return false }\n        }\n        // 4. 设备过滤 (可选)\n        if let filter = deviceFilter {\n            guard filter.matches(event.device) else { return false }\n        }\n        return true\n    }\n\n    // 保留: 旧的 CGEvent 匹配 (供 ScrollCore 热键使用, 不改)\n    func matches(_ event: CGEvent) -> Bool {\n        // 现有逻辑完全不变\n    }\n\n    // 新增: 从 MosInputEvent 构造\n    init(from event: MosInputEvent, deviceFilter: DeviceFilter? = nil) {\n        self.type = event.type\n        self.code = event.code\n        self.modifiers = UInt(event.modifiers.rawValue)\n        self.deviceFilter = deviceFilter\n        self.displayComponents = MosInputEvent.buildDisplayComponents(event)\n    }\n}\n\n/// ScrollHotkey 扩展: 从 MosInputEvent 构造\nextension ScrollHotkey {\n    init(from event: MosInputEvent) {\n        self.type = event.type\n        self.code = event.code\n    }\n}\n```\n\n### DeviceFilter (新增)\n\n```swift\nstruct DeviceFilter: Codable, Equatable {\n    let vendorId: UInt16?     // nil = 不限厂商\n    let productId: UInt16?    // nil = 不限型号\n\n    func matches(_ device: MosInputDevice?) -> Bool {\n        guard let device = device else { return false }\n        if let vid = vendorId, vid != device.vendorId { return false }\n        if let pid = productId, pid != device.productId { return false }\n        return true\n    }\n}\n```\n\n### 按钮编号空间\n\n```swift\n// 标准 CGEvent 鼠标按钮: 0 ~ 31 (系统分配)\n// 标准键盘虚拟键码:      0 ~ 127 (由 EventType 区分, 不冲突)\n// Logitech HID++ 专有:   1000+   (我们分配)\n\n/// Logitech CID -> Mos 按钮码映射\nstruct LogitechCIDMap {\n    // CID 参考: Logitech HID++ 2.0 REPROG_CONTROLS_V4 规范\n    private static let cidToCode: [UInt16: UInt16] = [\n        0x00C3: 1000,  // Gesture Button\n        0x00C4: 1001,  // SmartShift\n        0x00D7: 1002,  // DPI Change Button\n        // 后续设备新增 CID 在此追加, 从 1003 递增\n    ]\n\n    static func toMosCode(_ cid: UInt16) -> UInt16 {\n        if let known = cidToCode[cid] { return known }\n        // 未知 CID: 映射到 2000+ 区段, 但限制在 UInt16 范围内\n        let mapped = UInt32(2000) + UInt32(cid)\n        return mapped <= UInt32(UInt16.max) ? UInt16(mapped) : UInt16(cid & 0x0FFF) + 2000\n    }\n\n    static func displayName(forCode code: UInt16) -> String {\n        switch code {\n        case 1000: return \"Gesture\"\n        case 1001: return \"SmartShift\"\n        case 1002: return \"DPI\"\n        default:   return \"Logi \\(code)\"\n        }\n    }\n}\n```\n\n---\n\n## LogitechHIDManager 模块设计\n\n### 职责\n\n1. 通过 IOKit `IOHIDManager` 枚举和监控 Logitech HID 设备\n2. 实现 HID++ 2.0 协议子集(IRoot feature discovery + REPROG_CONTROLS_V4 button divert)\n3. 解析 HID++ 通知,将按键事件转换为 MosInputEvent\n4. 管理设备连接/断开生命周期\n\n### 设备发现\n\n```swift\nclass LogitechHIDManager {\n    static let shared = LogitechHIDManager()\n\n    private var hidManager: IOHIDManager?\n    private var connectedDevices: [IOHIDDevice: LogitechDeviceSession] = [:]\n\n    /// Logitech USB Vendor ID\n    private static let logitechVendorId: Int = 0x046D\n\n    func start() {\n        hidManager = IOHIDManagerCreate(kCFAllocatorDefault, IOOptionBits(kIOHIDOptionsTypeNone))\n        guard let manager = hidManager else { return }\n\n        // 只匹配 Logitech 设备\n        let matchDict: [String: Any] = [\n            kIOHIDVendorIDKey as String: LogitechHIDManager.logitechVendorId\n        ]\n        IOHIDManagerSetDeviceMatching(manager, matchDict as CFDictionary)\n\n        // 注册连接/断开回调\n        IOHIDManagerRegisterDeviceMatchingCallback(manager, deviceConnected, nil)\n        IOHIDManagerRegisterDeviceRemovalCallback(manager, deviceDisconnected, nil)\n\n        // Schedule 到 main RunLoop (低频事件, 避免线程同步)\n        IOHIDManagerScheduleWithRunLoop(manager, CFRunLoopGetMain(), CFRunLoopMode.commonModes.rawValue)\n        IOHIDManagerOpen(manager, IOOptionBits(kIOHIDOptionsTypeNone))\n    }\n\n    func stop() {\n        guard let manager = hidManager else { return }\n        // 清理所有设备会话\n        for (_, session) in connectedDevices {\n            session.teardown()\n        }\n        connectedDevices.removeAll()\n        IOHIDManagerClose(manager, IOOptionBits(kIOHIDOptionsTypeNone))\n        hidManager = nil\n    }\n}\n```\n\n### 设备会话\n\n每个已连接的 Logitech HID++ 设备维护一个独立会话:\n\n```swift\n/// 单个 Logitech 设备的 HID++ 会话\nclass LogitechDeviceSession {\n    let hidDevice: IOHIDDevice\n    let deviceInfo: MosInputDevice\n\n    // HID++ 状态\n    private var featureIndex: [UInt16: UInt8] = [:]   // Feature ID -> Feature Index\n    private var divertedCIDs: Set<UInt16> = []         // 已 divert 的 CID 集合\n    private var lastActiveCIDs: Set<UInt16> = []       // 上一帧活跃的 CID (用于差分检测)\n    private var deviceIndex: UInt8 = 0x01              // HID++ device index (连接时探测)\n\n    // Report buffer: 必须用堆分配指针, 保证在 IOKit 回调生命周期内地址稳定\n    // Swift [UInt8] 是 value type, copy-on-write 时地址会变, 导致 IOKit 回调访问野指针\n    private var reportBufferPtr: UnsafeMutablePointer<UInt8>?\n    private static let reportBufferSize = 64  // 足够容纳 Long report (20 bytes) + 余量\n\n    // HID++ 2.0 常量\n    private static let featureIRoot: UInt16 = 0x0000\n    private static let featureReprogV4: UInt16 = 0x1B04\n\n    // 异步请求超时保护\n    private var discoveryTimer: Timer?\n    private var pendingDiscovery: [UInt16: (UInt8?) -> Void] = [:]\n    private static let discoveryTimeout: TimeInterval = 5.0\n\n    init(hidDevice: IOHIDDevice) {\n        self.hidDevice = hidDevice\n        self.deviceInfo = MosInputDevice(\n            vendorId: UInt16(IOHIDDeviceGetProperty(hidDevice, kIOHIDVendorIDKey as CFString) as? Int ?? 0),\n            productId: UInt16(IOHIDDeviceGetProperty(hidDevice, kIOHIDProductIDKey as CFString) as? Int ?? 0),\n            name: IOHIDDeviceGetProperty(hidDevice, kIOHIDProductKey as CFString) as? String ?? \"Unknown\"\n        )\n    }\n\n    deinit {\n        reportBufferPtr?.deallocate()\n    }\n\n    /// 初始化 HID++ 通信: 探测 Device Index -> Feature Discovery -> Button Divert\n    func setup() {\n        // 1. 分配稳定的 report buffer\n        reportBufferPtr = .allocate(capacity: Self.reportBufferSize)\n        reportBufferPtr!.initialize(repeating: 0, count: Self.reportBufferSize)\n\n        // 2. 注册 Input Report 回调 (使用堆指针)\n        let context = Unmanaged.passUnretained(self).toOpaque()\n        IOHIDDeviceRegisterInputReportCallback(\n            hidDevice,\n            reportBufferPtr!,\n            Self.reportBufferSize,\n            Self.inputReportCallback,\n            context\n        )\n\n        // 3. 探测 device index\n        // 蓝牙直连通常是 0x01, Unifying Receiver 按配对槽位 0x01-0x06\n        // 发送 ping (IRoot.GetFeature with dummy feature) 到候选 index, 看谁响应\n        probeDeviceIndex { [weak self] index in\n            guard let self = self, let index = index else {\n                NSLog(\"[LogitechHID] Failed to probe device index, using default 0x01\")\n                return\n            }\n            self.deviceIndex = index\n\n            // 4. Feature Discovery\n            self.discoverFeature(featureId: Self.featureReprogV4) { [weak self] featureIdx in\n                guard let self = self, let featureIdx = featureIdx else {\n                    NSLog(\"[LogitechHID] Device does not support REPROG_CONTROLS_V4, skipping\")\n                    return\n                }\n                self.featureIndex[Self.featureReprogV4] = featureIdx\n                // 5. Divert 可重编程的按键\n                self.divertButtons(featureIndex: featureIdx)\n            }\n        }\n    }\n\n    func teardown() {\n        // 取消超时定时器\n        discoveryTimer?.invalidate()\n        discoveryTimer = nil\n        pendingDiscovery.removeAll()\n        // 取消所有 divert\n        for cid in divertedCIDs {\n            undivertButton(cid: cid)\n        }\n        divertedCIDs.removeAll()\n    }\n\n    /// 探测正确的 HID++ device index\n    /// 依次尝试 0x01 ~ 0x06, 发送 IRoot ping, 看哪个 index 收到有效响应\n    private func probeDeviceIndex(completion: @escaping (UInt8?) -> Void) {\n        // 简化策略: 先尝试 0x01 (蓝牙直连最常见)\n        // 如果超时无响应, 尝试下一个 index\n        // 最多尝试到 0x06\n        // 完整实现在 LogitechDeviceSession.swift 中\n        completion(0x01)  // 伪代码, 实际需要异步探测\n    }\n}\n```\n```\n\n### HID++ 2.0 消息收发\n\n```swift\nextension LogitechDeviceSession {\n    // 报文结构\n    // Short: [ReportID(0x10), DeviceIndex, FeatureIndex, FuncID/SwID, Param0, Param1, Param2]\n    // Long:  [ReportID(0x11), DeviceIndex, FeatureIndex, FuncID/SwID, Param0...Param15]\n\n    /// 发送 HID++ 请求\n    /// - 使用实例的 deviceIndex (连接时探测确定, 非硬编码)\n    /// - 检查 IOReturn 返回值, 失败时记录日志\n    private func sendRequest(featureIndex: UInt8, functionId: UInt8, params: [UInt8] = []) {\n        var report = [UInt8](repeating: 0, count: 7)  // Short report\n        report[0] = 0x10                               // Report ID\n        report[1] = deviceIndex                        // 探测得到的 device index\n        report[2] = featureIndex\n        report[3] = (functionId << 4) | 0x01           // FuncID | SwID\n        for (i, p) in params.prefix(3).enumerated() {\n            report[4 + i] = p\n        }\n        let result = IOHIDDeviceSetReport(\n            hidDevice,\n            IOHIDReportType(kIOHIDReportTypeOutput),   // Swift 需要显式类型转换\n            CFIndex(report[0]),\n            report,\n            report.count\n        )\n        if result != kIOReturnSuccess {\n            NSLog(\"[LogitechHID] SetReport failed: 0x%08x\", result)\n        }\n    }\n\n    /// Feature Discovery: IRoot.GetFeature(featureId) -> featureIndex\n    /// 带超时保护: discoveryTimeout 秒内无响应则回调 nil\n    private func discoverFeature(featureId: UInt16, completion: @escaping (UInt8?) -> Void) {\n        let params: [UInt8] = [UInt8(featureId >> 8), UInt8(featureId & 0xFF)]\n        sendRequest(featureIndex: 0x00, functionId: 0, params: params)\n        pendingDiscovery[featureId] = completion\n\n        // 超时保护\n        discoveryTimer = Timer.scheduledTimer(withTimeInterval: Self.discoveryTimeout, repeats: false) { [weak self] _ in\n            guard let self = self else { return }\n            if let pending = self.pendingDiscovery.removeValue(forKey: featureId) {\n                NSLog(\"[LogitechHID] Feature discovery timed out for 0x%04X\", featureId)\n                pending(nil)\n            }\n        }\n    }\n\n    /// Button Divert: REPROG_CONTROLS_V4.SetControlReporting(CID, divert=1)\n    /// 动态发现始终优先; knownDevices 仅作为调试参考, 不影响 divert 决策\n    private func divertButtons(featureIndex: UInt8) {\n        queryControlList(featureIndex: featureIndex) { [weak self] controls in\n            for control in controls where control.isDivertable {\n                self?.divertButton(featureIndex: featureIndex, cid: control.cid)\n            }\n        }\n    }\n}\n```\n\n### 事件解析与分发\n\n```swift\nextension LogitechDeviceSession {\n    // C 函数指针, 作为 IOHIDDeviceRegisterInputReportCallback 的 callback\n    static let inputReportCallback: IOHIDReportCallback = { context, result, sender, type, reportID, report, reportLength in\n        guard let context = context else { return }\n        let session = Unmanaged<LogitechDeviceSession>.fromOpaque(context).takeUnretainedValue()\n        let reportData = Array(UnsafeBufferPointer(start: report, count: reportLength))\n        session.handleInputReport(reportData)\n    }\n\n    /// 处理 Input Report\n    func handleInputReport(_ report: [UInt8]) {\n        // 验证是 HID++ 报文\n        guard report.count >= 7, (report[0] == 0x10 || report[0] == 0x11) else { return }\n\n        let featureIdx = report[2]\n        let funcAndSw = report[3]\n\n        // HID++ Error Report 检测 (Feature Index = 0xFF)\n        // 格式: [ReportID, DevIdx, 0xFF, ErrorFeatureIdx, ErrorFuncID, SoftwareID, ErrorCode]\n        if featureIdx == 0xFF {\n            let errorFeatureIdx = report[3]\n            let errorCode = report.count > 6 ? report[6] : 0\n            NSLog(\"[LogitechHID] Error report: featureIdx=0x%02X errorCode=0x%02X\", errorFeatureIdx, errorCode)\n            // 如果有 pending discovery 对应此 feature, 回调 nil\n            handleErrorReport(report)\n            return\n        }\n\n        // 检查是否为 pending feature discovery 的响应\n        if featureIdx == 0x00 {\n            handleDiscoveryResponse(report)\n            return\n        }\n\n        // 检查是否为 REPROG_CONTROLS_V4 通知\n        guard let reprogIdx = featureIndex[Self.featureReprogV4],\n              featureIdx == reprogIdx else { return }\n\n        // 解析按键事件\n        // REPROG_CONTROLS_V4 divertedButtonsEvent 通知格式:\n        // Params: [CID_MSB, CID_LSB, CID_MSB, CID_LSB, ...]  (成对 CID, 0x0000 结束)\n        var activeCIDs: Set<UInt16> = []\n        var offset = 4\n        while offset + 1 < report.count {\n            let cid = (UInt16(report[offset]) << 8) | UInt16(report[offset + 1])\n            if cid == 0 { break }\n            activeCIDs.insert(cid)\n            offset += 2\n        }\n\n        // 差分检测: 按下/抬起\n        let newlyPressed = activeCIDs.subtracting(lastActiveCIDs)\n        let newlyReleased = lastActiveCIDs.subtracting(activeCIDs)\n        lastActiveCIDs = activeCIDs\n\n        for cid in newlyPressed {\n            dispatchButtonEvent(cid: cid, isDown: true)\n        }\n        for cid in newlyReleased {\n            dispatchButtonEvent(cid: cid, isDown: false)\n        }\n    }\n\n    private func dispatchButtonEvent(cid: UInt16, isDown: Bool) {\n        // 使用 CGEventSource.flagsState 获取修饰键 (比 NSEvent.current 更可靠)\n        // NSEvent.current 只在 sendEvent 期间有效, IOKit 回调中可能为 nil\n        // CGEventSource.flagsState(.combinedSessionState) 在 macOS 10.13+ 可用\n        let currentFlags = CGEventSource.flagsState(.combinedSessionState)\n\n        let mosEvent = MosInputEvent(\n            type: .mouse,\n            code: LogitechCIDMap.toMosCode(cid),\n            modifiers: currentFlags,\n            phase: isDown ? .down : .up,\n            source: .hidPlusPlus,\n            device: deviceInfo\n        )\n\n        // 处理结果: HID++ 事件无 pass-through 语义\n        let _ = MosInputProcessor.shared.process(mosEvent)\n\n        // 同时发送通知 (供 KeyRecorder 录制期间监听)\n        NotificationCenter.default.post(\n            name: LogitechHIDManager.buttonEventNotification,\n            object: mosEvent\n        )\n    }\n}\n```\n\n### 设备兼容性策略\n\n```swift\n/// 已知设备的按键定义 (可通过 plist/JSON 配置文件外置, 未来不用改代码)\nstruct LogitechDeviceProfile {\n    let productId: UInt16\n    let name: String\n    let divertableCIDs: [UInt16]  // 需要 divert 的 CID 列表\n\n    static let knownDevices: [UInt16: LogitechDeviceProfile] = [\n        0xB034: LogitechDeviceProfile(\n            productId: 0xB034,\n            name: \"MX Master 3S\",\n            divertableCIDs: [0x00C3, 0x00C4, 0x00D7]\n        ),\n        // 后续设备在此追加\n    ]\n}\n```\n\n**未知设备处理**: 对于 `knownDevices` 中没有的 Logitech 设备,使用动态发现:\n1. 检查设备是否支持 REPROG_CONTROLS_V4 feature\n2. 如果支持,查询其可 divert 的按键列表\n3. 自动 divert 所有标记为 divertable 的按键\n\n这意味着未来新 Logitech 设备只要支持 HID++ 2.0 和 REPROG_CONTROLS_V4,无需修改代码即可自动兼容。\n\n**优先级**: 动态发现始终优先。`knownDevices` 仅作为调试参考和显示名称来源,不影响 divert 决策。如果动态发现返回的可 divert 按键多于 `knownDevices` 中定义的,按动态发现结果执行。\n\n---\n\n## 应用生命周期集成\n\n```swift\n// AppDelegate 或等效的启动入口\nfunc applicationDidFinishLaunching() {\n    // ... 现有初始化 ...\n    ScrollCore.shared.enable()\n    ButtonCore.shared.enable()\n    LogitechHIDManager.shared.start()   // 在 ButtonCore 之后启动\n}\n\nfunc applicationWillTerminate() {\n    LogitechHIDManager.shared.stop()    // 在 ButtonCore 之前停止\n    ButtonCore.shared.disable()\n    ScrollCore.shared.disable()\n}\n```\n\nLogitechHIDManager 的启停独立于 ButtonCore,但顺序上:\n- 启动时: ButtonCore 先启用 (确保 MosInputProcessor 的下游就绪), 然后启动 LogitechHID\n- 停止时: 先停 LogitechHID (停止产生事件), 然后停 ButtonCore\n\n---\n\n## 状态隔离\n\n### 状态归属矩阵\n\n| 模块 | 拥有的状态 | 不知道的事 |\n|------|-----------|----------|\n| **CGEventTap Adapter** (ButtonCore) | Interceptor 实例、EventTap 生命周期 | LogitechHIDManager 存在 |\n| **LogitechHIDManager** | IOHIDManager、已连接设备列表 | CGEventTap 存在、ButtonBinding 配置 |\n| **LogitechDeviceSession** | HID++ 会话状态、feature index 缓存、divert 状态、lastActiveCIDs | 处理层如何消费事件 |\n| **MosInputProcessor** | 无状态 | 事件来自哪里 |\n| **Options / ButtonUtils** | ButtonBinding 持久化配置 | 事件如何产生 |\n| **KeyRecorder** | 录制会话状态 | 设备协议实现 |\n| **ShortcutExecutor** | 无状态 | 触发来源 |\n\n### 依赖方向 (单向, 无环)\n\n```\nLogitechHIDManager --+\n                     +--> MosInputProcessor --> ButtonUtils/Options --> ShortcutExecutor\nCGEventTap Adapter --+\n```\n\n### 线程模型\n\n```\nMain RunLoop\n  +-- CGEventTap 回调 (系统调度, 同步)\n  +-- IOKit HIDManager 回调 (schedule 到 Main RunLoop, 同步)\n  +-- MosInputProcessor.process() (被上述两者同步调用, 无锁竞争)\n```\n\nIOKit schedule 到 Main RunLoop 的理由:\n- HID++ 按键事件极低频(用户按键级别, 每秒个位数)\n- 避免跨线程同步复杂性\n- ShortcutExecutor 内部的 CGEvent.post() 需要在 main thread\n\n---\n\n## KeyRecorder 适配\n\n### 改动方案\n\nKeyRecorder 需要同时捕获 CGEventTap 和 HID++ 两种事件源:\n\n```swift\nclass KeyRecorder: NSObject {\n    // 新增: HID++ 事件监听 (录制期间临时启用)\n    private var hidEventObserver: NSObjectProtocol?\n\n    func startRecording(from sourceView: NSView, mode: KeyRecordingMode = .combination) {\n        // ... 现有 CGEventTap interceptor 启动逻辑不变 ...\n\n        // 新增: 监听 HID++ 事件\n        hidEventObserver = NotificationCenter.default.addObserver(\n            forName: LogitechHIDManager.buttonEventNotification,\n            object: nil,\n            queue: .main\n        ) { [weak self] notification in\n            guard let mosEvent = notification.object as? MosInputEvent else { return }\n            // 复用现有的录制完成通知机制\n            NotificationCenter.default.post(\n                name: KeyRecorder.FINISH_NOTI_NAME,\n                object: mosEvent  // 注意: 这里传的是 MosInputEvent 而非 CGEvent\n            )\n        }\n    }\n\n    func stopRecording() {\n        // ... 现有清理逻辑 ...\n        // 新增: 移除 HID++ 监听\n        if let observer = hidEventObserver {\n            NotificationCenter.default.removeObserver(observer)\n            hidEventObserver = nil\n        }\n    }\n}\n```\n\n### Delegate 协议变更\n\n**问题**: 现有 `KeyRecorderDelegate` 是 `@objc protocol` (因为使用了 `@objc optional`)。但 `MosInputEvent` 是 struct,不能在 `@objc` 方法中使用。\n\n**解决方案**: 去掉 `@objc`,用 protocol extension 提供默认实现替代 `@objc optional`:\n\n```swift\n// 改造前:\n// @objc protocol KeyRecorderDelegate: AnyObject {\n//     func onEventRecorded(_ recorder: KeyRecorder, didRecordEvent event: CGEvent, isDuplicate: Bool)\n//     @objc optional func validateRecordedEvent(_ recorder: KeyRecorder, event: CGEvent) -> Bool\n// }\n\n// 改造后:\nprotocol KeyRecorderDelegate: AnyObject {\n    func onEventRecorded(_ recorder: KeyRecorder, didRecordEvent event: MosInputEvent, isDuplicate: Bool)\n    func validateRecordedEvent(_ recorder: KeyRecorder, event: MosInputEvent) -> Bool\n}\n\n// 默认实现 (替代 @objc optional 语义)\nextension KeyRecorderDelegate {\n    func validateRecordedEvent(_ recorder: KeyRecorder, event: MosInputEvent) -> Bool {\n        return true  // 默认: 视为新录制\n    }\n}\n```\n\n### handleRecordedEvent 改造\n\n现有代码第 208 行使用 `notification.object as! CGEvent` 强制转换。HID++ 事件作为 MosInputEvent 通过同一 notification 传入时会崩溃。改造后的完整逻辑:\n\n```swift\n@objc private func handleRecordedEvent(_ notification: NSNotification) {\n    guard isRecording, !isRecorded else { return }\n\n    // 统一转换为 MosInputEvent (兼容两种来源)\n    let mosEvent: MosInputEvent\n    if let cgEvent = notification.object as? CGEvent {\n        mosEvent = MosInputEvent(fromCGEvent: cgEvent)\n    } else if let hidEvent = notification.object as? MosInputEvent {\n        mosEvent = hidEvent\n    } else {\n        NSLog(\"[EventRecorder] Unknown event type: \\(type(of: notification.object))\")\n        return\n    }\n\n    // 验证有效性 (根据录制模式)\n    let isValid = recordingMode == .singleKey\n        ? isRecordableAsSingleKey(mosEvent)  // 需要新增 MosInputEvent 版本的验证\n        : isRecordable(mosEvent)\n    guard isValid else {\n        keyPopover?.keyPreview.shakeWarning()\n        invalidKeyPressCount += 1\n        if invalidKeyPressCount >= invalidKeyThreshold {\n            keyPopover?.showEscHint()\n        }\n        return\n    }\n\n    isRecorded = true\n    let isNew = self.delegate?.validateRecordedEvent(self, event: mosEvent) ?? true\n    let isDuplicate = !isNew\n    let status: KeyPreview.Status = isNew ? .recorded : .duplicate\n\n    keyPopover?.keyPreview\n        .update(from: MosInputEvent.buildDisplayComponents(mosEvent), status: status)\n    self.delegate?.onEventRecorded(self, didRecordEvent: mosEvent, isDuplicate: isDuplicate)\n\n    DispatchQueue.main.asyncAfter(deadline: .now() + 0.7) { [weak self] in\n        self?.stopRecording()\n    }\n}\n```\n\n**注意**: `MosInputEvent` 是 struct (不继承 NSObject),通过 `NotificationCenter` 传递时需要注意: `notification.object` 会被 box 为 `Any?`。使用 `as?` 类型检查即可安全判断。如果 box 行为有问题,备选方案是将 MosInputEvent 包装在一个轻量 NSObject wrapper class 中。\n\n---\n\n## 现有功能兼容性\n\n| 功能 | 影响 | 说明 |\n|------|------|------|\n| 滚动平滑 (ScrollCore) | 无 | 不改, 继续用 CGEventTap |\n| 滚动翻转 | 无 | 同上 |\n| 滚动热键 (dash/toggle/block) | 无 | 继续用 ScrollHotkey + CGEvent 匹配 |\n| 按钮绑定 (ButtonCore) | 主要改动 | callback 内转为 MosInputProcessor |\n| 分应用配置 | 无 | Application.buttons 数据结构已就绪 |\n| Remote 检测 | 无 | 只作用于 scrollWheel CGEvent |\n| Trackpad 过滤 | 无 | 只作用于 scrollWheel CGEvent |\n| Monitor 窗口 | 无 | 只可视化滚动数据 |\n| 快捷键执行 | 无 | ShortcutExecutor 接口不变 |\n| KeyRecorder | 需适配 | delegate 参数类型变更 |\n| 配置持久化 | 向后兼容 | RecordedEvent 新增 optional 字段 |\n\n### ButtonFilter 与 HID++ 事件\n\n当前 `ButtonFilter` 存在但未被 `ButtonCore.buttonEventCallBack` 调用(是预留接口)。`MosInputProcessor` 同样不集成 ButtonFilter。如果未来 ButtonFilter 被启用,需要同时将其应用于 HID++ 事件路径。目前两者保持一致: 都不经过 ButtonFilter。\n\n### Phase 2: ScrollCore 热键统一\n\n当前 ScrollCore 的热键系统 (dash/toggle/block) 使用 `ScrollHotkey.matches(_ event: CGEvent)` 直接匹配 CGEvent。如果未来用户需要将 Logitech 手势按钮用作滚动热键,需要在 LogitechHIDManager 和 ScrollCore 之间增加桥接层,将 HID++ 按键事件转化为 ScrollCore 的热键状态更新。这不在本次设计范围内。\n\n### UserDefaults 数据兼容\n\nRecordedEvent 新增 `deviceFilter: DeviceFilter?`:\n- 旧数据反序列化时该字段缺失 -> `decodeIfPresent` 返回 nil -> 匹配任何设备 -> 行为与改动前完全一致\n- 无需数据迁移逻辑\n\n---\n\n## 文件变更清单\n\n### 新增文件 (4个)\n\n| 文件 | 位置 | 职责 |\n|------|------|------|\n| `MosInputEvent.swift` | `Mos/InputEvent/` | MosInputEvent, MosInputPhase, MosInputSource, MosInputDevice, DeviceFilter |\n| `MosInputProcessor.swift` | `Mos/InputEvent/` | MosInputProcessor, MosInputResult |\n| `LogitechHIDManager.swift` | `Mos/LogitechHID/` | IOKit HIDManager 封装, 设备枚举, 生命周期 |\n| `LogitechDeviceSession.swift` | `Mos/LogitechHID/` | HID++ 2.0 协议通信, Feature Discovery, Button Divert, 事件解析 |\n\n### 修改文件 (6个)\n\n| 文件 | 变更内容 |\n|------|---------|\n| `RecordedEvent.swift` | 新增 `deviceFilter` 字段 + `matchesMosInput()` + `init(from: MosInputEvent)` + `ScrollHotkey.init(from: MosInputEvent)` |\n| `ButtonCore.swift` | callback 内部改为构造 MosInputEvent 并调用 MosInputProcessor |\n| `KeyRecorder.swift` | delegate 从 `@objc protocol` 改为 Swift protocol + extension 默认实现; 参数类型改为 MosInputEvent; `handleRecordedEvent` 增加类型分支; 录制时增加 HID++ 监听 |\n| `KeyCode.swift` | 新增 Logitech 按钮码显示名称映射 (1000+ 段) |\n| `PreferencesButtonsViewController` | delegate 方法签名跟随变更, `RecordedEvent(from: MosInputEvent)` |\n| `PreferencesScrollingViewController` | delegate 方法签名跟随变更, `ScrollHotkey(from: MosInputEvent)` |\n\n### 不修改文件\n\nScrollCore, ScrollPoster, Interpolator, ScrollFilter, ScrollUtils, ScrollEvent, Interceptor, ShortcutExecutor, SystemShortcut, ButtonFilter, ButtonUtils, Application, Options, Monitor 窗口\n\n---\n\n## 风险与缓解\n\n### 1. Logitech Options+ 冲突\n**风险**: Logitech Options+ 也会访问 HID++ 设备,两者争夺 HID 句柄。\n**缓解**: IOHIDManager 的 `kIOHIDOptionsTypeNone` 模式允许多个进程同时打开设备。但 divert 操作可能冲突 -- 需要在文档中告知用户: 如使用 Mos 的 Logitech 按键绑定功能,建议退出 Logitech Options+。\n\n### 2. 设备兼容性\n**风险**: 不同 Logitech 设备的 HID++ 实现细节可能不同。\n**缓解**: 使用动态 Feature Discovery 而非硬编码 feature index。对于不支持 REPROG_CONTROLS_V4 的设备,graceful fallback -- 不 divert 任何按键,不影响 CGEventTap 路径。\n\n### 3. 蓝牙 vs USB Receiver\n**风险**: Unifying Receiver 和蓝牙连接的设备在 HID 层的表现不同。\n**缓解**: Unifying Receiver 作为一个复合 HID 设备出现,需要正确处理 device index。初版优先支持蓝牙直连(更简单),USB Receiver 作为后续增强。\n\n### 4. macOS 版本兼容\n**风险**: IOKit API 在不同 macOS 版本上的行为。\n**缓解**: IOHIDManager 从 macOS 10.5 就存在,API 稳定。项目最低支持 10.13,完全兼容。\n\n### 5. 权限\n**风险**: 访问 HID 设备可能需要额外权限。\n**缓解**: Mos 已经要求 Accessibility 权限。IOHIDManager 访问 HID 设备在 macOS 上通常不需要额外权限(除了某些 kext 级别的操作)。需要实际测试确认。\n"
  },
  {
    "path": "tools/hidpp-divert-debug.swift",
    "content": "#!/usr/bin/env swift\n// 对比测试: 批量 divert vs 顺序 divert, 并验证 divert 状态\nimport Foundation\nimport IOKit\nimport IOKit.hid\n\nlet VID = 0x046D\nfunc hex(_ d: [UInt8], n: Int? = nil) -> String { d.prefix(n ?? d.count).map { String(format: \"%02X\", $0) }.joined(separator: \" \") }\n\nclass Ctx { var reports: [[UInt8]] = [] }\nlet ctx = Ctx()\nlet ctxPtr = Unmanaged.passRetained(ctx).toOpaque()\nlet cb: IOHIDReportCallback = { c, _, _, _, _, r, l in\n    guard let c = c else { return }\n    let x = Unmanaged<Ctx>.fromOpaque(c).takeUnretainedValue()\n    let d = Array(UnsafeBufferPointer(start: r, count: l))\n    if d.count >= 7 && (d[0] == 0x10 || d[0] == 0x11) { x.reports.append(d) }\n}\n\nlet mgr = IOHIDManagerCreate(kCFAllocatorDefault, IOOptionBits(kIOHIDOptionsTypeNone))\nIOHIDManagerSetDeviceMatching(mgr, [kIOHIDVendorIDKey as String: VID] as CFDictionary)\nIOHIDManagerScheduleWithRunLoop(mgr, CFRunLoopGetCurrent(), CFRunLoopMode.defaultMode.rawValue)\nIOHIDManagerOpen(mgr, IOOptionBits(kIOHIDOptionsTypeNone))\nRunLoop.current.run(until: Date(timeIntervalSinceNow: 0.5))\n\nguard let devs = IOHIDManagerCopyDevices(mgr) as? Set<IOHIDDevice>,\n      let dev = devs.first(where: { (IOHIDDeviceGetProperty($0, kIOHIDTransportKey as CFString) as? String ?? \"\").contains(\"Bluetooth\") })\nelse { print(\"No BLE device\"); exit(1) }\n\nprint(\"Device: \\(IOHIDDeviceGetProperty(dev, kIOHIDProductKey as CFString) as? String ?? \"?\")\")\nIOHIDDeviceOpen(dev, IOOptionBits(kIOHIDOptionsTypeNone))\nlet buf = UnsafeMutablePointer<UInt8>.allocate(capacity: 64)\nbuf.initialize(repeating: 0, count: 64)\nIOHIDDeviceRegisterInputReportCallback(dev, buf, 64, cb, ctxPtr)\n\nfunc send(_ d: [UInt8]) { IOHIDDeviceSetReport(dev, kIOHIDReportTypeOutput, CFIndex(d[0]), d, d.count) }\nfunc pkt(_ fi: UInt8, _ fn: UInt8, _ p: [UInt8] = []) -> [UInt8] {\n    var r = [UInt8](repeating: 0, count: 20); r[0] = 0x11; r[1] = 0xFF; r[2] = fi; r[3] = (fn << 4) | 0x01\n    for (i, v) in p.prefix(16).enumerated() { r[4+i] = v }; return r\n}\nfunc wait(_ t: TimeInterval = 2.0) -> [UInt8]? {\n    ctx.reports.removeAll()\n    let dl = Date(timeIntervalSinceNow: t)\n    while Date() < dl && ctx.reports.isEmpty { RunLoop.current.run(until: Date(timeIntervalSinceNow: 0.05)) }\n    return ctx.reports.first\n}\n\n// Step 1: Discover REPROG\nprint(\"\\n=== Feature Discovery ===\")\nsend(pkt(0x00, 0, [0x1B, 0x04]))\nguard let r = wait(), r[4] != 0 else { print(\"REPROG not found\"); exit(1) }\nlet reprogIdx = r[4]\nprint(\"REPROG at index 0x\\(String(format: \"%02X\", reprogIdx))\")\n\n// Step 2: Get control count\nsend(pkt(reprogIdx, 0))\nguard let cr = wait() else { print(\"No count response\"); exit(1) }\nlet count = Int(cr[4])\nprint(\"Controls: \\(count)\")\n\n// Step 3: Enumerate divertable controls\nstruct Ctrl { let cid: UInt16; let name: String; let divertable: Bool }\nvar ctrls: [Ctrl] = []\nlet names: [UInt16: String] = [0x0052:\"Middle\",0x0053:\"Back\",0x0056:\"Forward\",0x00C3:\"Gesture\",0x00C4:\"SmartShift\",0x00D7:\"DPI\"]\nfor i in 0..<count {\n    send(pkt(reprogIdx, 1, [UInt8(i)]))\n    guard let ir = wait(1.0) else { continue }\n    let cid = (UInt16(ir[4]) << 8) | UInt16(ir[5])\n    let f1 = ir[8]\n    let dvrt = (f1 & 0x20) != 0\n    ctrls.append(Ctrl(cid: cid, name: names[cid] ?? \"?\", divertable: dvrt))\n}\nlet divertable = ctrls.filter { $0.divertable }\nprint(\"Divertable: \\(divertable.map { $0.name })\")\n\n// Step 4: TEST A - 顺序 divert (等待每个 ACK)\nprint(\"\\n=== TEST A: Sequential divert (wait for each ACK) ===\")\nfor c in divertable {\n    send(pkt(reprogIdx, 3, [UInt8(c.cid >> 8), UInt8(c.cid & 0xFF), 0x01]))\n    let ack = wait(1.0)\n    print(\"  Divert \\(c.name): \\(ack != nil ? \"ACK\" : \"timeout\")\")\n}\n\n// Step 5: 验证 divert 状态 (GetControlReporting, function 2)\nprint(\"\\n=== Verify divert status (GetControlReporting) ===\")\nfor c in divertable {\n    send(pkt(reprogIdx, 2, [UInt8(c.cid >> 8), UInt8(c.cid & 0xFF)]))\n    if let vr = wait(1.0) {\n        let reportedFlags = vr[6]\n        let isDiverted = (reportedFlags & 0x01) != 0\n        print(\"  \\(c.name) (CID=\\(String(format: \"0x%04X\", c.cid))): flags=0x\\(String(format: \"%02X\", reportedFlags)) diverted=\\(isDiverted)\")\n    } else {\n        print(\"  \\(c.name): no response\")\n    }\n}\n\n// Step 6: 捕获按键 (10 秒)\nprint(\"\\n=== Button capture (10s) - PRESS BUTTONS NOW ===\")\nctx.reports.removeAll()\nvar lastCIDs: Set<UInt16> = []\nlet end = Date(timeIntervalSinceNow: 10.0)\nwhile Date() < end {\n    RunLoop.current.run(until: Date(timeIntervalSinceNow: 0.05))\n    for rpt in ctx.reports {\n        if rpt[2] == reprogIdx {\n            let fn = rpt[3] >> 4\n            if fn == 0 { // divertedButtonsEvent\n                var active: Set<UInt16> = []\n                var off = 4\n                while off + 1 < rpt.count { let c = (UInt16(rpt[off]) << 8) | UInt16(rpt[off+1]); if c == 0 { break }; active.insert(c); off += 2 }\n                for c in active.subtracting(lastCIDs) { print(\"  DOWN: \\(names[c] ?? \"?\") (0x\\(String(format: \"%04X\", c)))\") }\n                for c in lastCIDs.subtracting(active) { print(\"  UP:   \\(names[c] ?? \"?\") (0x\\(String(format: \"%04X\", c)))\") }\n                lastCIDs = active\n            } else {\n                print(\"  [func\\(fn)] \\(hex(rpt, n: 10))\")\n            }\n        } else {\n            let fi = rpt[2]\n            print(\"  [feat=0x\\(String(format: \"%02X\", fi))] \\(hex(rpt, n: 10))\")\n        }\n    }\n    ctx.reports.removeAll()\n}\n\n// Step 7: Undivert\nprint(\"\\n=== Undivert ===\")\nfor c in divertable {\n    send(pkt(reprogIdx, 3, [UInt8(c.cid >> 8), UInt8(c.cid & 0xFF), 0x00]))\n    let _ = wait(0.5)\n}\nprint(\"Done\")\n\nbuf.deallocate()\nIOHIDDeviceClose(dev, IOOptionBits(kIOHIDOptionsTypeNone))\nIOHIDManagerClose(mgr, IOOptionBits(kIOHIDOptionsTypeNone))\n"
  },
  {
    "path": "tools/hidpp-divert-fix.swift",
    "content": "#!/usr/bin/env swift\n// 对比: CID+flags+0000 vs CID+flags+CID (self-mapping)\nimport Foundation\nimport IOKit\nimport IOKit.hid\n\nlet VID = 0x046D\nclass Ctx { var reports: [[UInt8]] = [] }\nlet ctx = Ctx()\nlet ctxPtr = Unmanaged.passRetained(ctx).toOpaque()\nlet cb: IOHIDReportCallback = { c, _, _, _, _, r, l in\n    guard let c = c else { return }\n    let x = Unmanaged<Ctx>.fromOpaque(c).takeUnretainedValue()\n    let d = Array(UnsafeBufferPointer(start: r, count: l))\n    if d.count >= 7 && (d[0] == 0x10 || d[0] == 0x11) { x.reports.append(d) }\n}\n\nlet mgr = IOHIDManagerCreate(kCFAllocatorDefault, IOOptionBits(kIOHIDOptionsTypeNone))\nIOHIDManagerSetDeviceMatching(mgr, [kIOHIDVendorIDKey as String: VID] as CFDictionary)\nIOHIDManagerScheduleWithRunLoop(mgr, CFRunLoopGetCurrent(), CFRunLoopMode.defaultMode.rawValue)\nIOHIDManagerOpen(mgr, IOOptionBits(kIOHIDOptionsTypeNone))\nRunLoop.current.run(until: Date(timeIntervalSinceNow: 0.5))\n\nguard let devs = IOHIDManagerCopyDevices(mgr) as? Set<IOHIDDevice>,\n      let dev = devs.first(where: { (IOHIDDeviceGetProperty($0, kIOHIDTransportKey as CFString) as? String ?? \"\").contains(\"Bluetooth\") })\nelse { print(\"No BLE device\"); exit(1) }\n\nprint(\"Device: \\(IOHIDDeviceGetProperty(dev, kIOHIDProductKey as CFString) as? String ?? \"?\")\")\nIOHIDDeviceOpen(dev, IOOptionBits(kIOHIDOptionsTypeNone))\nlet buf = UnsafeMutablePointer<UInt8>.allocate(capacity: 64)\nbuf.initialize(repeating: 0, count: 64)\nIOHIDDeviceRegisterInputReportCallback(dev, buf, 64, cb, ctxPtr)\n\nfunc send(_ d: [UInt8]) { IOHIDDeviceSetReport(dev, kIOHIDReportTypeOutput, CFIndex(d[0]), d, d.count) }\nfunc pkt(_ fi: UInt8, _ fn: UInt8, _ p: [UInt8] = []) -> [UInt8] {\n    var r = [UInt8](repeating: 0, count: 20); r[0] = 0x11; r[1] = 0xFF; r[2] = fi; r[3] = (fn << 4) | 0x01\n    for (i, v) in p.prefix(16).enumerated() { r[4+i] = v }; return r\n}\nfunc wait(_ t: TimeInterval = 2.0) -> [UInt8]? {\n    ctx.reports.removeAll()\n    let dl = Date(timeIntervalSinceNow: t)\n    while Date() < dl && ctx.reports.isEmpty { RunLoop.current.run(until: Date(timeIntervalSinceNow: 0.05)) }\n    return ctx.reports.first\n}\n\nlet names: [UInt16: String] = [0x0052:\"Middle\",0x0053:\"Back\",0x0056:\"Forward\",0x00C3:\"Gesture\",0x00C4:\"SmartShift\",0x00D7:\"DPI\"]\n\n// Discover\nsend(pkt(0x00, 0, [0x1B, 0x04]))\nguard let r = wait(), r[4] != 0 else { print(\"REPROG not found\"); exit(1) }\nlet ri = r[4]\nprint(\"REPROG at 0x\\(String(format: \"%02X\", ri))\")\n\n// Test CID: SmartShift (0x00C4) - 最容易验证 (按下后滚轮应该不再切换)\nlet cid: UInt16 = 0x00C4\nlet cidH = UInt8(cid >> 8)\nlet cidL = UInt8(cid & 0xFF)\n\nprint(\"\\n=== Test 1: SetControlReporting with targetCID=0x0000 (current method) ===\")\nsend(pkt(ri, 3, [cidH, cidL, 0x01, 0x00, 0x00]))  // CID + flags + target=0x0000\nlet _ = wait(1.0)\n// Verify\nsend(pkt(ri, 2, [cidH, cidL]))  // GetControlReporting\nif let vr = wait(1.0) {\n    let flags = vr[6]\n    let target = (UInt16(vr[7]) << 8) | UInt16(vr[8])\n    print(\"  GetControlReporting: flags=0x\\(String(format: \"%02X\", flags)) target=0x\\(String(format: \"%04X\", target)) diverted=\\((flags & 0x01) != 0)\")\n}\n\n// Reset\nsend(pkt(ri, 3, [cidH, cidL, 0x00, 0x00, 0x00]))\nlet _ = wait(0.5)\n\nprint(\"\\n=== Test 2: SetControlReporting with targetCID=same CID (Solaar method) ===\")\nsend(pkt(ri, 3, [cidH, cidL, 0x01, cidH, cidL]))  // CID + flags + target=same CID\nlet _ = wait(1.0)\n// Verify\nsend(pkt(ri, 2, [cidH, cidL]))\nif let vr = wait(1.0) {\n    let flags = vr[6]\n    let target = (UInt16(vr[7]) << 8) | UInt16(vr[8])\n    print(\"  GetControlReporting: flags=0x\\(String(format: \"%02X\", flags)) target=0x\\(String(format: \"%04X\", target)) diverted=\\((flags & 0x01) != 0)\")\n}\n\nprint(\"\\n=== Test 3: SetControlReporting with flags=0x03 (divert + persistDivert) ===\")\nsend(pkt(ri, 3, [cidH, cidL, 0x03, cidH, cidL]))\nlet _ = wait(1.0)\nsend(pkt(ri, 2, [cidH, cidL]))\nif let vr = wait(1.0) {\n    let flags = vr[6]\n    let target = (UInt16(vr[7]) << 8) | UInt16(vr[8])\n    print(\"  GetControlReporting: flags=0x\\(String(format: \"%02X\", flags)) target=0x\\(String(format: \"%04X\", target)) diverted=\\((flags & 0x01) != 0)\")\n}\n\nprint(\"\\n=== Test 4: Read current mapping FIRST, then modify flags only ===\")\n// First read current state\nsend(pkt(ri, 2, [cidH, cidL]))\nif let current = wait(1.0) {\n    let curFlags = current[6]\n    let curTarget = [current[7], current[8]]\n    print(\"  Current: flags=0x\\(String(format: \"%02X\", curFlags)) target=0x\\(String(format: \"%02X%02X\", curTarget[0], curTarget[1]))\")\n\n    // Set divert bit ON, preserve existing target\n    let newFlags = curFlags | 0x01\n    send(pkt(ri, 3, [cidH, cidL, newFlags, curTarget[0], curTarget[1]]))\n    let _ = wait(1.0)\n\n    // Verify\n    send(pkt(ri, 2, [cidH, cidL]))\n    if let vr = wait(1.0) {\n        let flags = vr[6]\n        let target = (UInt16(vr[7]) << 8) | UInt16(vr[8])\n        print(\"  After divert: flags=0x\\(String(format: \"%02X\", flags)) target=0x\\(String(format: \"%04X\", target)) diverted=\\((flags & 0x01) != 0)\")\n    }\n}\n\n// If any test set diverted=true, capture buttons for 10s\nprint(\"\\n=== Button capture (10s) - PRESS SmartShift BUTTON ===\")\nctx.reports.removeAll()\nvar lastCIDs: Set<UInt16> = []\nlet end = Date(timeIntervalSinceNow: 10.0)\nwhile Date() < end {\n    RunLoop.current.run(until: Date(timeIntervalSinceNow: 0.05))\n    for rpt in ctx.reports {\n        if rpt[2] == ri && (rpt[3] >> 4) == 0 {\n            var active: Set<UInt16> = []\n            var off = 4\n            while off + 1 < rpt.count { let c = (UInt16(rpt[off]) << 8) | UInt16(rpt[off+1]); if c == 0 { break }; active.insert(c); off += 2 }\n            for c in active.subtracting(lastCIDs) { let n = names[c] ?? String(format: \"0x%04X\", c); print(\"  DOWN: \\(n)\") }\n            for c in lastCIDs.subtracting(active) { let n = names[c] ?? String(format: \"0x%04X\", c); print(\"  UP:   \\(n)\") }\n            lastCIDs = active\n        } else {\n            print(\"  [feat=0x\\(String(format: \"%02X\", rpt[2])) fn=\\(rpt[3] >> 4)] \\(rpt.prefix(10).map { String(format: \"%02X\", $0) }.joined(separator: \" \"))\")\n        }\n    }\n    ctx.reports.removeAll()\n}\n\n// Cleanup\nsend(pkt(ri, 3, [cidH, cidL, 0x00, cidH, cidL]))\nlet _ = wait(0.5)\nprint(\"\\nDone\")\nbuf.deallocate()\nIOHIDDeviceClose(dev, IOOptionBits(kIOHIDOptionsTypeNone))\nIOHIDManagerClose(mgr, IOOptionBits(kIOHIDOptionsTypeNone))\n"
  },
  {
    "path": "tools/hidpp-full-test.swift",
    "content": "#!/usr/bin/env swift\n// HID++ 2.0 全量测试 - 一次运行覆盖: 发现 → 枚举 → Divert → 捕获按键\n// swift tools/hidpp-full-test.swift\n\nimport Foundation\nimport IOKit\nimport IOKit.hid\nimport CoreGraphics\n\nlet LOGITECH_VID = 0x046D\n\nfunc hex(_ data: [UInt8], n: Int? = nil) -> String {\n    data.prefix(n ?? data.count).map { String(format: \"%02X\", $0) }.joined(separator: \" \")\n}\n\n// MARK: - Report context\nclass Ctx {\n    var reports: [[UInt8]] = []\n    func clear() { reports.removeAll() }\n    func waitForHIDPP(timeout: TimeInterval = 3.0) -> [UInt8]? {\n        let deadline = Date(timeIntervalSinceNow: timeout)\n        while Date() < deadline && reports.isEmpty {\n            RunLoop.current.run(until: Date(timeIntervalSinceNow: 0.05))\n        }\n        return reports.first\n    }\n}\n\nlet ctx = Ctx()\nlet ctxPtr = Unmanaged.passRetained(ctx).toOpaque()\nlet rxCallback: IOHIDReportCallback = { context, _, _, _, _, report, len in\n    guard let context = context else { return }\n    let c = Unmanaged<Ctx>.fromOpaque(context).takeUnretainedValue()\n    let data = Array(UnsafeBufferPointer(start: report, count: len))\n    if data.count >= 7 && (data[0] == 0x10 || data[0] == 0x11) {\n        c.reports.append(data)\n    }\n}\n\n// MARK: - Enumerate & find BLE device\nlet mgr = IOHIDManagerCreate(kCFAllocatorDefault, IOOptionBits(kIOHIDOptionsTypeNone))\nIOHIDManagerSetDeviceMatching(mgr, [kIOHIDVendorIDKey as String: LOGITECH_VID] as CFDictionary)\nIOHIDManagerScheduleWithRunLoop(mgr, CFRunLoopGetCurrent(), CFRunLoopMode.defaultMode.rawValue)\nIOHIDManagerOpen(mgr, IOOptionBits(kIOHIDOptionsTypeNone))\nRunLoop.current.run(until: Date(timeIntervalSinceNow: 0.5))\n\nguard let devs = IOHIDManagerCopyDevices(mgr) as? Set<IOHIDDevice>,\n      let bleDev = devs.first(where: {\n          (IOHIDDeviceGetProperty($0, kIOHIDTransportKey as CFString) as? String ?? \"\").contains(\"Bluetooth\")\n      }) else { print(\"FAIL: No BLE Logitech device\"); exit(1) }\n\nlet devName = IOHIDDeviceGetProperty(bleDev, kIOHIDProductKey as CFString) as? String ?? \"?\"\nprint(\"Device: \\(devName)\")\n\nIOHIDDeviceOpen(bleDev, IOOptionBits(kIOHIDOptionsTypeNone))\nlet buf = UnsafeMutablePointer<UInt8>.allocate(capacity: 64)\nbuf.initialize(repeating: 0, count: 64)\nIOHIDDeviceRegisterInputReportCallback(bleDev, buf, 64, rxCallback, ctxPtr)\n\n// MARK: - hidapi-compatible send\nfunc send(_ data: [UInt8]) -> IOReturn {\n    return IOHIDDeviceSetReport(bleDev, kIOHIDReportTypeOutput, CFIndex(data[0]), data, data.count)\n}\nfunc sendAndReceive(_ data: [UInt8], timeout: TimeInterval = 3.0) -> [UInt8]? {\n    ctx.clear()\n    let r = send(data)\n    guard r == kIOReturnSuccess else {\n        print(\"  TX FAILED: \\(String(format: \"0x%08x\", r))\")\n        return nil\n    }\n    return ctx.waitForHIDPP(timeout: timeout)\n}\n\nfunc makePacket(featureIdx: UInt8, funcId: UInt8, params: [UInt8] = []) -> [UInt8] {\n    var pkt = [UInt8](repeating: 0, count: 20)\n    pkt[0] = 0x11\n    pkt[1] = 0xFF  // BLE device index\n    pkt[2] = featureIdx\n    pkt[3] = (funcId << 4) | 0x01\n    for (i, p) in params.prefix(16).enumerated() { pkt[4 + i] = p }\n    return pkt\n}\n\n// ============================================================\nprint(\"\\n========== PHASE 1: IRoot Ping ==========\")\nlet pingPkt = makePacket(featureIdx: 0x00, funcId: 1)\nif let resp = sendAndReceive(pingPkt) {\n    print(\"OK: HID++ Protocol \\(resp[4]).\\(resp[5])\")\n} else {\n    print(\"FAIL: No ping response - aborting\")\n    exit(1)\n}\n\n// ============================================================\nprint(\"\\n========== PHASE 2: Feature Discovery ==========\")\n\nlet featureIds: [(UInt16, String)] = [\n    (0x0001, \"FEATURE_SET\"),\n    (0x1B04, \"REPROG_CONTROLS_V4\"),\n    (0x2110, \"SMART_SHIFT\"),\n    (0x2201, \"ADJUSTABLE_DPI\"),\n    (0x1000, \"BATTERY_STATUS\"),\n    (0x0003, \"DEVICE_FW_VERSION\"),\n    (0x0005, \"DEVICE_NAME\"),\n]\n\nvar featureMap: [UInt16: UInt8] = [:]\nfor (fid, fname) in featureIds {\n    let pkt = makePacket(featureIdx: 0x00, funcId: 0, params: [UInt8(fid >> 8), UInt8(fid & 0xFF)])\n    if let resp = sendAndReceive(pkt, timeout: 2.0) {\n        let idx = resp[4]\n        if idx != 0 {\n            featureMap[fid] = idx\n            print(\"  \\(fname) (0x\\(String(format: \"%04X\", fid))) -> index 0x\\(String(format: \"%02X\", idx))\")\n        } else {\n            print(\"  \\(fname) (0x\\(String(format: \"%04X\", fid))) -> NOT SUPPORTED\")\n        }\n    } else {\n        print(\"  \\(fname) -> NO RESPONSE\")\n    }\n}\n\n// ============================================================\nprint(\"\\n========== PHASE 3: Device Name ==========\")\nif let nameIdx = featureMap[0x0005] {\n    // GetDeviceNameCount (func 0)\n    let countPkt = makePacket(featureIdx: nameIdx, funcId: 0)\n    if let resp = sendAndReceive(countPkt) {\n        let nameLen = Int(resp[4])\n        var nameBytes: [UInt8] = []\n        // GetDeviceName (func 1, param = offset)\n        var offset = 0\n        while offset < nameLen {\n            let namePkt = makePacket(featureIdx: nameIdx, funcId: 1, params: [UInt8(offset)])\n            if let resp = sendAndReceive(namePkt, timeout: 1.0) {\n                let chunk = Array(resp[4..<min(resp.count, 4 + nameLen - offset)])\n                nameBytes.append(contentsOf: chunk.prefix(while: { $0 != 0 }))\n                offset += chunk.count\n            } else { break }\n        }\n        print(\"  Name: \\(String(bytes: nameBytes, encoding: .utf8) ?? \"?\")\")\n    }\n}\n\n// ============================================================\nprint(\"\\n========== PHASE 4: Battery ==========\")\nif let batIdx = featureMap[0x1000] {\n    let batPkt = makePacket(featureIdx: batIdx, funcId: 0)\n    if let resp = sendAndReceive(batPkt) {\n        print(\"  Battery: \\(resp[4])%, status=\\(resp[6])\")\n    }\n}\n\n// ============================================================\nprint(\"\\n========== PHASE 5: REPROG_CONTROLS_V4 ==========\")\nguard let reprogIdx = featureMap[0x1B04] else {\n    print(\"FAIL: REPROG_CONTROLS_V4 not found\"); exit(1)\n}\n\n// GetControlCount\nlet countPkt = makePacket(featureIdx: reprogIdx, funcId: 0)\nguard let countResp = sendAndReceive(countPkt) else {\n    print(\"FAIL: GetControlCount no response\"); exit(1)\n}\nlet controlCount = Int(countResp[4])\nprint(\"  Control count: \\(controlCount)\")\n\n// CID 名称查找表 (Solaar)\nlet cidNames: [UInt16: String] = [\n    0x0050: \"Left Click\", 0x0051: \"Right Click\", 0x0052: \"Middle Click\",\n    0x0053: \"Back\", 0x0056: \"Forward\",\n    0x00C3: \"Gesture Button\", 0x00C4: \"SmartShift\",\n    0x00D7: \"DPI Change\", 0x00FD: \"Battery Status LED\",\n]\n\nstruct ControlInfo {\n    let index: Int\n    let cid: UInt16\n    let taskId: UInt16\n    let flags1: UInt8\n    let flags2: UInt8\n    let name: String\n    var isReprogrammable: Bool { (flags1 & 0x10) != 0 }\n    var isDivertable: Bool { (flags1 & 0x20) != 0 }\n    var isPersistDivert: Bool { (flags1 & 0x40) != 0 }\n}\n\nvar controls: [ControlInfo] = []\nfor i in 0..<controlCount {\n    let infoPkt = makePacket(featureIdx: reprogIdx, funcId: 1, params: [UInt8(i)])\n    guard let resp = sendAndReceive(infoPkt, timeout: 2.0) else {\n        print(\"  Control[\\(i)]: NO RESPONSE\"); continue\n    }\n    let cid = (UInt16(resp[4]) << 8) | UInt16(resp[5])\n    let taskId = (UInt16(resp[6]) << 8) | UInt16(resp[7])\n    let f1 = resp[8]\n    let f2: UInt8 = resp.count > 12 ? resp[12] : 0\n    let name = cidNames[cid] ?? \"Unknown\"\n    let ctrl = ControlInfo(index: i, cid: cid, taskId: taskId, flags1: f1, flags2: f2, name: name)\n    controls.append(ctrl)\n\n    let flagStr = [\n        ctrl.isReprogrammable ? \"reprog\" : nil,\n        ctrl.isDivertable ? \"DIVERTABLE\" : nil,\n        ctrl.isPersistDivert ? \"persist\" : nil,\n    ].compactMap { $0 }.joined(separator: \",\")\n\n    print(\"  [\\(i)] CID=0x\\(String(format: \"%04X\", cid)) \\(name.padding(toLength: 18, withPad: \" \", startingAt: 0)) flags1=0x\\(String(format: \"%02X\", f1)) [\\(flagStr)]\")\n}\n\n// ============================================================\nprint(\"\\n========== PHASE 6: Divert All Divertable Controls ==========\")\nlet divertable = controls.filter { $0.isDivertable }\nprint(\"  Divertable: \\(divertable.count)/\\(controls.count)\")\n\nfor ctrl in divertable {\n    // SetControlReporting: func 3, params = CID(2) + flags(1)\n    // flag bit 0 = temporaryDivert\n    let divertPkt = makePacket(featureIdx: reprogIdx, funcId: 3,\n                               params: [UInt8(ctrl.cid >> 8), UInt8(ctrl.cid & 0xFF), 0x01])\n    let divertResp = sendAndReceive(divertPkt, timeout: 1.0)\n    print(\"  Divert CID=0x\\(String(format: \"%04X\", ctrl.cid)) (\\(ctrl.name)): \\(divertResp != nil ? \"OK\" : \"no ack\")\")\n}\n\n// ============================================================\nprint(\"\\n========== PHASE 7: Button Capture (20 seconds) ==========\")\nprint(\">>> 请在 20 秒内按下鼠标上的所有按键 (中键/前进/后退/手势/SmartShift/DPI) <<<\\n\")\n\nctx.clear()\nlet captureEnd = Date(timeIntervalSinceNow: 20.0)\nvar lastCIDs: Set<UInt16> = []\nvar capturedEvents: [(String, UInt16, String)] = []  // (direction, cid, name)\n\nwhile Date() < captureEnd {\n    RunLoop.current.run(until: Date(timeIntervalSinceNow: 0.05))\n\n    for report in ctx.reports {\n        // 只处理来自 REPROG_CONTROLS_V4 的事件\n        guard report[2] == reprogIdx else {\n            // 其他 feature 的通知也记录\n            let feat = report[2]\n            let funcId = report[3] >> 4\n            print(\"  [Other] Feature=0x\\(String(format: \"%02X\", feat)) Func=\\(funcId) Data=\\(hex(report, n: 12))\")\n            continue\n        }\n\n        // 解析 CID pairs\n        var activeCIDs: Set<UInt16> = []\n        var offset = 4\n        while offset + 1 < report.count {\n            let cid = (UInt16(report[offset]) << 8) | UInt16(report[offset + 1])\n            if cid == 0 { break }\n            activeCIDs.insert(cid)\n            offset += 2\n        }\n\n        let pressed = activeCIDs.subtracting(lastCIDs)\n        let released = lastCIDs.subtracting(activeCIDs)\n        lastCIDs = activeCIDs\n\n        for cid in pressed {\n            let name = cidNames[cid] ?? \"Unknown(0x\\(String(format: \"%04X\", cid)))\"\n            print(\"  >>> BUTTON DOWN: CID=0x\\(String(format: \"%04X\", cid)) = \\(name)\")\n            capturedEvents.append((\"DOWN\", cid, name))\n        }\n        for cid in released {\n            let name = cidNames[cid] ?? \"Unknown(0x\\(String(format: \"%04X\", cid)))\"\n            print(\"  >>> BUTTON UP:   CID=0x\\(String(format: \"%04X\", cid)) = \\(name)\")\n            capturedEvents.append((\"UP\", cid, name))\n        }\n    }\n    ctx.clear()\n}\n\n// ============================================================\nprint(\"\\n========== PHASE 8: Undivert ==========\")\nfor ctrl in divertable {\n    let undivertPkt = makePacket(featureIdx: reprogIdx, funcId: 3,\n                                 params: [UInt8(ctrl.cid >> 8), UInt8(ctrl.cid & 0xFF), 0x00])\n    let _ = sendAndReceive(undivertPkt, timeout: 1.0)\n}\nprint(\"  All controls undiverted\")\n\n// ============================================================\nprint(\"\\n========== RESULTS ==========\")\nprint(\"Device: \\(devName)\")\nprint(\"Controls: \\(controlCount) total, \\(divertable.count) divertable\")\nprint(\"Captured events: \\(capturedEvents.count)\")\nif capturedEvents.isEmpty {\n    print(\"\\n  NO BUTTON EVENTS CAPTURED\")\n    print(\"  Possible causes:\")\n    print(\"  - SetControlReporting divert didn't take effect\")\n    print(\"  - Button events use a different notification format\")\n    print(\"  - Buttons not pressed during capture window\")\n} else {\n    let uniqueCIDs = Set(capturedEvents.map { $0.1 })\n    print(\"\\nUnique buttons detected:\")\n    for cid in uniqueCIDs.sorted() {\n        let name = cidNames[cid] ?? \"Unknown\"\n        let downs = capturedEvents.filter { $0.0 == \"DOWN\" && $0.1 == cid }.count\n        print(\"  CID=0x\\(String(format: \"%04X\", cid)) \\(name): \\(downs) presses\")\n    }\n}\n\nprint(\"\\n========== DONE ==========\")\nbuf.deallocate()\nIOHIDDeviceClose(bleDev, IOOptionBits(kIOHIDOptionsTypeNone))\nIOHIDManagerClose(mgr, IOOptionBits(kIOHIDOptionsTypeNone))\n"
  },
  {
    "path": "tools/hidpp-probe.swift",
    "content": "#!/usr/bin/env swift\n// HID++ 2.0 BLE 探测工具 v3 - 精确复现 hidapi 行为\n// swift tools/hidpp-probe.swift\n\nimport Foundation\nimport IOKit\nimport IOKit.hid\n\nlet LOGITECH_VID = 0x046D\n\nfunc hex(_ data: [UInt8], n: Int? = nil) -> String {\n    data.prefix(n ?? data.count).map { String(format: \"%02X\", $0) }.joined(separator: \" \")\n}\n\nclass Ctx { var reports: [[UInt8]] = [] }\nlet ctx = Ctx()\nlet ctxPtr = Unmanaged.passRetained(ctx).toOpaque()\n\nlet rxCallback: IOHIDReportCallback = { context, result, sender, type, reportID, report, reportLength in\n    guard let context = context else { return }\n    let c = Unmanaged<Ctx>.fromOpaque(context).takeUnretainedValue()\n    let data = Array(UnsafeBufferPointer(start: report, count: reportLength))\n    if data.count >= 7 && (data[0] == 0x10 || data[0] == 0x11) {\n        c.reports.append(data)\n        print(\"  >> HID++ RX: \\(hex(data, n: min(data.count, 20)))\")\n    }\n}\n\n// Enumerate\nlet mgr = IOHIDManagerCreate(kCFAllocatorDefault, IOOptionBits(kIOHIDOptionsTypeNone))\nIOHIDManagerSetDeviceMatching(mgr, [kIOHIDVendorIDKey as String: LOGITECH_VID] as CFDictionary)\nIOHIDManagerScheduleWithRunLoop(mgr, CFRunLoopGetCurrent(), CFRunLoopMode.defaultMode.rawValue)\nIOHIDManagerOpen(mgr, IOOptionBits(kIOHIDOptionsTypeNone))\nRunLoop.current.run(until: Date(timeIntervalSinceNow: 0.5))\n\nguard let devs = IOHIDManagerCopyDevices(mgr) as? Set<IOHIDDevice>,\n      let bleDev = devs.first(where: {\n          let tr = IOHIDDeviceGetProperty($0, kIOHIDTransportKey as CFString) as? String ?? \"\"\n          return tr.contains(\"Bluetooth\")\n      }) else { print(\"No BLE Logitech device\"); exit(1) }\n\nlet name = IOHIDDeviceGetProperty(bleDev, kIOHIDProductKey as CFString) as? String ?? \"?\"\nprint(\"Target: \\(name) (BLE)\\n\")\nIOHIDDeviceOpen(bleDev, IOOptionBits(kIOHIDOptionsTypeNone))\n\nlet buf = UnsafeMutablePointer<UInt8>.allocate(capacity: 64)\nbuf.initialize(repeating: 0, count: 64)\nIOHIDDeviceRegisterInputReportCallback(bleDev, buf, 64, rxCallback, ctxPtr)\n\n// hidapi 精确行为: report_id != 0 时, data 包含 report ID, length = 全长\n// IOHIDDeviceSetReport(dev, OUTPUT, data[0], data, length)\nfunc hidapiWrite(_ device: IOHIDDevice, _ data: [UInt8]) -> IOReturn {\n    let reportId = CFIndex(data[0])\n    return IOHIDDeviceSetReport(device, kIOHIDReportTypeOutput, reportId, data, data.count)\n}\n\nfunc waitResponse(sec: TimeInterval = 3.0) -> Bool {\n    let deadline = Date(timeIntervalSinceNow: sec)\n    while Date() < deadline && ctx.reports.isEmpty {\n        RunLoop.current.run(until: Date(timeIntervalSinceNow: 0.1))\n    }\n    return !ctx.reports.isEmpty\n}\n\n// MARK: - Test 1: hidapi 精确行为, IRoot.GetFeature(0x1B04)\nprint(\"=== Test 1: hidapi-exact, IRoot.GetFeature(0x1B04) ===\\n\")\nfor devIdx: UInt8 in [0xFF, 0x01, 0x00] {\n    ctx.reports.removeAll()\n    var pkt = [UInt8](repeating: 0, count: 20)\n    pkt[0] = 0x11; pkt[1] = devIdx; pkt[2] = 0x00; pkt[3] = 0x01; pkt[4] = 0x1B; pkt[5] = 0x04\n    let r = hidapiWrite(bleDev, pkt)\n    print(\"devIdx=\\(String(format: \"0x%02X\", devIdx)): TX \\(hex(pkt, n: 8))... -> \\(r == kIOReturnSuccess ? \"OK\" : String(format: \"0x%08x\", r))\")\n    if !waitResponse() { print(\"  No response\\n\") } else { print() }\n}\n\n// MARK: - Test 2: IRoot.Ping (GetProtocolVersion)\nprint(\"=== Test 2: IRoot.Ping ===\\n\")\nfor devIdx: UInt8 in [0xFF, 0x01, 0x00] {\n    ctx.reports.removeAll()\n    var pkt = [UInt8](repeating: 0, count: 20)\n    pkt[0] = 0x11; pkt[1] = devIdx; pkt[2] = 0x00; pkt[3] = 0x11  // func 1, swId 1\n    let r = hidapiWrite(bleDev, pkt)\n    print(\"devIdx=\\(String(format: \"0x%02X\", devIdx)): TX \\(hex(pkt, n: 8))... -> \\(r == kIOReturnSuccess ? \"OK\" : String(format: \"0x%08x\", r))\")\n    if !waitResponse() { print(\"  No response\\n\") } else { print() }\n}\n\n// MARK: - Test 3: 对比 - 不含 report ID (我们之前的方法)\nprint(\"=== Test 3: no-id in payload (19 bytes) ===\\n\")\nfor devIdx: UInt8 in [0xFF] {\n    ctx.reports.removeAll()\n    var pkt = [UInt8](repeating: 0, count: 20)\n    pkt[0] = 0x11; pkt[1] = devIdx; pkt[2] = 0x00; pkt[3] = 0x01; pkt[4] = 0x1B; pkt[5] = 0x04\n    let payload = Array(pkt.dropFirst())  // 19 bytes, no report ID\n    let r = IOHIDDeviceSetReport(bleDev, kIOHIDReportTypeOutput, CFIndex(pkt[0]), payload, payload.count)\n    print(\"no-id 19B: TX -> \\(r == kIOReturnSuccess ? \"OK\" : String(format: \"0x%08x\", r))\")\n    if !waitResponse(sec: 2.0) { print(\"  No response\\n\") } else { print() }\n}\n\n// MARK: - Test 4: SetReport with kIOHIDOptionsTypeSeizeDevice\nprint(\"=== Test 4: Seize device then write ===\\n\")\nIOHIDDeviceClose(bleDev, IOOptionBits(kIOHIDOptionsTypeNone))\nlet seizeResult = IOHIDDeviceOpen(bleDev, IOOptionBits(kIOHIDOptionsTypeSeizeDevice))\nprint(\"IOHIDDeviceOpen(Seize): \\(seizeResult == kIOReturnSuccess ? \"OK\" : String(format: \"0x%08x\", seizeResult))\")\nif seizeResult == kIOReturnSuccess {\n    IOHIDDeviceRegisterInputReportCallback(bleDev, buf, 64, rxCallback, ctxPtr)\n    ctx.reports.removeAll()\n    var pkt = [UInt8](repeating: 0, count: 20)\n    pkt[0] = 0x11; pkt[1] = 0xFF; pkt[2] = 0x00; pkt[3] = 0x01; pkt[4] = 0x1B; pkt[5] = 0x04\n    let r = hidapiWrite(bleDev, pkt)\n    print(\"Seized write: TX -> \\(r == kIOReturnSuccess ? \"OK\" : String(format: \"0x%08x\", r))\")\n    if !waitResponse() { print(\"  No response\\n\") } else { print() }\n    IOHIDDeviceClose(bleDev, IOOptionBits(kIOHIDOptionsTypeNone))\n    // 重新正常打开\n    IOHIDDeviceOpen(bleDev, IOOptionBits(kIOHIDOptionsTypeNone))\n}\n\n// MARK: - Test 5: 被动监听 10s (请按按键)\nprint(\"=== Test 5: Passive listen 10s - PRESS BUTTONS NOW ===\\n\")\nIOHIDDeviceRegisterInputReportCallback(bleDev, buf, 64, rxCallback, ctxPtr)\nctx.reports.removeAll()\nlet end = Date(timeIntervalSinceNow: 10.0)\nwhile Date() < end {\n    RunLoop.current.run(until: Date(timeIntervalSinceNow: 0.2))\n}\nprint(\"\\nHID++ reports in 10s: \\(ctx.reports.count)\")\n\nprint(\"\\n=== Done ===\")\nbuf.deallocate()\nIOHIDDeviceClose(bleDev, IOOptionBits(kIOHIDOptionsTypeNone))\nIOHIDManagerClose(mgr, IOOptionBits(kIOHIDOptionsTypeNone))\n"
  },
  {
    "path": "tools/hidpp-undivert-test.swift",
    "content": "#!/usr/bin/env swift\n// 测试如何正确清除 persistDivert\nimport Foundation\nimport IOKit\nimport IOKit.hid\n\nlet VID = 0x046D\nclass Ctx { var reports: [[UInt8]] = [] }\nlet ctx = Ctx()\nlet ctxPtr = Unmanaged.passRetained(ctx).toOpaque()\nlet cb: IOHIDReportCallback = { c, _, _, _, _, r, l in\n    guard let c = c else { return }\n    Unmanaged<Ctx>.fromOpaque(c).takeUnretainedValue().reports.append(Array(UnsafeBufferPointer(start: r, count: l)))\n}\nlet mgr = IOHIDManagerCreate(kCFAllocatorDefault, IOOptionBits(kIOHIDOptionsTypeNone))\nIOHIDManagerSetDeviceMatching(mgr, [kIOHIDVendorIDKey as String: VID] as CFDictionary)\nIOHIDManagerScheduleWithRunLoop(mgr, CFRunLoopGetCurrent(), CFRunLoopMode.defaultMode.rawValue)\nIOHIDManagerOpen(mgr, IOOptionBits(kIOHIDOptionsTypeNone))\nRunLoop.current.run(until: Date(timeIntervalSinceNow: 0.5))\nguard let devs = IOHIDManagerCopyDevices(mgr) as? Set<IOHIDDevice>,\n      let dev = devs.first(where: { (IOHIDDeviceGetProperty($0, kIOHIDTransportKey as CFString) as? String ?? \"\").contains(\"Bluetooth\") })\nelse { print(\"No BLE device\"); exit(1) }\nIOHIDDeviceOpen(dev, IOOptionBits(kIOHIDOptionsTypeNone))\nlet buf = UnsafeMutablePointer<UInt8>.allocate(capacity: 64)\nbuf.initialize(repeating: 0, count: 64)\nIOHIDDeviceRegisterInputReportCallback(dev, buf, 64, cb, ctxPtr)\n\nfunc send(_ d: [UInt8]) { IOHIDDeviceSetReport(dev, kIOHIDReportTypeOutput, CFIndex(d[0]), d, d.count) }\nfunc pkt(_ fi: UInt8, _ fn: UInt8, _ p: [UInt8] = []) -> [UInt8] {\n    var r = [UInt8](repeating: 0, count: 20); r[0] = 0x11; r[1] = 0xFF; r[2] = fi; r[3] = (fn << 4) | 0x01\n    for (i, v) in p.prefix(16).enumerated() { r[4+i] = v }; return r\n}\nfunc wait(_ t: TimeInterval = 2.0) -> [UInt8]? {\n    ctx.reports.removeAll()\n    let dl = Date(timeIntervalSinceNow: t)\n    while Date() < dl && ctx.reports.isEmpty { RunLoop.current.run(until: Date(timeIntervalSinceNow: 0.05)) }\n    return ctx.reports.first\n}\nfunc getStatus(_ ri: UInt8, _ cid: UInt16) -> (UInt8, UInt16) {\n    send(pkt(ri, 2, [UInt8(cid >> 8), UInt8(cid & 0xFF)]))\n    if let vr = wait(1.0) { return (vr[6], (UInt16(vr[7]) << 8) | UInt16(vr[8])) }\n    return (0xFF, 0)\n}\n\n// Discover REPROG\nsend(pkt(0x00, 0, [0x1B, 0x04]))\nguard let r = wait(), r[4] != 0 else { print(\"REPROG not found\"); exit(1) }\nlet ri = r[4]\nlet cid: UInt16 = 0x00C4  // SmartShift\nlet h = UInt8(cid >> 8), l = UInt8(cid & 0xFF)\n\n// Check current status\nlet (curFlags, curTarget) = getStatus(ri, cid)\nprint(\"Current: flags=0x\\(String(format: \"%02X\", curFlags)) diverted=\\((curFlags & 0x01) != 0)\")\n\n// Try each undivert method\nlet tests: [(String, [UInt8])] = [\n    (\"flags=0x00, target=self\",  [h, l, 0x00, h, l]),\n    (\"flags=0x00, target=0x00\",  [h, l, 0x00, 0x00, 0x00]),\n    (\"flags=0x02, target=self (clear persist only)\", [h, l, 0x02, h, l]),\n    (\"flags=0x00, no target (3 bytes)\", [h, l, 0x00]),\n]\n\nfor (desc, params) in tests {\n    // First ensure it's diverted\n    send(pkt(ri, 3, [h, l, 0x03, h, l]))\n    let _ = wait(0.5)\n    let (bf, _) = getStatus(ri, cid)\n    guard (bf & 0x01) != 0 else {\n        print(\"\\n\\(desc): SKIP - couldn't set divert first\")\n        continue\n    }\n\n    // Try to undivert\n    send(pkt(ri, 3, params))\n    let _ = wait(0.5)\n    let (af, at) = getStatus(ri, cid)\n    let cleared = (af & 0x01) == 0\n    print(\"\\n\\(desc):\")\n    print(\"  After: flags=0x\\(String(format: \"%02X\", af)) target=0x\\(String(format: \"%04X\", at)) diverted=\\(!cleared) -> \\(cleared ? \"CLEARED\" : \"STILL DIVERTED\")\")\n}\n\n// Final cleanup: try all methods to ensure clean state\nprint(\"\\n=== Final cleanup ===\")\nsend(pkt(ri, 3, [h, l, 0x00, h, l])); let _ = wait(0.3)\nsend(pkt(ri, 3, [h, l, 0x00, 0x00, 0x00])); let _ = wait(0.3)\nlet (final, _) = getStatus(ri, cid)\nprint(\"Final: flags=0x\\(String(format: \"%02X\", final)) diverted=\\((final & 0x01) != 0)\")\nprint(\"\\nPress SmartShift to check if original function is restored (5s)...\")\nlet end = Date(timeIntervalSinceNow: 5.0)\nwhile Date() < end {\n    RunLoop.current.run(until: Date(timeIntervalSinceNow: 0.1))\n    for rpt in ctx.reports where rpt.count >= 7 && (rpt[0] == 0x10 || rpt[0] == 0x11) {\n        let fi = rpt[2]\n        if fi != ri { print(\"  SmartShift notification received -> original function RESTORED\") }\n        else { print(\"  REPROG event -> still diverted\") }\n    }\n    ctx.reports.removeAll()\n}\n\nprint(\"Done\")\nbuf.deallocate()\nIOHIDDeviceClose(dev, IOOptionBits(kIOHIDOptionsTypeNone))\nIOHIDManagerClose(mgr, IOOptionBits(kIOHIDOptionsTypeNone))\n"
  },
  {
    "path": "tools/hidpp-verify-final.swift",
    "content": "#!/usr/bin/env swift\n// 最终验证: flags=0x03 + targetCID=self + button capture\nimport Foundation\nimport IOKit\nimport IOKit.hid\n\nlet VID = 0x046D\nclass Ctx { var reports: [[UInt8]] = [] }\nlet ctx = Ctx()\nlet ctxPtr = Unmanaged.passRetained(ctx).toOpaque()\nlet cb: IOHIDReportCallback = { c, _, _, _, _, r, l in\n    guard let c = c else { return }\n    Unmanaged<Ctx>.fromOpaque(c).takeUnretainedValue().reports.append(Array(UnsafeBufferPointer(start: r, count: l)))\n}\nlet mgr = IOHIDManagerCreate(kCFAllocatorDefault, IOOptionBits(kIOHIDOptionsTypeNone))\nIOHIDManagerSetDeviceMatching(mgr, [kIOHIDVendorIDKey as String: VID] as CFDictionary)\nIOHIDManagerScheduleWithRunLoop(mgr, CFRunLoopGetCurrent(), CFRunLoopMode.defaultMode.rawValue)\nIOHIDManagerOpen(mgr, IOOptionBits(kIOHIDOptionsTypeNone))\nRunLoop.current.run(until: Date(timeIntervalSinceNow: 0.5))\nguard let devs = IOHIDManagerCopyDevices(mgr) as? Set<IOHIDDevice>,\n      let dev = devs.first(where: { (IOHIDDeviceGetProperty($0, kIOHIDTransportKey as CFString) as? String ?? \"\").contains(\"Bluetooth\") })\nelse { print(\"No BLE device\"); exit(1) }\nIOHIDDeviceOpen(dev, IOOptionBits(kIOHIDOptionsTypeNone))\nlet buf = UnsafeMutablePointer<UInt8>.allocate(capacity: 64)\nbuf.initialize(repeating: 0, count: 64)\nIOHIDDeviceRegisterInputReportCallback(dev, buf, 64, cb, ctxPtr)\n\nfunc send(_ d: [UInt8]) { IOHIDDeviceSetReport(dev, kIOHIDReportTypeOutput, CFIndex(d[0]), d, d.count) }\nfunc pkt(_ fi: UInt8, _ fn: UInt8, _ p: [UInt8] = []) -> [UInt8] {\n    var r = [UInt8](repeating: 0, count: 20); r[0] = 0x11; r[1] = 0xFF; r[2] = fi; r[3] = (fn << 4) | 0x01\n    for (i, v) in p.prefix(16).enumerated() { r[4+i] = v }; return r\n}\nfunc wait(_ t: TimeInterval = 2.0) -> [UInt8]? {\n    ctx.reports.removeAll()\n    let dl = Date(timeIntervalSinceNow: t)\n    while Date() < dl && ctx.reports.isEmpty { RunLoop.current.run(until: Date(timeIntervalSinceNow: 0.05)) }\n    return ctx.reports.first\n}\n\nlet names: [UInt16:String] = [0x0052:\"Middle\",0x0053:\"Back\",0x0056:\"Forward\",0x00C3:\"Gesture\",0x00C4:\"SmartShift\",0x00D7:\"DPI\"]\n\n// Discover\nsend(pkt(0x00, 0, [0x1B, 0x04])); let ri = wait()![4]\nsend(pkt(ri, 0)); let count = Int(wait()![4])\nprint(\"REPROG at 0x\\(String(format: \"%02X\", ri)), \\(count) controls\")\n\n// Enumerate divertable\nvar divertable: [(UInt16, String)] = []\nfor i in 0..<count {\n    send(pkt(ri, 1, [UInt8(i)])); guard let ir = wait(1.0) else { continue }\n    let cid = (UInt16(ir[4]) << 8) | UInt16(ir[5])\n    if (ir[8] & 0x20) != 0 { divertable.append((cid, names[cid] ?? \"?\")) }\n}\nprint(\"Divertable: \\(divertable.map { $0.1 })\")\n\n// Divert with flags=0x03 + targetCID=self\nprint(\"\\nDiverting with flags=0x03...\")\nfor (cid, name) in divertable {\n    let h = UInt8(cid >> 8), l = UInt8(cid & 0xFF)\n    send(pkt(ri, 3, [h, l, 0x03, h, l]))\n    let _ = wait(0.5)\n    // Verify\n    send(pkt(ri, 2, [h, l]))\n    if let vr = wait(0.5) {\n        let diverted = (vr[6] & 0x01) != 0\n        print(\"  \\(name): diverted=\\(diverted)\")\n    }\n}\n\n// Capture\nprint(\"\\n>>> PRESS ALL BUTTONS (15s) <<<\\n\")\nctx.reports.removeAll()\nvar lastCIDs: Set<UInt16> = []\nlet end = Date(timeIntervalSinceNow: 15.0)\nwhile Date() < end {\n    RunLoop.current.run(until: Date(timeIntervalSinceNow: 0.05))\n    for rpt in ctx.reports where rpt.count >= 7 && (rpt[0] == 0x10 || rpt[0] == 0x11) {\n        let fi = rpt[2], fn = rpt[3] >> 4\n        if fi == ri && fn == 0 {\n            var active: Set<UInt16> = []\n            var off = 4\n            while off+1 < rpt.count { let c = (UInt16(rpt[off])<<8)|UInt16(rpt[off+1]); if c==0{break}; active.insert(c); off+=2 }\n            for c in active.subtracting(lastCIDs) { print(\"DOWN: \\(names[c] ?? String(format:\"0x%04X\",c))\") }\n            for c in lastCIDs.subtracting(active) { print(\"UP:   \\(names[c] ?? String(format:\"0x%04X\",c))\") }\n            lastCIDs = active\n        } else {\n            print(\"[f=0x\\(String(format:\"%02X\",fi)) fn=\\(fn)]\")\n        }\n    }\n    ctx.reports.removeAll()\n}\n\n// Undivert\nfor (cid, _) in divertable {\n    let h = UInt8(cid >> 8), l = UInt8(cid & 0xFF)\n    send(pkt(ri, 3, [h, l, 0x00, h, l])); let _ = wait(0.3)\n}\nprint(\"\\nDone - undiverted\")\nbuf.deallocate()\n"
  },
  {
    "path": "website/.nvmrc",
    "content": "22\n"
  },
  {
    "path": "website/CNAME",
    "content": "mos.caldis.me"
  },
  {
    "path": "website/README.md",
    "content": "## Mos Home Page\n\nThis is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).\n\n## Getting Started\n\nFirst, run the development server:\n\n```bash\nnpm run dev\n```\n\nOpen [http://localhost:3000](http://localhost:3000) with your browser to see the result.\n\nYou can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.\n\n## Deploy\n\n```bash\nnpm run build\n```\n\n## Transition\n\nJust edit the wording with your language in `app/i18n` and rise an pull request."
  },
  {
    "path": "website/app/components/BentoCard/BentoCard.tsx",
    "content": "\"use client\";\n\nimport {\n  motion,\n  useMotionTemplate,\n  useMotionValue,\n  useReducedMotion,\n  useSpring,\n  useTransform,\n} from \"framer-motion\";\nimport { MouseEvent, ReactNode } from \"react\";\n\nconst SPRING = { stiffness: 150, damping: 30 };\n\nexport function BentoCard({\n  children,\n  className = \"\",\n}: {\n  children: ReactNode;\n  className?: string;\n}) {\n  const shouldReduceMotion = useReducedMotion();\n\n  const mouseX = useMotionValue(0.5);\n  const mouseY = useMotionValue(0.5);\n\n  const rawRotateX = useTransform(mouseY, [0, 1], [4, -4]);\n  const rawRotateY = useTransform(mouseX, [0, 1], [-6, 6]);\n  const rotateX = useSpring(rawRotateX, SPRING);\n  const rotateY = useSpring(rawRotateY, SPRING);\n\n  const spotX = useTransform(mouseX, [0, 1], [0, 100]);\n  const spotY = useTransform(mouseY, [0, 1], [0, 100]);\n  const spotlight = useMotionTemplate`radial-gradient(480px circle at ${spotX}% ${spotY}%, rgba(255,255,255,0.08), transparent 60%)`;\n\n  const handleMouseMove = (e: MouseEvent<HTMLDivElement>) => {\n    if (shouldReduceMotion) return;\n    const rect = e.currentTarget.getBoundingClientRect();\n    mouseX.set((e.clientX - rect.left) / rect.width);\n    mouseY.set((e.clientY - rect.top) / rect.height);\n  };\n\n  const handleMouseLeave = () => {\n    mouseX.set(0.5);\n    mouseY.set(0.5);\n  };\n\n  return (\n    <motion.div\n      className={`group relative h-full rounded-[var(--radius-card)] glass shadow-elevated overflow-hidden border border-white/10 ${className}`}\n      style={\n        shouldReduceMotion\n          ? {}\n          : { rotateX, rotateY, transformPerspective: 1200 }\n      }\n      onMouseMove={handleMouseMove}\n      onMouseLeave={handleMouseLeave}\n    >\n      {/* Cursor-following spotlight */}\n      <motion.div\n        className=\"pointer-events-none absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity duration-500\"\n        style={{ background: spotlight }}\n      />\n      {children}\n    </motion.div>\n  );\n}\n"
  },
  {
    "path": "website/app/components/CopyButton/CopyButton.tsx",
    "content": "\"use client\";\n\nimport { ReactNode, useCallback, useState } from \"react\";\n\nasync function copyToClipboard(value: string) {\n  try {\n    await navigator.clipboard.writeText(value);\n    return true;\n  } catch {\n    // Fallback for older browsers / permissions.\n    try {\n      const el = document.createElement(\"textarea\");\n      el.value = value;\n      el.setAttribute(\"readonly\", \"\");\n      el.style.position = \"fixed\";\n      el.style.top = \"-9999px\";\n      document.body.appendChild(el);\n      el.select();\n      const ok = document.execCommand(\"copy\");\n      document.body.removeChild(el);\n      return ok;\n    } catch {\n      return false;\n    }\n  }\n}\n\nexport function CopyButton({\n  value,\n  children,\n  className = \"\",\n  copiedLabel = \"Copied\",\n}: {\n  value: string;\n  children: ReactNode;\n  className?: string;\n  copiedLabel?: string;\n}) {\n  const [copied, setCopied] = useState(false);\n\n  const onCopy = useCallback(async () => {\n    const ok = await copyToClipboard(value);\n    if (!ok) return;\n    setCopied(true);\n    window.setTimeout(() => setCopied(false), 1400);\n  }, [value]);\n\n  return (\n    <button type=\"button\" onClick={onCopy} className={className}>\n      {copied ? copiedLabel : children}\n    </button>\n  );\n}\n\n"
  },
  {
    "path": "website/app/components/EasingPlayground/EasingPlayground.tsx",
    "content": "\"use client\";\n\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useI18n } from \"@/app/i18n/context\";\n\nfunction clamp(n: number, min: number, max: number) {\n  return Math.min(max, Math.max(min, n));\n}\n\nfunction roundTo(n: number, decimals: number) {\n  const p = Math.pow(10, decimals);\n  return Math.round(n * p) / p;\n}\n\n// Ported from Mos:\n// Mos/Utils/Constants.swift -> OPTIONS_SCROLL_DEFAULT.generateDurationTransition(with:)\nfunction generateDurationTransition(duration: number) {\n  // Slider upper bound is 5.0; Mos adds +0.2 so the result never hits 0.\n  const upperLimit = 5.0 + 0.2;\n  const d = clamp(duration, 0, 5.0);\n  const val = 1 - Math.sqrt(d / upperLimit);\n  return roundTo(val, 3);\n}\n\n// Ported from Mos:\n// Mos/ScrollCore/ScrollFilter.swift\nfunction scrollFilterFill(window: number[], nextValue: number) {\n  const first = window[1] ?? 0;\n  const diff = nextValue - first;\n  return [\n    first,\n    first + 0.23 * diff,\n    first + 0.5 * diff,\n    first + 0.77 * diff,\n    nextValue,\n  ];\n}\n\nfunction niceCeil(n: number) {\n  const x = Math.max(1e-6, n);\n  const p = Math.pow(10, Math.floor(Math.log10(x)));\n  const s = x / p;\n  let m = 1;\n  if (s <= 1) m = 1;\n  else if (s <= 2) m = 2;\n  else if (s <= 5) m = 5;\n  else m = 10;\n  return m * p;\n}\n\nfunction computeSim(step: number, gain: number, duration: number) {\n  // A compact simulation of Mos' ScrollPoster + Interpolator.lerp + ScrollFilter.\n  // We visualize the posted vertical deltas (deadZone-clamped) over time.\n  const manualContinuationThreshold = 0.18; // ScrollPoster.manualContinuationThreshold\n  const deadZone = 1.0; // OPTIONS_SCROLL_DEFAULT.deadZone\n  const burstTicks = 10; // A short \"wheel burst\" to resemble the in-app monitor.\n  const maxFrames = 90;\n  const fps = 60;\n  const dt = 1 / fps;\n\n  const trans = generateDurationTransition(duration);\n\n  let current = 0;\n  let buffer = 0;\n  let deltaPrev = 0;\n\n  let t = 0;\n  let lastManualTime = 0;\n  let manualInputEnded = true;\n\n  let filterWindow = [0.0, 0.0];\n  const samples: number[] = [];\n\n  for (let frame = 0; frame < maxFrames; frame += 1) {\n    if (frame < burstTicks) {\n      const y = step;\n      if (y * deltaPrev > 0) {\n        buffer += y * gain;\n      } else {\n        buffer = y * gain;\n        current = 0;\n      }\n      deltaPrev = y;\n      lastManualTime = t;\n      manualInputEnded = false;\n    }\n\n    // Interpolator.lerp(src: current, dest: buffer, trans: durationTransition)\n    const delta = (buffer - current) * trans;\n    current += delta;\n\n    // ScrollFilter.fill(with:)\n    filterWindow = scrollFilterFill(filterWindow, delta);\n    const filtered = filterWindow[0] ?? 0;\n    const out = Math.abs(filtered) > deadZone ? filtered : 0;\n\n    // Track when manual input ends (used for stopping conditions),\n    // but do NOT inject the \"TrackingEnd = 0\" marker frame in the graph.\n    if (!manualInputEnded && t - lastManualTime > manualContinuationThreshold) {\n      manualInputEnded = true;\n    }\n\n    samples.push(out);\n    t += dt;\n  }\n\n  const maxAbs = Math.max(1, ...samples.map((v) => Math.abs(v)));\n  return { samples, trans, maxAbs };\n}\n\nfunction computeTargetYMax(step: number, gain: number, duration: number) {\n  const { maxAbs } = computeSim(step, gain, duration);\n  return Math.min(6000, niceCeil(maxAbs * 1.06));\n}\n\nfunction stepToDotQuant(step: number) {\n  // User-facing behavior:\n  // - smaller STEP => dot advances in more discrete jumps\n  // - larger STEP  => dot motion feels more continuous (\"higher fps\")\n  const min = 0.01;\n  const max = 100;\n  const s = clamp(step, min, max);\n  const n =\n    (Math.log(s) - Math.log(min)) / Math.max(1e-6, Math.log(max) - Math.log(min)); // 0..1\n  const inv = 1 - clamp(n, 0, 1);\n  // Quantize u (0..1): higher value => chunkier jumps.\n  const qMin = 0.0025; // very smooth\n  const qMax = 0.045; // visibly discrete\n  return qMin + inv * (qMax - qMin);\n}\n\ntype EasingPlaygroundProps = {\n  className?: string;\n};\n\nexport function EasingPlayground({ className = \"\" }: EasingPlaygroundProps) {\n  const { t } = useI18n();\n\n  // Match Mos defaults (OPTIONS_SCROLL_DEFAULT)\n  const DEFAULT_STEP = 33.6;\n  const DEFAULT_GAIN = 2.7;\n  const DEFAULT_DURATION = 4.35;\n\n  const [step, setStep] = useState(DEFAULT_STEP);\n  const [gain, setGain] = useState(DEFAULT_GAIN);\n  const [duration, setDuration] = useState(DEFAULT_DURATION);\n\n  const dotRef = useRef<SVGCircleElement | null>(null);\n\n  // Start with a sensible default range (matches typical Mos monitor values),\n  // then expand upwards when parameters produce larger peaks.\n  const [yMax, setYMax] = useState(() =>\n    Math.max(60, computeTargetYMax(DEFAULT_STEP, DEFAULT_GAIN, DEFAULT_DURATION))\n  );\n\n  const sim = useMemo(() => computeSim(step, gain, duration), [duration, gain, step]);\n\n  const graph = useMemo(() => {\n    const VW = 860;\n    const VH = 280;\n    const padL = 56;\n    const padR = 18;\n    const padT = 18;\n    const padB = 44;\n    const w = VW - padL - padR;\n    const h = VH - padT - padB;\n\n    const samples = sim.samples;\n    const N = Math.max(2, samples.length);\n    const mapX = (i: number) => padL + (clamp(i, 0, N - 1) / (N - 1)) * w;\n    const mapY = (v: number) => {\n      const y = clamp(v, 0, yMax);\n      return padT + h - (y / yMax) * h;\n    };\n\n    const points = samples.map((v, i) => ({\n      x: mapX(i),\n      y: mapY(v),\n    }));\n\n    let d = \"\";\n    for (let i = 0; i < points.length; i += 1) {\n      const p = points[i]!;\n      d += i === 0 ? `M ${p.x.toFixed(2)} ${p.y.toFixed(2)}` : ` L ${p.x.toFixed(2)} ${p.y.toFixed(2)}`;\n    }\n\n    const baselineY = mapY(0);\n    const fill = `${d} L ${mapX(points.length - 1).toFixed(2)} ${baselineY.toFixed(2)} L ${mapX(0).toFixed(2)} ${baselineY.toFixed(2)} Z`;\n\n    return { VW, VH, padL, padR, padT, padB, points, d, fill, baselineY };\n  }, [sim.samples, yMax]);\n\n  useEffect(() => {\n    const reduced = window.matchMedia?.(\"(prefers-reduced-motion: reduce)\")?.matches ?? false;\n    if (reduced) return;\n\n    const dot = dotRef.current;\n    if (!dot) return;\n\n    let raf = 0;\n    const start = performance.now();\n    const travel = 1260;\n    const hold = 320;\n    const fade = 140;\n    const quant = stepToDotQuant(step);\n\n    const tick = (now: number) => {\n      const elapsed = now - start;\n      const cycle = travel + hold;\n      const t = elapsed % cycle;\n\n      const pts = graph.points;\n      const u = clamp(t / Math.max(1, travel), 0, 1);\n      const uq = clamp(Math.round(u / quant) * quant, 0, 1);\n      const pos = uq * (pts.length - 1);\n      const i0 = Math.floor(pos);\n      const i1 = Math.min(pts.length - 1, i0 + 1);\n      const k = clamp(pos - i0, 0, 1);\n      const p0 = pts[i0] ?? pts[0]!;\n      const p1 = pts[i1] ?? pts[pts.length - 1]!;\n      const xPx = p0.x + (p1.x - p0.x) * k;\n      const yPx = p0.y + (p1.y - p0.y) * k;\n\n      let alpha = 1;\n      if (t < fade) alpha = t / fade;\n      const fadeOutStart = travel + hold - fade;\n      if (t > fadeOutStart) alpha = 1 - (t - fadeOutStart) / fade;\n\n      dot.setAttribute(\"cx\", xPx.toFixed(2));\n      dot.setAttribute(\"cy\", yPx.toFixed(2));\n      dot.setAttribute(\"opacity\", clamp(alpha, 0, 1).toFixed(2));\n\n      raf = window.requestAnimationFrame(tick);\n    };\n    raf = window.requestAnimationFrame(tick);\n\n    return () => window.cancelAnimationFrame(raf);\n  }, [graph.points, step]);\n\n  return (\n    <div className={className}>\n      <div className=\"rounded-2xl border border-white/10 bg-black/35 overflow-hidden\">\n\t        <svg\n\t          viewBox={`0 0 ${graph.VW} ${graph.VH}`}\n\t          className=\"block w-full h-auto\"\n\t          aria-label={t.easing.graphAria}\n\t        >\n          <defs>\n            <linearGradient id=\"easeFill\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n              <stop offset=\"0%\" stopColor=\"rgba(255,255,255,0.14)\" />\n              <stop offset=\"100%\" stopColor=\"rgba(255,255,255,0)\" />\n            </linearGradient>\n          </defs>\n\n          {/* Grid */}\n          <g stroke=\"rgba(255,255,255,0.08)\" strokeWidth=\"1\">\n            {Array.from({ length: 7 }).map((_, i) => {\n              const x =\n                graph.padL + (i / 6) * (graph.VW - graph.padL - graph.padR);\n              return (\n                <line\n                  key={i}\n                  x1={x}\n                  y1={graph.padT}\n                  x2={x}\n                  y2={graph.VH - graph.padB}\n                />\n              );\n            })}\n            {Array.from({ length: 5 }).map((_, i) => {\n              const y =\n                graph.padT + (i / 4) * (graph.VH - graph.padT - graph.padB);\n              return (\n                <line\n                  key={i}\n                  x1={graph.padL}\n                  y1={y}\n                  x2={graph.VW - graph.padR}\n                  y2={y}\n                />\n              );\n            })}\n          </g>\n\n          {/* Fill under curve */}\n          <path d={graph.fill} fill=\"url(#easeFill)\" opacity=\"0.9\" />\n\n          {/* Curve */}\n          <path\n            key={`${step}-${gain}-${duration}`}\n            d={graph.d}\n            fill=\"none\"\n            stroke=\"rgba(255,255,255,0.92)\"\n            strokeWidth=\"2\"\n            strokeLinecap=\"round\"\n            strokeLinejoin=\"round\"\n            pathLength={1}\n            strokeDasharray={1}\n            strokeDashoffset={1}\n            style={{\n              animation: \"stroke-in 900ms var(--ease-out) both\",\n            }}\n          />\n\n          {/* Animated dot */}\n          <circle\n            ref={dotRef}\n            cx={graph.padL}\n            cy={graph.baselineY}\n            r=\"4.2\"\n            fill=\"rgba(255,255,255,0.95)\"\n          />\n          <circle\n            cx={graph.padL}\n            cy={graph.baselineY}\n            r=\"2\"\n            fill=\"rgba(255,255,255,0.55)\"\n            opacity=\"0.7\"\n          />\n        </svg>\n      </div>\n\n\t      <div className=\"mt-4 grid gap-4 md:grid-cols-3\">\n\t        <div className=\"rounded-2xl border border-white/10 bg-black/35 p-4\">\n\t          <div className=\"flex items-center justify-between\">\n\t            <div className=\"font-display text-sm tracking-[0.18em] uppercase text-white/70\">\n\t              {t.easing.step.label}\n\t            </div>\n\t            <div className=\"font-mono text-xs text-white/55\">\n\t              {step.toFixed(2)}\n\t            </div>\n\t          </div>\n          <input\n            className=\"mt-3 w-full range\"\n            type=\"range\"\n            min={0.01}\n            max={100}\n            step={0.01}\n            value={step}\n\t            onChange={(e) => {\n\t              const v = Number(e.target.value);\n\t              setStep(v);\n\t              setYMax((prev) => Math.max(prev, computeTargetYMax(v, gain, duration)));\n\t            }}\n\t            aria-label={t.easing.step.aria}\n\t          />\n\t          <div className=\"mt-2 font-mono text-[11px] text-white/40\">\n\t            {t.easing.step.help}\n\t          </div>\n\t        </div>\n\n        <div className=\"rounded-2xl border border-white/10 bg-black/35 p-4\">\n\t          <div className=\"flex items-center justify-between\">\n\t            <div className=\"font-display text-sm tracking-[0.18em] uppercase text-white/70\">\n\t              {t.easing.gain.label}\n\t            </div>\n\t            <div className=\"font-mono text-xs text-white/55\">\n\t              ×{gain.toFixed(2)}\n\t            </div>\n\t          </div>\n          <input\n            className=\"mt-3 w-full range\"\n            type=\"range\"\n            min={1}\n            max={10}\n            step={0.01}\n            value={gain}\n\t            onChange={(e) => {\n\t              const v = Number(e.target.value);\n\t              setGain(v);\n\t              setYMax((prev) => Math.max(prev, computeTargetYMax(step, v, duration)));\n\t            }}\n\t            aria-label={t.easing.gain.aria}\n\t          />\n\t          <div className=\"mt-2 font-mono text-[11px] text-white/40\">\n\t            {t.easing.gain.help}\n\t          </div>\n\t        </div>\n\n        <div className=\"rounded-2xl border border-white/10 bg-black/35 p-4\">\n\t          <div className=\"flex items-center justify-between\">\n\t            <div className=\"font-display text-sm tracking-[0.18em] uppercase text-white/70\">\n\t              {t.easing.duration.label}\n\t            </div>\n\t            <div className=\"font-mono text-xs text-white/55\">\n\t              {duration.toFixed(2)}\n\t            </div>\n\t          </div>\n          <input\n            className=\"mt-3 w-full range\"\n            type=\"range\"\n            min={1}\n            max={5}\n            step={0.01}\n            value={duration}\n\t            onChange={(e) => {\n\t              const v = Number(e.target.value);\n\t              setDuration(v);\n\t              setYMax((prev) => Math.max(prev, computeTargetYMax(step, gain, v)));\n\t            }}\n\t            aria-label={t.easing.duration.aria}\n\t          />\n\t          <div className=\"mt-2 font-mono text-[11px] text-white/40\">\n\t            {t.easing.duration.help}\n\t          </div>\n\t        </div>\n\t      </div>\n\n\t      <div className=\"mt-3 font-mono text-[11px] tracking-[0.18em] uppercase text-white/40\">\n\t        {t.easing.footer}\n\t      </div>\n\t    </div>\n\t  );\n}\n"
  },
  {
    "path": "website/app/components/FlowField/FlowField.tsx",
    "content": "\"use client\";\n\nimport { useEffect, useRef } from \"react\";\n\ntype FlowFieldProps = {\n  className?: string;\n};\n\ntype Particle = {\n  x: number;\n  y: number;\n  vx: number;\n  vy: number;\n  seed: number;\n  color: 0 | 1 | 2;\n};\n\nfunction clamp(n: number, min: number, max: number) {\n  return Math.min(max, Math.max(min, n));\n}\n\nfunction rand(seed: number) {\n  // Deterministic-ish hash to avoid needing a PRNG package.\n  const x = Math.sin(seed) * 10000;\n  return x - Math.floor(x);\n}\n\nexport function FlowField({ className = \"\" }: FlowFieldProps) {\n  const canvasRef = useRef<HTMLCanvasElement | null>(null);\n  const rafRef = useRef<number | null>(null);\n\n  useEffect(() => {\n    const canvas = canvasRef.current;\n    if (!canvas) return;\n\n    const reduced =\n      window.matchMedia?.(\"(prefers-reduced-motion: reduce)\")?.matches ?? false;\n    type NetworkInformation = { saveData?: boolean };\n    type NavigatorWithConnection = Navigator & { connection?: NetworkInformation };\n    const saveData = (navigator as NavigatorWithConnection).connection?.saveData ?? false;\n    if (reduced || saveData) return;\n\n    const ctx = canvas.getContext(\"2d\", { alpha: true });\n    if (!ctx) return;\n\n    const pointer = { x: -10_000, y: -10_000, active: false };\n    const colors = [\n      \"rgba(255,255,255,0.12)\",\n      \"rgba(255,255,255,0.08)\",\n      \"rgba(255,255,255,0.05)\",\n    ] as const;\n\n    let cssW = 1;\n    let cssH = 1;\n    let particles: Particle[] = [];\n\n    const resize = () => {\n      const rect = canvas.getBoundingClientRect();\n      cssW = Math.max(1, Math.floor(rect.width));\n      cssH = Math.max(1, Math.floor(rect.height));\n\n      const dpr = Math.max(1, window.devicePixelRatio || 1);\n      canvas.width = Math.floor(cssW * dpr);\n      canvas.height = Math.floor(cssH * dpr);\n      ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n\n      const coarse = window.matchMedia?.(\"(pointer: coarse)\")?.matches ?? false;\n      const density = coarse ? 0.35 : 0.7;\n      const count = clamp(Math.floor((cssW * cssH) / 5000 * density), 140, 620);\n\n      particles = Array.from({ length: count }, (_, i) => {\n        const s = i * 12.345;\n        return {\n          x: rand(s) * cssW,\n          y: rand(s + 1) * cssH,\n          vx: 0,\n          vy: 0,\n          seed: rand(s + 2) * 1000,\n          color: (i % 3) as 0 | 1 | 2,\n        };\n      });\n\n      ctx.clearRect(0, 0, cssW, cssH);\n    };\n\n    const onPointerMove = (event: PointerEvent) => {\n      const rect = canvas.getBoundingClientRect();\n      pointer.x = event.clientX - rect.left;\n      pointer.y = event.clientY - rect.top;\n      pointer.active = true;\n    };\n    const onBlur = () => {\n      pointer.active = false;\n      pointer.x = -10_000;\n      pointer.y = -10_000;\n    };\n\n    // Canvas is pointer-events:none (so it never blocks UI), so we track pointer globally.\n    window.addEventListener(\"pointermove\", onPointerMove, { passive: true });\n    window.addEventListener(\"blur\", onBlur);\n    window.addEventListener(\"resize\", resize, { passive: true });\n    resize();\n\n    let t0 = performance.now();\n    let running = true;\n\n    const fieldAngle = (x: number, y: number, t: number, seed: number) => {\n      // Cheap “flowy” field: 3 trig layers blended.\n      const n1 = Math.sin(x * 0.0022 + (t + seed) * 0.00065);\n      const n2 = Math.cos(y * 0.0020 - (t - seed) * 0.00055);\n      const n3 = Math.sin((x + y) * 0.0014 + (t + seed) * 0.00032);\n      const n = (n1 + n2 + n3) / 3;\n      return n * Math.PI * 2.2;\n    };\n\n    const tick = (now: number) => {\n      if (!running) return;\n      const dt = clamp(now - t0, 6, 28);\n      t0 = now;\n\n      const scrollMax = Math.max(1, document.documentElement.scrollHeight - window.innerHeight);\n      const scroll = clamp(window.scrollY / scrollMax, 0, 1);\n\n      // Persistent trails.\n      ctx.fillStyle = `rgba(0, 0, 0, ${0.08 + scroll * 0.05})`;\n      ctx.fillRect(0, 0, cssW, cssH);\n\n      ctx.save();\n      ctx.globalCompositeOperation = \"lighter\";\n      ctx.lineWidth = 1;\n\n      const speed = 0.8 + scroll * 1.4;\n      const influenceR = 180;\n\n      for (const p of particles) {\n        const px = p.x;\n        const py = p.y;\n\n        const a = fieldAngle(px, py, now, p.seed);\n        const ax = Math.cos(a) * 0.55;\n        const ay = Math.sin(a) * 0.55;\n\n        p.vx = p.vx * 0.84 + ax;\n        p.vy = p.vy * 0.84 + ay;\n\n        if (pointer.active) {\n          const dx = px - pointer.x;\n          const dy = py - pointer.y;\n          const d = Math.sqrt(dx * dx + dy * dy) || 1;\n          if (d < influenceR) {\n            const f = (1 - d / influenceR) * 1.15;\n            // Swirl around pointer for “alive” feel.\n            p.vx += (-dy / d) * f;\n            p.vy += (dx / d) * f;\n          }\n        }\n\n        const nx = px + p.vx * speed * (dt / 16);\n        const ny = py + p.vy * speed * (dt / 16);\n\n        p.x = nx;\n        p.y = ny;\n\n        ctx.strokeStyle = colors[p.color];\n        ctx.beginPath();\n        ctx.moveTo(px, py);\n        ctx.lineTo(nx, ny);\n        ctx.stroke();\n\n        const margin = 40;\n        if (nx < -margin || nx > cssW + margin || ny < -margin || ny > cssH + margin) {\n          const s = p.seed + now * 0.001;\n          p.x = rand(s) * cssW;\n          p.y = rand(s + 1) * cssH;\n          p.vx = 0;\n          p.vy = 0;\n        }\n      }\n\n      ctx.restore();\n      if (!running) return;\n      rafRef.current = window.requestAnimationFrame(tick);\n    };\n\n    rafRef.current = window.requestAnimationFrame(tick);\n\n    const onVisibilityChange = () => {\n      if (document.hidden) {\n        running = false;\n        if (rafRef.current) window.cancelAnimationFrame(rafRef.current);\n        rafRef.current = null;\n        return;\n      }\n      if (!running) {\n        running = true;\n        t0 = performance.now();\n        rafRef.current = window.requestAnimationFrame(tick);\n      }\n    };\n    document.addEventListener(\"visibilitychange\", onVisibilityChange);\n\n    return () => {\n      if (rafRef.current) window.cancelAnimationFrame(rafRef.current);\n      window.removeEventListener(\"pointermove\", onPointerMove);\n      window.removeEventListener(\"blur\", onBlur);\n      window.removeEventListener(\"resize\", resize);\n      document.removeEventListener(\"visibilitychange\", onVisibilityChange);\n    };\n  }, []);\n\n  return (\n    <canvas\n      ref={canvasRef}\n      className={`block w-full h-full pointer-events-none ${className}`}\n      aria-hidden=\"true\"\n    />\n  );\n}\n"
  },
  {
    "path": "website/app/components/HeroCurvePanel/HeroCurvePanel.tsx",
    "content": "\"use client\";\n\nimport { motion, useReducedMotion } from \"framer-motion\";\n\nconst SPRING = { type: \"spring\" as const, stiffness: 80, damping: 18 };\n\n// Pre-computed path representing a typical Mos smooth-scroll curve:\n// fast rise to peak, then smooth exponential decay.\n// ViewBox: 0 0 400 200 (y=200 is baseline, y=0 is max speed)\nconst CURVE_D =\n  \"M 0 192 C 8 192 18 28 48 16 S 96 14 128 22 S 192 52 248 102 S 320 162 400 188\";\n\nconst PARAMS = [\n  { label: \"STEP\", value: \"33.6\" },\n  { label: \"GAIN\", value: \"×2.7\" },\n  { label: \"DURATION\", value: \"4.35s\" },\n];\n\nexport function HeroCurvePanel() {\n  const shouldReduceMotion = useReducedMotion();\n\n  return (\n    <motion.div\n      className=\"hidden md:block w-[280px] lg:w-[320px] xl:w-[340px] shrink-0\"\n      initial={shouldReduceMotion ? false : { opacity: 0, y: 30 }}\n      animate={{ opacity: 1, y: 0 }}\n      transition={{ ...SPRING, delay: 0.34 }}\n    >\n      <motion.div\n        className=\"relative rounded-[var(--radius-card)] glass shadow-elevated border border-white/10 overflow-hidden p-5\"\n        style={{ transformPerspective: 1200 }}\n        whileHover={shouldReduceMotion ? {} : { rotateY: -3 }}\n        transition={SPRING}\n      >\n        {/* Panel label */}\n        <div className=\"font-display text-[10px] tracking-[0.22em] uppercase text-white/45 mb-4\">\n          Smooth Scroll Curve\n        </div>\n\n        {/* Animated SVG curve */}\n        <div className=\"rounded-2xl border border-white/8 bg-black/30 overflow-hidden\">\n          <svg\n            viewBox=\"0 0 400 200\"\n            className=\"block w-full h-auto\"\n            aria-hidden=\"true\"\n          >\n            <defs>\n              <linearGradient id=\"heroCurveFill\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n                <stop offset=\"0%\" stopColor=\"rgba(255,255,255,0.14)\" />\n                <stop offset=\"100%\" stopColor=\"rgba(255,255,255,0)\" />\n              </linearGradient>\n            </defs>\n\n            {/* Grid lines */}\n            <g stroke=\"rgba(255,255,255,0.06)\" strokeWidth=\"1\">\n              {[0, 1, 2, 3].map((i) => (\n                <line\n                  key={`vl-${i}`}\n                  x1={i * 133}\n                  y1=\"8\"\n                  x2={i * 133}\n                  y2=\"196\"\n                />\n              ))}\n              {[0, 1, 2, 3].map((i) => (\n                <line\n                  key={`hl-${i}`}\n                  x1=\"0\"\n                  y1={8 + i * 62}\n                  x2=\"400\"\n                  y2={8 + i * 62}\n                />\n              ))}\n            </g>\n\n            {/* Area fill under curve */}\n            <path\n              d={`${CURVE_D} L 400 192 L 0 192 Z`}\n              fill=\"url(#heroCurveFill)\"\n              opacity=\"0.9\"\n            />\n\n            {/* Animated stroke */}\n            <path\n              d={CURVE_D}\n              fill=\"none\"\n              stroke=\"rgba(255,255,255,0.90)\"\n              strokeWidth=\"2\"\n              strokeLinecap=\"round\"\n              strokeLinejoin=\"round\"\n              pathLength={1}\n              strokeDasharray={1}\n              strokeDashoffset={shouldReduceMotion ? 0 : 1}\n              style={\n                shouldReduceMotion\n                  ? {}\n                  : { animation: \"stroke-in 1200ms var(--ease-out) 500ms both\" }\n              }\n            />\n          </svg>\n        </div>\n\n        {/* Parameter badges */}\n        <div className=\"mt-4 grid grid-cols-3 gap-2\">\n          {PARAMS.map((p) => (\n            <div\n              key={p.label}\n              className=\"rounded-xl border border-white/8 bg-white/4 px-2.5 py-2\"\n            >\n              <div className=\"font-display text-[9px] tracking-[0.18em] uppercase text-white/40\">\n                {p.label}\n              </div>\n              <div className=\"mt-1 font-mono text-sm tabular-nums text-white/80\">\n                {p.value}\n              </div>\n            </div>\n          ))}\n        </div>\n      </motion.div>\n    </motion.div>\n  );\n}\n"
  },
  {
    "path": "website/app/components/LanguageSelector/LanguageSelector.tsx",
    "content": "\"use client\";\n\nimport { Modal } from \"@/app/components/Modal/Modal\";\nimport { useModal } from \"@/app/components/Modal/hooks\";\nimport { Magnetic } from \"@/app/components/Magnetic/Magnetic\";\nimport type { Language } from \"@/app/i18n/context\";\nimport { useI18n } from \"@/app/i18n/context\";\n\nconst LANGUAGES: { code: Language; name: string }[] = [\n  { code: \"en\", name: \"English\" },\n  { code: \"zh\", name: \"简体中文\" },\n  { code: \"zh-Hant\", name: \"繁體中文\" },\n  { code: \"ja\", name: \"日本語\" },\n  { code: \"ko\", name: \"한국어\" },\n  { code: \"ru\", name: \"Русский\" },\n  { code: \"de\", name: \"Deutsch\" },\n  { code: \"pl\", name: \"Polski\" },\n  { code: \"el\", name: \"Ελληνικά\" },\n  { code: \"tr\", name: \"Türkçe\" },\n  { code: \"uk\", name: \"Українська\" },\n  { code: \"id\", name: \"Bahasa\" },\n];\n\nexport function LanguageSelector() {\n  const { language, setLanguage, t } = useI18n();\n  const { isOpen, handleOpen, handleClose } = useModal();\n\n  const currentLanguage = LANGUAGES.find((lang) => lang.code === language);\n\n  return (\n    <>\n      <Magnetic strength={14}>\n        <button\n          type=\"button\"\n          onClick={handleOpen}\n          className=\"group grid h-11 w-11 place-items-center rounded-2xl border border-white/5 bg-white/4 hover:bg-white/7 hover:border-white/9 transition-colors\"\n          aria-label={t.languageSelector.title}\n          title={currentLanguage?.name ?? \"English\"}\n        >\n          <svg\n            aria-hidden=\"true\"\n            viewBox=\"0 0 24 24\"\n            className=\"h-5 w-5 text-white/82 group-hover:text-white/92 transition-colors\"\n            fill=\"currentColor\"\n          >\n            <path d=\"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z\" />\n          </svg>\n        </button>\n      </Magnetic>\n\n      <Modal\n        isOpen={isOpen}\n        onClose={handleClose}\n        title={t.languageSelector.title}\n        closeLabel={t.a11y.closeDialog}\n        width=\"max-w-lg\"\n      >\n        <div className=\"grid grid-cols-2 gap-2\">\n          {LANGUAGES.map((lang) => (\n            <button\n              type=\"button\"\n              key={lang.code}\n              onClick={() => {\n                setLanguage(lang.code);\n                handleClose();\n              }}\n              className={`p-3 rounded-lg text-left transition-colors\n                        ${\n                          language === lang.code\n                            ? \"bg-white/10 text-white\"\n                            : \"text-white/60 hover:bg-white/5 hover:text-white/90\"\n                        }`}\n            >\n              {lang.name}\n            </button>\n          ))}\n        </div>\n      </Modal>\n    </>\n  );\n}\n"
  },
  {
    "path": "website/app/components/Magnetic/Magnetic.tsx",
    "content": "\"use client\";\n\nimport { ReactNode, useEffect, useRef } from \"react\";\n\nexport function Magnetic({\n  children,\n  strength = 16,\n  className = \"\",\n}: {\n  children: ReactNode;\n  strength?: number;\n  className?: string;\n}) {\n  const rootRef = useRef<HTMLDivElement | null>(null);\n  const innerRef = useRef<HTMLDivElement | null>(null);\n  const rafRef = useRef<number | null>(null);\n\n  useEffect(() => {\n    const root = rootRef.current;\n    const inner = innerRef.current;\n    if (!root || !inner) return;\n\n    const fine = window.matchMedia?.(\"(any-pointer: fine)\")?.matches ?? false;\n    const reduced = window.matchMedia?.(\"(prefers-reduced-motion: reduce)\")?.matches ?? false;\n    if (!fine || reduced) return;\n\n    let x = 0;\n    let y = 0;\n    let tx = 0;\n    let ty = 0;\n\n    const clamp = (n: number, min: number, max: number) => Math.min(max, Math.max(min, n));\n\n    const tick = () => {\n      x += (tx - x) * 0.18;\n      y += (ty - y) * 0.18;\n      inner.style.transform = `translate3d(${x}px, ${y}px, 0)`;\n      rafRef.current = window.requestAnimationFrame(tick);\n    };\n\n    const onMove = (event: PointerEvent) => {\n      const rect = root.getBoundingClientRect();\n      const dx = event.clientX - (rect.left + rect.width / 2);\n      const dy = event.clientY - (rect.top + rect.height / 2);\n\n      const nx = dx / Math.max(1, rect.width / 2);\n      const ny = dy / Math.max(1, rect.height / 2);\n\n      tx = clamp(nx, -1, 1) * strength;\n      ty = clamp(ny, -1, 1) * strength;\n    };\n\n    const onLeave = () => {\n      tx = 0;\n      ty = 0;\n    };\n\n    root.addEventListener(\"pointermove\", onMove, { passive: true });\n    root.addEventListener(\"pointerleave\", onLeave, { passive: true });\n    rafRef.current = window.requestAnimationFrame(tick);\n\n    return () => {\n      if (rafRef.current) window.cancelAnimationFrame(rafRef.current);\n      root.removeEventListener(\"pointermove\", onMove);\n      root.removeEventListener(\"pointerleave\", onLeave);\n      inner.style.transform = \"translate3d(0, 0, 0)\";\n    };\n  }, [strength]);\n\n  return (\n    <div ref={rootRef} className={`inline-block ${className}`}>\n      <div ref={innerRef} style={{ willChange: \"transform\" }}>\n        {children}\n      </div>\n    </div>\n  );\n}\n\n"
  },
  {
    "path": "website/app/components/Modal/Modal.tsx",
    "content": "\"use client\";\n\nimport { ReactNode, useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nfunction getFocusableElements(root: HTMLElement | null): HTMLElement[] {\n  if (!root) return [];\n\n  const nodes = Array.from(\n    root.querySelectorAll<HTMLElement>(\n      [\n        'a[href]',\n        'button:not([disabled])',\n        'input:not([disabled])',\n        'select:not([disabled])',\n        'textarea:not([disabled])',\n        '[tabindex]:not([tabindex=\"-1\"])',\n      ].join(\",\")\n    )\n  );\n\n  return nodes.filter((el) => {\n    // Filter out hidden elements.\n    const style = window.getComputedStyle(el);\n    return style.display !== \"none\" && style.visibility !== \"hidden\";\n  });\n}\n\ninterface ModalProps {\n  isOpen: boolean;\n  onClose: () => void;\n  title: string;\n  children: ReactNode;\n  width?: string;\n  closeLabel?: string;\n}\n\nexport function Modal({\n  isOpen,\n  onClose,\n  title,\n  children,\n  width = \"max-w-sm\",\n  closeLabel = \"Close dialog\",\n}: ModalProps) {\n  const [portalRoot, setPortalRoot] = useState<HTMLElement | null>(null);\n  const titleId = useId();\n  const dialogRef = useRef<HTMLDivElement | null>(null);\n  const closeButtonRef = useRef<HTMLButtonElement | null>(null);\n  const lastActiveElementRef = useRef<HTMLElement | null>(null);\n\n  const label = useMemo(() => ({ titleId }), [titleId]);\n\n  useEffect(() => {\n    setPortalRoot(document.body);\n  }, []);\n\n  useEffect(() => {\n    if (!isOpen) return;\n\n    lastActiveElementRef.current =\n      document.activeElement instanceof HTMLElement ? document.activeElement : null;\n\n    const prevOverflow = document.body.style.overflow;\n    document.body.style.overflow = \"hidden\";\n\n    const raf = window.requestAnimationFrame(() => {\n      const focusables = getFocusableElements(dialogRef.current);\n      (closeButtonRef.current ?? focusables[0] ?? dialogRef.current)?.focus?.();\n    });\n\n    const onKeyDown = (event: KeyboardEvent) => {\n      if (event.key === \"Escape\") {\n        event.preventDefault();\n        onClose();\n        return;\n      }\n      if (event.key !== \"Tab\") return;\n\n      const dialogEl = dialogRef.current;\n      if (!dialogEl) return;\n\n      const focusables = getFocusableElements(dialogEl);\n      if (focusables.length === 0) {\n        event.preventDefault();\n        dialogEl.focus();\n        return;\n      }\n\n      const first = focusables[0];\n      const last = focusables[focusables.length - 1];\n      const active = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n\n      if (event.shiftKey) {\n        if (!active || !dialogEl.contains(active) || active === first) {\n          event.preventDefault();\n          last.focus();\n        }\n        return;\n      }\n\n      if (!active || !dialogEl.contains(active) || active === last) {\n        event.preventDefault();\n        first.focus();\n      }\n    };\n\n    document.addEventListener(\"keydown\", onKeyDown);\n\n    return () => {\n      window.cancelAnimationFrame(raf);\n      document.body.style.overflow = prevOverflow;\n      document.removeEventListener(\"keydown\", onKeyDown);\n\n      try {\n        lastActiveElementRef.current?.focus?.();\n      } catch {\n        // Ignore focus restore failures (e.g. element unmounted).\n      } finally {\n        lastActiveElementRef.current = null;\n      }\n    };\n  }, [isOpen, onClose]);\n\n  if (!portalRoot) return null;\n  if (!isOpen) return null;\n\n  return createPortal(\n    <div\n      className=\"fixed inset-0 z-[80] grid place-items-center px-4 py-6 bg-black/70 supports-[backdrop-filter:blur(0)]:bg-black/45 supports-[-webkit-backdrop-filter:blur(0)]:bg-black/45 backdrop-blur-xl\"\n      role=\"presentation\"\n      onClick={(e) => {\n        if (e.target === e.currentTarget) onClose();\n      }}\n    >\n      <div\n        ref={dialogRef}\n        role=\"dialog\"\n        aria-modal=\"true\"\n        aria-labelledby={label.titleId}\n        tabIndex={-1}\n        className={`w-full ${width} max-h-[calc(100vh-3rem)] max-h-[calc(100svh-3rem)] overflow-auto rounded-[22px] border border-white/10\n                 bg-[rgba(10,11,16,0.72)] shadow-elevated backdrop-blur-xl\n                 motion-safe:animate-[modal-appear_0.5s_var(--ease-out)]`}\n      >\n        <div className=\"flex justify-between items-center px-5 sm:px-6 pt-5 sm:pt-6\">\n          <h3 id={label.titleId} className=\"font-display text-lg sm:text-xl text-white\">\n            {title}\n          </h3>\n          <button\n            ref={closeButtonRef}\n            type=\"button\"\n            onClick={onClose}\n            className=\"rounded-xl p-2 text-white/55 hover:text-white/85 hover:bg-white/5 transition-colors\"\n            aria-label={closeLabel}\n          >\n            <svg className=\"w-6 h-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n              <path\n                strokeLinecap=\"round\"\n                strokeLinejoin=\"round\"\n                strokeWidth={2}\n                d=\"M6 18L18 6M6 6l12 12\"\n              />\n            </svg>\n          </button>\n        </div>\n        <div className=\"px-5 sm:px-6 pb-5 sm:pb-6 pt-4\">{children}</div>\n      </div>\n    </div>,\n    portalRoot\n  );\n}\n"
  },
  {
    "path": "website/app/components/Modal/hooks.ts",
    "content": "\"use client\";\n\nimport { useCallback, useState } from \"react\";\n\nexport function useModal(initialOpen = false) {\n  const [isOpen, setIsOpen] = useState(initialOpen);\n  const handleOpen = useCallback(() => setIsOpen(true), []);\n  const handleClose = useCallback(() => setIsOpen(false), []);\n  return { isOpen, handleOpen, handleClose, setIsOpen };\n}\n\n"
  },
  {
    "path": "website/app/components/Reveal/Reveal.tsx",
    "content": "\"use client\";\n\nimport { motion, useInView, useReducedMotion } from \"framer-motion\";\nimport { ReactNode, useRef } from \"react\";\n\nconst SPRING = { type: \"spring\" as const, stiffness: 100, damping: 20 };\n\nconst variants = {\n  hidden: { opacity: 0, y: 24 },\n  visible: { opacity: 1, y: 0 },\n};\n\nexport function Reveal({\n  children,\n  className = \"\",\n  delayMs = 0,\n}: {\n  children: ReactNode;\n  className?: string;\n  delayMs?: number;\n}) {\n  const ref = useRef<HTMLDivElement | null>(null);\n  const shouldReduceMotion = useReducedMotion();\n  const inView = useInView(ref, {\n    once: true,\n    margin: \"40px 0px -10% 0px\",\n  });\n\n  return (\n    <motion.div\n      ref={ref}\n      className={className}\n      variants={variants}\n      initial={shouldReduceMotion ? \"visible\" : \"hidden\"}\n      animate={inView ? \"visible\" : \"hidden\"}\n      transition={{ ...SPRING, delay: delayMs / 1000 }}\n    >\n      {children}\n    </motion.div>\n  );\n}\n"
  },
  {
    "path": "website/app/globals.css",
    "content": "@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n:root {\n  --bg0: #000000;\n  --bg1: #090909;\n  --fg0: rgba(255, 255, 255, 0.92);\n  --fg1: rgba(255, 255, 255, 0.72);\n  --fg2: rgba(255, 255, 255, 0.52);\n  --border: rgba(255, 255, 255, 0.12);\n\n  --accent: #ffffff;\n  --accent2: #a1a1aa;\n  --accent3: #52525b;\n\n  --radius-xl: 26px;\n  --radius-card: 32px;\n\n  --ease-out: cubic-bezier(0.16, 1, 0.3, 1);\n\n  --noise-opacity: 0.065;\n}\n\nhtml,\nbody {\n  height: 100%;\n}\n\nbody {\n  color: var(--fg0);\n  background:\n    radial-gradient(1100px 680px at 5% 8%, rgba(255, 255, 255, 0.10), transparent 55%),\n    radial-gradient(900px 620px at 88% 14%, rgba(255, 255, 255, 0.06), transparent 55%),\n    radial-gradient(1100px 820px at 45% 92%, rgba(255, 255, 255, 0.045), transparent 60%),\n    linear-gradient(180deg, var(--bg0), var(--bg1));\n  font-family:\n    var(--font-body),\n    ui-sans-serif,\n    system-ui,\n    -apple-system,\n    BlinkMacSystemFont,\n    \"Segoe UI\",\n    Helvetica,\n    Arial,\n    \"Apple Color Emoji\",\n    \"Segoe UI Emoji\";\n  text-rendering: geometricPrecision;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n* {\n  -webkit-tap-highlight-color: transparent;\n}\n\n::selection {\n  background: rgba(255, 255, 255, 0.14);\n  color: rgba(255, 255, 255, 0.98);\n}\n\n/* A subtle, always-on grain to kill flat gradients. */\nbody::before {\n  content: \"\";\n  position: fixed;\n  inset: 0;\n  pointer-events: none;\n  opacity: var(--noise-opacity);\n  mix-blend-mode: overlay;\n  background-image:\n    repeating-linear-gradient(\n      0deg,\n      rgba(255, 255, 255, 0.05) 0px,\n      rgba(255, 255, 255, 0.05) 1px,\n      rgba(0, 0, 0, 0.00) 2px,\n      rgba(0, 0, 0, 0.00) 4px\n    ),\n    repeating-linear-gradient(\n      90deg,\n      rgba(255, 255, 255, 0.035) 0px,\n      rgba(255, 255, 255, 0.035) 1px,\n      rgba(0, 0, 0, 0.00) 2px,\n      rgba(0, 0, 0, 0.00) 5px\n    );\n  transform: translateZ(0);\n}\n\n/* Scrollbar (WebKit) */\n*::-webkit-scrollbar {\n  width: 10px;\n  height: 10px;\n}\n*::-webkit-scrollbar-thumb {\n  background: rgba(255, 255, 255, 0.16);\n  border: 2px solid rgba(0, 0, 0, 0);\n  background-clip: content-box;\n  border-radius: 999px;\n}\n*::-webkit-scrollbar-thumb:hover {\n  background: rgba(255, 255, 255, 0.24);\n  border: 2px solid rgba(0, 0, 0, 0);\n  background-clip: content-box;\n}\n\n@keyframes modal-appear {\n  from {\n    opacity: 0;\n    transform: scale(0.95);\n  }\n  to {\n    opacity: 1;\n    transform: scale(1);\n  }\n}\n\n@keyframes stroke-in {\n  from {\n    stroke-dashoffset: 1;\n    opacity: 0.2;\n  }\n  to {\n    stroke-dashoffset: 0;\n    opacity: 1;\n  }\n}\n\n@keyframes float-slow {\n  0% {\n    transform: translate3d(0, 0, 0);\n  }\n  100% {\n    transform: translate3d(0, -14px, 0);\n  }\n}\n\n@keyframes homebrew-pulse {\n  0% {\n    border-color: rgba(255, 255, 255, 0.12);\n    box-shadow:\n      0 0 0 1px rgba(255, 255, 255, 0.10) inset,\n      0 0 0 0 rgba(255, 255, 255, 0),\n      0 0 0 rgba(0, 0, 0, 0);\n  }\n  28% {\n    border-color: rgba(255, 255, 255, 0.26);\n    box-shadow:\n      0 0 0 1px rgba(255, 255, 255, 0.18) inset,\n      0 0 0 1px rgba(255, 255, 255, 0.16),\n      0 0 0 10px rgba(255, 255, 255, 0.055),\n      0 0 64px rgba(255, 255, 255, 0.08);\n  }\n  100% {\n    border-color: rgba(255, 255, 255, 0.12);\n    box-shadow:\n      0 0 0 1px rgba(255, 255, 255, 0.10) inset,\n      0 0 0 0 rgba(255, 255, 255, 0),\n      0 0 0 rgba(0, 0, 0, 0);\n  }\n}\n\n@keyframes homebrew-sheen {\n  0% {\n    opacity: 0;\n    transform: translate3d(0, 10px, 0) scale(0.985);\n  }\n  30% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    transform: translate3d(0, 0, 0) scale(1);\n  }\n}\n\n@layer utilities {\n  .font-display {\n    font-family:\n      var(--font-display),\n      var(--font-body),\n      ui-sans-serif,\n      system-ui,\n      -apple-system,\n      BlinkMacSystemFont,\n      \"Segoe UI\",\n      Helvetica,\n      Arial;\n  }\n\n  .font-mono {\n    font-family:\n      var(--font-mono),\n      ui-monospace,\n      SFMono-Regular,\n      Menlo,\n      Monaco,\n      Consolas,\n      \"Liberation Mono\",\n      \"Courier New\",\n      monospace;\n  }\n\n  .text-balance {\n    text-wrap: balance;\n  }\n\n  .glass {\n    background: rgba(8, 9, 14, 0.60);\n    border: 1px solid var(--border);\n    backdrop-filter: blur(16px);\n    -webkit-backdrop-filter: blur(16px);\n    box-shadow:\n      0 0 0 1px rgba(255,255,255,0.06) inset,\n      0 1px 0 rgba(255,255,255,0.12) inset,\n      0 32px 120px rgba(0,0,0,0.8);\n  }\n\n  .ring-accent {\n    box-shadow:\n      0 0 0 1px rgba(255, 255, 255, 0.10) inset,\n      0 0 0 1px rgba(255, 255, 255, 0.12),\n      0 24px 60px rgba(0, 0, 0, 0.55);\n  }\n\n  .shadow-elevated {\n    box-shadow:\n      0 32px 120px rgba(0, 0, 0, 0.80),\n      0 1px 0 rgba(255, 255, 255, 0.08) inset;\n  }\n\n  .orb {\n    position: absolute;\n    border-radius: 999px;\n    filter: blur(28px);\n    opacity: 0.10;\n    transform: translateZ(0);\n    animation: float-slow 7s var(--ease-out) infinite alternate;\n  }\n\n  .hairline {\n    background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.18), transparent);\n  }\n\n  .homebrew-highlight {\n    position: relative;\n    isolation: isolate;\n    will-change: box-shadow;\n    animation: homebrew-pulse 1200ms var(--ease-out) both;\n  }\n\n  .homebrew-highlight::after {\n    content: \"\";\n    position: absolute;\n    inset: -2px;\n    border-radius: inherit;\n    pointer-events: none;\n    background:\n      radial-gradient(900px 260px at 28% 0%, rgba(255, 255, 255, 0.16), transparent 60%),\n      radial-gradient(720px 240px at 82% 10%, rgba(255, 255, 255, 0.10), transparent 62%);\n    mix-blend-mode: screen;\n    opacity: 0;\n    animation: homebrew-sheen 1200ms var(--ease-out) both;\n  }\n\n  .range {\n    -webkit-appearance: none;\n    appearance: none;\n    height: 2px;\n    border-radius: 999px;\n    background: rgba(255, 255, 255, 0.16);\n    outline: none;\n  }\n\n  .range::-webkit-slider-thumb {\n    -webkit-appearance: none;\n    appearance: none;\n    width: 14px;\n    height: 14px;\n    border-radius: 999px;\n    background: rgba(255, 255, 255, 0.92);\n    border: 1px solid rgba(0, 0, 0, 0.28);\n    box-shadow:\n      0 0 0 6px rgba(255, 255, 255, 0.08),\n      0 14px 40px rgba(0, 0, 0, 0.55);\n    cursor: pointer;\n  }\n\n  .range::-webkit-slider-thumb:active {\n    transform: scale(0.96);\n  }\n\n  .range::-moz-range-thumb {\n    width: 14px;\n    height: 14px;\n    border-radius: 999px;\n    background: rgba(255, 255, 255, 0.92);\n    border: 1px solid rgba(0, 0, 0, 0.28);\n    box-shadow:\n      0 0 0 6px rgba(255, 255, 255, 0.08),\n      0 14px 40px rgba(0, 0, 0, 0.55);\n    cursor: pointer;\n  }\n\n  .range::-moz-range-track {\n    height: 2px;\n    border-radius: 999px;\n    background: rgba(255, 255, 255, 0.16);\n  }\n\n  /* Gradient text with safe fallback (avoid transparent text if background-clip isn't supported). */\n  .text-flow {\n    color: rgba(255, 255, 255, 0.96);\n  }\n}\n\n@supports ((-webkit-background-clip: text) or (background-clip: text)) {\n  @layer utilities {\n    .text-flow {\n      background-image: linear-gradient(\n        90deg,\n        rgba(255, 255, 255, 0.98) 0%,\n        rgba(255, 255, 255, 0.64) 38%,\n        rgba(255, 255, 255, 0.98) 86%\n      );\n      -webkit-background-clip: text;\n      background-clip: text;\n      color: transparent;\n      -webkit-text-fill-color: transparent;\n    }\n  }\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .homebrew-highlight {\n    animation: none;\n    border-color: rgba(255, 255, 255, 0.22);\n    box-shadow:\n      0 0 0 1px rgba(255, 255, 255, 0.14) inset,\n      0 0 0 1px rgba(255, 255, 255, 0.12),\n      0 0 32px rgba(255, 255, 255, 0.06);\n  }\n  .homebrew-highlight::after {\n    animation: none;\n    opacity: 0;\n  }\n  .orb {\n    animation: none;\n  }\n}\n"
  },
  {
    "path": "website/app/home-client.tsx",
    "content": "\"use client\";\n\nimport Image from \"next/image\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport logo512 from \"@/assets/image/logo-512.png\";\nimport { FlowField } from \"./components/FlowField/FlowField\";\nimport { LanguageSelector } from \"./components/LanguageSelector/LanguageSelector\";\nimport { Magnetic } from \"./components/Magnetic/Magnetic\";\nimport { Reveal } from \"./components/Reveal/Reveal\";\nimport { EasingPlayground } from \"./components/EasingPlayground/EasingPlayground\";\nimport { CopyButton } from \"./components/CopyButton/CopyButton\";\nimport { useI18n } from \"./i18n/context\";\nimport { format } from \"./i18n/format\";\nimport { useGithubRelease } from \"./services/github\";\nimport { motion, useReducedMotion } from \"framer-motion\";\nimport { HeroCurvePanel } from \"./components/HeroCurvePanel/HeroCurvePanel\";\nimport { BentoCard } from \"./components/BentoCard/BentoCard\";\n\nconst FALLBACK_RELEASE_LINK = \"https://github.com/Caldis/Mos/releases/latest\";\n\ntype Axis = \"X\" | \"Y\";\ntype AxisSetting = \"smooth\" | \"reverse\";\n\ntype AppProfile = {\n  id: string;\n  name: string;\n  icon: string;\n  curve: { step: number; gain: number; duration: number };\n  axes: Record<Axis, Record<AxisSetting, boolean>>;\n};\n\nconst APP_PROFILES: AppProfile[] = [\n  {\n    id: \"xcode\",\n    name: \"Xcode\",\n    icon: \"/app-icons/xcode.png\",\n    curve: { step: 28.0, gain: 2.3, duration: 3.4 },\n    axes: {\n      Y: { smooth: true, reverse: false },\n      X: { smooth: false, reverse: false },\n    },\n  },\n  {\n    id: \"safari\",\n    name: \"Safari\",\n    icon: \"/app-icons/safari.png\",\n    curve: { step: 33.6, gain: 2.7, duration: 4.35 },\n    axes: {\n      Y: { smooth: true, reverse: false },\n      X: { smooth: true, reverse: false },\n    },\n  },\n  {\n    id: \"figma\",\n    name: \"Figma\",\n    icon: \"/app-icons/figma.png\",\n    curve: { step: 26.0, gain: 2.1, duration: 3.8 },\n    axes: {\n      Y: { smooth: true, reverse: false },\n      X: { smooth: true, reverse: true },\n    },\n  },\n  {\n    id: \"terminal\",\n    name: \"Terminal\",\n    icon: \"/app-icons/terminal.png\",\n    curve: { step: 18.0, gain: 1.6, duration: 2.0 },\n    axes: {\n      Y: { smooth: false, reverse: false },\n      X: { smooth: false, reverse: false },\n    },\n  },\n  {\n    id: \"notion\",\n    name: \"Notion\",\n    icon: \"/app-icons/notion.png\",\n    curve: { step: 30.0, gain: 2.4, duration: 4.8 },\n    axes: {\n      Y: { smooth: true, reverse: false },\n      X: { smooth: false, reverse: false },\n    },\n  },\n  {\n    id: \"chrome\",\n    name: \"Chrome\",\n    icon: \"/app-icons/chrome.png\",\n    curve: { step: 33.6, gain: 2.9, duration: 4.1 },\n    axes: {\n      Y: { smooth: true, reverse: false },\n      X: { smooth: true, reverse: false },\n    },\n  },\n];\n\nfunction MiniToggle({\n  checked,\n  onToggle,\n  ariaLabel,\n  disabled = false,\n}: {\n  checked: boolean;\n  onToggle: () => void;\n  ariaLabel: string;\n  disabled?: boolean;\n}) {\n  return (\n    <button\n      type=\"button\"\n      role=\"switch\"\n      aria-checked={checked}\n      aria-disabled={disabled}\n      aria-label={ariaLabel}\n      disabled={disabled}\n      onClick={() => {\n        if (disabled) return;\n        onToggle();\n      }}\n      className={`relative inline-flex h-6 w-11 shrink-0 items-center overflow-hidden rounded-full border p-[2px] transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-white/20 ${\n        checked\n          ? \"border-white/30 bg-white/28\"\n          : disabled\n            ? \"border-white/8 bg-white/4\"\n            : \"border-white/8 bg-white/4 hover:border-white/14 hover:bg-white/7\"\n      } ${disabled ? \"cursor-default\" : \"cursor-pointer\"}`}\n    >\n      <span\n        aria-hidden=\"true\"\n        className={`h-5 w-5 rounded-full shadow-[0_6px_16px_rgba(0,0,0,0.45)] transition-[transform,background-color] duration-200 ease-out ${\n          checked ? \"translate-x-5 bg-white\" : \"translate-x-0 bg-white/50\"\n        }`}\n      />\n    </button>\n  );\n}\n\nfunction pickDownloadUrl(release: unknown): string {\n  if (!release || typeof release !== \"object\") return FALLBACK_RELEASE_LINK;\n\n  const assetsRaw = (release as Record<string, unknown>).assets;\n  if (!Array.isArray(assetsRaw) || assetsRaw.length === 0) return FALLBACK_RELEASE_LINK;\n\n  const assets = assetsRaw\n    .map((asset) => {\n      if (!asset || typeof asset !== \"object\") return null;\n      const record = asset as Record<string, unknown>;\n      const name = typeof record.name === \"string\" ? record.name : null;\n      const url =\n        typeof record.browser_download_url === \"string\" ? record.browser_download_url : null;\n      if (!name || !url) return null;\n      return { name, url };\n    })\n    .filter(Boolean) as { name: string; url: string }[];\n\n  if (assets.length === 0) return FALLBACK_RELEASE_LINK;\n\n  const byExt = (ext: string) => assets.find((a) => a.name.toLowerCase().endsWith(ext));\n\n  return byExt(\".zip\")?.url || byExt(\".dmg\")?.url || assets[0]?.url || FALLBACK_RELEASE_LINK;\n}\n\nconst HERO_SPRING = { type: \"spring\" as const, stiffness: 100, damping: 20 };\n\nfunction heroMotion(delayS: number, shouldReduceMotion: boolean | null) {\n  return {\n    initial: shouldReduceMotion ? (false as const) : { opacity: 0, y: 24 },\n    animate: { opacity: 1, y: 0 },\n    transition: { ...HERO_SPRING, delay: delayS },\n  };\n}\n\nexport default function HomeClient() {\n  const { t } = useI18n();\n  const shouldReduceMotion = useReducedMotion();\n  const { data: release } = useGithubRelease();\n\n  const [axesDemo, setAxesDemo] = useState<Record<Axis, Record<AxisSetting, boolean>>>(() => ({\n    Y: { smooth: true, reverse: false },\n    X: { smooth: false, reverse: true },\n  }));\n\n  const toggleAxis = useCallback((axis: Axis, setting: AxisSetting) => {\n    setAxesDemo((prev) => ({\n      ...prev,\n      [axis]: { ...prev[axis], [setting]: !prev[axis][setting] },\n    }));\n  }, []);\n\n\n  const versionLabel = useMemo(() => {\n    const tag = release?.tag_name;\n    return typeof tag === \"string\" && tag.trim() ? `v${tag.replace(/^v/i, \"\")}` : null;\n  }, [release?.tag_name]);\n\n  const downloadUrl = useMemo(() => pickDownloadUrl(release), [release]);\n\n  const homebrewRef = useRef<HTMLDivElement | null>(null);\n  const pendingHomebrewFlashRef = useRef(false);\n  const homebrewFlashStartTimerRef = useRef<number | null>(null);\n  const homebrewFlashTimerRef = useRef<number | null>(null);\n\n  const flashHomebrew = useCallback((delayMs = 0) => {\n    const el = homebrewRef.current;\n    if (!el) return;\n\n    if (homebrewFlashStartTimerRef.current) {\n      window.clearTimeout(homebrewFlashStartTimerRef.current);\n      homebrewFlashStartTimerRef.current = null;\n    }\n    if (homebrewFlashTimerRef.current) {\n      window.clearTimeout(homebrewFlashTimerRef.current);\n      homebrewFlashTimerRef.current = null;\n    }\n\n    const start = () => {\n      el.classList.remove(\"homebrew-highlight\");\n      // Force reflow so the animation restarts reliably.\n      // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n      el.offsetWidth;\n      el.classList.add(\"homebrew-highlight\");\n\n      homebrewFlashTimerRef.current = window.setTimeout(() => {\n        el.classList.remove(\"homebrew-highlight\");\n        homebrewFlashTimerRef.current = null;\n      }, 1200);\n    };\n\n    if (delayMs > 0) {\n      homebrewFlashStartTimerRef.current = window.setTimeout(() => {\n        homebrewFlashStartTimerRef.current = null;\n        start();\n      }, delayMs);\n    } else {\n      start();\n    }\n  }, []);\n\n  useEffect(() => {\n    const el = homebrewRef.current;\n    if (!el) return;\n\n    const io = new IntersectionObserver(\n      (entries) => {\n        const entry = entries[0];\n        if (!entry?.isIntersecting) return;\n        if (!pendingHomebrewFlashRef.current) return;\n        pendingHomebrewFlashRef.current = false;\n        flashHomebrew(500);\n      },\n      { threshold: 0.35 }\n    );\n\n    io.observe(el);\n\n    return () => {\n      io.disconnect();\n      if (homebrewFlashStartTimerRef.current) {\n        window.clearTimeout(homebrewFlashStartTimerRef.current);\n        homebrewFlashStartTimerRef.current = null;\n      }\n      if (homebrewFlashTimerRef.current) {\n        window.clearTimeout(homebrewFlashTimerRef.current);\n        homebrewFlashTimerRef.current = null;\n      }\n    };\n  }, [flashHomebrew]);\n\n  const scrollToHomebrew = () => {\n    const el = homebrewRef.current ?? document.getElementById(\"homebrew\");\n    if (!el) return;\n\n    const reduced = window.matchMedia?.(\"(prefers-reduced-motion: reduce)\")?.matches ?? false;\n\n    const rect = el.getBoundingClientRect();\n    const inView = rect.top < window.innerHeight * 0.78 && rect.bottom > window.innerHeight * 0.22;\n    if (inView) {\n      pendingHomebrewFlashRef.current = false;\n      flashHomebrew(500);\n    } else {\n      pendingHomebrewFlashRef.current = true;\n    }\n\n    el.scrollIntoView({ behavior: reduced ? \"auto\" : \"smooth\", block: \"start\" });\n  };\n\n  return (\n    <div className=\"min-h-[100dvh] text-[color:var(--fg0)]\">\n      <a\n        href=\"#content\"\n        className=\"sr-only focus:not-sr-only focus:fixed focus:z-[100] focus:top-4 focus:left-4 focus:px-4 focus:py-2 focus:rounded-xl focus:bg-black/70 focus:text-white focus:outline-none\"\n      >\n        {t.a11y.skipToContent}\n      </a>\n\n      <div className=\"fixed inset-0 -z-10 overflow-hidden\">\n        <FlowField className=\"absolute inset-0\" />\n        <div className=\"orb left-[-140px] top-[-120px] w-[380px] h-[380px] bg-[color:var(--accent)]\" />\n        <div className=\"orb right-[-180px] top-[10vh] w-[420px] h-[420px] bg-[color:var(--accent3)] [animation-delay:-1.2s]\" />\n        <div className=\"orb left-[12vw] bottom-[-220px] w-[520px] h-[520px] bg-[color:var(--accent2)] [animation-delay:-2.1s]\" />\n      </div>\n\n      <header className=\"fixed left-0 right-0 top-0 z-50 px-4 sm:px-6\">\n        <nav className=\"mx-auto mt-4 sm:mt-6 max-w-6xl rounded-[var(--radius-xl)] glass ring-accent\">\n          <div className=\"flex items-center justify-between px-4 sm:px-5 py-3\">\n            <div className=\"flex items-center gap-3\">\n              <Image\n                src={logo512}\n                alt={t.a11y.appIconAlt}\n                width={40}\n                height={40}\n                className=\"object-contain rounded-[14px]\"\n                priority\n              />\n              <div className=\"text-lg sm:text-xl font-extrabold tracking-[0.015em] text-white\">\n                Mos\n              </div>\n            </div>\n\n            <div className=\"flex items-center gap-3\">\n              <LanguageSelector />\n              <Magnetic strength={14}>\n                <a\n                  href=\"https://github.com/Caldis/Mos\"\n                  target=\"_blank\"\n                  rel=\"noopener noreferrer\"\n                  className=\"group grid h-11 w-11 place-items-center rounded-2xl border border-white/5 bg-white/4 hover:bg-white/7 hover:border-white/9 transition-colors\"\n                  aria-label={t.a11y.githubAria}\n                  title={t.nav.githubTitle}\n                >\n                  <svg\n                    aria-hidden=\"true\"\n                    viewBox=\"0 0 24 24\"\n                    className=\"h-5 w-5 text-white/82 group-hover:text-white/92 transition-colors\"\n                    fill=\"currentColor\"\n                  >\n                    <path d=\"M12 2c-5.52 0-10 4.58-10 10.23 0 4.52 2.87 8.35 6.84 9.7.5.1.68-.22.68-.48 0-.24-.01-.88-.01-1.72-2.78.62-3.37-1.37-3.37-1.37-.45-1.18-1.11-1.49-1.11-1.49-.91-.64.07-.63.07-.63 1.01.07 1.54 1.06 1.54 1.06.9 1.57 2.35 1.12 2.92.86.09-.67.35-1.12.64-1.38-2.22-.26-4.56-1.14-4.56-5.06 0-1.12.39-2.04 1.03-2.76-.1-.26-.45-1.3.1-2.72 0 0 .84-.28 2.75 1.05.8-.23 1.65-.35 2.5-.35.85 0 1.7.12 2.5.35 1.9-1.33 2.75-1.05 2.75-1.05.55 1.42.2 2.46.1 2.72.64.72 1.03 1.64 1.03 2.76 0 3.93-2.34 4.8-4.58 5.05.36.32.69.96.69 1.94 0 1.4-.01 2.52-.01 2.86 0 .26.18.58.69.48A10.3 10.3 0 0 0 22 12.23C22 6.58 17.52 2 12 2Z\" />\n                  </svg>\n                </a>\n              </Magnetic>\n            </div>\n          </div>\n        </nav>\n      </header>\n\n      <main id=\"content\" className=\"mx-auto max-w-6xl px-4 sm:px-6\">\n        <section className=\"relative min-h-[100dvh] pt-28 sm:pt-36 pb-10 sm:pb-12 flex flex-col\">\n          <div className=\"flex-1 flex items-center\">\n            <div className=\"w-full grid grid-cols-1 md:grid-cols-[1fr_auto] gap-12 lg:gap-20 items-center\">\n\n              {/* Left column */}\n              <div>\n                <motion.div\n                  className=\"inline-flex items-center gap-3 rounded-full border border-white/10 bg-black/40 px-4 py-2 text-xs text-white/70 shadow-elevated\"\n                  {...heroMotion(0, shouldReduceMotion)}\n                >\n                  <span className=\"inline-flex items-center gap-2\">\n                    <span className=\"h-2 w-2 rounded-full bg-[color:var(--accent)] shadow-[0_0_22px_rgba(255,255,255,0.35)]\" />\n                    {t.hero.badgeLine1}\n                  </span>\n                  <span className=\"hidden sm:inline text-white/35\">•</span>\n                  <span className=\"hidden sm:inline font-mono text-white/45\">\n                    {t.hero.badgeLine2}\n                  </span>\n                </motion.div>\n\n                <motion.h1\n                  className=\"mt-7 font-display text-balance text-[52px] leading-[0.95] tracking-[-0.02em] sm:text-[88px] md:text-[108px] lg:text-[124px] text-white\"\n                  {...heroMotion(0.08, shouldReduceMotion)}\n                >\n                  {t.hero.titleLine1}\n                  <span className=\"block\">\n                    {t.hero.titleLine2Before}\n                    <span\n                      className=\"inline-block text-flow\"\n                      style={{ textShadow: \"0 0 42px rgba(255,255,255,0.08)\" }}\n                    >\n                      {t.hero.titleLine2Highlight}\n                    </span>\n                    {t.hero.titleLine2After}\n                  </span>\n                </motion.h1>\n\n                <motion.p\n                  className=\"mt-5 max-w-2xl text-balance text-[15px] sm:text-lg text-white/72 leading-[1.7]\"\n                  {...heroMotion(0.18, shouldReduceMotion)}\n                >\n                  {t.hero.lead}\n                </motion.p>\n\n                <motion.div\n                  className=\"mt-8 flex flex-col sm:flex-row sm:items-start gap-3 sm:gap-4\"\n                  {...heroMotion(0.26, shouldReduceMotion)}\n                >\n                  <div className=\"flex flex-col items-start w-fit\">\n                    <Magnetic strength={22}>\n                      <a\n                        href={downloadUrl}\n                        target=\"_blank\"\n                        rel=\"noopener noreferrer\"\n                        className=\"group relative overflow-hidden rounded-[18px] px-6 py-3.5 text-sm sm:text-base font-semibold tracking-wide text-black shadow-elevated border border-black/10 inline-flex items-center justify-center\"\n                        style={{\n                          background:\n                            \"linear-gradient(180deg, rgba(255,255,255,0.96) 0%, rgba(255,255,255,0.84) 100%)\",\n                        }}\n                      >\n                        <span className=\"relative z-10\">{t.hero.ctaDownload}</span>\n                        <span className=\"absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity duration-500 [background:radial-gradient(800px_240px_at_30%_0%,rgba(0,0,0,0.18),transparent_55%)]\" />\n                      </a>\n                    </Magnetic>\n                    <a\n                      href=\"#homebrew\"\n                      onClick={(e) => {\n                        e.preventDefault();\n                        scrollToHomebrew();\n                      }}\n                      className=\"mt-2 self-center text-xs font-mono text-white/50 hover:text-white/75 transition-colors underline decoration-white/15 hover:decoration-white/35 underline-offset-4\"\n                    >\n                      {t.hero.ctaInstallHomebrew}\n                    </a>\n                  </div>\n\n                  <Magnetic strength={14}>\n                    <a\n                      href=\"https://github.com/Caldis/Mos\"\n                      target=\"_blank\"\n                      rel=\"noopener noreferrer\"\n                      className=\"group inline-flex items-center justify-center rounded-[18px] px-6 py-3.5 text-sm sm:text-base font-semibold tracking-wide text-white/85 border border-white/12 bg-white/5 hover:bg-white/8 transition-colors\"\n                    >\n                      <span className=\"mr-2 opacity-70 group-hover:opacity-100 transition-opacity\">↗</span>\n                      <span>{t.hero.ctaViewGitHub}</span>\n                    </a>\n                  </Magnetic>\n\n                  <div className=\"sm:ml-auto sm:self-center text-xs text-white/45\">\n                    <div className=\"font-mono tabular-nums\">{t.hero.requirementsLine1}</div>\n                    <div className=\"font-mono\">{t.hero.requirementsLine2}</div>\n                  </div>\n                </motion.div>\n              </div>\n\n              {/* Right column — HeroCurvePanel is hidden md: internally */}\n              <HeroCurvePanel />\n            </div>\n          </div>\n\n          <div className=\"mt-8 sm:mt-10 flex items-center gap-3 text-white/40\">\n            <div className=\"h-[1px] flex-1 hairline\" />\n            <div className=\"font-mono text-[11px] tracking-[0.18em] uppercase\">\n              {t.hero.scrollHint}\n            </div>\n            <div className=\"h-[1px] flex-1 hairline\" />\n          </div>\n        </section>\n\n        <section className=\"py-16 sm:py-24\">\n          <Reveal>\n            <h2 className=\"font-display text-balance text-3xl sm:text-5xl text-white leading-[0.95] tracking-[-0.01em]\">\n              {t.sectionFeel.title}\n            </h2>\n          </Reveal>\n          <Reveal delayMs={90}>\n            <p className=\"mt-4 max-w-3xl text-white/68 leading-[1.7]\">\n              {t.sectionFeel.lead}\n            </p>\n          </Reveal>\n\n          <div className=\"mt-10 grid grid-cols-1 md:grid-cols-12 gap-4\">\n            {/* Row 1: Easing (7) + Axes (5) */}\n            <Reveal className=\"md:col-span-7 h-full\" delayMs={140}>\n              <BentoCard>\n                <div className=\"relative p-6 sm:p-8\">\n                  <div className=\"font-display text-[11px] tracking-[0.22em] uppercase text-white/50\">\n                    {t.sectionFeel.cards.curves.kicker}\n                  </div>\n                  <div className=\"mt-4 text-2xl sm:text-3xl text-white font-semibold\">\n                    {t.sectionFeel.cards.curves.title}\n                  </div>\n                  <p className=\"mt-3 text-white/62 leading-[1.7]\">\n                    {t.sectionFeel.cards.curves.body}\n                  </p>\n                  <EasingPlayground className=\"mt-6\" />\n                </div>\n              </BentoCard>\n            </Reveal>\n\n            <Reveal className=\"md:col-span-5 h-full\" delayMs={200}>\n              <BentoCard>\n                <div className=\"relative p-6 sm:p-8\">\n                  <div className=\"font-display text-[11px] tracking-[0.22em] uppercase text-white/50\">\n                    {t.sectionFeel.cards.axes.kicker}\n                  </div>\n                  <div className=\"mt-4 text-2xl sm:text-3xl text-white font-semibold\">\n                    {t.sectionFeel.cards.axes.title}\n                  </div>\n                  <p className=\"mt-3 text-white/62 leading-[1.7]\">\n                    {t.sectionFeel.cards.axes.body}\n                  </p>\n\n                  <div className=\"mt-6 rounded-2xl border border-white/10 bg-black/30 p-5\">\n                    <div className=\"space-y-3\">\n                      {([\"Y\", \"X\"] as const).map((axis) => {\n                        const row = axesDemo[axis];\n                        return (\n                          <div key={axis} className=\"flex items-center gap-3\">\n                            <div className=\"h-10 w-10 rounded-2xl border border-white/10 bg-white/5 grid place-items-center\">\n                              <span className=\"font-mono text-xs text-white/60\">{axis}</span>\n                            </div>\n\n                            <div className=\"flex flex-1 flex-wrap gap-2\">\n                              <div className=\"flex min-w-[150px] flex-1 items-center justify-between rounded-xl border border-white/10 bg-white/5 px-3 py-2\">\n                                <span className=\"font-mono text-[11px] text-white/60\">\n                                  {t.sectionFeel.cards.axes.smooth}\n                                </span>\n                                <MiniToggle\n                                  checked={row.smooth}\n                                  onToggle={() => toggleAxis(axis, \"smooth\")}\n                                  ariaLabel={`${axis} ${t.sectionFeel.cards.axes.smooth}`}\n                                />\n                              </div>\n\n                              <div className=\"flex min-w-[150px] flex-1 items-center justify-between rounded-xl border border-white/10 bg-white/5 px-3 py-2\">\n                                <span className=\"font-mono text-[11px] text-white/60\">\n                                  {t.sectionFeel.cards.axes.reverse}\n                                </span>\n                                <MiniToggle\n                                  checked={row.reverse}\n                                  onToggle={() => toggleAxis(axis, \"reverse\")}\n                                  ariaLabel={`${axis} ${t.sectionFeel.cards.axes.reverse}`}\n                                />\n                              </div>\n                            </div>\n                          </div>\n                        );\n                      })}\n                    </div>\n                  </div>\n                </div>\n              </BentoCard>\n            </Reveal>\n\n            {/* Row 2: Per-App (5) + Buttons (7) — taller than row 1 */}\n            <Reveal className=\"md:col-span-5 h-full\" delayMs={260}>\n              <BentoCard>\n                <div className=\"relative p-6 sm:p-8 min-h-[360px]\">\n                  <div className=\"font-display text-[11px] tracking-[0.22em] uppercase text-white/50\">\n                    {t.sectionFeel.cards.perApp.kicker}\n                  </div>\n                  <div className=\"mt-4 text-2xl sm:text-3xl text-white font-semibold\">\n                    {t.sectionFeel.cards.perApp.title}\n                  </div>\n                  <p className=\"mt-3 text-white/62 leading-[1.7]\">\n                    {t.sectionFeel.cards.perApp.body}\n                  </p>\n\n                  {/* 2-column grid with larger 48px icons + smooth badge */}\n                  <div className=\"mt-6 grid grid-cols-2 gap-3\">\n                    {APP_PROFILES.map((a) => (\n                      <div\n                        key={a.id}\n                        className=\"rounded-2xl border border-white/10 bg-white/5 p-3 flex items-center gap-3\"\n                      >\n                        <div className=\"h-12 w-12 shrink-0 rounded-xl border border-white/10 bg-black/20 overflow-hidden\">\n                          <Image\n                            src={a.icon}\n                            alt=\"\"\n                            width={48}\n                            height={48}\n                            className=\"h-full w-full object-cover\"\n                          />\n                        </div>\n                        <div>\n                          <div className=\"font-mono text-[11px] text-white/65\">{a.name}</div>\n                          {a.axes.Y.smooth && (\n                            <div className=\"mt-0.5 inline-flex items-center gap-1 rounded-full bg-white/8 border border-white/10 px-1.5 py-0.5\">\n                              <span className=\"h-1.5 w-1.5 rounded-full bg-white/60\" />\n                              <span className=\"font-mono text-[9px] text-white/50\">smooth</span>\n                            </div>\n                          )}\n                        </div>\n                      </div>\n                    ))}\n                  </div>\n                </div>\n              </BentoCard>\n            </Reveal>\n\n            <Reveal className=\"md:col-span-7 h-full\" delayMs={320}>\n              <BentoCard>\n                <div className=\"relative p-6 sm:p-8 min-h-[360px]\">\n                  <div className=\"font-display text-[11px] tracking-[0.22em] uppercase text-white/50\">\n                    {t.sectionFeel.cards.buttons.kicker}\n                  </div>\n                  <div className=\"mt-4 text-2xl sm:text-3xl text-white font-semibold\">\n                    {t.sectionFeel.cards.buttons.title}\n                  </div>\n                  <p className=\"mt-3 text-white/62 leading-[1.7]\">\n                    {t.sectionFeel.cards.buttons.body}\n                  </p>\n\n                  <div className=\"mt-6 rounded-2xl border border-white/10 bg-black/30 p-5\">\n                    <div className=\"font-mono text-xs text-white/45\">\n                      {t.sectionFeel.cards.buttons.quickBind}\n                    </div>\n                    <div className=\"mt-3 grid gap-2\">\n                      {[\n                        {\n                          k: t.sectionFeel.cards.buttons.rows.button4,\n                          v: t.sectionFeel.cards.buttons.rows.missionControl,\n                        },\n                        {\n                          k: t.sectionFeel.cards.buttons.rows.button5,\n                          v: t.sectionFeel.cards.buttons.rows.nextSpace,\n                        },\n                        {\n                          k: t.sectionFeel.cards.buttons.rows.wheelClick,\n                          v: t.sectionFeel.cards.buttons.rows.appSwitcher,\n                        },\n                      ].map((row) => (\n                        <div\n                          key={row.k}\n                          className=\"flex items-center justify-between rounded-xl border border-white/10 bg-white/5 px-3 py-2\"\n                        >\n                          <div className=\"font-mono text-xs text-white/75\">{row.k}</div>\n                          <div className=\"font-mono text-xs text-white/45\">{row.v}</div>\n                        </div>\n                      ))}\n                      {/* Pulsing \"recording\" placeholder row */}\n                      <div className=\"flex items-center justify-between rounded-xl border border-white/8 bg-white/3 px-3 py-2 opacity-60\">\n                        <div className=\"flex items-center gap-2\">\n                          <span className=\"relative flex h-1.5 w-1.5\">\n                            <span className=\"motion-safe:animate-ping absolute inline-flex h-full w-full rounded-full bg-white/60 opacity-75\" />\n                            <span className=\"relative inline-flex rounded-full h-1.5 w-1.5 bg-white/40\" />\n                          </span>\n                          <div className=\"font-mono text-xs text-white/45\">—</div>\n                        </div>\n                        <div className=\"font-mono text-[10px] text-white/30 italic\">recording…</div>\n                      </div>\n                    </div>\n                  </div>\n                </div>\n              </BentoCard>\n            </Reveal>\n          </div>\n        </section>\n\n        <section className=\"pt-0 pb-16 sm:pb-24\">\n          <div className=\"rounded-[28px] glass shadow-elevated border border-white/10 overflow-hidden\">\n            <div className=\"px-6 sm:px-10 py-10 sm:py-14\">\n              <Reveal>\n                <h3 className=\"font-display text-balance text-3xl sm:text-6xl text-white leading-[0.95] tracking-[-0.015em]\">\n                  {t.download.title}\n                </h3>\n              </Reveal>\n              <Reveal delayMs={90}>\n                <p className=\"mt-4 max-w-3xl text-white/68 leading-[1.7]\">\n                  {t.download.body}\n                </p>\n              </Reveal>\n\n              <Reveal delayMs={160}>\n                <div className=\"mt-8 flex flex-col sm:flex-row sm:items-center gap-3\">\n                  <Magnetic strength={22}>\n                    <a\n                      href={downloadUrl}\n                      target=\"_blank\"\n                      rel=\"noopener noreferrer\"\n                      className=\"group relative overflow-hidden rounded-[18px] px-6 py-3.5 text-sm sm:text-base font-semibold tracking-wide text-black shadow-elevated border border-black/10 inline-flex items-center justify-center\"\n                      style={{\n                        background:\n                          \"linear-gradient(180deg, rgba(255,255,255,0.96) 0%, rgba(255,255,255,0.84) 100%)\",\n                      }}\n                    >\n                      <span className=\"relative z-10\">\n                        {t.download.ctaDownload}\n                      </span>\n                      <span className=\"absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity duration-500 [background:radial-gradient(900px_260px_at_30%_0%,rgba(0,0,0,0.18),transparent_55%)]\" />\n                    </a>\n                  </Magnetic>\n\n                  <Magnetic strength={14}>\n                    <a\n                      href=\"https://github.com/Caldis/Mos/releases\"\n                      target=\"_blank\"\n                      rel=\"noopener noreferrer\"\n                      className=\"inline-flex items-center justify-center rounded-[18px] px-6 py-3.5 text-sm sm:text-base font-semibold tracking-wide text-white/85 border border-white/12 bg-white/5 hover:bg-white/8 transition-colors\"\n                    >\n                      {t.download.releaseNotes}\n                    </a>\n                  </Magnetic>\n\n                  <Magnetic strength={14}>\n                    <a\n                      href=\"https://github.com/Caldis/Mos/wiki\"\n                      target=\"_blank\"\n                      rel=\"noopener noreferrer\"\n                      className=\"inline-flex items-center justify-center rounded-[18px] px-6 py-3.5 text-sm sm:text-base font-semibold tracking-wide text-white/85 border border-white/12 bg-white/5 hover:bg-white/8 transition-colors\"\n                    >\n                      {t.download.docs}\n                    </a>\n                  </Magnetic>\n                </div>\n              </Reveal>\n\n              <Reveal delayMs={220}>\n                <div\n                  id=\"homebrew\"\n                  ref={homebrewRef}\n                  className=\"mt-8 scroll-mt-28 rounded-[22px] border border-white/10 bg-black/35 p-5 sm:p-6\"\n                >\n                  <div className=\"flex flex-col sm:flex-row sm:items-center justify-between gap-3\">\n                    <div>\n                      <div className=\"font-display text-sm tracking-[0.18em] uppercase text-white/70\">\n                        {t.homebrew.title}\n                      </div>\n                      <div className=\"mt-2 font-mono text-sm text-white/75\">\n                        brew install --cask mos\n                      </div>\n                    </div>\n                    <CopyButton\n                      value=\"brew install --cask mos\"\n                      className=\"self-start sm:self-auto rounded-2xl px-4 py-2.5 text-sm font-semibold border border-white/12 bg-white/5 hover:bg-white/8 transition-colors text-white/85\"\n                      copiedLabel={t.homebrew.copied}\n                    >\n                      {t.homebrew.copy}\n                    </CopyButton>\n                  </div>\n                  <div className=\"mt-4 font-mono text-xs text-white/45\">\n                    {(() => {\n                      const tpl = t.homebrew.tip;\n                      const marker = \"{cask}\";\n                      const idx = tpl.indexOf(marker);\n                      if (idx === -1) return tpl;\n                      const before = tpl.slice(0, idx);\n                      const after = tpl.slice(idx + marker.length);\n                      return (\n                        <>\n                          {before}\n                          <span className=\"text-white/70\">mos@beta</span>\n                          {after}\n                        </>\n                      );\n                    })()}\n                  </div>\n                </div>\n              </Reveal>\n            </div>\n\n            <div className=\"px-6 sm:px-10 py-6 border-t border-white/10 flex flex-col sm:flex-row sm:items-center justify-between gap-3 text-white/45\">\n              <div className=\"font-mono text-xs\">\n                {(versionLabel\n                  ? format(t.footer.latestVersion, { version: versionLabel })\n                  : t.footer.latestRelease) +\n                  \" · \" +\n                  t.footer.requiresMacos}\n              </div>\n              <div className=\"flex items-center gap-4 font-mono text-xs\">\n                <a\n                  href=\"https://github.com/Caldis/Mos\"\n                  target=\"_blank\"\n                  rel=\"noopener noreferrer\"\n                  className=\"hover:text-white/80 transition-colors\"\n                >\n                  {t.footer.github}\n                </a>\n                <a\n                  href=\"https://github.com/Caldis/Mos/wiki\"\n                  target=\"_blank\"\n                  rel=\"noopener noreferrer\"\n                  className=\"hover:text-white/80 transition-colors\"\n                >\n                  {t.footer.wiki}\n                </a>\n                <a\n                  href=\"https://github.com/Caldis/Mos/releases\"\n                  target=\"_blank\"\n                  rel=\"noopener noreferrer\"\n                  className=\"hover:text-white/80 transition-colors\"\n                >\n                  {t.footer.releases}\n                </a>\n              </div>\n            </div>\n          </div>\n        </section>\n      </main>\n    </div>\n  );\n}\n"
  },
  {
    "path": "website/app/i18n/context.tsx",
    "content": "\"use client\";\n\nimport { createContext, useContext, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { de } from \"./de\";\nimport { el } from \"./el\";\nimport { en } from \"./en\";\nimport { id } from \"./id\";\nimport { ja } from \"./ja\";\nimport { ko } from \"./ko\";\nimport { pl } from \"./pl\";\nimport { ru } from \"./ru\";\nimport { tr } from \"./tr\";\nimport { uk } from \"./uk\";\nimport { zh } from \"./zh\";\nimport { zhHant } from \"./zh-Hant\";\n\nexport type Language =\n  | \"en\"\n  | \"zh\"\n  | \"zh-Hant\"\n  | \"ja\"\n  | \"ko\"\n  | \"ru\"\n  | \"de\"\n  | \"pl\"\n  | \"el\"\n  | \"tr\"\n  | \"uk\"\n  | \"id\";\n\nexport type Translations = typeof en;\n\nconst SUPPORTED_LANGUAGES: readonly Language[] = [\n  \"en\",\n  \"zh\",\n  \"zh-Hant\",\n  \"ja\",\n  \"ko\",\n  \"ru\",\n  \"de\",\n  \"pl\",\n  \"el\",\n  \"tr\",\n  \"uk\",\n  \"id\",\n];\n\nfunction isLanguage(value: string): value is Language {\n  return (SUPPORTED_LANGUAGES as readonly string[]).includes(value);\n}\n\nfunction uniqStrings(items: string[]) {\n  return Array.from(new Set(items.filter(Boolean)));\n}\n\nfunction mapBrowserLanguageToSupported(langRaw: string): Language | null {\n  const lang = langRaw.trim().toLowerCase();\n  if (!lang) return null;\n\n  // Chinese needs special handling for script/region.\n  if (lang === \"zh\" || lang.startsWith(\"zh-\") || lang.startsWith(\"zh_\")) {\n    const l = lang.replace(\"_\", \"-\");\n    const isHant =\n      l.includes(\"hant\") ||\n      l.startsWith(\"zh-hk\") ||\n      l.startsWith(\"zh-tw\") ||\n      l.startsWith(\"zh-mo\");\n    return isHant ? \"zh-Hant\" : \"zh\";\n  }\n\n  const primary = lang.split(/[-_]/)[0] ?? \"\";\n  if (primary === \"in\") return \"id\"; // old Indonesian code\n\n  const asLanguage = primary as Language;\n  return SUPPORTED_LANGUAGES.includes(asLanguage) ? asLanguage : null;\n}\n\nfunction defaultLanguageFromBrowser(): Language {\n  const candidates =\n    typeof navigator !== \"undefined\"\n      ? uniqStrings([...(navigator.languages ?? []), navigator.language ?? \"\"])\n      : [];\n\n  for (const lang of candidates) {\n    const mapped = mapBrowserLanguageToSupported(lang);\n    if (mapped) return mapped;\n  }\n\n  return \"en\";\n}\n\nconst TRANSLATIONS_BY_LANGUAGE: Record<Language, Translations> = {\n  en,\n  zh,\n  \"zh-Hant\": zhHant,\n  ja,\n  ko,\n  ru,\n  de,\n  pl,\n  el,\n  tr,\n  uk,\n  id,\n};\n\ninterface I18nContextType {\n  language: Language;\n  t: Translations;\n  setLanguage: (lang: Language) => void;\n}\n\nconst I18nContext = createContext<I18nContextType | null>(null);\n\nexport function I18nProvider({ children }: { children: React.ReactNode }) {\n  const [language, setLanguage] = useState<Language>(\"en\");\n  const didMountRef = useRef(false);\n\n  const translations = useMemo(() => {\n    return TRANSLATIONS_BY_LANGUAGE[language] ?? en;\n  }, [language]);\n\n  useEffect(() => {\n    const stored = localStorage.getItem(\"language\");\n    const desiredLanguage = stored && isLanguage(stored) ? stored : defaultLanguageFromBrowser();\n\n    // eslint-disable-next-line react-hooks/set-state-in-effect\n    setLanguage(desiredLanguage);\n\n    try {\n      localStorage.setItem(\"language\", desiredLanguage);\n    } catch {\n      // ignore\n    }\n    try {\n      document.documentElement.lang = desiredLanguage;\n    } catch {\n      // ignore\n    }\n  }, []);\n\n  useEffect(() => {\n    if (!didMountRef.current) {\n      didMountRef.current = true;\n      return;\n    }\n\n    try {\n      localStorage.setItem(\"language\", language);\n    } catch {\n      // ignore\n    }\n    try {\n      document.documentElement.lang = language;\n    } catch {\n      // ignore\n    }\n  }, [language]);\n\n  return (\n    <I18nContext.Provider value={{ language, t: translations, setLanguage }}>\n      {children}\n    </I18nContext.Provider>\n  );\n}\n\nexport function useI18n() {\n  const context = useContext(I18nContext);\n  if (!context) {\n    throw new Error(\"useI18n must be used within an I18nProvider\");\n  }\n  return context;\n}\n"
  },
  {
    "path": "website/app/i18n/de.ts",
    "content": "import type { Translations } from \"./context\";\n\nexport const de: Translations = {\n  languageSelector: {\n    title: \"Sprache auswählen\",\n  },\n  a11y: {\n    skipToContent: \"Zum Inhalt springen\",\n    closeDialog: \"Dialog schließen\",\n    githubAria: \"Mos auf GitHub\",\n    appIconAlt: \"Mos App-Icon\",\n    scrollCurveGraph: \"Scrollkurven-Diagramm\",\n  },\n  nav: {\n    githubTitle: \"GitHub\",\n  },\n  hero: {\n    badgeLine1: \"Sanftes Scrollen mit dem Mausrad unter macOS\",\n    badgeLine2: \"App-Profile · getrennte Achsen · Buttons & Shortcuts\",\n    titleLine1: \"Mach aus der Maus\",\n    titleLine2Before: \"einen \",\n    titleLine2Highlight: \"Flow\",\n    titleLine2After: \".\",\n    lead:\n      \"Mos ist ein kostenloses Open-Source-Tool für macOS. Es macht das Scrollen mit dem Mausrad so glatt wie beim Trackpad, ohne dir die Kontrolle zu nehmen. Kurven anpassen, Achsen trennen und Regeln pro App überschreiben.\",\n    ctaDownload: \"Mos herunterladen\",\n    ctaViewGitHub: \"Auf GitHub ansehen\",\n    ctaInstallHomebrew: \"Mit Homebrew installieren\",\n    requirementsLine1: \"macOS 10.13+ erforderlich\",\n    requirementsLine2: \"Kostenlos · Open Source\",\n    scrollHint: \"Scrollen zum Entdecken\",\n  },\n  sectionFeel: {\n    title: \"Deterministisch scrollen. Gefühl feinjustieren.\",\n    lead:\n      \"Mos verwandelt rohe Mausrad-Deltas in vorhersehbare Bewegung. Behalte in allen Apps dasselbe Gefühl und überschreibe es nur dort, wo du es brauchst.\",\n    cards: {\n      curves: {\n        kicker: \"Kurven & Beschleunigung\",\n        title: \"Das Gefühl formen.\",\n        body:\n          \"Smoothness ist eine Kurve. Stell Step, Gain und Duration ein und sieh, wie rohe Deltas in kontrollierte Bewegung werden.\",\n      },\n      axes: {\n        kicker: \"Unabhängige Achsen\",\n        title: \"X und Y trennen.\",\n        body:\n          \"Vertikal und horizontal sind getrennte Achsen. Glätten und Invert kannst du pro Achse an- und ausschalten.\",\n        smooth: \"Glätten\",\n        reverse: \"Invert\",\n        on: \"An\",\n        off: \"Aus\",\n      },\n      perApp: {\n        kicker: \"Profile pro App\",\n        title: \"Andere Apps, anderes Gefühl.\",\n        body:\n          \"Jede App kann die Defaults übernehmen oder Scroll- und Button-Regeln überschreiben. Präzise, wo’s zählt, smooth überall sonst.\",\n      },\n      buttons: {\n        kicker: \"Buttons & Shortcuts\",\n        title: \"Binden, aufnehmen, wiederholen.\",\n        body:\n          \"Maus- oder Tastatur-Events aufnehmen und an System-Shortcuts binden. Im Live-Monitor siehst du, was deine Geräte senden.\",\n        quickBind: \"Schnell binden\",\n        rows: {\n          button4: \"Taste 4\",\n          button5: \"Taste 5\",\n          wheelClick: \"Radklick\",\n          missionControl: \"Mission Control\",\n          nextSpace: \"Nächster Bereich\",\n          appSwitcher: \"App-Umschalter\",\n        },\n      },\n    },\n  },\n  download: {\n    title: \"Mos herunterladen. Scrollen nach deinem Geschmack.\",\n    body:\n      \"In Sekunden installiert, in deinem Tempo eingestellt. Und das Scroll-Gefühl bleibt in deinen Apps konsistent.\",\n    ctaDownload: \"Herunterladen\",\n    releaseNotes: \"Release Notes\",\n    docs: \"Doku\",\n  },\n  homebrew: {\n    title: \"Homebrew\",\n    copy: \"Kopieren\",\n    copied: \"Kopiert\",\n    tip: \"Tipp: Wenn du die Beta nutzt, heißt dein Cask vielleicht {cask}.\",\n  },\n  footer: {\n    latestRelease: \"Neuester Release\",\n    latestVersion: \"Neueste {version}\",\n    requiresMacos: \"macOS 10.13+ erforderlich\",\n    github: \"GitHub\",\n    wiki: \"Wiki\",\n    releases: \"Releases\",\n  },\n  easing: {\n    graphAria: \"Scrollkurven-Diagramm\",\n    step: {\n      label: \"Step\",\n      aria: \"Step\",\n      help: \"Quantisierungs-Untergrenze für Mausrad-Deltas.\",\n    },\n    gain: {\n      label: \"Gain\",\n      aria: \"Gain\",\n      help: \"Skaliert die Strecke pro Tick und wie schnell die Kurve anzieht.\",\n    },\n    duration: {\n      label: \"Duration\",\n      aria: \"Duration\",\n      help: \"Zeitkonstante fürs Glätten (höher = längerer Nachlauf).\",\n    },\n    footer: \"ScrollCore curve\",\n  },\n};\n"
  },
  {
    "path": "website/app/i18n/el.ts",
    "content": "import type { Translations } from \"./context\";\n\nexport const el: Translations = {\n  languageSelector: {\n    title: \"Επιλογή γλώσσας\",\n  },\n  a11y: {\n    skipToContent: \"Μετάβαση στο περιεχόμενο\",\n    closeDialog: \"Κλείσιμο διαλόγου\",\n    githubAria: \"Mos στο GitHub\",\n    appIconAlt: \"Εικονίδιο εφαρμογής Mos\",\n    scrollCurveGraph: \"Γράφημα καμπύλης κύλισης\",\n  },\n  nav: {\n    githubTitle: \"GitHub\",\n  },\n  hero: {\n    badgeLine1: \"Ομαλό scrolling με ροδέλα ποντικιού στο macOS\",\n    badgeLine2: \"προφίλ ανά εφαρμογή · ανεξάρτητοι άξονες · κουμπιά & shortcuts\",\n    titleLine1: \"Κάνε το ποντίκι\",\n    titleLine2Before: \"να \",\n    titleLine2Highlight: \"ρέει\",\n    titleLine2After: \".\",\n    lead:\n      \"Το Mos είναι ένα δωρεάν, open-source εργαλείο για macOS. Κάνει το scrolling με ροδέλα να θυμίζει trackpad, χωρίς να χάνεις τον έλεγχο. Ρύθμισε καμπύλες, χώρισε άξονες και βάλε εξαιρέσεις ανά εφαρμογή.\",\n    ctaDownload: \"Λήψη Mos\",\n    ctaViewGitHub: \"Δες το στο GitHub\",\n    ctaInstallHomebrew: \"Εγκατάσταση με Homebrew\",\n    requirementsLine1: \"Απαιτεί macOS 10.13+\",\n    requirementsLine2: \"Δωρεάν · Open source\",\n    scrollHint: \"Κάνε scroll για συνέχεια\",\n  },\n  sectionFeel: {\n    title: \"Προβλέψιμο scrolling. Ρυθμιζόμενη αίσθηση.\",\n    lead:\n      \"Το Mos μετατρέπει τις ωμές μεταβολές της ροδέλας σε προβλέψιμη κίνηση. Κράτα την ίδια αίσθηση σε όλες τις εφαρμογές και κάνε override όπου χρειάζεται.\",\n    cards: {\n      curves: {\n        kicker: \"Καμπύλες & επιτάχυνση\",\n        title: \"Διαμόρφωσε την αίσθηση.\",\n        body:\n          \"Η ομαλότητα είναι καμπύλη. Ρύθμισε step, gain και duration και δες πώς οι ωμές μεταβολές γίνονται ελεγχόμενη κίνηση.\",\n      },\n      axes: {\n        kicker: \"Ανεξάρτητοι άξονες\",\n        title: \"Χώρισε X και Y.\",\n        body:\n          \"Κάνε την κάθετη και την οριζόντια κύλιση ξεχωριστούς άξονες. Ενεργοποίησε/απενεργοποίησε την ομαλότητα και την αντιστροφή ανεξάρτητα για τον καθένα.\",\n        smooth: \"Ομαλότητα\",\n        reverse: \"Αντιστροφή\",\n        on: \"ON\",\n        off: \"OFF\",\n      },\n      perApp: {\n        kicker: \"Προφίλ ανά εφαρμογή\",\n        title: \"Άλλες εφαρμογές, άλλη αίσθηση.\",\n        body:\n          \"Άφησε κάθε εφαρμογή να κληρονομεί τα default ή κάνε override κανόνες κύλισης και κουμπιών. Ακρίβεια όπου χρειάζεται, ομαλότητα παντού αλλού.\",\n      },\n      buttons: {\n        kicker: \"Κουμπιά & shortcuts\",\n        title: \"Δέσε, γράψε, επανάλαβε.\",\n        body:\n          \"Κατέγραψε events από ποντίκι ή πληκτρολόγιο και δέσε τα σε system shortcuts. Με το live monitor βλέπεις τι στέλνουν οι συσκευές σου.\",\n        quickBind: \"Γρήγορη δέσμευση\",\n        rows: {\n          button4: \"Κουμπί 4\",\n          button5: \"Κουμπί 5\",\n          wheelClick: \"Κλικ ροδέλας\",\n          missionControl: \"Mission Control\",\n          nextSpace: \"Επόμενος χώρος\",\n          appSwitcher: \"Εναλλαγή εφαρμογών\",\n        },\n      },\n    },\n  },\n  download: {\n    title: \"Λήψη Mos. Ρύθμισε το scrolling σου.\",\n    body:\n      \"Εγκατάσταση σε δευτερόλεπτα, ρύθμιση με τον ρυθμό σου, και σταθερή συμπεριφορά κύλισης στις εφαρμογές που χρησιμοποιείς καθημερινά.\",\n    ctaDownload: \"Λήψη\",\n    releaseNotes: \"Σημειώσεις έκδοσης\",\n    docs: \"Οδηγίες\",\n  },\n  homebrew: {\n    title: \"Homebrew\",\n    copy: \"Αντιγραφή\",\n    copied: \"Αντιγράφηκε\",\n    tip: \"Συμβουλή: αν είσαι σε beta, το cask μπορεί να είναι {cask}.\",\n  },\n  footer: {\n    latestRelease: \"Τελευταία έκδοση\",\n    latestVersion: \"Τελευταίο {version}\",\n    requiresMacos: \"Απαιτεί macOS 10.13+\",\n    github: \"GitHub\",\n    wiki: \"Wiki\",\n    releases: \"Releases\",\n  },\n  easing: {\n    graphAria: \"Γράφημα καμπύλης κύλισης\",\n    step: {\n      label: \"Βήμα\",\n      aria: \"Βήμα\",\n      help: \"Κατώφλι κβαντοποίησης για τις μεταβολές της ροδέλας.\",\n    },\n    gain: {\n      label: \"Κέρδος\",\n      aria: \"Κέρδος\",\n      help: \"Κλιμακώνει την απόσταση ανά tick και το πόσο γρήγορα ανεβαίνει η καμπύλη.\",\n    },\n    duration: {\n      label: \"Διάρκεια\",\n      aria: \"Διάρκεια\",\n      help: \"Χρονική σταθερά εξομάλυνσης (μεγαλύτερη = μεγαλύτερη ουρά).\",\n    },\n    footer: \"Καμπύλη ScrollCore\",\n  },\n};\n"
  },
  {
    "path": "website/app/i18n/en.ts",
    "content": "export const en = {\n  languageSelector: {\n    title: \"Select Language\",\n  },\n  a11y: {\n    skipToContent: \"Skip to content\",\n    closeDialog: \"Close dialog\",\n    githubAria: \"Mos on GitHub\",\n    appIconAlt: \"Mos app icon\",\n    scrollCurveGraph: \"Scroll curve graph\",\n  },\n  nav: {\n    githubTitle: \"GitHub\",\n  },\n  hero: {\n    badgeLine1: \"Smooth scrolling for mouse wheels on macOS\",\n    badgeLine2: \"per-app profiles · independent axes · buttons & shortcuts\",\n    titleLine1: \"Turn the mouse\",\n    titleLine2Before: \"into \",\n    titleLine2Highlight: \"flow\",\n    titleLine2After: \".\",\n    lead:\n      \"Mos is a free, open-source macOS utility that makes wheel scrolling feel closer to a trackpad, without getting in your way. Tune curves, split axes, and override behavior per app.\",\n    ctaDownload: \"Download Mos\",\n    ctaViewGitHub: \"View on GitHub\",\n    ctaInstallHomebrew: \"Install via Homebrew\",\n    requirementsLine1: \"Requires macOS 10.13+\",\n    requirementsLine2: \"Free · Open source\",\n    scrollHint: \"Scroll to explore\",\n  },\n  sectionFeel: {\n    title: \"Deterministic scroll. Tunable feel.\",\n    lead:\n      \"Mos turns raw wheel deltas into predictable motion. Keep the same feel across apps, and override it when you need to.\",\n    cards: {\n      curves: {\n        kicker: \"Curves & Acceleration\",\n        title: \"Shape the feel.\",\n        body:\n          \"Smoothness is a curve. Adjust step, gain, and duration, and see how raw wheel deltas turn into controlled motion.\",\n      },\n      axes: {\n        kicker: \"Independent Axes\",\n        title: \"Split X and Y.\",\n        body:\n          \"Treat vertical and horizontal scroll as separate axes. Toggle smoothing and reverse independently for each.\",\n        smooth: \"Smooth\",\n        reverse: \"Reverse\",\n        on: \"On\",\n        off: \"Off\",\n      },\n      perApp: {\n        kicker: \"Per-app Profiles\",\n        title: \"Different apps, different feel.\",\n        body:\n          \"Let each app inherit defaults, or override scroll and button rules. Precision where it matters, smooth everywhere else.\",\n      },\n      buttons: {\n        kicker: \"Buttons & Shortcuts\",\n        title: \"Bind, record, repeat.\",\n        body:\n          \"Record mouse or keyboard events and bind them to system shortcuts. Use the live monitor to see what your devices are sending.\",\n        quickBind: \"Quick Bind\",\n        rows: {\n          button4: \"Button 4\",\n          button5: \"Button 5\",\n          wheelClick: \"Wheel Click\",\n          missionControl: \"Mission Control\",\n          nextSpace: \"Next Space\",\n          appSwitcher: \"App Switcher\",\n        },\n      },\n    },\n  },\n  download: {\n    title: \"Download Mos. Tune your scroll.\",\n    body:\n      \"Install in seconds, tweak it when you need to, and keep your scroll behavior consistent across the apps you live in.\",\n    ctaDownload: \"Download\",\n    releaseNotes: \"Release notes\",\n    docs: \"Docs\",\n  },\n  homebrew: {\n    title: \"Homebrew\",\n    copy: \"Copy\",\n    copied: \"Copied\",\n    tip: \"Tip: If you’re on beta, your cask might be {cask}.\",\n  },\n  footer: {\n    latestRelease: \"Latest release\",\n    latestVersion: \"Latest {version}\",\n    requiresMacos: \"Requires macOS 10.13+\",\n    github: \"GitHub\",\n    wiki: \"Wiki\",\n    releases: \"Releases\",\n  },\n  easing: {\n    graphAria: \"Scroll curve graph\",\n    step: {\n      label: \"Step\",\n      aria: \"Step\",\n      help: \"Quantization floor for wheel deltas.\",\n    },\n    gain: {\n      label: \"Gain\",\n      aria: \"Gain\",\n      help: \"Scales distance per tick and how fast the curve ramps.\",\n    },\n    duration: {\n      label: \"Duration\",\n      aria: \"Duration\",\n      help: \"Smoothing time constant (higher means longer tail).\",\n    },\n    footer: \"ScrollCore curve\",\n  },\n};\n"
  },
  {
    "path": "website/app/i18n/format.ts",
    "content": "export function format(\n  template: string,\n  params: Record<string, string | number | undefined | null>\n) {\n  return template.replace(/\\{(\\w+)\\}/g, (_m, key: string) => {\n    const v = params[key];\n    return v === undefined || v === null ? `{${key}}` : String(v);\n  });\n}\n\n"
  },
  {
    "path": "website/app/i18n/id.ts",
    "content": "import type { Translations } from \"./context\";\n\nexport const id: Translations = {\n  languageSelector: {\n    title: \"Pilih Bahasa\",\n  },\n  a11y: {\n    skipToContent: \"Lewati ke konten\",\n    closeDialog: \"Tutup dialog\",\n    githubAria: \"Mos di GitHub\",\n    appIconAlt: \"Ikon aplikasi Mos\",\n    scrollCurveGraph: \"Grafik kurva scroll\",\n  },\n  nav: {\n    githubTitle: \"GitHub\",\n  },\n  hero: {\n    badgeLine1: \"Scroll halus untuk roda mouse di macOS\",\n    badgeLine2: \"profil per aplikasi · sumbu terpisah · tombol & pintasan\",\n    titleLine1: \"Ubah mouse\",\n    titleLine2Before: \"menjadi \",\n    titleLine2Highlight: \"flow\",\n    titleLine2After: \".\",\n    lead:\n      \"Mos adalah utilitas macOS gratis dan open-source yang membuat scroll roda mouse terasa lebih seperti trackpad, tanpa mengurangi kontrol. Atur kurva, pisahkan sumbu, dan override perilaku per aplikasi.\",\n    ctaDownload: \"Unduh Mos\",\n    ctaViewGitHub: \"Lihat di GitHub\",\n    ctaInstallHomebrew: \"Instal via Homebrew\",\n    requirementsLine1: \"Butuh macOS 10.13+\",\n    requirementsLine2: \"Gratis · Open source\",\n    scrollHint: \"Scroll untuk melihat\",\n  },\n  sectionFeel: {\n    title: \"Scroll yang konsisten. Rasa yang bisa diatur.\",\n    lead:\n      \"Mos mengubah delta roda mentah menjadi gerakan yang bisa diprediksi. Pertahankan rasa yang sama di berbagai aplikasi, dan override saat perlu.\",\n    cards: {\n      curves: {\n        kicker: \"Kurva & akselerasi\",\n        title: \"Bentuk rasanya.\",\n        body:\n          \"Kehalusan adalah kurva. Ubah step, gain, dan duration, lalu lihat bagaimana delta mentah menjadi gerakan yang terkontrol.\",\n      },\n      axes: {\n        kicker: \"Sumbu terpisah\",\n        title: \"Pisahkan X dan Y.\",\n        body:\n          \"Anggap scroll vertikal dan horizontal sebagai dua sumbu terpisah. Kehalusan dan reverse bisa dinyalakan/dimatikan secara independen untuk tiap sumbu.\",\n        smooth: \"Kehalusan\",\n        reverse: \"Reverse\",\n        on: \"Nyala\",\n        off: \"Mati\",\n      },\n      perApp: {\n        kicker: \"Profil per aplikasi\",\n        title: \"Aplikasi berbeda, rasa berbeda.\",\n        body:\n          \"Setiap aplikasi bisa memakai default atau meng-override aturan scroll dan tombol. Presisi saat dibutuhkan, halus di tempat lain.\",\n      },\n      buttons: {\n        kicker: \"Tombol & pintasan\",\n        title: \"Ikat, rekam, ulangi.\",\n        body:\n          \"Rekam event mouse atau keyboard lalu ikat ke pintasan sistem. Dengan live monitor kamu bisa melihat apa yang dikirim perangkatmu.\",\n        quickBind: \"Quick Bind\",\n        rows: {\n          button4: \"Button 4\",\n          button5: \"Button 5\",\n          wheelClick: \"Wheel Click\",\n          missionControl: \"Mission Control\",\n          nextSpace: \"Next Space\",\n          appSwitcher: \"App Switcher\",\n        },\n      },\n    },\n  },\n  download: {\n    title: \"Unduh Mos. Atur scroll sesuai kamu.\",\n    body:\n      \"Instal dalam hitungan detik, atur saat perlu, dan jaga perilaku scroll tetap konsisten di aplikasi yang kamu pakai setiap hari.\",\n    ctaDownload: \"Unduh\",\n    releaseNotes: \"Catatan rilis\",\n    docs: \"Dokumentasi\",\n  },\n  homebrew: {\n    title: \"Homebrew\",\n    copy: \"Salin\",\n    copied: \"Disalin\",\n    tip: \"Tips: jika kamu memakai beta, cask-nya mungkin {cask}.\",\n  },\n  footer: {\n    latestRelease: \"Rilis terbaru\",\n    latestVersion: \"Terbaru {version}\",\n    requiresMacos: \"Butuh macOS 10.13+\",\n    github: \"GitHub\",\n    wiki: \"Wiki\",\n    releases: \"Releases\",\n  },\n  easing: {\n    graphAria: \"Grafik kurva scroll\",\n    step: {\n      label: \"Step\",\n      aria: \"Step\",\n      help: \"Batas kuantisasi untuk delta roda.\",\n    },\n    gain: {\n      label: \"Gain\",\n      aria: \"Gain\",\n      help: \"Mengalikan jarak per tick dan seberapa cepat kurva naik.\",\n    },\n    duration: {\n      label: \"Duration\",\n      aria: \"Duration\",\n      help: \"Konstanta waktu smoothing (lebih besar = tail lebih panjang).\",\n    },\n    footer: \"ScrollCore curve\",\n  },\n};\n"
  },
  {
    "path": "website/app/i18n/ja.ts",
    "content": "import type { Translations } from \"./context\";\n\nexport const ja: Translations = {\n  languageSelector: {\n    title: \"言語を選択\",\n  },\n  a11y: {\n    skipToContent: \"本文へスキップ\",\n    closeDialog: \"ダイアログを閉じる\",\n    githubAria: \"Mos の GitHub\",\n    appIconAlt: \"Mos アプリアイコン\",\n    scrollCurveGraph: \"スクロールカーブのグラフ\",\n  },\n  nav: {\n    githubTitle: \"GitHub\",\n  },\n  hero: {\n    badgeLine1: \"macOS のマウスホイールをスムーズに\",\n    badgeLine2: \"アプリ別プロファイル · 軸の分離 · ボタン/ショートカット\",\n    titleLine1: \"マウスを\",\n    titleLine2Before: \"\",\n    titleLine2Highlight: \"flow\",\n    titleLine2After: \" に変える。\",\n    lead:\n      \"Mos は無料・オープンソースの macOS ユーティリティです。ホイールスクロールをトラックパッドに近い感触にしつつ、操作感はそのまま。カーブ調整、X/Y の分離、アプリ別の上書きができます。\",\n    ctaDownload: \"Mos をダウンロード\",\n    ctaViewGitHub: \"GitHub で見る\",\n    ctaInstallHomebrew: \"Homebrew でインストール\",\n    requirementsLine1: \"macOS 10.13 以降\",\n    requirementsLine2: \"無料 · オープンソース\",\n    scrollHint: \"スクロールして見る\",\n  },\n  sectionFeel: {\n    title: \"狙いどおりにスクロール。手触りは調整できる。\",\n    lead:\n      \"Mos は生のホイール入力を予測しやすい動きに変換します。アプリ間で同じ感触を保ち、必要なときだけアプリ別に上書きできます。\",\n    cards: {\n      curves: {\n        kicker: \"カーブと加速\",\n        title: \"手触りを作る。\",\n        body:\n          \"滑らかさはカーブです。Step / Gain / Duration を調整して、生の入力がどう制御された動きになるかを確認できます。\",\n      },\n      axes: {\n        kicker: \"独立した軸\",\n        title: \"X と Y を分ける。\",\n        body:\n          \"縦と横を別々の軸として扱えます。スムーズと反転は、軸ごとにオン/オフできます。\",\n        smooth: \"スムーズ\",\n        reverse: \"反転\",\n        on: \"ON\",\n        off: \"OFF\",\n      },\n      perApp: {\n        kicker: \"アプリ別プロファイル\",\n        title: \"アプリごとに手触りを。\",\n        body:\n          \"基本設定のまま使うことも、アプリごとにスクロールやボタンのルールを上書きすることもできます。必要なところは正確に、他は滑らかに。\",\n      },\n      buttons: {\n        kicker: \"ボタンとショートカット\",\n        title: \"割り当てて、記録して、繰り返す。\",\n        body:\n          \"マウスやキーボードのイベントを記録して、システムのショートカットに割り当てます。ライブモニターで送信内容も確認できます。\",\n        quickBind: \"クイックバインド\",\n        rows: {\n          button4: \"ボタン 4\",\n          button5: \"ボタン 5\",\n          wheelClick: \"ホイールクリック\",\n          missionControl: \"Mission Control\",\n          nextSpace: \"次のスペース\",\n          appSwitcher: \"アプリ切り替え\",\n        },\n      },\n    },\n  },\n  download: {\n    title: \"Mos をダウンロード。スクロールを自分好みに。\",\n    body:\n      \"数秒で入れて、必要なときに調整。よく使うアプリでも同じ感触に揃えられます。\",\n    ctaDownload: \"ダウンロード\",\n    releaseNotes: \"リリースノート\",\n    docs: \"ドキュメント\",\n  },\n  homebrew: {\n    title: \"Homebrew\",\n    copy: \"コピー\",\n    copied: \"コピーしました\",\n    tip: \"ヒント: beta を使っている場合、cask は {cask} かもしれません。\",\n  },\n  footer: {\n    latestRelease: \"最新リリース\",\n    latestVersion: \"最新 {version}\",\n    requiresMacos: \"macOS 10.13 以降\",\n    github: \"GitHub\",\n    wiki: \"Wiki\",\n    releases: \"Releases\",\n  },\n  easing: {\n    graphAria: \"スクロールカーブのグラフ\",\n    step: {\n      label: \"Step\",\n      aria: \"Step\",\n      help: \"ホイール入力の量子化の下限。\",\n    },\n    gain: {\n      label: \"Gain\",\n      aria: \"Gain\",\n      help: \"1 ティックあたりの距離と、立ち上がりの速さを決めます。\",\n    },\n    duration: {\n      label: \"Duration\",\n      aria: \"Duration\",\n      help: \"平滑化の時間定数（大きいほど尾を引きます）。\",\n    },\n    footer: \"ScrollCore curve\",\n  },\n};\n"
  },
  {
    "path": "website/app/i18n/ko.ts",
    "content": "import type { Translations } from \"./context\";\n\nexport const ko: Translations = {\n  languageSelector: {\n    title: \"언어 선택\",\n  },\n  a11y: {\n    skipToContent: \"본문으로 건너뛰기\",\n    closeDialog: \"대화상자 닫기\",\n    githubAria: \"Mos GitHub\",\n    appIconAlt: \"Mos 앱 아이콘\",\n    scrollCurveGraph: \"스크롤 커브 그래프\",\n  },\n  nav: {\n    githubTitle: \"GitHub\",\n  },\n  hero: {\n    badgeLine1: \"macOS에서 마우스 휠 스크롤을 부드럽게\",\n    badgeLine2: \"앱별 프로필 · 축 분리 · 버튼/단축키\",\n    titleLine1: \"마우스를\",\n    titleLine2Before: \"\",\n    titleLine2Highlight: \"flow\",\n    titleLine2After: \"로 바꿉니다.\",\n    lead:\n      \"Mos는 무료 오픈소스 macOS 유틸리티입니다. 휠 스크롤을 트랙패드에 가까운 느낌으로 만들면서도, 필요한 제어는 그대로 남겨둡니다. 곡선을 조정하고, X/Y 축을 분리하고, 앱별로 동작을 덮어쓸 수 있어요.\",\n    ctaDownload: \"Mos 다운로드\",\n    ctaViewGitHub: \"GitHub에서 보기\",\n    ctaInstallHomebrew: \"Homebrew로 설치\",\n    requirementsLine1: \"macOS 10.13+ 필요\",\n    requirementsLine2: \"무료 · 오픈 소스\",\n    scrollHint: \"스크롤해서 더 보기\",\n  },\n  sectionFeel: {\n    title: \"예측 가능한 스크롤. 조절 가능한 감각.\",\n    lead:\n      \"Mos는 원시 휠 델타를 예측 가능한 움직임으로 바꿉니다. 앱 전반에 같은 느낌을 유지하고, 필요할 때만 앱별로 덮어쓰세요.\",\n    cards: {\n      curves: {\n        kicker: \"곡선과 가속\",\n        title: \"느낌을 다듬기.\",\n        body:\n          \"부드러움은 곡선입니다. Step, Gain, Duration을 조절하고, 원시 휠 델타가 어떻게 제어된 움직임으로 바뀌는지 확인하세요.\",\n      },\n      axes: {\n        kicker: \"독립 축\",\n        title: \"X와 Y를 분리.\",\n        body:\n          \"세로/가로를 서로 다른 축으로 취급합니다. 스무딩과 반전은 축별로 ON/OFF 할 수 있어요.\",\n        smooth: \"스무딩\",\n        reverse: \"반전\",\n        on: \"ON\",\n        off: \"OFF\",\n      },\n      perApp: {\n        kicker: \"앱별 프로필\",\n        title: \"앱마다 다른 감각.\",\n        body:\n          \"각 앱은 기본값을 그대로 쓰거나, 스크롤/버튼 규칙을 앱별로 덮어쓸 수 있습니다. 필요한 곳은 정확하게, 나머지는 부드럽게.\",\n      },\n      buttons: {\n        kicker: \"버튼과 단축키\",\n        title: \"바인딩, 기록, 반복.\",\n        body:\n          \"마우스나 키보드 이벤트를 기록해 시스템 단축키에 바인딩합니다. 라이브 모니터로 기기가 보내는 값을 확인할 수도 있어요.\",\n        quickBind: \"빠른 바인드\",\n        rows: {\n          button4: \"버튼 4\",\n          button5: \"버튼 5\",\n          wheelClick: \"휠 클릭\",\n          missionControl: \"Mission Control\",\n          nextSpace: \"다음 공간\",\n          appSwitcher: \"앱 전환기\",\n        },\n      },\n    },\n  },\n  download: {\n    title: \"Mos 다운로드. 스크롤을 내 취향으로.\",\n    body:\n      \"몇 초 만에 설치하고, 필요할 때만 조절하세요. 자주 쓰는 앱에서도 같은 스크롤 감각을 유지할 수 있습니다.\",\n    ctaDownload: \"다운로드\",\n    releaseNotes: \"릴리스 노트\",\n    docs: \"문서\",\n  },\n  homebrew: {\n    title: \"Homebrew\",\n    copy: \"복사\",\n    copied: \"복사됨\",\n    tip: \"팁: beta를 사용 중이라면 cask가 {cask}일 수 있어요.\",\n  },\n  footer: {\n    latestRelease: \"최신 릴리스\",\n    latestVersion: \"최신 {version}\",\n    requiresMacos: \"macOS 10.13+ 필요\",\n    github: \"GitHub\",\n    wiki: \"Wiki\",\n    releases: \"Releases\",\n  },\n  easing: {\n    graphAria: \"스크롤 커브 그래프\",\n    step: {\n      label: \"Step\",\n      aria: \"Step\",\n      help: \"휠 델타의 양자화 하한.\",\n    },\n    gain: {\n      label: \"Gain\",\n      aria: \"Gain\",\n      help: \"틱당 이동 거리와 곡선이 올라가는 속도를 결정합니다.\",\n    },\n    duration: {\n      label: \"Duration\",\n      aria: \"Duration\",\n      help: \"스무딩 시간 상수(클수록 꼬리가 길어짐).\",\n    },\n    footer: \"ScrollCore curve\",\n  },\n};\n"
  },
  {
    "path": "website/app/i18n/pl.ts",
    "content": "import type { Translations } from \"./context\";\n\nexport const pl: Translations = {\n  languageSelector: {\n    title: \"Wybierz język\",\n  },\n  a11y: {\n    skipToContent: \"Przejdź do treści\",\n    closeDialog: \"Zamknij okno dialogowe\",\n    githubAria: \"Mos na GitHubie\",\n    appIconAlt: \"Ikona aplikacji Mos\",\n    scrollCurveGraph: \"Wykres krzywej przewijania\",\n  },\n  nav: {\n    githubTitle: \"GitHub\",\n  },\n  hero: {\n    badgeLine1: \"Płynne przewijanie kółkiem myszy w macOS\",\n    badgeLine2: \"profile per aplikacja · niezależne osie · przyciski i skróty\",\n    titleLine1: \"Zamień mysz\",\n    titleLine2Before: \"w \",\n    titleLine2Highlight: \"flow\",\n    titleLine2After: \".\",\n    lead:\n      \"Mos to darmowe, otwartoźródłowe narzędzie dla macOS. Sprawia, że przewijanie kółkiem jest bliższe wrażeniu z trackpada, bez odbierania kontroli. Dostosuj krzywe, rozdziel osie i nadpisuj zachowanie dla poszczególnych aplikacji.\",\n    ctaDownload: \"Pobierz Mos\",\n    ctaViewGitHub: \"Zobacz na GitHubie\",\n    ctaInstallHomebrew: \"Zainstaluj przez Homebrew\",\n    requirementsLine1: \"Wymaga macOS 10.13+\",\n    requirementsLine2: \"Darmowe · Open source\",\n    scrollHint: \"Przewiń, aby zobaczyć więcej\",\n  },\n  sectionFeel: {\n    title: \"Przewidywalne przewijanie. Odczucie do ustawienia.\",\n    lead:\n      \"Mos zamienia surowe delty kółka w przewidywalny ruch. Zachowaj to samo odczucie w aplikacjach i nadpisuj je tylko tam, gdzie trzeba.\",\n    cards: {\n      curves: {\n        kicker: \"Krzywe i przyspieszenie\",\n        title: \"Ułóż odczucie.\",\n        body:\n          \"Płynność to krzywa. Zmieniaj Step, Gain i Duration i zobacz, jak surowe delty stają się kontrolowanym ruchem.\",\n      },\n      axes: {\n        kicker: \"Niezależne osie\",\n        title: \"Rozdziel X i Y.\",\n        body:\n          \"Pion i poziom to niezależne osie. Wygładzanie i odwrócenie możesz włączać osobno dla każdej z nich.\",\n        smooth: \"Wygładzanie\",\n        reverse: \"Odwróć\",\n        on: \"Wł.\",\n        off: \"Wył.\",\n      },\n      perApp: {\n        kicker: \"Profile per aplikacja\",\n        title: \"Inne aplikacje, inne odczucie.\",\n        body:\n          \"Każda aplikacja może dziedziczyć ustawienia domyślne albo nadpisywać reguły przewijania i przycisków. Precyzja tam, gdzie trzeba, płynność wszędzie indziej.\",\n      },\n      buttons: {\n        kicker: \"Przyciski i skróty\",\n        title: \"Przypnij, nagraj, powtórz.\",\n        body:\n          \"Nagraj zdarzenia myszy lub klawiatury i przypisz je do skrótów systemowych. W monitorze na żywo sprawdzisz, co wysyłają urządzenia.\",\n        quickBind: \"Szybkie przypisanie\",\n        rows: {\n          button4: \"Przycisk 4\",\n          button5: \"Przycisk 5\",\n          wheelClick: \"Klik kółka\",\n          missionControl: \"Mission Control\",\n          nextSpace: \"Następna przestrzeń\",\n          appSwitcher: \"Przełącznik aplikacji\",\n        },\n      },\n    },\n  },\n  download: {\n    title: \"Pobierz Mos. Ustaw przewijanie pod siebie.\",\n    body:\n      \"Instalacja w kilka sekund. Dopasuj, kiedy potrzebujesz, i utrzymaj spójne przewijanie w aplikacjach, z których korzystasz na co dzień.\",\n    ctaDownload: \"Pobierz\",\n    releaseNotes: \"Informacje o wydaniu\",\n    docs: \"Dokumentacja\",\n  },\n  homebrew: {\n    title: \"Homebrew\",\n    copy: \"Kopiuj\",\n    copied: \"Skopiowano\",\n    tip: \"Wskazówka: jeśli używasz bety, twój cask może nazywać się {cask}.\",\n  },\n  footer: {\n    latestRelease: \"Najnowsze wydanie\",\n    latestVersion: \"Najnowsza {version}\",\n    requiresMacos: \"Wymaga macOS 10.13+\",\n    github: \"GitHub\",\n    wiki: \"Wiki\",\n    releases: \"Releases\",\n  },\n  easing: {\n    graphAria: \"Wykres krzywej przewijania\",\n    step: {\n      label: \"Krok\",\n      aria: \"Krok\",\n      help: \"Dolny próg kwantyzacji dla delt kółka.\",\n    },\n    gain: {\n      label: \"Wzmocnienie\",\n      aria: \"Wzmocnienie\",\n      help: \"Skaluje dystans na тик i szybkość narastania krzywej.\",\n    },\n    duration: {\n      label: \"Czas\",\n      aria: \"Czas\",\n      help: \"Stała czasowa wygładzania (większa = dłuższy ogon).\",\n    },\n    footer: \"Krzywa ScrollCore\",\n  },\n};\n"
  },
  {
    "path": "website/app/i18n/ru.ts",
    "content": "import type { Translations } from \"./context\";\n\nexport const ru: Translations = {\n  languageSelector: {\n    title: \"Выбор языка\",\n  },\n  a11y: {\n    skipToContent: \"Перейти к содержимому\",\n    closeDialog: \"Закрыть диалог\",\n    githubAria: \"Mos на GitHub\",\n    appIconAlt: \"Иконка Mos\",\n    scrollCurveGraph: \"График кривой прокрутки\",\n  },\n  nav: {\n    githubTitle: \"GitHub\",\n  },\n  hero: {\n    badgeLine1: \"Плавная прокрутка колесом мыши в macOS\",\n    badgeLine2: \"профили по приложениям · независимые оси · кнопки и шорткаты\",\n    titleLine1: \"Превратите мышь\",\n    titleLine2Before: \"в \",\n    titleLine2Highlight: \"flow\",\n    titleLine2After: \".\",\n    lead:\n      \"Mos — бесплатная утилита с открытым кодом для macOS. Она делает прокрутку колесом ближе по ощущениям к трекпаду, не забирая контроль. Настраивайте кривые, разделяйте оси и переопределяйте поведение для каждого приложения.\",\n    ctaDownload: \"Скачать Mos\",\n    ctaViewGitHub: \"Открыть на GitHub\",\n    ctaInstallHomebrew: \"Установить через Homebrew\",\n    requirementsLine1: \"Нужна macOS 10.13+\",\n    requirementsLine2: \"Бесплатно · Открытый код\",\n    scrollHint: \"Прокрутите вниз\",\n  },\n  sectionFeel: {\n    title: \"Предсказуемая прокрутка. Настраиваемое ощущение.\",\n    lead:\n      \"Mos превращает сырые дельты колеса в предсказуемое движение. Сохраняйте одинаковое ощущение в разных приложениях и включайте исключения там, где нужно.\",\n    cards: {\n      curves: {\n        kicker: \"Кривые и ускорение\",\n        title: \"Сформируйте ощущение.\",\n        body:\n          \"Плавность — это кривая. Меняйте шаг, усиление и длительность и смотрите, как сырые дельты превращаются в контролируемое движение.\",\n      },\n      axes: {\n        kicker: \"Независимые оси\",\n        title: \"Разделите X и Y.\",\n        body:\n          \"Вертикальная и горизонтальная прокрутка идут как отдельные оси. Плавность и реверс можно включать и выключать независимо для каждой.\",\n        smooth: \"Плавность\",\n        reverse: \"Реверс\",\n        on: \"Вкл\",\n        off: \"Выкл\",\n      },\n      perApp: {\n        kicker: \"Профили по приложениям\",\n        title: \"Разным приложениям — разное ощущение.\",\n        body:\n          \"Пусть приложение наследует настройки по умолчанию или переопределяйте правила прокрутки и кнопок. Точность там, где нужно, и плавность везде.\",\n      },\n      buttons: {\n        kicker: \"Кнопки и шорткаты\",\n        title: \"Привязать, записать, повторить.\",\n        body:\n          \"Записывайте события мыши или клавиатуры и привязывайте их к системным сочетаниям. В живом мониторе видно, что отправляют ваши устройства.\",\n        quickBind: \"Быстрая привязка\",\n        rows: {\n          button4: \"Кнопка 4\",\n          button5: \"Кнопка 5\",\n          wheelClick: \"Нажатие колеса\",\n          missionControl: \"Mission Control\",\n          nextSpace: \"Следующее пространство\",\n          appSwitcher: \"Переключатель приложений\",\n        },\n      },\n    },\n  },\n  download: {\n    title: \"Скачать Mos. Настройте прокрутку под себя.\",\n    body:\n      \"Устанавливается за секунды. Настраивайте, когда понадобится, и держите одинаковое поведение прокрутки в тех приложениях, где вы живете.\",\n    ctaDownload: \"Скачать\",\n    releaseNotes: \"Заметки к релизу\",\n    docs: \"Документация\",\n  },\n  homebrew: {\n    title: \"Homebrew\",\n    copy: \"Копировать\",\n    copied: \"Скопировано\",\n    tip: \"Подсказка: если вы на beta, ваш cask может быть {cask}.\",\n  },\n  footer: {\n    latestRelease: \"Последний релиз\",\n    latestVersion: \"Последний {version}\",\n    requiresMacos: \"Нужна macOS 10.13+\",\n    github: \"GitHub\",\n    wiki: \"Wiki\",\n    releases: \"Releases\",\n  },\n  easing: {\n    graphAria: \"График кривой прокрутки\",\n    step: {\n      label: \"Шаг\",\n      aria: \"Шаг\",\n      help: \"Нижний предел квантования для дельт колеса.\",\n    },\n    gain: {\n      label: \"Усиление\",\n      aria: \"Усиление\",\n      help: \"Масштабирует расстояние за тик и скорость разгона кривой.\",\n    },\n    duration: {\n      label: \"Длительность\",\n      aria: \"Длительность\",\n      help: \"Константа сглаживания (выше — длиннее хвост).\",\n    },\n    footer: \"Кривая ScrollCore\",\n  },\n};\n"
  },
  {
    "path": "website/app/i18n/tr.ts",
    "content": "import type { Translations } from \"./context\";\n\nexport const tr: Translations = {\n  languageSelector: {\n    title: \"Dil seç\",\n  },\n  a11y: {\n    skipToContent: \"İçeriğe atla\",\n    closeDialog: \"İletişim penceresini kapat\",\n    githubAria: \"GitHub'da Mos\",\n    appIconAlt: \"Mos uygulama simgesi\",\n    scrollCurveGraph: \"Kaydırma eğrisi grafiği\",\n  },\n  nav: {\n    githubTitle: \"GitHub\",\n  },\n  hero: {\n    badgeLine1: \"macOS'ta mouse tekeri için akıcı kaydırma\",\n    badgeLine2: \"uygulama profilleri · bağımsız eksenler · tuşlar ve kısayollar\",\n    titleLine1: \"Fareyi\",\n    titleLine2Before: \"\",\n    titleLine2Highlight: \"flow\",\n    titleLine2After: \"'a çevir.\",\n    lead:\n      \"Mos, macOS için ücretsiz ve açık kaynak bir araç. Mouse tekeri kaydırmasını trackpad'e daha yakın hissettirir, kontrolü elinden almaz. Eğrileri ayarla, X/Y eksenlerini ayır ve uygulama bazında davranışı geçersiz kıl.\",\n    ctaDownload: \"Mos'u indir\",\n    ctaViewGitHub: \"GitHub'da gör\",\n    ctaInstallHomebrew: \"Homebrew ile yükle\",\n    requirementsLine1: \"macOS 10.13+ gerekir\",\n    requirementsLine2: \"Ücretsiz · Açık kaynak\",\n    scrollHint: \"Keşfetmek için kaydır\",\n  },\n  sectionFeel: {\n    title: \"Tahmin edilebilir kaydırma. Ayarlanabilir his.\",\n    lead:\n      \"Mos, ham teker delta değerlerini öngörülebilir harekete çevirir. Uygulamalar arasında aynı hissi koru, gerektiğinde uygulama bazında geçersiz kıl.\",\n    cards: {\n      curves: {\n        kicker: \"Eğriler ve hızlanma\",\n        title: \"Hissi şekillendir.\",\n        body:\n          \"Akıcılık bir eğridir. Step, Gain ve Duration'ı ayarla; ham delta değerlerinin nasıl kontrollü harekete dönüştüğünü gör.\",\n      },\n      axes: {\n        kicker: \"Bağımsız eksenler\",\n        title: \"X ve Y'yi ayır.\",\n        body:\n          \"Dikey ve yatay kaydırmayı ayrı eksenler olarak düşün. Akıcılığı ve ters çevirmeyi her eksen için ayrı ayrı aç/kapat.\",\n        smooth: \"Akıcılık\",\n        reverse: \"Ters çevir\",\n        on: \"Açık\",\n        off: \"Kapalı\",\n      },\n      perApp: {\n        kicker: \"Uygulama profilleri\",\n        title: \"Farklı uygulamalar, farklı his.\",\n        body:\n          \"Her uygulama varsayılanları devralabilir ya da kaydırma ve tuş kurallarını geçersiz kılabilir. Gerekli yerde hassas, diğer her yerde akıcı.\",\n      },\n      buttons: {\n        kicker: \"Tuşlar ve kısayollar\",\n        title: \"Bağla, kaydet, tekrar et.\",\n        body:\n          \"Mouse veya klavye olaylarını kaydet ve sistem kısayollarına bağla. Canlı monitörle cihazlarının ne gönderdiğini görebilirsin.\",\n        quickBind: \"Hızlı bağla\",\n        rows: {\n          button4: \"Tuş 4\",\n          button5: \"Tuş 5\",\n          wheelClick: \"Teker tıklaması\",\n          missionControl: \"Mission Control\",\n          nextSpace: \"Sonraki alan\",\n          appSwitcher: \"Uygulama değiştirici\",\n        },\n      },\n    },\n  },\n  download: {\n    title: \"Mos'u indir. Kaydırmanı kendine göre ayarla.\",\n    body:\n      \"Saniyeler içinde kur. İhtiyacın olduğunda ayarla ve kullandığın uygulamalarda kaydırma davranışını tutarlı tut.\",\n    ctaDownload: \"İndir\",\n    releaseNotes: \"Sürüm notları\",\n    docs: \"Dokümanlar\",\n  },\n  homebrew: {\n    title: \"Homebrew\",\n    copy: \"Kopyala\",\n    copied: \"Kopyalandı\",\n    tip: \"İpucu: beta kullanıyorsan cask'in {cask} olabilir.\",\n  },\n  footer: {\n    latestRelease: \"En son sürüm\",\n    latestVersion: \"En son {version}\",\n    requiresMacos: \"macOS 10.13+ gerekir\",\n    github: \"GitHub\",\n    wiki: \"Wiki\",\n    releases: \"Releases\",\n  },\n  easing: {\n    graphAria: \"Kaydırma eğrisi grafiği\",\n    step: {\n      label: \"Adım\",\n      aria: \"Adım\",\n      help: \"Teker delta değerleri için kuantizasyon eşiği.\",\n    },\n    gain: {\n      label: \"Kazanç\",\n      aria: \"Kazanç\",\n      help: \"Tick başına mesafeyi ve eğrinin ne kadar hızlı yükseldiğini ölçekler.\",\n    },\n    duration: {\n      label: \"Süre\",\n      aria: \"Süre\",\n      help: \"Yumuşatma zaman sabiti (daha yüksek = daha uzun kuyruk).\",\n    },\n    footer: \"ScrollCore eğrisi\",\n  },\n};\n"
  },
  {
    "path": "website/app/i18n/uk.ts",
    "content": "import type { Translations } from \"./context\";\n\nexport const uk: Translations = {\n  languageSelector: {\n    title: \"Вибір мови\",\n  },\n  a11y: {\n    skipToContent: \"Перейти до вмісту\",\n    closeDialog: \"Закрити діалог\",\n    githubAria: \"Mos на GitHub\",\n    appIconAlt: \"Іконка Mos\",\n    scrollCurveGraph: \"Графік кривої прокручування\",\n  },\n  nav: {\n    githubTitle: \"GitHub\",\n  },\n  hero: {\n    badgeLine1: \"Плавне прокручування коліщатком миші в macOS\",\n    badgeLine2: \"профілі для програм · незалежні осі · кнопки й скорочення\",\n    titleLine1: \"Перетвори мишу\",\n    titleLine2Before: \"на \",\n    titleLine2Highlight: \"flow\",\n    titleLine2After: \".\",\n    lead:\n      \"Mos — безкоштовна утиліта з відкритим кодом для macOS. Вона робить прокручування коліщатком ближчим до відчуття трекпада, не забираючи контроль. Налаштовуй криві, розділяй осі та перевизначай поведінку для кожного застосунку.\",\n    ctaDownload: \"Завантажити Mos\",\n    ctaViewGitHub: \"Переглянути на GitHub\",\n    ctaInstallHomebrew: \"Встановити через Homebrew\",\n    requirementsLine1: \"Потрібна macOS 10.13+\",\n    requirementsLine2: \"Безкоштовно · Відкритий код\",\n    scrollHint: \"Прокрути вниз\",\n  },\n  sectionFeel: {\n    title: \"Передбачуване прокручування. Налаштовуване відчуття.\",\n    lead:\n      \"Mos перетворює сирі дельти коліщатка на передбачуваний рух. Зберігай однакове відчуття між застосунками і роби override там, де потрібно.\",\n    cards: {\n      curves: {\n        kicker: \"Криві й прискорення\",\n        title: \"Сформуй відчуття.\",\n        body:\n          \"Плавність — це крива. Налаштуй step, gain і duration та подивись, як сирі дельти стають керованим рухом.\",\n      },\n      axes: {\n        kicker: \"Незалежні осі\",\n        title: \"Розділи X і Y.\",\n        body:\n          \"Вертикальне й горизонтальне прокручування — окремі осі. Плавність і реверс можна вмикати та вимикати для кожної осі незалежно.\",\n        smooth: \"Плавність\",\n        reverse: \"Реверс\",\n        on: \"Увімк.\",\n        off: \"Вимк.\",\n      },\n      perApp: {\n        kicker: \"Профілі для програм\",\n        title: \"Різні застосунки, різне відчуття.\",\n        body:\n          \"Нехай кожен застосунок успадковує налаштування за замовчуванням або перевизначуй правила прокручування й кнопок. Точність там, де треба, плавність всюди інде.\",\n      },\n      buttons: {\n        kicker: \"Кнопки й скорочення\",\n        title: \"Прив’яжи, запиши, повтори.\",\n        body:\n          \"Записуй події миші або клавіатури та прив’язуй їх до системних скорочень. У живому моніторі видно, що надсилають твої пристрої.\",\n        quickBind: \"Швидка прив’язка\",\n        rows: {\n          button4: \"Кнопка 4\",\n          button5: \"Кнопка 5\",\n          wheelClick: \"Натиск коліщатка\",\n          missionControl: \"Mission Control\",\n          nextSpace: \"Наступний простір\",\n          appSwitcher: \"Перемикач програм\",\n        },\n      },\n    },\n  },\n  download: {\n    title: \"Завантаж Mos. Налаштуй прокручування під себе.\",\n    body:\n      \"Встановлюється за секунди. Налаштовуй, коли потрібно, і тримай однакову поведінку прокручування у своїх застосунках.\",\n    ctaDownload: \"Завантажити\",\n    releaseNotes: \"Нотатки до релізу\",\n    docs: \"Документація\",\n  },\n  homebrew: {\n    title: \"Homebrew\",\n    copy: \"Копіювати\",\n    copied: \"Скопійовано\",\n    tip: \"Порада: якщо ти на beta, твій cask може бути {cask}.\",\n  },\n  footer: {\n    latestRelease: \"Останній реліз\",\n    latestVersion: \"Остання {version}\",\n    requiresMacos: \"Потрібна macOS 10.13+\",\n    github: \"GitHub\",\n    wiki: \"Wiki\",\n    releases: \"Releases\",\n  },\n  easing: {\n    graphAria: \"Графік кривої прокручування\",\n    step: {\n      label: \"Крок\",\n      aria: \"Крок\",\n      help: \"Нижній поріг квантування для дельт коліщатка.\",\n    },\n    gain: {\n      label: \"Підсилення\",\n      aria: \"Підсилення\",\n      help: \"Масштабує відстань за тик і швидкість наростання кривої.\",\n    },\n    duration: {\n      label: \"Тривалість\",\n      aria: \"Тривалість\",\n      help: \"Часова константа згладжування (вище = довший хвіст).\",\n    },\n    footer: \"Крива ScrollCore\",\n  },\n};\n"
  },
  {
    "path": "website/app/i18n/zh-Hant.ts",
    "content": "import type { Translations } from \"./context\";\n\nexport const zhHant: Translations = {\n  languageSelector: {\n    title: \"選擇語言\",\n  },\n  a11y: {\n    skipToContent: \"跳到內容\",\n    closeDialog: \"關閉對話框\",\n    githubAria: \"Mos 的 GitHub\",\n    appIconAlt: \"Mos 應用程式圖示\",\n    scrollCurveGraph: \"捲動曲線圖\",\n  },\n  nav: {\n    githubTitle: \"GitHub\",\n  },\n  hero: {\n    badgeLine1: \"讓 macOS 上的滑鼠滾輪捲動更順\",\n    badgeLine2: \"按 App 設定 · X/Y 軸獨立 · 按鍵與快捷鍵\",\n    titleLine1: \"讓滑鼠\",\n    titleLine2Before: \"變得\",\n    titleLine2Highlight: \"順滑\",\n    titleLine2After: \"。\",\n    lead:\n      \"Mos 是一個免費、開源的 macOS 小工具，讓滾輪捲動更接近觸控板手感，同時不影響你的控制。你可以調曲線、分離 X/Y，也能針對不同 App 覆寫行為。\",\n    ctaDownload: \"下載 Mos\",\n    ctaViewGitHub: \"在 GitHub 查看\",\n    ctaInstallHomebrew: \"透過 Homebrew 安裝\",\n    requirementsLine1: \"需要 macOS 10.13+\",\n    requirementsLine2: \"免費 · 開源\",\n    scrollHint: \"往下滑看看\",\n  },\n  sectionFeel: {\n    title: \"捲動更可控。手感可調。\",\n    lead:\n      \"Mos 會把原始滾輪增量變成更可預測的動作。不同 App 也能維持同樣的手感，需要時再按應用覆寫。\",\n    cards: {\n      curves: {\n        kicker: \"曲線與加速\",\n        title: \"調出你喜歡的手感。\",\n        body:\n          \"順滑其實是一條曲線。調整步進、增益與時長，看看原始滾輪增量如何變成更可控的捲動。\",\n      },\n      axes: {\n        kicker: \"軸向獨立\",\n        title: \"X 與 Y 分開調。\",\n        body:\n          \"把垂直/水平當成兩條獨立的軸：平滑與反向都可以按軸單獨開關。\",\n        smooth: \"平滑\",\n        reverse: \"反向\",\n        on: \"開\",\n        off: \"關\",\n      },\n      perApp: {\n        kicker: \"按 App 設定\",\n        title: \"不同 App，不同規則。\",\n        body:\n          \"每個 App 可以繼承預設值，也可以單獨覆寫捲動與按鍵規則。需要精準就精準，其餘保持順滑。\",\n      },\n      buttons: {\n        kicker: \"按鍵與快捷鍵\",\n        title: \"綁定、記錄、重複。\",\n        body:\n          \"把滑鼠或鍵盤事件錄下來，綁定到系統快捷鍵。也能用即時監視器看看裝置到底送了什麼。\",\n        quickBind: \"快速綁定\",\n        rows: {\n          button4: \"按鍵 4\",\n          button5: \"按鍵 5\",\n          wheelClick: \"滾輪按下\",\n          missionControl: \"控制中心\",\n          nextSpace: \"下一個空間\",\n          appSwitcher: \"App 切換器\",\n        },\n      },\n    },\n  },\n  download: {\n    title: \"下載 Mos。按你的習慣調。\",\n    body: \"幾秒就能裝好，需要時再慢慢調參數，讓常用 App 裡的捲動手感保持一致。\",\n    ctaDownload: \"下載\",\n    releaseNotes: \"更新紀錄\",\n    docs: \"文件\",\n  },\n  homebrew: {\n    title: \"Homebrew\",\n    copy: \"複製\",\n    copied: \"已複製\",\n    tip: \"提示：如果你在用 beta 版，cask 可能是 {cask}。\",\n  },\n  footer: {\n    latestRelease: \"最新發佈\",\n    latestVersion: \"最新 {version}\",\n    requiresMacos: \"需要 macOS 10.13+\",\n    github: \"GitHub\",\n    wiki: \"Wiki\",\n    releases: \"Releases\",\n  },\n  easing: {\n    graphAria: \"捲動曲線圖\",\n    step: {\n      label: \"步進\",\n      aria: \"步進\",\n      help: \"滾輪增量的量化下限。\",\n    },\n    gain: {\n      label: \"增益\",\n      aria: \"增益\",\n      help: \"決定每次捲動的距離，以及曲線爬升的速度。\",\n    },\n    duration: {\n      label: \"時長\",\n      aria: \"時長\",\n      help: \"平滑時間常數（越大尾巴越長）。\",\n    },\n    footer: \"ScrollCore 曲線\",\n  },\n};\n"
  },
  {
    "path": "website/app/i18n/zh.ts",
    "content": "import type { Translations } from \"./context\";\n\nexport const zh: Translations = {\n  languageSelector: {\n    title: \"选择语言\",\n  },\n  a11y: {\n    skipToContent: \"跳到正文\",\n    closeDialog: \"关闭对话框\",\n    githubAria: \"Mos 的 GitHub\",\n    appIconAlt: \"Mos 应用图标\",\n    scrollCurveGraph: \"滚动曲线图\",\n  },\n  nav: {\n    githubTitle: \"GitHub\",\n  },\n  hero: {\n    badgeLine1: \"让 macOS 上的鼠标滚轮滚动更顺滑\",\n    badgeLine2: \"按应用配置 · 横纵轴独立 · 按键与快捷键\",\n    titleLine1: \"让鼠标\",\n    titleLine2Before: \"变得\",\n    titleLine2Highlight: \"顺滑\",\n    titleLine2After: \"。\",\n    lead:\n      \"Mos 是一个免费的开源 macOS 小工具，让滚轮滚动更接近触控板的手感，同时不影响你的控制。你可以调曲线、分离横纵轴，也可以按 App 覆盖行为。\",\n    ctaDownload: \"下载 Mos\",\n    ctaViewGitHub: \"在 GitHub 查看\",\n    ctaInstallHomebrew: \"通过 Homebrew 安装\",\n    requirementsLine1: \"需要 macOS 10.13+\",\n    requirementsLine2: \"免费 · 开源\",\n    scrollHint: \"向下滚动了解更多\",\n  },\n  sectionFeel: {\n    title: \"滚动更可控。手感可调。\",\n    lead:\n      \"Mos 会把原始滚轮增量变成更可预测的运动。不同 App 也能保持同样的手感，需要时再按应用覆盖。\",\n    cards: {\n      curves: {\n        kicker: \"曲线与加速\",\n        title: \"调出你喜欢的手感。\",\n        body:\n          \"顺滑其实是一条曲线。调整步进、增益和时长，看看原始滚轮增量如何变成更可控的滚动。\",\n      },\n      axes: {\n        kicker: \"轴向独立\",\n        title: \"横纵轴分开调。\",\n        body:\n          \"把垂直/水平当成两条独立的轴：平滑与反向都可以按轴单独开关。\",\n        smooth: \"平滑\",\n        reverse: \"反向\",\n        on: \"开\",\n        off: \"关\",\n      },\n      perApp: {\n        kicker: \"按应用配置\",\n        title: \"不同 App，不同规则。\",\n        body:\n          \"每个 App 可以继承默认值，也可以单独覆盖滚动和按键规则。需要精准就精准，其他地方保持顺滑。\",\n      },\n      buttons: {\n        kicker: \"按键与快捷键\",\n        title: \"绑定、记录、重复。\",\n        body:\n          \"把鼠标或键盘事件录下来，绑定到系统快捷键。也可以用实时监视器看看设备到底发了什么。\",\n        quickBind: \"快速绑定\",\n        rows: {\n          button4: \"按键 4\",\n          button5: \"按键 5\",\n          wheelClick: \"滚轮按下\",\n          missionControl: \"调度中心\",\n          nextSpace: \"下一个空间\",\n          appSwitcher: \"应用切换器\",\n        },\n      },\n    },\n  },\n  download: {\n    title: \"下载 Mos。按你的习惯调。\",\n    body: \"几秒就能装好，需要时再慢慢调参数，让常用 App 里滚动手感保持一致。\",\n    ctaDownload: \"下载\",\n    releaseNotes: \"更新日志\",\n    docs: \"文档\",\n  },\n  homebrew: {\n    title: \"Homebrew\",\n    copy: \"复制\",\n    copied: \"已复制\",\n    tip: \"提示：如果你在用 beta 版，cask 可能是 {cask}。\",\n  },\n  footer: {\n    latestRelease: \"最新发布\",\n    latestVersion: \"最新 {version}\",\n    requiresMacos: \"需要 macOS 10.13+\",\n    github: \"GitHub\",\n    wiki: \"Wiki\",\n    releases: \"Releases\",\n  },\n  easing: {\n    graphAria: \"滚动曲线图\",\n    step: {\n      label: \"步进\",\n      aria: \"步进\",\n      help: \"滚轮增量的量化下限。\",\n    },\n    gain: {\n      label: \"增益\",\n      aria: \"增益\",\n      help: \"决定每次滚动的距离，以及曲线爬升的速度。\",\n    },\n    duration: {\n      label: \"时长\",\n      aria: \"时长\",\n      help: \"平滑时间常数（越大尾巴越长）。\",\n    },\n    footer: \"ScrollCore 曲线\",\n  },\n};\n"
  },
  {
    "path": "website/app/layout.tsx",
    "content": "import Script from \"next/script\";\nimport { IBM_Plex_Mono, Space_Grotesk, Syne } from \"next/font/google\";\nimport \"./globals.css\";\nimport { SITE_DESCRIPTION, SITE_NAME, SITE_URL } from \"./site\";\nimport { Providers } from \"./providers\";\n\nconst fontDisplay = Syne({\n  variable: \"--font-display\",\n  subsets: [\"latin\"],\n  weight: [\"400\", \"600\", \"700\", \"800\"],\n});\n\nconst fontBody = Space_Grotesk({\n  variable: \"--font-body\",\n  subsets: [\"latin\"],\n  weight: [\"400\", \"500\", \"600\", \"700\"],\n});\n\nconst fontMono = IBM_Plex_Mono({\n  variable: \"--font-mono\",\n  subsets: [\"latin\"],\n  weight: [\"400\", \"500\", \"600\"],\n});\n\nconst GA_ID = \"G-9M7WPLB8BR\";\n\nexport default function RootLayout({\n  children,\n}: Readonly<{\n  children: React.ReactNode;\n}>) {\n  const siteOrigin = SITE_URL.toString().replace(/\\/$/, \"\");\n\n  const jsonLd = {\n    \"@context\": \"https://schema.org\",\n    \"@graph\": [\n      {\n        \"@type\": \"WebSite\",\n        \"@id\": `${siteOrigin}/#website`,\n        url: `${siteOrigin}/`,\n        name: SITE_NAME,\n        description: SITE_DESCRIPTION,\n        inLanguage: \"en\",\n      },\n      {\n        \"@type\": \"SoftwareApplication\",\n        \"@id\": `${siteOrigin}/#software`,\n        name: SITE_NAME,\n        url: `${siteOrigin}/`,\n        operatingSystem: \"macOS\",\n        applicationCategory: \"UtilitiesApplication\",\n        description: SITE_DESCRIPTION,\n        downloadUrl: \"https://github.com/Caldis/Mos/releases/latest\",\n        softwareHelp: \"https://github.com/Caldis/Mos/wiki\",\n        sameAs: [\"https://github.com/Caldis/Mos\"],\n        license: \"https://creativecommons.org/licenses/by-nc/4.0/\",\n        offers: {\n          \"@type\": \"Offer\",\n          price: \"0\",\n          priceCurrency: \"USD\",\n        },\n      },\n    ],\n  };\n\n  return (\n    <html lang=\"en\" className=\"js\">\n      <head>\n        <script\n          type=\"application/ld+json\"\n          // JSON-LD should be static, machine-readable, and identical for bots & users.\n          dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}\n        />\n        <noscript>\n          <style>{`html.js .reveal{opacity:1!important;transform:none!important;filter:none!important}`}</style>\n        </noscript>\n      </head>\n      <body className={`${fontDisplay.variable} ${fontBody.variable} ${fontMono.variable} antialiased`}>\n        <Providers>{children}</Providers>\n        <Script\n          src={`https://www.googletagmanager.com/gtag/js?id=${GA_ID}`}\n          strategy=\"afterInteractive\"\n        />\n        <Script id=\"ga4\" strategy=\"afterInteractive\">\n          {`\n            window.dataLayer = window.dataLayer || [];\n            function gtag(){dataLayer.push(arguments);}\n            gtag('js', new Date());\n            gtag('config', '${GA_ID}');\n          `}\n        </Script>\n      </body>\n    </html>\n  );\n}\n"
  },
  {
    "path": "website/app/page.tsx",
    "content": "import type { Metadata } from \"next\";\nimport HomeClient from \"./home-client\";\nimport { OG_IMAGE_PATH, SITE_DESCRIPTION, SITE_NAME, SITE_TITLE, SITE_URL } from \"./site\";\n\nexport const metadata: Metadata = {\n  metadataBase: SITE_URL,\n  title: SITE_TITLE,\n  description: SITE_DESCRIPTION,\n  alternates: {\n    canonical: \"/\",\n  },\n  openGraph: {\n    type: \"website\",\n    url: \"/\",\n    title: SITE_TITLE,\n    description: SITE_DESCRIPTION,\n    siteName: SITE_NAME,\n    images: [\n      {\n        url: OG_IMAGE_PATH,\n        width: 1200,\n        height: 630,\n        alt: SITE_TITLE,\n      },\n    ],\n  },\n  twitter: {\n    card: \"summary_large_image\",\n    title: SITE_TITLE,\n    description: SITE_DESCRIPTION,\n    images: [OG_IMAGE_PATH],\n  },\n};\n\nexport default function Page() {\n  return <HomeClient />;\n}\n\n"
  },
  {
    "path": "website/app/providers.tsx",
    "content": "\"use client\";\n\nimport { I18nProvider } from \"./i18n/context\";\n\nexport function Providers({ children }: { children: React.ReactNode }) {\n  return <I18nProvider>{children}</I18nProvider>;\n}\n\n"
  },
  {
    "path": "website/app/robots.ts",
    "content": "import type { MetadataRoute } from \"next\";\nimport { SITE_URL } from \"./site\";\n\nexport const dynamic = \"force-static\";\n\nexport default function robots(): MetadataRoute.Robots {\n  const siteOrigin = SITE_URL.toString().replace(/\\/$/, \"\");\n\n  return {\n    rules: [\n      {\n        userAgent: \"*\",\n        allow: \"/\",\n      },\n    ],\n    sitemap: `${siteOrigin}/sitemap.xml`,\n  };\n}\n"
  },
  {
    "path": "website/app/services/github.ts",
    "content": "import useSWR from \"swr\";\nimport { fetcher } from \"./utils\";\n\nexport function useGithubRelease() {\n  return useSWR(\"https://api.github.com/repos/Caldis/Mos/releases/latest\", fetcher, {\n    // 30分钟内的重复请求将使用缓存\n    dedupingInterval: 1000 * 60 * 30,\n    // 禁用焦点重新验证\n    revalidateOnFocus: false,\n    // 禁用重新连接时重新验证\n    revalidateOnReconnect: false,\n    // 禁用自动间隔重新验证\n    refreshInterval: 0\n  });\n}"
  },
  {
    "path": "website/app/services/utils.ts",
    "content": "export async function fetcher (...args: [RequestInfo | URL, RequestInit?]) {\n    const response = await fetch(...args)\n    const json = await response.json()\n    return json\n}"
  },
  {
    "path": "website/app/site.ts",
    "content": "const rawSiteUrl = process.env.NEXT_PUBLIC_SITE_URL ?? \"https://mos.caldis.me\";\n\n// Ensure a trailing slash so `new URL(\"/path\", SITE_URL)` behaves predictably.\nexport const SITE_URL = new URL(rawSiteUrl.endsWith(\"/\") ? rawSiteUrl : `${rawSiteUrl}/`);\n\nexport const SITE_NAME = \"Mos\";\n\nexport const SITE_TITLE = \"Mos | Turn the mouse into flow\";\n\nexport const SITE_DESCRIPTION =\n  \"Mos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\";\n\nexport const OG_IMAGE_PATH = \"/og.svg\";\n"
  },
  {
    "path": "website/app/sitemap.ts",
    "content": "import type { MetadataRoute } from \"next\";\nimport { SITE_URL } from \"./site\";\n\nexport const dynamic = \"force-static\";\n\nexport default function sitemap(): MetadataRoute.Sitemap {\n  const siteOrigin = SITE_URL.toString().replace(/\\/$/, \"\");\n\n  return [\n    {\n      url: `${siteOrigin}/`,\n      changeFrequency: \"monthly\",\n      priority: 1,\n    },\n  ];\n}\n"
  },
  {
    "path": "website/archive/v0/index.css",
    "content": "html, body {\n    height: 100%;\n}\nh1 {\n    font-size: 92px;\n}\nh3 {\n    font-size: 42px;\n}\nh4 {\n    font-size: 32px;\n}\nh6 {\n    font-size: 18px;\n}\ndiv {\n    box-sizing: border-box;\n}\nbutton {\n    font-size: 16px;\n    font-weight: 200;\n    box-sizing: border-box;\n    background-color: rgba(0,0,0,0);\n    border: 1px solid #666;\n    border-radius: 3px;\n    padding: 8px 16px;\n    cursor: pointer;\n    transition: all .3s;\n    outline:none;\n}\nbutton:hover {\n    color: white;\n    background-color: #999;\n}\nbutton:active {\n    color: white;\n    background-color: #666;\n}\n\n#mainContainer {\n    display: flex;\n    flex-direction: column;\n    width: 100%;\n    height: 100%;\n    background-color: #fff;\n}\n\n\n\n\n#header {\n    padding: 0 30px;\n    display: flex;\n    flex-direction: row;\n    width: 100%;\n    height: 100px;\n}\n.appTitle {\n    width: 100px;\n    text-align: center;\n    height: 100%;\n}\n.titleText {\n    line-height: 100px;\n}\n.space {\n    flex-grow: 1;\n}\n.language {\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n    width: 80px;\n    text-align: center;\n}\n\n\n\n\n#content {\n    flex-grow: 1;\n    display: flex;\n    justify-content: center;\n    align-items: center;\n}\n.contentWrapper {\n    text-align: center;\n}\n.introTitle {\n    padding-top: 30px;\n    width: 100%;\n    text-align: center;\n    margin-bottom: 30px;\n}\n.appLogo {\n    width: 256px;\n}\n.appName {\n    height: 50px;\n    margin-bottom: 4px\n}\n.logoHr {\n    display: inline-block;\n    width: 88px;\n    border-top: 2px solid #333;\n}\n.appDisc {\n    font-size: 12px;\n    color: #999;\n    margin: 15px auto 0;\n}\n.buttonContainer {\n    width: 100%;\n    text-align: center;\n}\n.infoContainer {\n    padding: 30px 0;\n    width: 100%;\n    text-align: center;\n}\n.info {\n    cursor: pointer;\n    user-select: none;\n    font-size: 12px;\n    color: #666;\n}\n.info:hover {\n    color: #999999;\n}\n.info:active {\n    color: #666;\n}\n.infoStar {\n    margin-top: 10px;\n    width: 100%;\n    height: 34px;\n}\n\n\n\n\n#footer {\n    width: 100%;\n    height: 50px;\n    padding: 0 30px;\n    display: flex;\n    flex-direction: row;\n}\n.contact {\n    display: inline-block;\n    width: 60px;\n    text-align: right;\n    color: #333;\n    height: 100%;\n    line-height: 50px;\n}\n.sp {\n    user-select: none;\n    display: inline-block;\n    width: 20px;\n    text-align: center;\n    color: #333;\n    height: 100%;\n    line-height: 50px;\n}\n.issue {\n    display: inline-block;\n    width: 50px;\n    text-align: left;\n    color: #333;\n    height: 100%;\n    line-height: 50px;\n}"
  },
  {
    "path": "website/archive/v0/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"baidu-site-verification\" content=\"K88H1W8gJu\"/>\n    <meta name=\"google-site-verification\" content=\"9u_s16Eo3xGlz_wsxroSpFrbpa_rLYFg9ghHHJlKcXM\" />\n    <title id=\"title\">MOS | A simple tool can offer the smooth scrolling and reverse the mouse scrolling direction on your Mac</title>\n    <!-- Reset def style -->\n    <style>body,h1,h2,h3,h4,h5,h6,hr,p,blockquote,dl,dt,dd,ul,ol,li,pre,form,fieldset,legend,button,input,textarea,th,td{margin:0;padding:0}body,button,input,select,textarea{font:12px/1.5 tahoma,arial,\\5b8b\\4f53,sans-serif}h1,h2,h3,h4,h5,h6{font-weight:200}address,cite,dfn,em,var{font-style:normal}code,kbd,pre,samp{font-family:courier new,courier,monospace}small{font-size:12px}ul,ol{list-style:none}a{text-decoration:none}a:hover{text-decoration:underline}legend{color:#000}fieldset,img{border:0}button,input,select,textarea{font-size:100%}table{border-collapse:collapse;border-spacing:0}*{font-family:\"Helvetica Neue\",\"Luxi Sans\",\"DejaVu Sans\",Tahoma,\"Hiragino Sans GB\",\"Microsoft Yahei\",sans-serif!important}</style>\n    <link rel=\"stylesheet\" href=\"index.css\" type=\"text/css\">\n</head>\n\n<body>\n\n<div id=\"mainContainer\">\n    \n    <div id=\"header\">\n        <!--<div class=\"space\"></div>-->\n        <!--<div class=\"language\">-->\n            <!--<a href=\"indexCN.html\">-->\n                <!--<button>中文</button>-->\n            <!--</a>-->\n        <!--</div>-->\n    </div>\n\n    <div id=\"content\">\n        <div class=\"contentWrapper\">\n            <div class=\"introTitle\">\n                <h6 id=\"intro\">Introducing</h6>\n                <p align=\"center\">\n                    <img class=\"appLogo\" src=\"Logo@512.png\">\n                </p>\n                <h3 class=\"appName\">MOS</h3>\n                <hr class=\"logoHr\"/>\n                <p class=\"appDisc\" id=\"disc\">A simple tool can offer the smooth scrolling and reverse the mouse scrolling direction on your Mac</p>\n            </div>\n            <div class=\"buttonContainer\">\n                <a href=\"https://github.com/Caldis/Mos/releases/download/1.7.0/Mos.Version.1.7.0.dmg\">\n                    <button class=\"downloadButton\" id=\"download\">\n                        Download Now\n                    </button>\n                </a>\n            </div>\n            <div class=\"infoContainer\">\n                <p class=\"infoDisc\">\n                    <span id=\"version\">Version 1.7.0, Require macOS acOS 10.11+. </span>\n                    <a class=\"info\" id=\"notes\" href=\"https://github.com/Caldis/Mos/releases\">Release Notes</a>\n                </p>\n                <span class=\"infoDisc\" id=\"star\">Or Star the source code from Github !</span>\n                <div class=\"infoStar\">\n                    <a class=\"github-button\" href=\"https://github.com/Caldis/Mos\" data-icon=\"octicon-star\" data-style=\"mega\" data-count-href=\"/Caldis/Mos/stargazers\" data-count-api=\"/repos/Caldis/Mos#stargazers_count\" data-count-aria-label=\"# stargazers on GitHub\" aria-label=\"Star Caldis/Mos on GitHub\">Star</a>\n                </div>\n            </div>\n        </div>\n    </div>\n\n    <div id=\"footer\">\n        <div class=\"space\"></div>\n        <a class=\"info contact\" id=\"contact\" href=\"Mailto:532607446@qq.com\">Contact</a>\n        <span class=\"sp\">|</span>\n        <a class=\"info issue\" id=\"issue\" href=\"https://github.com/Caldis/Mos/wiki\">Issue</a>\n    </div>\n\n</div>\n\n<script src=\"index.js\" type=\"text/javascript\"></script>\n<script src=\"http://buttons.github.io/buttons.js\"></script>\n<!-- Global site tag (gtag.js) - Google Analytics -->\n<script async src=\"https://www.googletagmanager.com/gtag/js?id=UA-85573109-2\"></script>\n<script>\n  window.dataLayer = window.dataLayer || [];\n  function gtag(){dataLayer.push(arguments);}\n  gtag('js', new Date());\n\n  gtag('config', 'UA-85573109-2');\n</script>\n</body>\n\n</html>"
  },
  {
    "path": "website/archive/v0/index.js",
    "content": "// 浏览器语系\r\nvar userAgentLanguage = window.navigator.language.toLowerCase()\r\n// 页面语系\r\nvar pageLanguage = document.querySelector(\"html\").lang\r\n// 国际化对照表\r\nvar i18nLanguageMappingList = {\r\n    title: {\r\n        zh: \"MOS | 一个用于在 Mac 上平滑你的鼠标滚动效果的小工具, 让你的鼠标滚轮丝滑如触控板\",\r\n        en: \"MOS | A simple tool can offer the smooth scrolling and reverse the mouse scrolling direction on your Mac\"\r\n    },\r\n    intro: {\r\n        zh: \"疯狂推荐\",\r\n        en: \"Introducing\"\r\n    },\r\n    disc: {\r\n        zh: \"一个用于在 Mac 上平滑你的鼠标滚动效果的小工具, 让你的鼠标滚轮丝爽如触控板。\",\r\n        en: \"A simple tool can offer the smooth scrolling and reverse the mouse scrolling direction on your Mac\"\r\n    },\r\n    download: {\r\n        zh: \"立马下载\",\r\n        en: \"Download Now\"\r\n    },\r\n    version: {\r\n        zh: \"版本 1.7.0, 支持 MacOS 10.11+ 系统。\",\r\n        en: \"Version 1.7.0, Require macOS MacOS 10.11+. \"\r\n    },\r\n    notes: {\r\n        zh: \"查看更新日志\",\r\n        en: \"Release Notes\"\r\n    },\r\n    star: {\r\n        zh: \"或者你可以来我们的 Github 赏个Star !\",\r\n        en: \"Or Star the source code from Github !\"\r\n    },\r\n    contact: {\r\n        zh: \"联系作者\",\r\n        en: \"contact\"\r\n    },\r\n    issue: {\r\n        zh: \"帮助支持\",\r\n        en: \"Wiki\"\r\n    }\r\n}\r\n// 国际化页面文字\r\nfunction translate(language) {\r\n    // 目标语系 (手动指定, 默认由浏览器提供)\r\n    var targetLanguage = language || userAgentLanguage\r\n    // 如果目标语系与当前页面提供语系不同, 则开始翻译\r\n    if (targetLanguage !== pageLanguage) {\r\n        // 遍历国际化对照表\r\n        Object.keys(i18nLanguageMappingList).forEach(function (translationKeyword) {\r\n            // 获取每个关键字的国际化映射表\r\n            var multiLanguages = i18nLanguageMappingList[translationKeyword]\r\n            // 匹配语言, 如果找到对应映射, 则替换标签内原字符\r\n            if (multiLanguages[targetLanguage]) {\r\n                // 精确匹配 (完全相同)\r\n                document.querySelector(\"#\"+translationKeyword).innerText = multiLanguages[targetLanguage]\r\n            } else if (multiLanguages[targetLanguage.substring(0, 2)]) {\r\n                // 模糊匹配 (仅匹配目标语系的前两个字符, 也就是国家代码)\r\n                document.querySelector(\"#\"+translationKeyword).innerText = multiLanguages[targetLanguage.substring(0, 2)]\r\n            }\r\n        })\r\n    }\r\n}\r\n// 开始翻译页面\r\ntranslate()"
  },
  {
    "path": "website/archive/v0/indexCN.html",
    "content": "<!DOCTYPE html>\n<html lang=\"zh\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <title>MOS | 一个用于在 Mac 上平滑你的鼠标滚动效果的小工具, 让你的鼠标滚轮丝滑如触控板</title>\n    <link rel=\"stylesheet\" href=\"reset.css\" type=\"text/css\">\n    <link rel=\"stylesheet\" href=\"index.css\" type=\"text/css\">\n</head>\n\n<body>\n\n<div id=\"mainContainer\">\n    <div id=\"header\">\n        <div class=\"space\"></div>\n        <div class=\"language\">\n            <a href=\"index.html\">\n                <button>English</button>\n            </a>\n        </div>\n    </div>\n    <div id=\"content\">\n        <div class=\"contentWrapper\">\n            <div class=\"introTitle\">\n                <h6>疯狂推荐</h6>\n                <p align=\"center\">\n                    <img class=\"appLogo\" src=\"./Logo@512.png\">\n                </p>\n                <h3 class=\"appName\">MOS</h3>\n                <hr class=\"logoHr\"/>\n                <p class=\"appDisc\">一个用于在 Mac 上平滑你的鼠标滚动效果的小工具, 让你的鼠标滚轮丝爽如触控板。</p>\n            </div>\n            <div class=\"buttonContainer\">\n                <a href=\"https://github.com/Caldis/Mos/releases/download/1.7.0/Mos.Version.1.7.0.dmg\">\n                    <button class=\"downloadButton\">\n                        立马下载\n                    </button>\n                </a>\n            </div>\n            <div class=\"infoContainer\">\n                <p class=\"infoDisc\">\n                    版本 1.7.0, 支持 MacOS 10.11+ 系统。<a class=\"info\" href=\"https://github.com/Caldis/Mos/releases\">查看更新日志</a>\n                </p>\n                <span class=\"infoDisc\">\n                    或者你可以来我们的 <a class=\"info\" href=\"https://github.com/Caldis/Mos\">Github</a> <b>赏个Star!</b>\n                </span>\n                <div class=\"infoStar\">\n                    <a class=\"github-button\" href=\"https://github.com/Caldis/Mos\" data-icon=\"octicon-star\" data-style=\"mega\" data-count-href=\"/Caldis/Mos/stargazers\" data-count-api=\"/repos/Caldis/Mos#stargazers_count\" data-count-aria-label=\"# stargazers on GitHub\" aria-label=\"Star Caldis/Mos on GitHub\">Star</a>\n                </div>\n            </div>\n        </div>\n    </div>\n    <div id=\"footer\">\n        <div class=\"space\"></div>\n        <a class=\"info contact\" href=\"Mailto:532607446@qq.com\">联系作者</a>\n        <span class=\"sp\">|</span>\n        <a class=\"info issue\" href=\"https://github.com/Caldis/Mos/issues\">提交问题</a>\n    </div>\n</div>\n\n<script src=\"index.js\" type=\"text/javascript\"></script>\n<script async defer src=\"https://buttons.github.io/buttons.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "website/archive/v0/reset.css",
    "content": "/*\nKISSY CSS Reset\n理念：1. reset 的目的不是清除浏览器的默认样式，这仅是部分工作。清除和重置是紧密不可分的。\n2. reset 的目的不是让默认样式在所有浏览器下一致，而是减少默认样式有可能带来的问题。\n3. reset 期望提供一套普适通用的基础样式。但没有银弹，推荐根据具体需求，裁剪和修改后再使用。\n特色：1. 适应中文；2. 基于最新主流浏览器。\n维护：玉伯<lifesinger@gmail.com>, 正淳<ragecarrier@gmail.com>\n */\n\n/** 清除内外边距 **/\nbody, h1, h2, h3, h4, h5, h6, hr, p, blockquote, /* structural elements 结构元素 */\ndl, dt, dd, ul, ol, li, /* list elements 列表元素 */\npre, /* text formatting elements 文本格式元素 */\nform, fieldset, legend, button, input, textarea, /* form elements 表单元素 */\nth, td /* table elements 表格元素 */ {\n    margin: 0;\n    padding: 0;\n}\n\n/** 设置默认字体 **/\nbody,\nbutton, input, select, textarea /* for ie */ {\n    font: 12px/1.5 tahoma, arial, \\5b8b\\4f53, sans-serif;\n}\nh1, h2, h3, h4, h5, h6 { font-weight: 200; }\naddress, cite, dfn, em, var { font-style: normal; } /* 将斜体扶正 */\ncode, kbd, pre, samp { font-family: courier new, courier, monospace; } /* 统一等宽字体 */\nsmall { font-size: 12px; } /* 小于 12px 的中文很难阅读，让 small 正常化 */\n\n/** 重置列表元素 **/\nul, ol { list-style: none; }\n\n/** 重置文本格式元素 **/\na { text-decoration: none; }\na:hover { text-decoration: underline; }\n\n\n/** 重置表单元素 **/\nlegend { color: #000; } /* for ie6 */\nfieldset, img { border: 0; } /* img 搭车：让链接里的 img 无边框 */\nbutton, input, select, textarea { font-size: 100%; } /* 使得表单元素在 ie 下能继承字体大小 */\n/* 注：optgroup 无法扶正 */\n\n/** 重置表格元素 **/\ntable { border-collapse: collapse; border-spacing: 0; }\n\n* {\n    font-family: \"Helvetica Neue\", \"Luxi Sans\", \"DejaVu Sans\", Tahoma, \"Hiragino Sans GB\", \"Microsoft Yahei\", sans-serif !important;\n}"
  },
  {
    "path": "website/archive/v1/assets/fonts/ubuntu/font.css",
    "content": "/* cyrillic-ext */\r\n@font-face {\r\n    font-family: 'Ubuntu';\r\n    font-style: normal;\r\n    font-weight: 400;\r\n    src: local('Ubuntu Regular'), local('Ubuntu-Regular'), url(https://fonts.gstatic.com/s/ubuntu/v11/4iCs6KVjbNBYlgoKcg72j00.woff2) format('woff2');\r\n    unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\r\n}\r\n/* cyrillic */\r\n@font-face {\r\n    font-family: 'Ubuntu';\r\n    font-style: normal;\r\n    font-weight: 400;\r\n    src: local('Ubuntu Regular'), local('Ubuntu-Regular'), url(./4iCs6KVjbNBYlgoKew72j00.woff2) format('woff2');\r\n    unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\r\n}\r\n/* greek-ext */\r\n@font-face {\r\n    font-family: 'Ubuntu';\r\n    font-style: normal;\r\n    font-weight: 400;\r\n    src: local('Ubuntu Regular'), local('Ubuntu-Regular'), url(./4iCs6KVjbNBYlgoKcw72j00.woff2) format('woff2');\r\n    unicode-range: U+1F00-1FFF;\r\n}\r\n/* greek */\r\n@font-face {\r\n    font-family: 'Ubuntu';\r\n    font-style: normal;\r\n    font-weight: 400;\r\n    src: local('Ubuntu Regular'), local('Ubuntu-Regular'), url(./4iCs6KVjbNBYlgoKfA72j00.woff2) format('woff2');\r\n    unicode-range: U+0370-03FF;\r\n}\r\n/* latin-ext */\r\n@font-face {\r\n    font-family: 'Ubuntu';\r\n    font-style: normal;\r\n    font-weight: 400;\r\n    src: local('Ubuntu Regular'), local('Ubuntu-Regular'), url(./4iCs6KVjbNBYlgoKcQ72j00.woff2) format('woff2');\r\n    unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\r\n}\r\n/* latin */\r\n@font-face {\r\n    font-family: 'Ubuntu';\r\n    font-style: normal;\r\n    font-weight: 400;\r\n    src: local('Ubuntu Regular'), local('Ubuntu-Regular'), url(./4iCs6KVjbNBYlgoKfw72.woff2) format('woff2');\r\n    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\r\n}"
  },
  {
    "path": "website/archive/v1/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"baidu-site-verification\" content=\"K88H1W8gJu\"/>\n    <meta name=\"google-site-verification\" content=\"9u_s16Eo3xGlz_wsxroSpFrbpa_rLYFg9ghHHJlKcXM\" />\n    <title id=\"title\">MOS | A lightweight tool used to smooth scrolling and set scroll direction independently for your mouse on MacOS</title>\n    <!-- Styles -->\n    <link href=\"srceset.css\" rel=\"stylesheet\">\n    <link href=\"./assets/fonts/ubuntu/font.css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/png\" href=\"./assets/image/logo-small.png\">\n    <!-- Global site tag (gtag.js) - Google Analytics -->\n    <script async src=\"https://www.googletagmanager.com/gtag/js?id=UA-85573109-2\"></script>\n    <script>\n        window.dataLayer = window.dataLayer || [];\n        function gtag(){dataLayer.push(arguments);}\n        gtag('js', new Date());\n        gtag('config', 'UA-85573109-2');\n    </script>\n    <!--Github Buttons-->\n    <script async defer src=\"https://buttons.github.io/buttons.js\"></script>\n</head>\n\n<body>\n\n    <header>\n        <h1 class=\"logo\">\n            <label class=\"mainColor\" for=\"title\">MOS</label>\n        </h1>\n        <a class=\"github\" href=\"https://github.com/Caldis/Mos\">\n            <div aria-label=\"Github\" style=\"width: 24px; height: 24px;\">\n                <svg focusable=\"false\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M12.007 0C6.12 0 1.1 4.27.157 10.08c-.944 5.813 2.468 11.45 8.054 13.312.19.064.397.033.555-.084.16-.117.25-.304.244-.5v-2.042c-3.33.735-4.037-1.56-4.037-1.56-.22-.726-.694-1.35-1.334-1.756-1.096-.75.074-.735.074-.735.773.103 1.454.557 1.846 1.23.694 1.21 2.23 1.638 3.45.96.056-.61.327-1.178.766-1.605-2.67-.3-5.462-1.335-5.462-6.002-.02-1.193.42-2.35 1.23-3.226-.327-1.015-.27-2.116.166-3.09 0 0 1.006-.33 3.3 1.23 1.966-.538 4.04-.538 6.003 0 2.295-1.5 3.3-1.23 3.3-1.23.445 1.006.49 2.144.12 3.18.81.877 1.25 2.033 1.23 3.226 0 4.607-2.805 5.627-5.476 5.927.578.583.88 1.386.825 2.206v3.29c-.005.2.092.393.26.507.164.115.377.14.565.063 5.568-1.88 8.956-7.514 8.007-13.313C22.892 4.267 17.884.007 12.008 0z\"></path></svg>\n            </div>\n        </a>\n    </header>\n\n    <main>\n\n        <section class=\"lendingSection\">\n            <div>\n                <div class=\"detail\">\n                    <div class=\"slogan\">\n                        <h1 class=\"mainColor\">Mos</h1>\n                        <span class=\"versionDetails\">\n                            <span id=\"version\">Version </span>\n                            <span id=\"githubVersion\">-</span>\n                            <span id=\"versionRequire\">, requires macOS 10.11 or later</span>\n                        </span>\n                    </div>\n                    <div class=\"information\">\n                        <h2 id=\"information\" >A lightweight tool used to smooth scrolling and set scroll direction independently for your mouse on MacOS</h2>\n                    </div>\n                    <div class=\"download parallaxButtonContainer\">\n                        <a id=\"headDownload\" href=\"#\" class=\"parallaxButton\" data-title=\"Download Now\">\n                            <span id=\"downloadNowButton\">Download Now</span>\n                        </a>\n                        <a class=\"github-button\" href=\"https://github.com/Caldis/Mos\" data-icon=\"octicon-star\" data-style=\"mega\" data-count-href=\"/Caldis/Mos/stargazers\" data-count-api=\"/repos/Caldis/Mos#stargazers_count\" data-count-aria-label=\"# stargazers on GitHub\" aria-label=\"Star Caldis/Mos on GitHub\">Star</a>\n                    </div>\n                </div>\n                <div class=\"introTitle\">\n                    <h6 id=\"intro\">Introducing</h6>\n                    <h1 id=\"appName\">MOS</h1>\n                    <h3 id=\"appDisc\">A simple tool can offer the smooth scrolling and reverse the mouse scrolling direction on your Mac</h3>\n                    <h4 id=\"appVersion\">Version <span id=\"githubVersion\">2.0.0</span>, Require macOS 10.11+</h4>\n                </div>\n                <div class=\"introImage\">\n                    <img src=\"./assets/image/en/PreferencesGeneral.png\" alt=\"Mos\">\n                </div>\n            </div>\n        </section>\n\n        <section class=\"detailSection\">\n            <article>\n                <div class=\"text\">\n                    <div>\n                        <h2 id=\"detailTitleA\" class=\"mainColor\">Take Full Control of Your Mouse</h2>\n                    </div>\n                    <div>\n                        <h3 id=\"detailTextA\">\n                            Mos separates touchpad and mouse scrolls independently, then, you can set the direction of the touchpad and mouse wheel separately. Also, Mos providing smooth scrolling for your mouse, whether you are a Windows user or a MacOS, you can move freely.\n                        </h3>\n                    </div>\n                </div>\n                <div class=\"image\">\n                    <img id=\"detailImageA\" src=\"./assets/image/en/PreferencesGeneral.png\" alt=\"Take Full Control of Your Mouse\">\n                </div>\n            </article>\n            <article>\n                <div class=\"image\">\n                    <img id=\"detailImageB\" src=\"./assets/image/en/PreferencesAdvanced.png\" alt=\"Scrolling, Smoother Than Ever\">\n                </div>\n                <div class=\"text\">\n                    <div>\n                        <h2 id=\"detailTitleB\" class=\"mainColor\">Scrolling, Smoother Than Ever</h2>\n                    </div>\n                    <div>\n                        <h3 id=\"detailTextB\">\n                            Mos's special interpolation algorithm can make every mouse roll as smooth and silky as possible.\n                        </h3>\n                    </div>\n                </div>\n            </article>\n            <article>\n                <div class=\"text\">\n                    <div>\n                        <h2 id=\"detailTitleC\" class=\"mainColor\">Manage Programs Independently</h2>\n                    </div>\n                    <div>\n                        <h3 id=\"detailTextC\">\n                            Mos can independently manage the scrolling behavior of each application. For some annoying programs, we help you.\n                        </h3>\n                    </div>\n                </div>\n                <div class=\"image\">\n                    <img id=\"detailImageC\" src=\"./assets/image/en/PreferencesExceptionFull.png\" alt=\"Manage Programs Independently\">\n                </div>\n            </article>\n        </section>\n\n        <section class=\"commentSection\">\n            <div class=\"comment\">\n                <div class=\"user\">\n                    <div class=\"avatar\">\n                        <img src=\"\" alt=\"\">\n                    </div>\n                    <div>\n                        <h2>User Name</h2>\n                        <span>User Description</span>\n                    </div>\n                </div>\n                <div class=\"text\">\n                    User Comment contain\n                </div>\n            </div>\n        </section>\n\n        <section class=\"suggestionSection\">\n            <div>\n                <h1 id=\"suggestionTitle\">\n                    So, what are you waiting for?\n                </h1>\n            </div>\n            <div class=\"download\">\n                <a id=\"downloadNow\" href=\"https://github.com/Caldis/Mos/releases/download/2.0.0/Mos.Version.2.0.0.dmg\">Download Now</a>\n            </div>\n        </section>\n\n    </main>\n\n    <footer class=\"footer\">\n        <div>\n            <h2>Mos</h2>\n        </div>\n        <div>\n            <span id=\"createBy\" >Design & Create by </span>\n            <a href=\"https://github.com/Caldis\">Caldis</a>\n            <span id=\"createAnd\">, and all the</span>\n            <a id=\"contributors\" href=\"https://github.com/Caldis/Mos/graphs/contributors\">contributors</a>\n            <span id=\"and\">and</span>\n            <b id=\"members\">community members</b>\n        </div>\n        <div>\n            <span id=\"poweredBy\">Powered by </span>\n            <a href=\"https://developer.apple.com/swift/\">Swift</a>\n        </div>\n        <div>\n            <span id=\"unique\">For every pursuing macOS users</span>\n        </div>\n        <a class=\"github\" href=\"https://github.com/Caldis/Mos\">\n            <div aria-label=\"Github\" style=\"width: 24px; height: 24px;\">\n                <svg focusable=\"false\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M12.007 0C6.12 0 1.1 4.27.157 10.08c-.944 5.813 2.468 11.45 8.054 13.312.19.064.397.033.555-.084.16-.117.25-.304.244-.5v-2.042c-3.33.735-4.037-1.56-4.037-1.56-.22-.726-.694-1.35-1.334-1.756-1.096-.75.074-.735.074-.735.773.103 1.454.557 1.846 1.23.694 1.21 2.23 1.638 3.45.96.056-.61.327-1.178.766-1.605-2.67-.3-5.462-1.335-5.462-6.002-.02-1.193.42-2.35 1.23-3.226-.327-1.015-.27-2.116.166-3.09 0 0 1.006-.33 3.3 1.23 1.966-.538 4.04-.538 6.003 0 2.295-1.5 3.3-1.23 3.3-1.23.445 1.006.49 2.144.12 3.18.81.877 1.25 2.033 1.23 3.226 0 4.607-2.805 5.627-5.476 5.927.578.583.88 1.386.825 2.206v3.29c-.005.2.092.393.26.507.164.115.377.14.565.063 5.568-1.88 8.956-7.514 8.007-13.313C22.892 4.267 17.884.007 12.008 0z\"></path></svg>\n            </div>\n        </a>\n    </footer>\n\n<script type=\"text/javascript\" src=\"dist/main.js\"></script></body>\n\n</html>\n"
  },
  {
    "path": "website/archive/v1/index.template.html",
    "content": "<!DOCTYPE html>\r\n<html lang=\"en\">\r\n\r\n<head>\r\n    <meta charset=\"UTF-8\">\r\n    <meta name=\"baidu-site-verification\" content=\"K88H1W8gJu\"/>\r\n    <meta name=\"google-site-verification\" content=\"9u_s16Eo3xGlz_wsxroSpFrbpa_rLYFg9ghHHJlKcXM\" />\r\n    <title id=\"title\">MOS | A lightweight tool used to smooth scrolling and set scroll direction independently for your mouse on MacOS</title>\r\n    <!-- Styles -->\r\n    <link href=\"srceset.css\" rel=\"stylesheet\">\r\n    <link href=\"./assets/fonts/ubuntu/font.css\" rel=\"stylesheet\">\r\n    <!-- Global site tag (gtag.js) - Google Analytics -->\r\n    <script async src=\"https://www.googletagmanager.com/gtag/js?id=UA-85573109-2\"></script>\r\n    <script>\r\n        window.dataLayer = window.dataLayer || [];\r\n        function gtag(){dataLayer.push(arguments);}\r\n        gtag('js', new Date());\r\n        gtag('config', 'UA-85573109-2');\r\n    </script>\r\n    <!--Github Buttons-->\r\n    <script async defer src=\"https://buttons.github.io/buttons.js\"></script>\r\n</head>\r\n\r\n<body>\r\n\r\n    <header>\r\n        <h1 class=\"logo\">\r\n            <label class=\"mainColor\" for=\"title\">MOS</label>\r\n        </h1>\r\n        <a class=\"github\" href=\"https://github.com/Caldis/Mos\">\r\n            <div aria-label=\"Github\" style=\"width: 24px; height: 24px;\">\r\n                <svg focusable=\"false\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M12.007 0C6.12 0 1.1 4.27.157 10.08c-.944 5.813 2.468 11.45 8.054 13.312.19.064.397.033.555-.084.16-.117.25-.304.244-.5v-2.042c-3.33.735-4.037-1.56-4.037-1.56-.22-.726-.694-1.35-1.334-1.756-1.096-.75.074-.735.074-.735.773.103 1.454.557 1.846 1.23.694 1.21 2.23 1.638 3.45.96.056-.61.327-1.178.766-1.605-2.67-.3-5.462-1.335-5.462-6.002-.02-1.193.42-2.35 1.23-3.226-.327-1.015-.27-2.116.166-3.09 0 0 1.006-.33 3.3 1.23 1.966-.538 4.04-.538 6.003 0 2.295-1.5 3.3-1.23 3.3-1.23.445 1.006.49 2.144.12 3.18.81.877 1.25 2.033 1.23 3.226 0 4.607-2.805 5.627-5.476 5.927.578.583.88 1.386.825 2.206v3.29c-.005.2.092.393.26.507.164.115.377.14.565.063 5.568-1.88 8.956-7.514 8.007-13.313C22.892 4.267 17.884.007 12.008 0z\"></path></svg>\r\n            </div>\r\n        </a>\r\n    </header>\r\n\r\n    <main>\r\n\r\n        <section class=\"lendingSection\">\r\n            <div>\r\n                <div class=\"detail\">\r\n                    <div class=\"slogan\">\r\n                        <h1 class=\"mainColor\">Mos</h1>\r\n                        <span class=\"versionDetails\">\r\n                            <span id=\"version\">Version </span>\r\n                            <span id=\"githubVersion\">-</span>\r\n                            <span id=\"versionRequire\">, requires macOS 10.11 or later</span>\r\n                        </span>\r\n                    </div>\r\n                    <div class=\"information\">\r\n                        <h2 id=\"information\" >A lightweight tool used to smooth scrolling and set scroll direction independently for your mouse on MacOS</h2>\r\n                    </div>\r\n                    <div class=\"download parallaxButtonContainer\">\r\n                        <a id=\"headDownload\" href=\"#\" class=\"parallaxButton\" data-title=\"Download Now\">\r\n                            <span id=\"downloadNowButton\">Download Now</span>\r\n                        </a>\r\n                        <a class=\"github-button\" href=\"https://github.com/Caldis/Mos\" data-icon=\"octicon-star\" data-style=\"mega\" data-count-href=\"/Caldis/Mos/stargazers\" data-count-api=\"/repos/Caldis/Mos#stargazers_count\" data-count-aria-label=\"# stargazers on GitHub\" aria-label=\"Star Caldis/Mos on GitHub\">Star</a>\r\n                    </div>\r\n                </div>\r\n                <div class=\"introImage\">\r\n                    <img src=\"./assets/image/logo-big.png\" alt=\"Mos\">\r\n                </div>\r\n            </div>\r\n        </section>\r\n\r\n        <section class=\"detailSection\">\r\n            <article>\r\n                <div class=\"text\">\r\n                    <div>\r\n                        <h2 id=\"detailTitleA\" class=\"mainColor\">Take Full Control of Your Mouse</h2>\r\n                    </div>\r\n                    <div>\r\n                        <h3 id=\"detailTextA\">\r\n                            Mos separates touchpad and mouse scrolls independently, then, you can set the direction of the touchpad and mouse wheel separately. Also, Mos providing smooth scrolling for your mouse, whether you are a Windows user or a MacOS, you can move freely.\r\n                        </h3>\r\n                    </div>\r\n                </div>\r\n                <div class=\"image\">\r\n                    <img id=\"detailImageA\" src=\"./assets/image/en/PreferencesGeneral.png\" alt=\"Take Full Control of Your Mouse\">\r\n                </div>\r\n            </article>\r\n            <article>\r\n                <div class=\"image\">\r\n                    <img id=\"detailImageB\" src=\"./assets/image/en/PreferencesAdvanced.png\" alt=\"Scrolling, Smoother Than Ever\">\r\n                </div>\r\n                <div class=\"text\">\r\n                    <div>\r\n                        <h2 id=\"detailTitleB\" class=\"mainColor\">Scrolling, Smoother Than Ever</h2>\r\n                    </div>\r\n                    <div>\r\n                        <h3 id=\"detailTextB\">\r\n                            Mos's special interpolation algorithm can make every mouse roll as smooth and silky as possible.\r\n                        </h3>\r\n                    </div>\r\n                </div>\r\n            </article>\r\n            <article>\r\n                <div class=\"text\">\r\n                    <div>\r\n                        <h2 id=\"detailTitleC\" class=\"mainColor\">Manage Programs Independently</h2>\r\n                    </div>\r\n                    <div>\r\n                        <h3 id=\"detailTextC\">\r\n                            Mos can independently manage the scrolling behavior of each application. For some annoying programs, we help you.\r\n                        </h3>\r\n                    </div>\r\n                </div>\r\n                <div class=\"image\">\r\n                    <img id=\"detailImageC\" src=\"./assets/image/en/PreferencesExceptionFull.png\" alt=\"Manage Programs Independently\">\r\n                </div>\r\n            </article>\r\n        </section>\r\n\r\n        <section class=\"commentSection\">\r\n            <div class=\"comment\">\r\n                <div class=\"user\">\r\n                    <div class=\"avatar\">\r\n                        <img src=\"\" alt=\"\">\r\n                    </div>\r\n                    <div>\r\n                        <h2>User Name</h2>\r\n                        <span>User Description</span>\r\n                    </div>\r\n                </div>\r\n                <div class=\"text\">\r\n                    User Comment contain\r\n                </div>\r\n            </div>\r\n        </section>\r\n\r\n        <section class=\"suggestionSection\">\r\n            <div>\r\n                <h1 id=\"suggestionTitle\">\r\n                    So, what are you waiting for?\r\n                </h1>\r\n            </div>\r\n            <div class=\"download\">\r\n                <a id=\"downloadNow\" href=\"https://github.com/Caldis/Mos/releases/download/2.0.0/Mos.Version.2.0.0.dmg\">Download Now</a>\r\n            </div>\r\n        </section>\r\n\r\n    </main>\r\n\r\n    <footer class=\"footer\">\r\n        <div>\r\n            <h2>Mos</h2>\r\n        </div>\r\n        <div>\r\n            <span id=\"createBy\" >Design & Create by </span>\r\n            <a href=\"https://github.com/Caldis\">Caldis</a>\r\n            <span id=\"createAnd\">, and all the</span>\r\n            <a id=\"contributors\" href=\"https://github.com/Caldis/Mos/graphs/contributors\">contributors</a>\r\n            <span id=\"and\">and</span>\r\n            <b id=\"members\">community members</b>\r\n        </div>\r\n        <div>\r\n            <span id=\"poweredBy\">Powered by </span>\r\n            <a href=\"https://developer.apple.com/swift/\">Swift</a>\r\n        </div>\r\n        <div>\r\n            <span id=\"unique\">For every pursuing macOS users</span>\r\n        </div>\r\n        <a class=\"github\" href=\"https://github.com/Caldis/Mos\">\r\n            <div aria-label=\"Github\" style=\"width: 24px; height: 24px;\">\r\n                <svg focusable=\"false\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M12.007 0C6.12 0 1.1 4.27.157 10.08c-.944 5.813 2.468 11.45 8.054 13.312.19.064.397.033.555-.084.16-.117.25-.304.244-.5v-2.042c-3.33.735-4.037-1.56-4.037-1.56-.22-.726-.694-1.35-1.334-1.756-1.096-.75.074-.735.074-.735.773.103 1.454.557 1.846 1.23.694 1.21 2.23 1.638 3.45.96.056-.61.327-1.178.766-1.605-2.67-.3-5.462-1.335-5.462-6.002-.02-1.193.42-2.35 1.23-3.226-.327-1.015-.27-2.116.166-3.09 0 0 1.006-.33 3.3 1.23 1.966-.538 4.04-.538 6.003 0 2.295-1.5 3.3-1.23 3.3-1.23.445 1.006.49 2.144.12 3.18.81.877 1.25 2.033 1.23 3.226 0 4.607-2.805 5.627-5.476 5.927.578.583.88 1.386.825 2.206v3.29c-.005.2.092.393.26.507.164.115.377.14.565.063 5.568-1.88 8.956-7.514 8.007-13.313C22.892 4.267 17.884.007 12.008 0z\"></path></svg>\r\n            </div>\r\n        </a>\r\n    </footer>\r\n\r\n</body>\r\n\r\n</html>\r\n"
  },
  {
    "path": "website/archive/v1/package.json",
    "content": "{\n  \"name\": \"Mos-Homepage\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A lightweight tool used to smooth scrolling and set scroll direction independently for your mouse on MacOS\",\n  \"main\": \"src/index.js\",\n  \"scripts\": {\n    \"dev\": \"webpack-serve --mode development --open --hot\",\n    \"dist\": \"webpack --mode production\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/Caldis/Mos.git\"\n  },\n  \"keywords\": [\n    \"Mos\",\n    \"homepage\"\n  ],\n  \"author\": \"Caldis\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/Caldis/Mos/issues\"\n  },\n  \"homepage\": \"mos.u2sk.com\",\n  \"devDependencies\": {\n    \"babel-loader\": \"^7.1.4\",\n    \"babel-preset-env\": \"^1.6.1\",\n    \"babel-preset-stage-0\": \"^6.24.1\",\n    \"css-loader\": \"^3.2.1\",\n    \"extract-text-webpack-plugin\": \"^3.0.2\",\n    \"file-loader\": \"^1.1.11\",\n    \"html-webpack-plugin\": \"^3.1.0\",\n    \"node-sass\": \"^4.8.3\",\n    \"sass-loader\": \"^6.0.7\",\n    \"style-loader\": \"^0.20.3\",\n    \"webpack\": \"^4.2.0\",\n    \"webpack-cli\": \"^3.3.10\",\n    \"webpack-serve\": \"^0.3.0\"\n  },\n  \"dependencies\": {\n    \"babel-core\": \"^6.26.3\"\n  }\n}\n"
  },
  {
    "path": "website/archive/v1/src/i18n/image.js",
    "content": "// 图片国际化\n// HTML 绑定对应 ID, 此处查找 ID, 将预设的图片链接替换入内\n\n(function () {\n    // 浏览器语系\n    var userAgentLanguage = window.navigator.language.toLowerCase()\n    // 页面语系\n    var pageLanguage = document.querySelector(\"html\").lang\n    // 国际化对照表\n    var i18nLanguageMappingList = {\n        detailImageA: {\n            zh: \"./assets/image/cn/PreferencesGeneral.png\",\n            en: \"./assets/image/en/PreferencesGeneral.png\",\n            ru: \"./assets/image/ru/PreferencesGeneral.png\"\n        },\n        detailImageB: {\n            zh: \"./assets/image/cn/PreferencesAdvanced.png\",\n            en: \"./assets/image/en/PreferencesAdvanced.png\",\n            ru: \"./assets/image/ru/PreferencesAdvanced.png\"\n        },\n        detailImageC: {\n            zh: \"./assets/image/cn/PreferencesExceptionFull.png\",\n            en: \"./assets/image/en/PreferencesExceptionFull.png\",\n            ru: \"./assets/image/ru/PreferencesException.png\"\n        }\n    }\n    // 国际化页面文字\n    function translate(language) {\n        // 目标语系 (手动指定, 默认由浏览器提供)\n        var targetLanguage = language || userAgentLanguage\n        // 如果目标语系与当前页面提供语系不同, 则开始翻译\n        if (targetLanguage !== pageLanguage) {\n            // 遍历国际化对照表\n            Object.keys(i18nLanguageMappingList).forEach(function (translationKeyword) {\n                // 获取每个关键字的国际化映射表\n                var multiLanguages = i18nLanguageMappingList[translationKeyword]\n                // 匹配语言, 如果找到对应映射, 则替换标签内原字符\n                if (multiLanguages[targetLanguage]) {\n                    // 精确匹配 (完全相同)\n                    document.querySelector(\"#\"+translationKeyword).src = multiLanguages[targetLanguage]\n                } else if (multiLanguages[targetLanguage.substring(0, 2)]) {\n                    // 模糊匹配 (仅匹配目标语系的前两个字符, 也就是国家代码)\n                    document.querySelector(\"#\"+translationKeyword).src = multiLanguages[targetLanguage.substring(0, 2)]\n                }\n            })\n        }\n    }\n    // 开始翻译页面\n    translate()\n})()\n"
  },
  {
    "path": "website/archive/v1/src/i18n/text.js",
    "content": "// 文本国际化\r\n// HTML 绑定对应 ID, 此处查找 ID, 将预设的文字替换入内\r\n\r\n(function () {\r\n    // 浏览器语系\r\n    var userAgentLanguage = window.navigator.language.toLowerCase()\r\n    // 页面语系\r\n    var pageLanguage = document.querySelector(\"html\").lang\r\n    // 国际化对照表\r\n    var i18nLanguageMappingList = {\r\n        title: {\r\n            zh: \"MOS | 一个用于在 MacOS 上平滑你的鼠标滚动效果或单独设置滚动方向的小工具, 让你的滚轮爽如触控板\",\r\n            en: \"MOS | A lightweight tool used to smooth scrolling and set scroll direction independently for your mouse on MacOS\",\r\n            ru: \"MOS | Легкий инструмент, используемый для плавной прокрутки и установки направления прокрутки независимо для вашей мыши на MacOS\"\r\n            sp: \"MOS | Una herramienta liviana que se usa para suavizar y establecer la dirección de desplazamiento de forma independiente para tu mouse en MacOS\",\r\n        },\r\n        information: {\r\n            zh: \"一个用于在 MacOS 上平滑你的鼠标滚动效果或单独设置滚动方向的小工具, 让你的滚轮爽如触控板\",\r\n            en: \"A lightweight tool used to smooth scrolling and set scroll direction independently for your mouse on MacOS\",\r\n            ru: \"Легкий инструмент, используемый для плавной прокрутки и установки независимого направления прокрутки для вашей мыши на MacOS\"\r\n            sp: \"Una herramienta liviana que se usa para suavizar y establecer la dirección de desplazamiento de manera independiente para tu mouse en MacOS\",\r\n        },\r\n        detailTitleA: {\r\n            zh: \"现在, 完全掌控你的鼠标\",\r\n            en: \"Take Full Control of Your Mouse\",\r\n            ru: \"Полный контроль над мышью\"\r\n            sp: \"Toma el control total de tu mouse\"\r\n        },\r\n        detailTextA: {\r\n            zh: \"Mos 可以分离你的触控板与鼠标的滚动事件, 皆因与此, 鼠标的滚动方向再也不受触控板所限. 同时, Mos 还可以为你的鼠标提供平滑滚动, 不管你是 Windows 用户, 亦或是 MacOS 用户, 均可切换自如\",\r\n            en: \"Mos separates touchpad and mouse scrolls independently, then, you can set the direction of the touchpad and mouse wheel separately. Also, Mos providing smooth scrolling for your mouse, whether you are a Windows user or a MacOS, you can move freely.\",\r\n            ru: \"Mos разделяет прокрутку тачпада и мыши, вы можете установить направление прокрутки сенсорной панели и колесика мыши отдельно. Кроме того, Mos обеспечивает плавную прокрутку для вашей мыши, независимо от того, являетесь ли вы пользователем Windows или MacOS.\"\r\n            sp: \"Mos separa los desplazamientos del panel táctil y del mouse de forma independiente, luego, puede configurar la dirección del panel táctil y la rueda del mouse por separado. Además, Mos proporciona un desplazamiento suave para tu mouse, ya sea que seas un usuario de Windows o MacOS, así puedes moverte libremente.\",\r\n        },\r\n        detailTitleB: {\r\n            zh: \"滚动, 从未如此顺手\",\r\n            en: \"Scrolling, Smoother Than Ever\",\r\n            ru: \"Максимальная плавность\"\r\n            sp: \"Desplazamiento, más fluido que nunca\",\r\n        },\r\n        detailTextB: {\r\n            zh: \"经过 Mos 独特的插值算法处理后, 您的鼠标滚动将会变得前所未有的顺滑\",\r\n            en: \"Mos's special interpolation algorithm can make every mouse roll as smooth and silky as possible.\",\r\n            ru: \"Специальный алгоритм интерполяции Mos может сделать любую мышку более гладкой и шелковистой.\"\r\n            sp: \"El algoritmo especial de interpolación de Mos puede hacer que cada giro del mouse sea lo más suave y sedoso posible.\",\r\n        },\r\n        detailTitleC: {\r\n            zh: \"所有应用, 尽在管理之下\",\r\n            en: \"Manage Programs Independently\",\r\n            ru: \"Каждая программа под контролем\"\r\n            sp: \"Administrar programas de manera independiente\",\r\n        },\r\n        detailTextC: {\r\n            zh: \"Mos 可以独立管理每个应用程序的滚动行为. 对付某些恼人的程序, 交给我们解决\",\r\n            en: \"Mos can independently manage the scrolling behavior of each application. For some annoying programs, we help you.\",\r\n            ru: \"Mos может самостоятельно управлять поведением прокрутки каждого приложения.\"\r\n            sp: \"Mos puede gestionar de manera independiente el comportamiento del desplazamiento de cada aplicación. Para determinados programas molestos, estamos para ayudarte.\",\r\n        },\r\n        suggestionTitle: {\r\n            zh: \"那么, 你还在等什么呢\",\r\n            en: \"So, what are you waiting for?\",\r\n            ru: \"Так чего же вы ждете?\"\r\n            sp: \"¿Entonces, qué estás esperando?\",\r\n        },\r\n        createBy: {\r\n            zh: \"设计与创作由 \",\r\n            en: \"Create & Design by \",\r\n            ru: \"Создано и разработано \"\r\n            sp: \"Creado y diseñado por \",\r\n        },\r\n        createAnd: {\r\n            zh: \"完成, 以及所有的\",\r\n            en: \", and all the\",\r\n            ru: \", и всеми\"\r\n            sp: \", y todo el\",\r\n        },\r\n        contributors: {\r\n            zh: \"贡献者们\",\r\n            en: \"contributors\",\r\n            ru: \"разработчиками\"\r\n            sp: \"colaboradores\",\r\n        },\r\n        and: {\r\n            zh: \"以及\",\r\n            en: \"and\",\r\n            ru: \"и\"\r\n            sp: \"y\",\r\n        },\r\n        members: {\r\n            zh: \"所有社区成员们\",\r\n            en: \"social members\",\r\n            ru: \"участниками сообщества\"\r\n            sp: \"miembros de redes sociales\",\r\n        },\r\n        poweredBy: {\r\n            zh: \"自豪地采用 \",\r\n            en: \"Powered by \",\r\n            ru: \"Работает на \"\r\n            sp: \"Impulsado por \",\r\n        },\r\n        unique: {\r\n            zh: \"献给每一位有追求的 MacOS 用户\",\r\n            en: \"For every pursuing MacOS users\",\r\n            ru: \"Посвящается каждому пользователю MacOS\"\r\n            sp: \"Para todos los usuarios de MacOS\",\r\n        },\r\n        downloadNow: {\r\n            zh: \"马上下载\",\r\n            en: \"Download Now\",\r\n            ru: \"Скачать сейчас\"\r\n            sp: \"Descargar ahora\",\r\n        },\r\n        downloadNowButton: {\r\n            zh: \"马上下载\",\r\n            en: \"Download Now\",\r\n            ru: \"Скачать сейчас\"\r\n            sp: \"Descargar ahora\",\r\n        },\r\n        version: {\r\n            zh: \"版本 \",\r\n            en: \"Version \",\r\n            ru: \"Версия \"\r\n            sp: \"Versión \",\r\n        },\r\n        versionRequire: {\r\n            zh: \", 要求 macOS 10.11 或更新版本\",\r\n            en: \", requires macOS 10.11 or later\",\r\n            ru: \", требуется macOS 10.11 или более поздняя версия\"\r\n            sp: \", requiere macOS 10.11 o posterior\",\r\n        }\r\n    }\r\n    // 国际化页面文字\r\n    function translate(language) {\r\n        // 目标语系 (手动指定, 默认由浏览器提供)\r\n        var targetLanguage = language || userAgentLanguage\r\n        // 如果目标语系与当前页面提供语系不同, 则开始翻译\r\n        if (targetLanguage !== pageLanguage) {\r\n            // 遍历国际化对照表\r\n            Object.keys(i18nLanguageMappingList).forEach(function (translationKeyword) {\r\n                // 获取每个关键字的国际化映射表\r\n                var multiLanguages = i18nLanguageMappingList[translationKeyword]\r\n                // 匹配语言, 如果找到对应映射, 则替换标签内原字符\r\n                if (multiLanguages[targetLanguage]) {\r\n                    // 精确匹配 (完全相同)\r\n                    document.querySelector(\"#\"+translationKeyword).innerText = multiLanguages[targetLanguage]\r\n                } else if (multiLanguages[targetLanguage.substring(0, 2)]) {\r\n                    // 模糊匹配 (仅匹配目标语系的前两个字符, 也就是国家代码)\r\n                    document.querySelector(\"#\"+translationKeyword).innerText = multiLanguages[targetLanguage.substring(0, 2)]\r\n                }\r\n            })\r\n        }\r\n    }\r\n    // 开始翻译页面\r\n    translate()\r\n})()\r\n"
  },
  {
    "path": "website/archive/v1/src/index.css",
    "content": ".mainColor {\r\n    color: #333333;\r\n    background: -webkit-linear-gradient(#a4a4a4, #020202);\r\n    -webkit-background-clip: text;\r\n    -webkit-text-fill-color: transparent;\r\n}\r\n\r\n/*主体*/\r\nmain {\r\n    overflow-x: hidden;\r\n    opacity: 0;\r\n    animation: fadeIn;\r\n    animation-delay: 1s;\r\n    animation-duration: 1.5s;\r\n    animation-fill-mode: forwards;\r\n}\r\nmain>section {\r\n    box-sizing: border-box;\r\n    /*必须*/\r\n    position: relative;\r\n    padding-top: 90px;\r\n    width: 100%;\r\n}\r\nmain>section:first-of-type {\r\n    height: 100vh;\r\n}\r\n/*导航*/\r\nheader {\r\n    z-index: 1000;\r\n    box-sizing: border-box;\r\n    position: fixed;\r\n    display: flex;\r\n    justify-content: space-between;\r\n    align-items: center;\r\n    flex-direction: row;\r\n    width: 100%;\r\n    height: 90px;\r\n    padding: 0 100px;\r\n    -webkit-backdrop-filter: blur(6px);\r\n    backdrop-filter: blur(6px);\r\n    background-color: rgba(255, 255, 255, 0.7);\r\n    border-bottom: 1px solid #e8e9ed;\r\n}\r\n/*各单元导航*/\r\n/*main>section>nav {*/\r\n    /*!*必须*!*/\r\n    /*position: absolute;*/\r\n    /*!*必须*!*/\r\n    /*top: 0; right: 0; bottom: 0; left: 0;*/\r\n    /*!*必须*!*/\r\n    /*clip: rect(auto, auto, auto, auto);*/\r\n/*}*/\r\n/*main>section>nav>div {*/\r\n    /*position: fixed;*/\r\n    /*top: 0;*/\r\n    /*width: 100%;*/\r\n/*}*/\r\n/*main>section>nav>div>div {*/\r\n    /*max-width: 1440px;*/\r\n    /*height: 90px;*/\r\n    /*display: flex;*/\r\n    /*flex-direction: row;*/\r\n    /*justify-content: space-between;*/\r\n    /*align-items: center;*/\r\n    /*margin: 0 auto;*/\r\n    /*padding: 0 calc(1440px * (1 / 24));*/\r\n/*}*/\r\n.logo {\r\n    pointer-events: all;\r\n    height: 90px;\r\n    display: flex;\r\n    flex-direction: row;\r\n    justify-content: space-between;\r\n    align-items: center;\r\n}\r\n.logo img {\r\n    height: 45px;\r\n}\r\n.logo label {\r\n    cursor: pointer;\r\n    user-select: none;\r\n    margin-left: 15px;\r\n    line-height: 90px;\r\n    font-size: 32px;\r\n    font-weight: bold;\r\n    transition: all .1s ease-out;\r\n}\r\n.logo label:hover {\r\n    transform: scale(1.1);\r\n}\r\n.logo label:active {\r\n    transform: scale(1.0);\r\n}\r\n/*Github按钮*/\r\n.github {\r\n    transition: fill .1s;\r\n}\r\n.github svg {\r\n    width: 24px;\r\n    height: 24px;\r\n    fill: #999;\r\n}\r\n.github:hover svg {\r\n    fill: #666;\r\n}\r\n.github:active svg {\r\n    fill: #333;\r\n}\r\n\r\n\r\n\r\n/*各区块*/\r\n.lendingSection {\r\n    display: flex;\r\n    flex-direction: row;\r\n    align-items: center;\r\n    justify-content: center;\r\n}\r\n.lendingSection>div {\r\n    margin: -90px auto 0;\r\n    max-width: 1400px;\r\n    padding: 0 100px;\r\n    display: flex;\r\n    flex-direction: row;\r\n    justify-content: center;\r\n    align-items: center;\r\n}\r\n.lendingSection .detail {\r\n    display: flex;\r\n    flex-direction: column;\r\n}\r\n.lendingSection .detail h1 {\r\n    font-size: 72px;\r\n}\r\n.lendingSection .slogan {\r\n    position: relative;\r\n}\r\n.lendingSection .slogan .versionDetails {\r\n    position: absolute;\r\n    left: 145px;\r\n    top: 66px;\r\n    font-size: 12px;\r\n    color: #666;\r\n}\r\n.lendingSection .detail h2 {\r\n\r\n}\r\n.lendingSection .detail .information {\r\n    color: #666;\r\n    margin-bottom: 15px;\r\n}\r\n.lendingSection .introImage {\r\n    flex-shrink: 0;\r\n    width: 40%;\r\n    min-width: 300px;\r\n    filter: drop-shadow(0 12px 7px rgba(0, 0, 0, 0.3));\r\n}\r\n.lendingSection .introImage img {\r\n    width: 100%;\r\n}\r\n\r\n\r\n\r\n\r\n.detailSection {\r\n\r\n}\r\n.detailSection article {\r\n    margin: auto;\r\n    max-width: 1400px;\r\n    padding: 0 100px;\r\n    display: flex;\r\n    flex-direction: row;\r\n    align-items: center;\r\n    justify-content: center;\r\n}\r\n.detailSection article>div {\r\n    width: 50%;\r\n    flex-shrink: 0;\r\n}\r\n.detailSection article>div h2{\r\n    font-size: 38px;\r\n    margin-bottom: 20px;\r\n}\r\n.detailSection article>div h3{\r\n    font-size: 16px;\r\n    color: #333;\r\n}\r\n.detailSection article>div.image:nth-child(even) {\r\n\r\n}\r\n.detailSection article>div.image:nth-child(odd) {\r\n    display: flex;\r\n    flex-direction: row-reverse;\r\n}\r\n\r\n\r\n\r\n.commentSection {\r\n    display: none;\r\n}\r\n\r\n\r\n\r\n\r\n.suggestionSection {\r\n    display: flex;\r\n    flex-direction: column;\r\n    align-items: center;\r\n    justify-content: center;\r\n    background: linear-gradient(170deg, #c5b7f0 0%, #40BAF5 97%);\r\n    padding-bottom: 90px;\r\n    color: white;\r\n    pointer-events: initial;\r\n}\r\n.suggestionSection>div {\r\n    display: flex;\r\n    flex-direction: row;\r\n    align-items: center;\r\n    justify-content: center;\r\n    z-index: 100;\r\n}\r\n.suggestionSection>div>img {\r\n    width: 50px;\r\n}\r\n.suggestionSection>div>h1 {\r\n    margin-left: 20px;\r\n    font-size: 48px;\r\n    pointer-events: none;\r\n}\r\n.suggestionSection .download {\r\n    transition: all .3s;\r\n}\r\n.suggestionSection .download:hover {\r\n    transform: scale3d(1.1, 1.1, 1);\r\n}\r\n.suggestionSection .download:active {\r\n    transform: scale3d(1, 1, 1);\r\n}\r\n.suggestionSection .download a {\r\n    background-color: white;\r\n    color: #77b9f0;\r\n    border-radius: 4px;\r\n    padding: .8em 2em;\r\n    cursor: pointer;\r\n    margin: 20px;\r\n    font-weight: bold;\r\n    font-size: 18px;\r\n    letter-spacing: .01em;\r\n    text-decoration: none;\r\n}\r\n\r\n\r\n\r\n.footer {\r\n    padding: 80px;\r\n    display: flex;\r\n    flex-direction: column;\r\n    justify-content: center;\r\n    align-items: center;\r\n    color: #333;\r\n}\r\n.footer>div {\r\n    margin: 2px auto;\r\n}\r\n.footer a {\r\n    text-decoration: underline;\r\n    margin: 0 2px;\r\n    color: #333;\r\n    font-weight: bold;\r\n}\r\n.footer .github {\r\n    margin-top: 5px;\r\n}\r\n\r\n\r\n.navHide {\r\n    color: transparent;\r\n    background-color: transparent;\r\n}\r\n.navShow {\r\n    color: #333333;\r\n    background-color: #f2f3f5;\r\n    box-shadow: 0 0 10px #ccc;\r\n}\r\n\r\n@keyframes fadeIn {\r\n    0% {\r\n        opacity: 0;\r\n        transform: translateY(50px);\r\n    }\r\n    100% {\r\n        opacity: 1;\r\n        transform: translateY(0);\r\n    }\r\n}"
  },
  {
    "path": "website/archive/v1/src/index.js",
    "content": "// Basic\nimport 'archive/v1/src/index.css'\n// I18N\nimport 'archive/v1/src/i18n/text.js'\nimport 'archive/v1/src/i18n/image.js'\n// Github Releases\nimport 'archive/v1/src/releases'\n// ParallaxButton\nimport 'archive/v1/src/parallaxButton'\nimport 'archive/v1/src/parallaxButton/index.css'\n"
  },
  {
    "path": "website/archive/v1/src/parallaxButton/index.css",
    "content": ".parallaxButton {\n  position: relative;\n  display: inline-block;\n  padding: 1.2em 4em;\n  text-decoration: none;\n  text-align: center;\n  cursor: pointer;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  color: white;\n}\n.parallaxButton::before {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  background: linear-gradient(-15deg, #2368ff, #a777e3);\n  /*background: linear-gradient(-15deg, #060606, #353535);*/\n  border-radius: 4px;\n  -webkit-transition: -webkit-box-shadow .5s ease, -webkit-transform .2s ease;\n  transition: -webkit-box-shadow .5s ease, -webkit-transform .2s ease;\n  transition: box-shadow .5s ease, transform .2s ease;\n  transition: box-shadow .5s ease, transform .2s ease, -webkit-box-shadow .5s ease, -webkit-transform .2s ease;\n  will-change: transform;\n  -webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);\n  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);\n  -webkit-transform: translateY(var(--ty, 0)) rotateX(var(--rx, 0)) rotateY(var(--ry, 0)) translateZ(var(--tz, -12px));\n  transform: translateY(var(--ty, 0)) rotateX(var(--rx, 0)) rotateY(var(--ry, 0)) translateZ(var(--tz, -12px));\n}\n.parallaxButton:hover::before {\n  -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);\n  box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);\n}\n/*.parallaxButton::after {*/\n  /*position: relative;*/\n  /*display: inline-block;*/\n  /*content: attr(data-title);*/\n  /*-webkit-transition: -webkit-transform .2s ease;*/\n  /*transition: -webkit-transform .2s ease;*/\n  /*transition: transform .2s ease;*/\n  /*transition: transform .2s ease, -webkit-transform .2s ease;*/\n  /*font-weight: bold;*/\n  /*font-size: 18px;*/\n  /*letter-spacing: .01em;*/\n  /*will-change: transform;*/\n  /*-webkit-transform: translateY(var(--ty, 0)) rotateX(var(--rx, 0)) rotateY(var(--ry, 0));*/\n  /*transform: translateY(var(--ty, 0)) rotateX(var(--rx, 0)) rotateY(var(--ry, 0));*/\n/*}*/\n\n\n/*Custom*/\n.parallaxButtonContainer {\n    display: -webkit-box;\n    display: -ms-flexbox;\n    display: flex;\n    -webkit-box-align: center;\n    -ms-flex-align: center;\n    align-items: center;\n    -webkit-box-pack: center;\n    -ms-flex-pack: center;\n    justify-content: flex-start;\n    -webkit-transform-style: preserve-3d;\n    transform-style: preserve-3d;\n    -webkit-transform: perspective(800px);\n    transform: perspective(800px);\n    margin-top: 20px;\n    opacity: 0.8;\n}\n.parallaxButtonContainer .parallaxButton {\n    margin-right: 20px;\n}\n.parallaxButton>span {\n  position: relative;\n  display: inline-block;\n  -webkit-transition: -webkit-transform .2s ease;\n  transition: -webkit-transform .2s ease;\n  transition: transform .2s ease;\n  transition: transform .2s ease, -webkit-transform .2s ease;\n  font-weight: bold;\n  font-size: 18px;\n  letter-spacing: .01em;\n  will-change: transform;\n  -webkit-transform: translateY(var(--ty, 0)) rotateX(var(--rx, 0)) rotateY(var(--ry, 0));\n  transform: translateY(var(--ty, 0)) rotateX(var(--rx, 0)) rotateY(var(--ry, 0));\n}"
  },
  {
    "path": "website/archive/v1/src/parallaxButton/index.js",
    "content": "// From:\n// https://codepen.io/andrit/pen/kkVxag\n\nvar docStyle = document.documentElement.style\nvar aElem = document.querySelector('.parallaxButton')\nvar boundingClientRect = aElem.getBoundingClientRect()\n\nwindow.onresize = function (e) {\n    boundingClientRect = aElem.getBoundingClientRect()\n}\nwindow.onscroll = function (e) {\n    boundingClientRect = aElem.getBoundingClientRect()\n}\n\naElem.onmousemove = function(e) {\n    const x = e.clientX - boundingClientRect.left\n    const y = e.clientY - boundingClientRect.top\n    const xc = boundingClientRect.width/2\n    const yc = boundingClientRect.height/2\n    const dx = x - xc\n    const dy = y - yc\n    docStyle.setProperty('--rx', `${ dy/-1 }deg`)\n    docStyle.setProperty('--ry', `${ dx/10 }deg`)\n}\n\naElem.onmouseleave = function(e) {\n    docStyle.setProperty('--ty', '0')\n    docStyle.setProperty('--rx', '0')\n    docStyle.setProperty('--ry', '0')\n}\n\naElem.onmousedown = function(e) {\n    docStyle.setProperty('--tz', '-25px')\n}\n\ndocument.body.onmouseup = function(e) {\n    docStyle.setProperty('--tz', '-12px')\n}"
  },
  {
    "path": "website/archive/v1/src/releases/index.js",
    "content": "// 通过 Github 获取最新版本与下载链接\n\nconst endpoint = \"https://api.github.com/repos/Caldis/Mos/releases/latest\"\nconst githubVersion = document.querySelector(\"#githubVersion\")\nconst githubDownloadA = document.querySelector(\"#headDownload\")\nconst githubDownloadB = document.querySelector(\"#downloadNow\")\n\nfetch(endpoint)\n    .then(res => {\n        return res.json()\n    }).then(json => {\n        githubVersion.innerText = json.tag_name\n        githubDownloadA.href = json.assets[0].browser_download_url\n        githubDownloadB.href = json.assets[0].browser_download_url\n    })"
  },
  {
    "path": "website/archive/v1/src/reset.css",
    "content": "body,h1,h2,h3,h4,h5,h6,hr,p,blockquote,dl,dt,dd,ul,ol,li,pre,form,fieldset,legend,button,input,textarea,th,td{margin:0;padding:0}body,button,input,select,textarea{font:12px/1.5 tahoma,arial,\\5b8b\\4f53,sans-serif}h1,h2,h3,h4,h5,h6{font-weight:200}address,cite,dfn,em,var{font-style:normal}code,kbd,pre,samp{font-family:courier new,courier,monospace}small{font-size:12px}ul,ol{list-style:none}a{text-decoration:none}a:hover{text-decoration:underline}legend{color:#000}fieldset,img{border:0}button,input,select,textarea{font-size:100%}table{border-collapse:collapse;border-spacing:0}*{font-family:\"Ubuntu\", \"Helvetica Neue\",\"Luxi Sans\",\"DejaVu Sans\",Tahoma,\"Hiragino Sans GB\",\"Microsoft Yahei\",sans-serif}\n"
  },
  {
    "path": "website/archive/v1/webpack.config.js",
    "content": "const path = require('path')\nconst HtmlWebPackPlugin = require(\"html-webpack-plugin\")\n\nmodule.exports = {\n\n    module: {\n        rules: [\n            {\n                test: /.(js)$/,\n                exclude: /node_modules/,\n                use: ['babel-loader']\n            },\n            {\n                test: /\\.css$/,\n                use: [\n                    'style-loader',\n                    'css-loader'\n                ]\n            },\n            {\n                test: /\\.scss$|\\.sass$/,\n                use: [\n                    'style-loader',\n                    'css-loader',\n                    'sass-loader'\n                ]\n            },\n            {\n                test: /\\.(png|jpg|gif|mp4|ogg|svg|woff|woff2|ttf|eot)$/,\n                loader: 'file-loader'\n            },\n        ]\n    },\n\n    plugins: [\n        new HtmlWebPackPlugin({\n            template: path.resolve(__dirname, 'index.template.html'),\n            filename: \"../index.html\"\n        })\n    ]\n\n}"
  },
  {
    "path": "website/docs/plans/2026-02-25-taste-redesign-design.md",
    "content": "# Mos Homepage Taste Redesign — Design Doc\n\n**Date:** 2026-02-25\n**Direction:** Precision Instrument (方案 A)\n**Skill Reference:** `DESIGN_VARIANCE: 8`, `MOTION_INTENSITY: 6`, `VISUAL_DENSITY: 4`\n\n---\n\n## Summary\n\nA comprehensive aesthetic upgrade of the Mos homepage.\n**Constraints:** Pure monochrome (no color accents), add Framer Motion, keep all existing functionality and i18n.\n**New dependencies:** `framer-motion` only.\n\n---\n\n## Section 1 — Visual Foundation & Material System\n\n### globals.css changes\n- Noise layer: opacity `0.045` → `0.065`, finer grain\n- Orb opacity: `0.18` → `0.10`, blur variance for depth\n- Background radial gradients: shift to asymmetric positions (`5% 8%` / `88% 14%`)\n- FlowField trail: background fill alpha `0.12` → `0.08` (longer trails, more flow)\n\n### Glass card upgrade\n```css\n.glass {\n  background: rgba(8, 9, 14, 0.60);\n  box-shadow:\n    0 0 0 1px rgba(255,255,255,0.06) inset,\n    0 1px 0 rgba(255,255,255,0.12) inset,   /* top-edge highlight line */\n    0 32px 120px rgba(0,0,0,0.8);\n}\n```\n\n### CSS Token changes\n- `--radius-xl`: `22px` → `26px`\n- New: `--radius-card: 32px` (large cards)\n- `shadow-elevated`: depth from `80px` → `120px`\n\n---\n\n## Section 2 — Typography System\n\n| Element | Before | After |\n|---------|--------|-------|\n| Hero H1 (mobile) | `42px` | `52px` |\n| Hero H1 (tablet) | `72px` | `88px` |\n| Hero H1 (desktop) | `84px` | `108px` |\n| Hero H1 (large) | – | `124px` |\n| H1 tracking | default | `tracking-[-0.02em]` |\n| H1 line-height | – | `leading-[0.95]` |\n| Kicker tracking | `0.18em` | `0.22em` |\n| Kicker color | `white/70` | `white/50` |\n| Body line-height | `leading-relaxed` | `leading-[1.7]` |\n| Mono numerals | – | `tabular-nums` |\n\n---\n\n## Section 3 — Hero Section Redesign\n\n### Layout (md+ splits into two columns)\n```\n<section> min-h-[100dvh]\n  <div> grid grid-cols-1 md:grid-cols-[1fr_auto] gap-12 lg:gap-20 items-center\n\n    LEFT (55%) — unchanged content, upgraded typography + spring entrance\n      Badge → H1 line1 → H1 line2 → Lead → CTA group → requirements\n\n    RIGHT (45%, md+ only) — new HeroCurvePanel component\n      Glass card ~340×320px\n      Static animated SVG scroll curve (stroke-dashoffset animation)\n      3 floating parameter badges: step / gain / duration (default values)\n      Framer Motion: initial y:30 opacity:0, spring {stiffness:80, damping:18}\n      Subtle rotateY:-6deg → 0 on hover\n```\n\n### Spring entrance stagger\n| Element | Delay |\n|---------|-------|\n| Badge | 0ms |\n| H1 line 1 | 80ms |\n| H1 line 2 | 160ms |\n| Lead | 220ms |\n| CTAs | 280ms |\n| Right panel | 340ms |\n\nSpring params: `{ stiffness: 100, damping: 20 }` (all elements)\n\n---\n\n## Section 4 — Bento Grid Asymmetric Layout\n\n### Before\n```\nRow 1: [col-span-12: Easing]\nRow 2: [col-span-6: Axes] [col-span-6: Per-App]\nRow 3: [col-span-12: Buttons]\n```\n\n### After (md+)\n```\nRow 1: [col-span-7: Easing Playground]  [col-span-5: Axes Control]   equal height\nRow 2: [col-span-5: Per-App Grid]       [col-span-7: Button Bindings] ~60px taller than row 1\n```\n\nPattern: `7+5` ↔ `5+7` alternating columns, row 2 has greater min-height.\n\n### Card internal upgrades\n- **Easing card (7/12):** Graph area taller, sliders wider\n- **Axes card (5/12):** Toggle rows with `backdrop-blur` grouping box; active toggle has subtle glow\n- **Per-App card (5/12):** 2×3 grid (was 3×2), 48px icons, small `smooth` status badge\n- **Buttons card (7/12):** Left-key/right-value alignment; one pulsing placeholder row (\"recording...\")\n\n---\n\n## Section 5 — Framer Motion Animation System\n\n**New dependency:** `framer-motion` (~70KB gz)\n\n### Spring baseline\n```ts\nconst spring = { type: \"spring\", stiffness: 100, damping: 20 }\n```\n\n### Reveal component (upgraded)\n- Replace CSS `.reveal`/`.in-view` with `motion.div` + `useInView` from FM\n- Keep same `Reveal` component API (`delayMs`, `className` props)\n- Remove `.reveal`, `.reveal.in-view` from `globals.css`\n\n### Card 3D hover\n```ts\nonMouseMove → compute (rotateX: ±4deg, rotateY: ±6deg) from cursor offset\n→ motion.div style={{ rotateX, rotateY, transition: \"0.1s ease\" }}\n→ internal radial-gradient spotlight follows cursor\n```\n\n### Bento card stagger\n- Trigger: `useInView` with `{ once: true, margin: \"-80px\" }`\n- Each card: `y: 28 → 0`, `opacity: 0 → 1`, stagger interval `120ms`\n\n### Items NOT migrated to Framer Motion\n- FlowField canvas (keeps RAF)\n- `.orb` floats (keep CSS `float-slow` keyframes)\n- `homebrew-pulse` / `homebrew-sheen` (keep CSS keyframes)\n- `hero-in` CSS (replaced by FM), `stroke-in` (keep for SVG path)\n\n---\n\n## New Components\n\n| Component | File | Purpose |\n|-----------|------|---------|\n| `HeroCurvePanel` | `app/components/HeroCurvePanel/HeroCurvePanel.tsx` | Static curve SVG + param badges for hero right side |\n| `BentoCard` | `app/components/BentoCard/BentoCard.tsx` | Reusable card wrapper with 3D hover FM effect |\n\n---\n\n## Files to Modify\n\n| File | Change |\n|------|--------|\n| `app/globals.css` | Material tokens, noise, glass, typography, remove `.reveal` CSS |\n| `app/layout.tsx` | Font sizes stay, no change needed |\n| `app/home-client.tsx` | Hero split layout, bento grid restructure, FM entrance |\n| `app/components/Reveal/Reveal.tsx` | Replace CSS with FM `useInView` |\n| `app/components/FlowField/FlowField.tsx` | Reduce fill alpha to 0.08 |\n| `package.json` | Add `framer-motion` |\n\n---\n\n## Pre-Flight Checklist (from skill)\n- [ ] `min-h-[100dvh]` used (already present as `min-h-[100svh]`, upgrade to `100dvh`)\n- [ ] No purple/blue glows (confirmed monochrome)\n- [ ] No centered hero (confirmed split layout)\n- [ ] No 3-column generic cards (confirmed asymmetric 7+5)\n- [ ] Animations use `transform`/`opacity` only (hardware accelerated)\n- [ ] `prefers-reduced-motion` respected in FM with `useReducedMotion`\n- [ ] Mobile layout tested (single-column fallback)\n- [ ] Loading/empty states maintained (existing patterns kept)\n"
  },
  {
    "path": "website/docs/plans/2026-02-25-taste-redesign.md",
    "content": "# Mos Homepage Taste Redesign — Implementation Plan\n\n> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.\n\n**Goal:** Upgrade the Mos homepage to \"Precision Instrument\" aesthetic — upgraded material quality, asymmetric bento grid, Framer Motion spring entrance/3D-hover, split Hero layout.\n\n**Architecture:** Pure monochrome stays; quality comes from layered glass materials, diffusion shadows, and spring physics. Framer Motion replaces CSS reveal animations; CSS canvas/orb animations stay. A new `BentoCard` wraps all feature cards with 3D hover. A new `HeroCurvePanel` adds a right-column visual to the Hero.\n\n**Tech Stack:** Next.js 16, React 19, Tailwind CSS v3, Framer Motion v11, TypeScript\n\n---\n\n## Task 1: Install framer-motion\n\n**Files:**\n- Modify: `package.json`\n\n**Step 1: Install the package**\n\n```bash\ncd /Users/caldis/Code/Mos/website\npnpm add framer-motion@^11\n```\n\n**Step 2: Verify install**\n\nRun: `grep framer package.json`\nExpected output: `\"framer-motion\": \"^11.x.x\"`\n\n**Step 3: Commit**\n\n```bash\ngit add package.json pnpm-lock.yaml\ngit commit -m \"feat: add framer-motion dependency\"\n```\n\n---\n\n## Task 2: Upgrade globals.css — material tokens, glass, orbs\n\n**Files:**\n- Modify: `app/globals.css`\n\nThis task upgrades the visual foundation. No JS changes.\n\n**Step 1: Update `:root` tokens**\n\nIn `app/globals.css`, replace the `:root` block:\n\n```css\n:root {\n  --bg0: #000000;\n  --bg1: #090909;\n  --fg0: rgba(255, 255, 255, 0.92);\n  --fg1: rgba(255, 255, 255, 0.72);\n  --fg2: rgba(255, 255, 255, 0.52);\n  --border: rgba(255, 255, 255, 0.12);\n\n  --accent: #ffffff;\n  --accent2: #a1a1aa;\n  --accent3: #52525b;\n\n  --radius-xl: 26px;\n  --radius-card: 32px;\n\n  --ease-out: cubic-bezier(0.16, 1, 0.3, 1);\n\n  --noise-opacity: 0.065;\n}\n```\n\n**Step 2: Update body background to asymmetric positions**\n\nReplace the `body` background gradient block:\n\n```css\nbody {\n  color: var(--fg0);\n  background:\n    radial-gradient(1100px 680px at 5% 8%, rgba(255, 255, 255, 0.10), transparent 55%),\n    radial-gradient(900px 620px at 88% 14%, rgba(255, 255, 255, 0.06), transparent 55%),\n    radial-gradient(1100px 820px at 45% 92%, rgba(255, 255, 255, 0.045), transparent 60%),\n    linear-gradient(180deg, var(--bg0), var(--bg1));\n  font-family:\n    var(--font-body),\n    ui-sans-serif,\n    system-ui,\n    -apple-system,\n    BlinkMacSystemFont,\n    \"Segoe UI\",\n    Helvetica,\n    Arial,\n    \"Apple Color Emoji\",\n    \"Segoe UI Emoji\";\n  text-rendering: geometricPrecision;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n```\n\n**Step 3: Upgrade `.glass` utility**\n\nReplace the `.glass` block inside `@layer utilities`:\n\n```css\n.glass {\n  background: rgba(8, 9, 14, 0.60);\n  border: 1px solid var(--border);\n  backdrop-filter: blur(16px);\n  -webkit-backdrop-filter: blur(16px);\n  box-shadow:\n    0 0 0 1px rgba(255,255,255,0.06) inset,\n    0 1px 0 rgba(255,255,255,0.12) inset,\n    0 32px 120px rgba(0,0,0,0.8);\n}\n```\n\n**Step 4: Upgrade `.shadow-elevated` utility**\n\n```css\n.shadow-elevated {\n  box-shadow:\n    0 32px 120px rgba(0, 0, 0, 0.80),\n    0 1px 0 rgba(255, 255, 255, 0.08) inset;\n}\n```\n\n**Step 5: Update `.orb` opacity**\n\nChange `opacity: 0.18` → `opacity: 0.10` in the `.orb` block.\n\n**Step 6: Remove the `.reveal` and `.reveal.in-view` CSS**\n\nDelete these blocks entirely (they will be replaced by Framer Motion in Task 3):\n\n```css\n/* DELETE THESE: */\n.reveal { ... }\n.reveal.in-view { ... }\n```\n\nAlso delete the `@media (scripting: none)` block that mentions `.reveal`:\n```css\n/* DELETE: */\n@media (scripting: none) {\n  .reveal { ... }\n}\n```\n\nKeep `@keyframes hero-in` for now (removed in Task 6).\nKeep `.ring-accent`, `.hairline`, `.orb`, `.homebrew-highlight`, etc.\n\n**Step 7: Remove the `prefers-reduced-motion` `.reveal` rule**\n\nThe `@media (prefers-reduced-motion: reduce)` block at the bottom has no `.reveal` rules, so nothing to delete there. Keep `homebrew-highlight` reduced-motion rules.\n\n**Step 8: Start dev server and visually verify**\n\n```bash\npnpm dev\n```\n\nOpen http://localhost:3000. The page should look the same in structure but with:\n- Slightly denser noise texture\n- Deeper card shadows\n- Top-edge highlight line visible on glass cards (nav bar)\n- Note: the page may look broken because Reveal CSS was removed — that's OK, Task 3 fixes it.\n\n**Step 9: Commit**\n\n```bash\ngit add app/globals.css\ngit commit -m \"style: upgrade material tokens, glass highlight, deeper shadows\"\n```\n\n---\n\n## Task 3: Upgrade Reveal.tsx to Framer Motion\n\n**Files:**\n- Modify: `app/components/Reveal/Reveal.tsx`\n\nThe old implementation uses `IntersectionObserver` + CSS class toggling. Replace with Framer Motion `useInView` + `motion.div`.\n\n**Step 1: Replace the entire file content**\n\n```tsx\n\"use client\";\n\nimport { motion, useInView, useReducedMotion } from \"framer-motion\";\nimport { ReactNode, useRef } from \"react\";\n\nconst SPRING = { type: \"spring\" as const, stiffness: 100, damping: 20 };\n\nconst variants = {\n  hidden: { opacity: 0, y: 24, filter: \"blur(12px)\" },\n  visible: { opacity: 1, y: 0, filter: \"blur(0px)\" },\n};\n\nexport function Reveal({\n  children,\n  className = \"\",\n  delayMs = 0,\n}: {\n  children: ReactNode;\n  className?: string;\n  delayMs?: number;\n}) {\n  const ref = useRef<HTMLDivElement | null>(null);\n  const shouldReduceMotion = useReducedMotion();\n  const inView = useInView(ref, {\n    once: true,\n    margin: \"40px 0px -10% 0px\",\n  });\n\n  return (\n    <motion.div\n      ref={ref}\n      className={className}\n      variants={variants}\n      initial={shouldReduceMotion ? \"visible\" : \"hidden\"}\n      animate={inView ? \"visible\" : \"hidden\"}\n      transition={{ ...SPRING, delay: delayMs / 1000 }}\n    >\n      {children}\n    </motion.div>\n  );\n}\n```\n\n**Step 2: Verify dev server**\n\n```bash\npnpm dev\n```\n\nOpen http://localhost:3000. Scroll through the page — all sections should fade+slide in with spring motion. No broken layout.\n\n**Step 3: Commit**\n\n```bash\ngit add app/components/Reveal/Reveal.tsx\ngit commit -m \"feat: replace CSS reveal with Framer Motion spring useInView\"\n```\n\n---\n\n## Task 4: Create BentoCard component with 3D hover\n\n**Files:**\n- Create: `app/components/BentoCard/BentoCard.tsx`\n\nThis wraps bento feature cards with a 3D hover tilt effect. The card rotates slightly toward the cursor, and a spotlight follows the cursor inside the card.\n\n**Step 1: Create the file**\n\n```tsx\n\"use client\";\n\nimport {\n  motion,\n  useMotionTemplate,\n  useMotionValue,\n  useReducedMotion,\n  useSpring,\n  useTransform,\n} from \"framer-motion\";\nimport { MouseEvent, ReactNode } from \"react\";\n\nconst SPRING = { stiffness: 150, damping: 30 };\n\nexport function BentoCard({\n  children,\n  className = \"\",\n}: {\n  children: ReactNode;\n  className?: string;\n}) {\n  const shouldReduceMotion = useReducedMotion();\n\n  const mouseX = useMotionValue(0.5);\n  const mouseY = useMotionValue(0.5);\n\n  const rawRotateX = useTransform(mouseY, [0, 1], [4, -4]);\n  const rawRotateY = useTransform(mouseX, [0, 1], [-6, 6]);\n  const rotateX = useSpring(rawRotateX, SPRING);\n  const rotateY = useSpring(rawRotateY, SPRING);\n\n  const spotX = useTransform(mouseX, [0, 1], [0, 100]);\n  const spotY = useTransform(mouseY, [0, 1], [0, 100]);\n  const spotlight = useMotionTemplate`radial-gradient(480px circle at ${spotX}% ${spotY}%, rgba(255,255,255,0.08), transparent 60%)`;\n\n  const handleMouseMove = (e: MouseEvent<HTMLDivElement>) => {\n    if (shouldReduceMotion) return;\n    const rect = e.currentTarget.getBoundingClientRect();\n    mouseX.set((e.clientX - rect.left) / rect.width);\n    mouseY.set((e.clientY - rect.top) / rect.height);\n  };\n\n  const handleMouseLeave = () => {\n    mouseX.set(0.5);\n    mouseY.set(0.5);\n  };\n\n  return (\n    <motion.div\n      className={`group relative h-full rounded-[var(--radius-card)] glass shadow-elevated overflow-hidden border border-white/10 ${className}`}\n      style={\n        shouldReduceMotion\n          ? {}\n          : { rotateX, rotateY, transformPerspective: 1200 }\n      }\n      onMouseMove={handleMouseMove}\n      onMouseLeave={handleMouseLeave}\n    >\n      {/* Cursor-following spotlight */}\n      <motion.div\n        className=\"pointer-events-none absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity duration-500\"\n        style={{ background: spotlight }}\n      />\n      {children}\n    </motion.div>\n  );\n}\n```\n\n**Step 2: Verify (no visual change yet, just ensure no TypeScript errors)**\n\n```bash\npnpm build 2>&1 | head -40\n```\n\nExpected: no TypeScript errors related to BentoCard.\n\n**Step 3: Commit**\n\n```bash\ngit add app/components/BentoCard/BentoCard.tsx\ngit commit -m \"feat: add BentoCard with 3D cursor-tilt and spotlight hover\"\n```\n\n---\n\n## Task 5: Create HeroCurvePanel component\n\n**Files:**\n- Create: `app/components/HeroCurvePanel/HeroCurvePanel.tsx`\n\nA purely presentational right-column panel for the Hero section. Shows an animated SVG scroll curve (no sliders) with three floating parameter badges.\n\n**Step 1: Create the file**\n\n```tsx\n\"use client\";\n\nimport { motion, useReducedMotion } from \"framer-motion\";\n\nconst SPRING = { type: \"spring\" as const, stiffness: 80, damping: 18 };\n\n// Pre-computed path representing a typical Mos smooth-scroll curve:\n// fast rise to peak, then smooth exponential decay.\n// ViewBox: 0 0 400 200 (y=200 is baseline, y=0 is max speed)\nconst CURVE_D =\n  \"M 0 192 C 8 192 18 28 48 16 S 96 14 128 22 S 192 52 248 102 S 320 162 400 188\";\n\nconst PARAMS = [\n  { label: \"STEP\", value: \"33.6\" },\n  { label: \"GAIN\", value: \"×2.7\" },\n  { label: \"DURATION\", value: \"4.35s\" },\n];\n\nexport function HeroCurvePanel() {\n  const shouldReduceMotion = useReducedMotion();\n\n  return (\n    <motion.div\n      className=\"hidden md:block w-[280px] lg:w-[320px] xl:w-[340px] shrink-0\"\n      initial={shouldReduceMotion ? false : { opacity: 0, y: 30 }}\n      animate={{ opacity: 1, y: 0 }}\n      transition={{ ...SPRING, delay: 0.34 }}\n    >\n      <motion.div\n        className=\"relative rounded-[var(--radius-card)] glass shadow-elevated border border-white/10 overflow-hidden p-5\"\n        style={{ transformPerspective: 1200 }}\n        whileHover={shouldReduceMotion ? {} : { rotateY: -3 }}\n        transition={SPRING}\n      >\n        {/* Panel label */}\n        <div className=\"font-display text-[10px] tracking-[0.22em] uppercase text-white/45 mb-4\">\n          Smooth Scroll Curve\n        </div>\n\n        {/* Animated SVG curve */}\n        <div className=\"rounded-2xl border border-white/8 bg-black/30 overflow-hidden\">\n          <svg\n            viewBox=\"0 0 400 200\"\n            className=\"block w-full h-auto\"\n            aria-hidden=\"true\"\n          >\n            <defs>\n              <linearGradient id=\"heroCurveFill\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n                <stop offset=\"0%\" stopColor=\"rgba(255,255,255,0.14)\" />\n                <stop offset=\"100%\" stopColor=\"rgba(255,255,255,0)\" />\n              </linearGradient>\n            </defs>\n\n            {/* Grid lines */}\n            <g stroke=\"rgba(255,255,255,0.06)\" strokeWidth=\"1\">\n              {[0, 1, 2, 3].map((i) => (\n                <line\n                  key={`vl-${i}`}\n                  x1={i * 133}\n                  y1=\"8\"\n                  x2={i * 133}\n                  y2=\"196\"\n                />\n              ))}\n              {[0, 1, 2, 3].map((i) => (\n                <line\n                  key={`hl-${i}`}\n                  x1=\"0\"\n                  y1={8 + i * 62}\n                  x2=\"400\"\n                  y2={8 + i * 62}\n                />\n              ))}\n            </g>\n\n            {/* Area fill under curve */}\n            <path\n              d={`${CURVE_D} L 400 192 L 0 192 Z`}\n              fill=\"url(#heroCurveFill)\"\n              opacity=\"0.9\"\n            />\n\n            {/* Animated stroke */}\n            <path\n              d={CURVE_D}\n              fill=\"none\"\n              stroke=\"rgba(255,255,255,0.90)\"\n              strokeWidth=\"2\"\n              strokeLinecap=\"round\"\n              strokeLinejoin=\"round\"\n              pathLength={1}\n              strokeDasharray={1}\n              strokeDashoffset={1}\n              style={{\n                animation: \"stroke-in 1200ms var(--ease-out) 500ms both\",\n              }}\n            />\n          </svg>\n        </div>\n\n        {/* Parameter badges */}\n        <div className=\"mt-4 grid grid-cols-3 gap-2\">\n          {PARAMS.map((p) => (\n            <div\n              key={p.label}\n              className=\"rounded-xl border border-white/8 bg-white/4 px-2.5 py-2\"\n            >\n              <div className=\"font-display text-[9px] tracking-[0.18em] uppercase text-white/40\">\n                {p.label}\n              </div>\n              <div className=\"mt-1 font-mono text-sm tabular-nums text-white/80\">\n                {p.value}\n              </div>\n            </div>\n          ))}\n        </div>\n      </motion.div>\n    </motion.div>\n  );\n}\n```\n\n**Step 2: Verify no TypeScript errors**\n\n```bash\npnpm build 2>&1 | head -40\n```\n\n**Step 3: Commit**\n\n```bash\ngit add app/components/HeroCurvePanel/HeroCurvePanel.tsx\ngit commit -m \"feat: add HeroCurvePanel static SVG curve for Hero right column\"\n```\n\n---\n\n## Task 6: Hero layout — split grid + FM entrance, upgraded typography\n\n**Files:**\n- Modify: `app/home-client.tsx`\n\nThis is the largest change. We:\n1. Import FM and HeroCurvePanel\n2. Replace CSS `motion-safe:animate-[hero-in_...]` on every hero element with `motion.div` FM stagger\n3. Upgrade hero font sizes\n4. Add the two-column grid wrapper\n5. Remove `min-h-screen` (keep only `min-h-[100dvh]`)\n\n**Step 1: Add imports at the top of home-client.tsx**\n\nAfter the existing imports, add:\n```tsx\nimport { motion, useReducedMotion } from \"framer-motion\";\nimport { HeroCurvePanel } from \"./components/HeroCurvePanel/HeroCurvePanel\";\n```\n\nAlso add `useReducedMotion` to the top-level component — add this inside `HomeClient()`:\n```tsx\nconst shouldReduceMotion = useReducedMotion();\n```\n\n**Step 2: Define hero spring at module level (above `HomeClient`)**\n\n```tsx\nconst HERO_SPRING = { type: \"spring\" as const, stiffness: 100, damping: 20 };\n\nfunction heroMotion(delayS: number, shouldReduceMotion: boolean | null) {\n  return {\n    initial: shouldReduceMotion ? false : ({ opacity: 0, y: 24 } as const),\n    animate: { opacity: 1, y: 0 } as const,\n    transition: { ...HERO_SPRING, delay: delayS },\n  };\n}\n```\n\n**Step 3: Replace the hero `<section>` in the JSX**\n\nFind the hero section (starts at `<section className=\"relative min-h-screen min-h-[100svh] ...`).\n\nReplace the entire section with the code below. Key changes:\n- `min-h-screen min-h-[100svh]` → `min-h-[100dvh]`\n- inner `<div className=\"w-full\">` → `<div className=\"w-full grid grid-cols-1 md:grid-cols-[1fr_auto] gap-12 lg:gap-20 items-center\">`\n- All hero elements wrapped in `<motion.div {...heroMotion(delay, shouldReduceMotion)}>`\n- Font sizes on `<h1>` upgraded\n- `<HeroCurvePanel />` added as second grid column\n\n```tsx\n<section className=\"relative min-h-[100dvh] pt-28 sm:pt-36 pb-10 sm:pb-12 flex flex-col\">\n  <div className=\"flex-1 flex items-center\">\n    <div className=\"w-full grid grid-cols-1 md:grid-cols-[1fr_auto] gap-12 lg:gap-20 items-center\">\n\n      {/* Left column */}\n      <div>\n        <motion.div\n          className=\"inline-flex items-center gap-3 rounded-full border border-white/10 bg-black/40 px-4 py-2 text-xs text-white/70 shadow-elevated\"\n          {...heroMotion(0, shouldReduceMotion)}\n        >\n          <span className=\"inline-flex items-center gap-2\">\n            <span className=\"h-2 w-2 rounded-full bg-[color:var(--accent)] shadow-[0_0_22px_rgba(255,255,255,0.35)]\" />\n            {t.hero.badgeLine1}\n          </span>\n          <span className=\"hidden sm:inline text-white/35\">•</span>\n          <span className=\"hidden sm:inline font-mono text-white/45\">\n            {t.hero.badgeLine2}\n          </span>\n        </motion.div>\n\n        <motion.h1\n          className=\"mt-7 font-display text-balance text-[52px] leading-[0.95] tracking-[-0.02em] sm:text-[88px] md:text-[108px] lg:text-[124px] text-white\"\n          {...heroMotion(0.08, shouldReduceMotion)}\n        >\n          {t.hero.titleLine1}\n          <span className=\"block\">\n            {t.hero.titleLine2Before}\n            <span\n              className=\"inline-block text-flow\"\n              style={{ textShadow: \"0 0 42px rgba(255,255,255,0.08)\" }}\n            >\n              {t.hero.titleLine2Highlight}\n            </span>\n            {t.hero.titleLine2After}\n          </span>\n        </motion.h1>\n\n        <motion.p\n          className=\"mt-5 max-w-2xl text-balance text-[15px] sm:text-lg text-white/72 leading-[1.7]\"\n          {...heroMotion(0.18, shouldReduceMotion)}\n        >\n          {t.hero.lead}\n        </motion.p>\n\n        <motion.div\n          className=\"mt-8 flex flex-col sm:flex-row sm:items-start gap-3 sm:gap-4\"\n          {...heroMotion(0.26, shouldReduceMotion)}\n        >\n          <div className=\"flex flex-col items-start w-fit\">\n            <Magnetic strength={22}>\n              <a\n                href={downloadUrl}\n                target=\"_blank\"\n                rel=\"noopener noreferrer\"\n                className=\"group relative overflow-hidden rounded-[18px] px-6 py-3.5 text-sm sm:text-base font-semibold tracking-wide text-black shadow-elevated border border-black/10 inline-flex items-center justify-center\"\n                style={{\n                  background:\n                    \"linear-gradient(180deg, rgba(255,255,255,0.96) 0%, rgba(255,255,255,0.84) 100%)\",\n                }}\n              >\n                <span className=\"relative z-10\">{t.hero.ctaDownload}</span>\n                <span className=\"absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity duration-500 [background:radial-gradient(800px_240px_at_30%_0%,rgba(0,0,0,0.18),transparent_55%)]\" />\n              </a>\n            </Magnetic>\n            <a\n              href=\"#homebrew\"\n              onClick={(e) => {\n                e.preventDefault();\n                scrollToHomebrew();\n              }}\n              className=\"mt-2 self-center text-xs font-mono text-white/50 hover:text-white/75 transition-colors underline decoration-white/15 hover:decoration-white/35 underline-offset-4\"\n            >\n              {t.hero.ctaInstallHomebrew}\n            </a>\n          </div>\n\n          <Magnetic strength={14}>\n            <a\n              href=\"https://github.com/Caldis/Mos\"\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n              className=\"group inline-flex items-center justify-center rounded-[18px] px-6 py-3.5 text-sm sm:text-base font-semibold tracking-wide text-white/85 border border-white/12 bg-white/5 hover:bg-white/8 transition-colors\"\n            >\n              <span className=\"mr-2 opacity-70 group-hover:opacity-100 transition-opacity\">↗</span>\n              <span>{t.hero.ctaViewGitHub}</span>\n            </a>\n          </Magnetic>\n\n          <div className=\"sm:ml-auto sm:self-center text-xs text-white/45\">\n            <div className=\"font-mono tabular-nums\">{t.hero.requirementsLine1}</div>\n            <div className=\"font-mono\">{t.hero.requirementsLine2}</div>\n          </div>\n        </motion.div>\n      </div>\n\n      {/* Right column — visible md+ only (hidden on mobile via HeroCurvePanel internals) */}\n      <HeroCurvePanel />\n    </div>\n  </div>\n\n  <div className=\"mt-8 sm:mt-10 flex items-center gap-3 text-white/40\">\n    <div className=\"h-[1px] flex-1 hairline\" />\n    <div className=\"font-mono text-[11px] tracking-[0.18em] uppercase\">\n      {t.hero.scrollHint}\n    </div>\n    <div className=\"h-[1px] flex-1 hairline\" />\n  </div>\n</section>\n```\n\n**Step 4: Remove `@keyframes hero-in` from globals.css**\n\nNow that hero elements use Framer Motion, the `hero-in` keyframe is unused. Open `app/globals.css` and delete the `@keyframes hero-in` block:\n\n```css\n/* DELETE THIS: */\n@keyframes hero-in {\n  from { ... }\n  to { ... }\n}\n```\n\n**Step 5: Visual verify on dev server**\n\n```bash\npnpm dev\n```\n\n- Hero should show two columns on desktop: left has large text + CTAs, right shows the curve panel\n- Each hero element should spring-in with stagger on page load\n- Mobile: curve panel is hidden, single column layout\n- Font sizes should be noticeably larger on desktop\n\n**Step 6: Commit**\n\n```bash\ngit add app/home-client.tsx app/globals.css\ngit commit -m \"feat: hero split layout with FM spring stagger, upgraded typography\"\n```\n\n---\n\n## Task 7: Bento grid asymmetric layout — 7+5 ↔ 5+7\n\n**Files:**\n- Modify: `app/home-client.tsx`\n\nChange the features section from `[12] / [6,6] / [12]` to `[7,5] / [5,7]`.\nWrap each card's inner `<div>` with `<BentoCard>`.\n\n**Step 1: Add BentoCard import at top of home-client.tsx**\n\n```tsx\nimport { BentoCard } from \"./components/BentoCard/BentoCard\";\n```\n\n**Step 2: Replace the bento grid section**\n\nFind the `<div className=\"mt-10 grid grid-cols-1 md:grid-cols-12 gap-4\">` block and replace it with:\n\n```tsx\n<div className=\"mt-10 grid grid-cols-1 md:grid-cols-12 gap-4\">\n  {/* Row 1: Easing (7) + Axes (5) */}\n  <Reveal className=\"md:col-span-7\" delayMs={140}>\n    <BentoCard>\n      <div className=\"relative p-6 sm:p-8\">\n        <div className=\"font-display text-[11px] tracking-[0.22em] uppercase text-white/50\">\n          {t.sectionFeel.cards.curves.kicker}\n        </div>\n        <div className=\"mt-4 text-2xl sm:text-3xl text-white font-semibold\">\n          {t.sectionFeel.cards.curves.title}\n        </div>\n        <p className=\"mt-3 text-white/62 leading-[1.7]\">\n          {t.sectionFeel.cards.curves.body}\n        </p>\n        <EasingPlayground className=\"mt-6\" />\n      </div>\n    </BentoCard>\n  </Reveal>\n\n  <Reveal className=\"md:col-span-5\" delayMs={200}>\n    <BentoCard>\n      <div className=\"relative p-6 sm:p-8\">\n        <div className=\"font-display text-[11px] tracking-[0.22em] uppercase text-white/50\">\n          {t.sectionFeel.cards.axes.kicker}\n        </div>\n        <div className=\"mt-4 text-2xl sm:text-3xl text-white font-semibold\">\n          {t.sectionFeel.cards.axes.title}\n        </div>\n        <p className=\"mt-3 text-white/62 leading-[1.7]\">\n          {t.sectionFeel.cards.axes.body}\n        </p>\n\n        <div className=\"mt-6 rounded-2xl border border-white/10 bg-black/30 p-5\">\n          <div className=\"space-y-3\">\n            {([\"Y\", \"X\"] as const).map((axis) => {\n              const row = axesDemo[axis];\n              return (\n                <div key={axis} className=\"flex items-center gap-3\">\n                  <div className=\"h-10 w-10 rounded-2xl border border-white/10 bg-white/5 grid place-items-center\">\n                    <span className=\"font-mono text-xs text-white/60\">{axis}</span>\n                  </div>\n\n                  <div className=\"flex flex-1 flex-wrap gap-2\">\n                    <div className=\"flex min-w-[150px] flex-1 items-center justify-between rounded-xl border border-white/10 bg-white/5 px-3 py-2\">\n                      <span className=\"font-mono text-[11px] text-white/60\">\n                        {t.sectionFeel.cards.axes.smooth}\n                      </span>\n                      <MiniToggle\n                        checked={row.smooth}\n                        onToggle={() => toggleAxis(axis, \"smooth\")}\n                        ariaLabel={`${axis} ${t.sectionFeel.cards.axes.smooth}`}\n                      />\n                    </div>\n\n                    <div className=\"flex min-w-[150px] flex-1 items-center justify-between rounded-xl border border-white/10 bg-white/5 px-3 py-2\">\n                      <span className=\"font-mono text-[11px] text-white/60\">\n                        {t.sectionFeel.cards.axes.reverse}\n                      </span>\n                      <MiniToggle\n                        checked={row.reverse}\n                        onToggle={() => toggleAxis(axis, \"reverse\")}\n                        ariaLabel={`${axis} ${t.sectionFeel.cards.axes.reverse}`}\n                      />\n                    </div>\n                  </div>\n                </div>\n              );\n            })}\n          </div>\n        </div>\n      </div>\n    </BentoCard>\n  </Reveal>\n\n  {/* Row 2: Per-App (5) + Buttons (7) — min-height taller than row 1 */}\n  <Reveal className=\"md:col-span-5\" delayMs={260}>\n    <BentoCard>\n      <div className=\"relative p-6 sm:p-8 min-h-[360px]\">\n        <div className=\"font-display text-[11px] tracking-[0.22em] uppercase text-white/50\">\n          {t.sectionFeel.cards.perApp.kicker}\n        </div>\n        <div className=\"mt-4 text-2xl sm:text-3xl text-white font-semibold\">\n          {t.sectionFeel.cards.perApp.title}\n        </div>\n        <p className=\"mt-3 text-white/62 leading-[1.7]\">\n          {t.sectionFeel.cards.perApp.body}\n        </p>\n\n        {/* 2×3 grid (was 3×2) with larger icons */}\n        <div className=\"mt-6 grid grid-cols-2 gap-3\">\n          {APP_PROFILES.map((a) => (\n            <div\n              key={a.id}\n              className=\"rounded-2xl border border-white/10 bg-white/5 p-3 flex items-center gap-3\"\n            >\n              <div className=\"h-12 w-12 shrink-0 rounded-xl border border-white/10 bg-black/20 overflow-hidden\">\n                <Image\n                  src={a.icon}\n                  alt=\"\"\n                  width={48}\n                  height={48}\n                  className=\"h-full w-full object-cover\"\n                />\n              </div>\n              <div>\n                <div className=\"font-mono text-[11px] text-white/65\">{a.name}</div>\n                {a.axes.Y.smooth && (\n                  <div className=\"mt-0.5 inline-flex items-center gap-1 rounded-full bg-white/8 border border-white/10 px-1.5 py-0.5\">\n                    <span className=\"h-1.5 w-1.5 rounded-full bg-white/60\" />\n                    <span className=\"font-mono text-[9px] text-white/50\">smooth</span>\n                  </div>\n                )}\n              </div>\n            </div>\n          ))}\n        </div>\n      </div>\n    </BentoCard>\n  </Reveal>\n\n  <Reveal className=\"md:col-span-7\" delayMs={320}>\n    <BentoCard>\n      <div className=\"relative p-6 sm:p-8 min-h-[360px]\">\n        <div className=\"font-display text-[11px] tracking-[0.22em] uppercase text-white/50\">\n          {t.sectionFeel.cards.buttons.kicker}\n        </div>\n        <div className=\"mt-4 text-2xl sm:text-3xl text-white font-semibold\">\n          {t.sectionFeel.cards.buttons.title}\n        </div>\n        <p className=\"mt-3 text-white/62 leading-[1.7]\">\n          {t.sectionFeel.cards.buttons.body}\n        </p>\n\n        <div className=\"mt-6 rounded-2xl border border-white/10 bg-black/30 p-5\">\n          <div className=\"font-mono text-xs text-white/45\">\n            {t.sectionFeel.cards.buttons.quickBind}\n          </div>\n          <div className=\"mt-3 grid gap-2\">\n            {[\n              {\n                k: t.sectionFeel.cards.buttons.rows.button4,\n                v: t.sectionFeel.cards.buttons.rows.missionControl,\n              },\n              {\n                k: t.sectionFeel.cards.buttons.rows.button5,\n                v: t.sectionFeel.cards.buttons.rows.nextSpace,\n              },\n              {\n                k: t.sectionFeel.cards.buttons.rows.wheelClick,\n                v: t.sectionFeel.cards.buttons.rows.appSwitcher,\n              },\n            ].map((row) => (\n              <div\n                key={row.k}\n                className=\"flex items-center justify-between rounded-xl border border-white/10 bg-white/5 px-3 py-2\"\n              >\n                <div className=\"font-mono text-xs text-white/75\">{row.k}</div>\n                <div className=\"font-mono text-xs text-white/45\">{row.v}</div>\n              </div>\n            ))}\n            {/* Pulsing \"recording\" placeholder row */}\n            <div className=\"flex items-center justify-between rounded-xl border border-white/8 bg-white/3 px-3 py-2 opacity-60\">\n              <div className=\"flex items-center gap-2\">\n                <span className=\"relative flex h-1.5 w-1.5\">\n                  <span className=\"animate-ping absolute inline-flex h-full w-full rounded-full bg-white/60 opacity-75\" />\n                  <span className=\"relative inline-flex rounded-full h-1.5 w-1.5 bg-white/40\" />\n                </span>\n                <div className=\"font-mono text-xs text-white/45\">—</div>\n              </div>\n              <div className=\"font-mono text-[10px] text-white/30 italic\">recording…</div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </BentoCard>\n  </Reveal>\n</div>\n```\n\n**Step 3: Visual verify**\n\n```bash\npnpm dev\n```\n\n- Desktop: two rows with 7+5 and 5+7 column spans\n- Per-app card shows 2×2 grid with larger icons + smooth badges\n- Buttons card has a pulsing \"recording...\" row at the bottom\n- Each card should tilt slightly when you hover over it (3D effect)\n- Spotlight follows cursor inside each card\n\n**Step 4: Commit**\n\n```bash\ngit add app/home-client.tsx\ngit commit -m \"feat: asymmetric bento grid 7+5/5+7, BentoCard 3D hover, per-app 2col, buttons pulse\"\n```\n\n---\n\n## Task 8: Update section header typography\n\n**Files:**\n- Modify: `app/home-client.tsx`\n\nUpgrade the \"Feel\" section header and download section header with new kicker tracking.\n\n**Step 1: Update section kicker tracking in Feel section**\n\nFind the `<h2>` block in the Feel section:\n```tsx\n<h2 className=\"font-display text-balance text-3xl sm:text-5xl text-white leading-tight\">\n```\nChange to:\n```tsx\n<h2 className=\"font-display text-balance text-3xl sm:text-5xl text-white leading-[0.95] tracking-[-0.01em]\">\n```\n\nFind the lead `<p>` in the Feel section:\n```tsx\n<p className=\"mt-4 max-w-3xl text-white/68 leading-relaxed\">\n```\nChange to:\n```tsx\n<p className=\"mt-4 max-w-3xl text-white/68 leading-[1.7]\">\n```\n\n**Step 2: Update download section header**\n\nFind the `<h3>` in the download section:\n```tsx\n<h3 className=\"font-display text-balance text-3xl sm:text-6xl text-white leading-tight\">\n```\nChange to:\n```tsx\n<h3 className=\"font-display text-balance text-3xl sm:text-6xl text-white leading-[0.95] tracking-[-0.015em]\">\n```\n\nFind the download lead `<p>`:\n```tsx\n<p className=\"mt-4 max-w-3xl text-white/68 leading-relaxed\">\n```\nChange to:\n```tsx\n<p className=\"mt-4 max-w-3xl text-white/68 leading-[1.7]\">\n```\n\n**Step 3: Commit**\n\n```bash\ngit add app/home-client.tsx\ngit commit -m \"style: tighten section header leading and tracking\"\n```\n\n---\n\n## Task 9: FlowField — longer particle trails\n\n**Files:**\n- Modify: `app/components/FlowField/FlowField.tsx`\n\n**Step 1: Reduce fill alpha for longer trails**\n\nIn `FlowField.tsx`, find the line inside the `tick` function:\n```tsx\nctx.fillStyle = `rgba(0, 0, 0, ${0.12 + scroll * 0.06})`;\n```\n\nChange to:\n```tsx\nctx.fillStyle = `rgba(0, 0, 0, ${0.08 + scroll * 0.05})`;\n```\n\nThis reduces the background erase alpha, making particle trails persist longer and creating a more fluid, flowing look.\n\n**Step 2: Commit**\n\n```bash\ngit add app/components/FlowField/FlowField.tsx\ngit commit -m \"style: longer FlowField particle trails (fill alpha 0.12→0.08)\"\n```\n\n---\n\n## Task 10: Pre-flight verification\n\n**Files:**\n- Modify: `app/home-client.tsx` (dvh check)\n- Run: `pnpm build`\n\n**Step 1: Verify `min-h-[100dvh]` is used**\n\nSearch the file for any remaining `min-h-screen` or `min-h-[100svh]`:\n```bash\ngrep -n \"min-h-screen\\|100svh\" /Users/caldis/Code/Mos/website/app/home-client.tsx\n```\n\nExpected: no matches (the hero section should already use `100dvh` from Task 6). If any found, replace with `min-h-[100dvh]`.\n\n**Step 2: Verify useReducedMotion is used in FM components**\n\nAll three FM components (Reveal, BentoCard, HeroCurvePanel) use `useReducedMotion`. Confirm:\n```bash\ngrep -n \"useReducedMotion\" \\\n  /Users/caldis/Code/Mos/website/app/components/Reveal/Reveal.tsx \\\n  /Users/caldis/Code/Mos/website/app/components/BentoCard/BentoCard.tsx \\\n  /Users/caldis/Code/Mos/website/app/components/HeroCurvePanel/HeroCurvePanel.tsx\n```\n\nExpected: one match per file.\n\n**Step 3: Production build — verify no TypeScript/build errors**\n\n```bash\ncd /Users/caldis/Code/Mos/website && pnpm build\n```\n\nExpected: `✓ Compiled successfully`. Fix any TypeScript errors before committing.\n\n**Step 4: Verify no purple/blue colors crept in**\n\n```bash\ngrep -rn \"purple\\|violet\\|indigo\\|blue\" /Users/caldis/Code/Mos/website/app/globals.css\n```\n\nExpected: no matches (monochrome constraint satisfied).\n\n**Step 5: Final commit**\n\n```bash\ngit add app/home-client.tsx\ngit commit -m \"feat: taste redesign pre-flight — dvh, reduced-motion, build verified\"\n```\n\n---\n\n## Summary of All Changes\n\n| File | Change |\n|------|--------|\n| `package.json` | Add `framer-motion@^11` |\n| `app/globals.css` | Material tokens, glass highlight, deeper shadows, remove `.reveal` CSS |\n| `app/components/Reveal/Reveal.tsx` | FM `useInView` + spring animation |\n| `app/components/BentoCard/BentoCard.tsx` | **New** — 3D hover tilt + cursor spotlight |\n| `app/components/HeroCurvePanel/HeroCurvePanel.tsx` | **New** — static SVG curve panel for hero |\n| `app/home-client.tsx` | Hero split grid, FM stagger entrance, asymmetric bento, typography |\n| `app/components/FlowField/FlowField.tsx` | Longer trails (fill alpha) |\n\n## Execution Order\n\nTasks must run in order (each task builds on the previous):\n1 → 2 → 3 → 4 → 5 → 6 → 7 → 8 → 9 → 10\n\nTasks 4 and 5 (BentoCard and HeroCurvePanel) are independent of each other and can be parallelized if using subagent-driven development.\n"
  },
  {
    "path": "website/eslint.config.mjs",
    "content": "import nextCoreWebVitals from \"eslint-config-next/core-web-vitals\";\nimport typescript from \"eslint-config-next/typescript\";\n\nconst config = [\n  ...nextCoreWebVitals,\n  ...typescript,\n  {\n    ignores: [\n      \"archive/**\",\n    ],\n  },\n];\n\nexport default config;\n"
  },
  {
    "path": "website/next-env.d.ts",
    "content": "/// <reference types=\"next\" />\n/// <reference types=\"next/image-types/global\" />\nimport \"./.next/dev/types/routes.d.ts\";\n\n// NOTE: This file should not be edited\n// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.\n"
  },
  {
    "path": "website/next.config.ts",
    "content": "import type { NextConfig } from \"next\";\n\nconst nextConfig: NextConfig = {\n  output: 'export',\n  // GitHub Pages (static hosting) serves /foo/ as /foo/index.html; avoid /foo.html URLs.\n  trailingSlash: true,\n  images: { unoptimized: true },\n};\n\nexport default nextConfig;\n"
  },
  {
    "path": "website/package.json",
    "content": "{\n  \"name\": \"mos-home\",\n  \"version\": \"0.1.0\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"next dev --turbopack\",\n    \"build\": \"next build && bash scripts/publish-docs.sh\",\n    \"start\": \"next start\",\n    \"lint\": \"eslint .\"\n  },\n  \"dependencies\": {\n    \"framer-motion\": \"^11.18.2\",\n    \"next\": \"16.1.6\",\n    \"react\": \"^19.0.0\",\n    \"react-dom\": \"^19.0.0\",\n    \"swr\": \"^2.3.0\"\n  },\n  \"devDependencies\": {\n    \"@eslint/eslintrc\": \"^0.1.0\",\n    \"@types/node\": \"^20\",\n    \"@types/react\": \"^19\",\n    \"@types/react-dom\": \"^19\",\n    \"autoprefixer\": \"^10.4.24\",\n    \"eslint\": \"^9\",\n    \"eslint-config-next\": \"^16.1.6\",\n    \"postcss\": \"^8\",\n    \"tailwindcss\": \"^3.4.1\",\n    \"typescript\": \"^5\"\n  },\n  \"overrides\": {\n    \"minimatch\": \"^10.2.1\",\n    \"ajv\": \"^8.18.0\"\n  }\n}\n"
  },
  {
    "path": "website/pnpm-workspace.yaml",
    "content": "onlyBuiltDependencies:\n  - sharp\n  - unrs-resolver\n"
  },
  {
    "path": "website/postcss.config.mjs",
    "content": "/** @type {import('postcss-load-config').Config} */\nconst config = {\n  plugins: {\n    tailwindcss: {},\n    autoprefixer: {},\n  },\n};\n\nexport default config;\n"
  },
  {
    "path": "website/public/llms.txt",
    "content": "# Mos (macOS)\n\nMos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent axis tuning, and button/shortcut bindings.\n\n## Official links\n\n- Homepage: https://mos.caldis.me/\n- GitHub: https://github.com/Caldis/Mos\n- Docs (Wiki): https://github.com/Caldis/Mos/wiki\n- Releases: https://github.com/Caldis/Mos/releases\n- Latest release: https://github.com/Caldis/Mos/releases/latest\n\n## Install\n\n- Homebrew (beta cask): `brew install --cask mos@beta`\n\n## Notes\n\n- License: CC BY-NC 4.0 (https://creativecommons.org/licenses/by-nc/4.0/)\n- Mos is not intended to be distributed via the Mac App Store (per project license notes).\n\n"
  },
  {
    "path": "website/scripts/publish-docs.sh",
    "content": "#!/usr/bin/env bash\nset -euo pipefail\n\nROOT_DOCS_DIR=\"../docs\"\nOUT_DIR=\"./out\"\nAPPCAST_FROM_BUILD=\"../build/appcast.xml\"\nRELEASE_NOTES_FROM_BUILD_DIR=\"../build/release-notes\"\nRELEASE_NOTES_PATH_IN_DOCS=\"release-notes\"\n\ndie() {\n  echo \"Error: $*\" >&2\n  exit 1\n}\n\ninfo() {\n  echo \"[publish-docs] $*\"\n}\n\n[[ -d \"$OUT_DIR\" ]] || die \"Missing Next export output directory: $OUT_DIR (did next build produce it?)\"\n[[ -d \"$ROOT_DOCS_DIR\" ]] || die \"Missing docs directory: $ROOT_DOCS_DIR\"\n\ntmp_dir=\"$(mktemp -d -t mos-docs-publish.XXXXXX)\"\ncleanup() { rm -rf \"$tmp_dir\"; }\ntrap cleanup EXIT\n\nappcast_tmp=\"$tmp_dir/appcast.xml\"\nrelease_notes_tmp=\"$tmp_dir/release-notes\"\nmkdir -p \"$release_notes_tmp\"\n\n# Prefer appcast generated by build/appcast.xml; otherwise preserve existing docs/appcast.xml.\nif [[ -f \"$APPCAST_FROM_BUILD\" ]]; then\n  cp \"$APPCAST_FROM_BUILD\" \"$appcast_tmp\"\nelif [[ -f \"$ROOT_DOCS_DIR/appcast.xml\" ]]; then\n  cp \"$ROOT_DOCS_DIR/appcast.xml\" \"$appcast_tmp\"\nfi\n\n# Preserve existing docs release notes, then overlay build release notes (newer wins on filename conflict).\nif [[ -d \"$ROOT_DOCS_DIR/$RELEASE_NOTES_PATH_IN_DOCS\" ]]; then\n  cp -R \"$ROOT_DOCS_DIR/$RELEASE_NOTES_PATH_IN_DOCS/.\" \"$release_notes_tmp/\" || true\nfi\nif [[ -d \"$RELEASE_NOTES_FROM_BUILD_DIR\" ]]; then\n  cp -R \"$RELEASE_NOTES_FROM_BUILD_DIR/.\" \"$release_notes_tmp/\" || true\nfi\n\ninfo \"Clearing $ROOT_DOCS_DIR\"\nrm -rf \"$ROOT_DOCS_DIR\"/*\n\ninfo \"Publishing $OUT_DIR -> $ROOT_DOCS_DIR\"\nmv \"$OUT_DIR\"/* \"$ROOT_DOCS_DIR\"\n\nif [[ -f \"CNAME\" ]]; then\n  cp \"CNAME\" \"$ROOT_DOCS_DIR/\"\nfi\ntouch \"$ROOT_DOCS_DIR/.nojekyll\"\n\nif [[ -f \"$appcast_tmp\" ]]; then\n  mv \"$appcast_tmp\" \"$ROOT_DOCS_DIR/appcast.xml\"\n  info \"Restored appcast.xml\"\nfi\n\nif [[ -n \"$(ls -A \"$release_notes_tmp\" 2>/dev/null || true)\" ]]; then\n  mkdir -p \"$ROOT_DOCS_DIR/$RELEASE_NOTES_PATH_IN_DOCS\"\n  cp -R \"$release_notes_tmp/.\" \"$ROOT_DOCS_DIR/$RELEASE_NOTES_PATH_IN_DOCS/\"\n  info \"Restored release notes\"\nfi\n\ninfo \"Done\"\n\n"
  },
  {
    "path": "website/tailwind.config.ts",
    "content": "import type { Config } from \"tailwindcss\";\n\nexport default {\n  content: [\n    \"./pages/**/*.{js,ts,jsx,tsx,mdx}\",\n    \"./components/**/*.{js,ts,jsx,tsx,mdx}\",\n    \"./app/**/*.{js,ts,jsx,tsx,mdx}\",\n  ],\n  theme: {\n    extend: {\n      opacity: {\n        \"3\": \"0.03\",\n        \"7\": \"0.07\",\n        \"8\": \"0.08\",\n        \"9\": \"0.09\",\n        \"12\": \"0.12\",\n        \"14\": \"0.14\",\n        \"28\": \"0.28\",\n        \"62\": \"0.62\",\n        \"66\": \"0.66\",\n        \"68\": \"0.68\",\n        \"72\": \"0.72\",\n        \"82\": \"0.82\",\n        \"92\": \"0.92\",\n      },\n    },\n  },\n  plugins: [],\n} satisfies Config;\n"
  },
  {
    "path": "website/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ES2017\",\n    \"lib\": [\n      \"dom\",\n      \"dom.iterable\",\n      \"esnext\"\n    ],\n    \"allowJs\": true,\n    \"skipLibCheck\": true,\n    \"strict\": true,\n    \"noEmit\": true,\n    \"esModuleInterop\": true,\n    \"module\": \"esnext\",\n    \"moduleResolution\": \"bundler\",\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"jsx\": \"react-jsx\",\n    \"incremental\": true,\n    \"plugins\": [\n      {\n        \"name\": \"next\"\n      }\n    ],\n    \"paths\": {\n      \"@/*\": [\n        \"./*\"\n      ]\n    }\n  },\n  \"include\": [\n    \"**/*.ts\",\n    \"**/*.tsx\",\n    \".next/types/**/*.ts\",\n    \"next-env.d.ts\",\n    \"../docs/types/**/*.ts\",\n    \".next/dev/types/**/*.ts\"\n  ],\n  \"exclude\": [\n    \"node_modules\"\n  ]\n}\n"
  },
  {
    "path": "website/tsconfig.tsbuildinfo",
    "content": "{\"fileNames\":[\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es5.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2016.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2017.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2018.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2019.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2020.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2021.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2022.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2023.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2024.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.esnext.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.dom.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.dom.iterable.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.core.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.collection.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.generator.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.iterable.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.promise.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.proxy.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.reflect.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.symbol.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2016.array.include.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2016.intl.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2017.date.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2017.object.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2017.string.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2017.intl.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2018.intl.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2018.promise.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2018.regexp.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2019.array.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2019.object.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2019.string.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2019.symbol.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2019.intl.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2020.bigint.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2020.date.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2020.promise.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2020.string.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2020.intl.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2020.number.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2021.promise.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2021.string.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2021.weakref.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2021.intl.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2022.array.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2022.error.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2022.intl.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2022.object.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2022.string.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2022.regexp.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2023.array.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2023.collection.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2023.intl.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2024.collection.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2024.object.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2024.promise.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2024.regexp.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2024.string.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.esnext.array.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.esnext.collection.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.esnext.intl.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.esnext.disposable.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.esnext.promise.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.esnext.decorators.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.esnext.iterator.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.esnext.float16.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.esnext.error.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.decorators.d.ts\",\"./node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.decorators.legacy.d.ts\",\"./node_modules/.pnpm/@types+react@19.1.12/node_modules/@types/react/global.d.ts\",\"./node_modules/.pnpm/csstype@3.1.3/node_modules/csstype/index.d.ts\",\"./node_modules/.pnpm/@types+react@19.1.12/node_modules/@types/react/index.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/styled-jsx/types/css.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/styled-jsx/types/macro.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/styled-jsx/types/style.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/styled-jsx/types/global.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/styled-jsx/types/index.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/get-page-files.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/compatibility/disposable.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/compatibility/indexable.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/compatibility/iterators.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/compatibility/index.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/globals.typedarray.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/buffer.buffer.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/header.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/readable.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/file.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/fetch.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/formdata.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/connector.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/client.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/errors.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/dispatcher.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-dispatcher.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-origin.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool-stats.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/handlers.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/balanced-pool.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/agent.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-interceptor.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-agent.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-client.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-pool.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-errors.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/proxy-agent.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/env-http-proxy-agent.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-handler.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-agent.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/api.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/interceptors.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/util.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cookies.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/patch.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/websocket.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/eventsource.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/filereader.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/diagnostics-channel.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/content-type.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cache.d.ts\",\"./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/index.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/globals.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/assert.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/assert/strict.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/async_hooks.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/buffer.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/child_process.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/cluster.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/console.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/constants.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/crypto.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/dgram.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/diagnostics_channel.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/dns.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/dns/promises.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/domain.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/dom-events.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/events.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/fs.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/fs/promises.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/http.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/http2.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/https.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/inspector.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/module.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/net.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/os.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/path.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/perf_hooks.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/process.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/punycode.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/querystring.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/readline.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/readline/promises.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/repl.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/sea.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/stream.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/stream/promises.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/stream/consumers.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/stream/web.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/string_decoder.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/test.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/timers.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/timers/promises.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/tls.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/trace_events.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/tty.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/url.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/util.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/v8.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/vm.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/wasi.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/worker_threads.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/zlib.d.ts\",\"./node_modules/.pnpm/@types+node@20.19.12/node_modules/@types/node/index.d.ts\",\"./node_modules/.pnpm/@types+react@19.1.12/node_modules/@types/react/canary.d.ts\",\"./node_modules/.pnpm/@types+react@19.1.12/node_modules/@types/react/experimental.d.ts\",\"./node_modules/.pnpm/@types+react-dom@19.1.9_@types+react@19.1.12/node_modules/@types/react-dom/index.d.ts\",\"./node_modules/.pnpm/@types+react-dom@19.1.9_@types+react@19.1.12/node_modules/@types/react-dom/canary.d.ts\",\"./node_modules/.pnpm/@types+react-dom@19.1.9_@types+react@19.1.12/node_modules/@types/react-dom/experimental.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/lib/fallback.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/compiled/webpack/webpack.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/shared/lib/modern-browserslist-target.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/shared/lib/entry-constants.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/shared/lib/constants.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/config.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/lib/load-custom-routes.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/shared/lib/image-config.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/build/webpack/plugins/subresource-integrity-plugin.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/body-streams.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/lib/cache-control.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/lib/setup-exception-listeners.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/lib/worker.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/lib/constants.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/lib/bundler.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/lib/experimental/ppr.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/lib/page-types.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/build/segment-config/app/app-segment-config.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/build/segment-config/pages/pages-segment-config.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/build/analysis/get-page-static-info.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/build/webpack/loaders/get-module-build-info.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/build/webpack/plugins/middleware-plugin.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/require-hook.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/node-polyfill-crypto.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/node-environment-baseline.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/node-environment-extensions/error-inspect.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/node-environment-extensions/console-file.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/node-environment-extensions/console-exit.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/node-environment-extensions/console-dim.external.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/node-environment-extensions/unhandled-rejection.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/node-environment-extensions/random.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/node-environment-extensions/date.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/node-environment-extensions/web-crypto.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/node-environment-extensions/node-crypto.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/node-environment-extensions/fast-set-immediate.external.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/node-environment.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/build/page-extensions-type.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/route-kind.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/route-definitions/route-definition.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/route-definitions/app-page-route-definition.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/lib/cache-handlers/types.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/response-cache/types.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/resume-data-cache/cache-store.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/resume-data-cache/resume-data-cache.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/components/app-router-headers.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/render-result.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/instrumentation/types.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/lib/coalesced-function.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/shared/lib/router/utils/middleware-route-matcher.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/lib/router-utils/types.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/trace/types.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/trace/trace.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/trace/shared.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/trace/index.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/build/load-jsconfig.d.ts\",\"./node_modules/.pnpm/@next+env@16.1.6/node_modules/@next/env/dist/index.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/build/webpack/plugins/telemetry-plugin/use-cache-tracker-utils.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/build/webpack/plugins/telemetry-plugin/telemetry-plugin.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/telemetry/storage.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/build/build-context.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/shared/lib/bloom-filter.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/build/webpack-config.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/build/swc/generated-native.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/build/swc/types.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/dev/parse-version-info.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/next-devtools/shared/types.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/dev/dev-indicator-server-state.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/next-devtools/dev-overlay/cache-indicator.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/lib/parse-stack.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/next-devtools/server/shared.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/next-devtools/shared/stack-frame.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/next-devtools/dev-overlay/utils/get-error-by-type.d.ts\",\"./node_modules/.pnpm/@types+react@19.1.12/node_modules/@types/react/jsx-runtime.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/next-devtools/dev-overlay/container/runtime-error/render-error.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/next-devtools/dev-overlay/shared.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/dev/debug-channel.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/dev/hot-reloader-types.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/lib/i18n-provider.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/web/next-url.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/compiled/@edge-runtime/cookies/index.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/web/spec-extension/cookies.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/web/spec-extension/request.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/after/builtin-request-context.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/web/spec-extension/fetch-event.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/web/spec-extension/response.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/build/segment-config/middleware/middleware-config.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/web/types.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/build/webpack/plugins/pages-manifest-plugin.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/shared/lib/router/utils/parse-url.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/route-definitions/locale-route-definition.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/route-definitions/pages-route-definition.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/build/webpack/plugins/flight-manifest-plugin.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/build/webpack/plugins/next-font-manifest-plugin.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/shared/lib/deep-readonly.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/next-devtools/userspace/pages/pages-dev-overlay-setup.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/render.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/shared/lib/mitt.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/with-router.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/router.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/route-loader.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/page-loader.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/shared/lib/router/router.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/shared/lib/router-context.shared-runtime.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/shared/lib/loadable-context.shared-runtime.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/shared/lib/loadable.shared-runtime.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/shared/lib/image-config-context.shared-runtime.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/components/readonly-url-search-params.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/shared/lib/hooks-client-context.shared-runtime.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/shared/lib/head-manager-context.shared-runtime.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/shared/lib/app-router-types.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/flight-data-helpers.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/components/router-reducer/ppr-navigations.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/components/segment-cache/types.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/components/segment-cache/navigation.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/components/segment-cache/cache-key.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/components/router-reducer/fetch-server-response.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/components/router-reducer/router-reducer-types.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/shared/lib/app-router-context.shared-runtime.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/shared/lib/server-inserted-html.shared-runtime.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/route-modules/pages/vendored/contexts/entrypoints.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/route-modules/pages/module.compiled.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/build/templates/pages.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/route-modules/pages/module.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/route-modules/pages/builtin/_error.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/load-default-error-components.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/base-http/node.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/response-cache/index.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/route-definitions/pages-api-route-definition.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/route-matches/pages-api-route-match.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/route-matchers/route-matcher.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/route-matcher-providers/route-matcher-provider.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/route-matcher-managers/route-matcher-manager.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/normalizers/normalizer.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/normalizers/locale-route-normalizer.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/normalizers/request/pathname-normalizer.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/normalizers/request/suffix.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/normalizers/request/rsc.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/normalizers/request/next-data.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/normalizers/request/segment-prefix-rsc.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/build/static-paths/types.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/base-server.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/lib/async-callback-set.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/shared/lib/router/utils/route-regex.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/shared/lib/router/utils/route-matcher.d.ts\",\"./node_modules/.pnpm/sharp@0.34.5/node_modules/sharp/lib/index.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/image-optimizer.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/next-server.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/lib/types.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/lib/lru-cache.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/lib/dev-bundler-service.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/use-cache/cache-life.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/dev/static-paths-worker.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/dev/next-dev-server.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/next.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/lib/render-server.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/lib/router-server.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/shared/lib/router/utils/path-match.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/lib/router-utils/filesystem.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/lib/router-utils/setup-dev-bundler.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/lib/router-utils/router-server-context.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/route-modules/route-module.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/load-components.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/web/adapter.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/app-render/types.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/build/webpack/loaders/metadata/types.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/build/webpack/loaders/next-app-loader/index.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/lib/app-dir-module.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/web/spec-extension/adapters/request-cookies.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/async-storage/draft-mode-provider.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/web/spec-extension/adapters/headers.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/app-render/cache-signal.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/app-render/dynamic-rendering.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/request/fallback-params.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/app-render/work-unit-async-storage-instance.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/lib/lazy-result.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/lib/implicit-tags.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/app-render/staged-rendering.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/app-render/work-unit-async-storage.external.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/shared/lib/router/utils/parse-relative-url.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/app-render/app-render.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/route-modules/app-page/vendored/contexts/entrypoints.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/components/error-boundary.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/components/layout-router.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/components/render-from-template-context.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/app-render/action-async-storage-instance.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/app-render/action-async-storage.external.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/components/client-page.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/components/client-segment.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/request/search-params.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/components/hooks-server-context.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/components/http-access-fallback/error-boundary.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/lib/metadata/types/alternative-urls-types.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/lib/metadata/types/extra-types.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/lib/metadata/types/metadata-types.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/lib/metadata/types/manifest-types.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/lib/metadata/types/opengraph-types.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/lib/metadata/types/twitter-types.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/lib/metadata/types/metadata-interface.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/lib/metadata/types/resolvers.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/lib/metadata/types/icons.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/lib/metadata/resolve-metadata.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/lib/metadata/metadata.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/lib/framework/boundary-components.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/app-render/rsc/preloads.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/app-render/rsc/postpone.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/app-render/rsc/taint.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/shared/lib/segment-cache/segment-value-encoding.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/app-render/collect-segment-data.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/next-devtools/userspace/app/segment-explorer-node.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/app-render/entry-base.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/build/templates/app-page.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/build/rendering-mode.d.ts\",\"./node_modules/.pnpm/@types+react@19.1.12/node_modules/@types/react/jsx-dev-runtime.d.ts\",\"./node_modules/.pnpm/@types+react@19.1.12/node_modules/@types/react/compiler-runtime.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/entrypoints.d.ts\",\"./node_modules/.pnpm/@types+react-dom@19.1.9_@types+react@19.1.12/node_modules/@types/react-dom/client.d.ts\",\"./node_modules/.pnpm/@types+react-dom@19.1.9_@types+react@19.1.12/node_modules/@types/react-dom/server.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/route-modules/app-page/vendored/ssr/entrypoints.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/route-modules/app-page/module.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/route-modules/app-page/module.compiled.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/route-definitions/app-route-route-definition.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/async-storage/work-store.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/web/http.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/route-modules/app-route/shared-modules.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/components/redirect-status-code.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/components/redirect-error.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/build/templates/app-route.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/route-modules/app-route/module.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/route-modules/app-route/module.compiled.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/build/segment-config/app/app-segments.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/build/utils.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/lib/router-utils/build-prefetch-segment-data-route.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/build/turborepo-access-trace/types.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/build/turborepo-access-trace/result.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/build/turborepo-access-trace/helpers.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/build/turborepo-access-trace/index.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/export/routes/types.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/export/types.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/export/worker.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/build/worker.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/build/index.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/lib/incremental-cache/index.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/after/after.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/after/after-context.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/app-render/work-async-storage-instance.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/app-render/create-error-handler.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/shared/lib/action-revalidation-kind.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/app-render/work-async-storage.external.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/request/params.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/route-matches/route-match.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/request-meta.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/cli/next-test.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/shared/lib/size-limit.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/config-shared.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/base-http/index.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/api-utils/index.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/build/adapter/build-complete.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/types.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/shared/lib/html-context.shared-runtime.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/shared/lib/utils.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/pages/_app.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/app.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/web/spec-extension/unstable-cache.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/web/spec-extension/revalidate.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/web/spec-extension/unstable-no-store.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/use-cache/cache-tag.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/cache.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/pages/_document.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/document.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/shared/lib/dynamic.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dynamic.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/pages/_error.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/error.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/shared/lib/head.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/head.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/request/cookies.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/request/headers.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/request/draft-mode.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/headers.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/shared/lib/get-img-props.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/image-component.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/shared/lib/image-external.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/image.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/link.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/link.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/components/unrecognized-action-error.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/components/redirect.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/components/not-found.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/components/forbidden.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/components/unauthorized.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/components/unstable-rethrow.server.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/components/unstable-rethrow.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/components/navigation.react-server.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/components/navigation.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/navigation.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/router.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/script.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/script.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/web/spec-extension/user-agent.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/compiled/@edge-runtime/primitives/url.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/web/spec-extension/image-response.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/compiled/@vercel/og/satori/index.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/compiled/@vercel/og/emoji/index.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/compiled/@vercel/og/types.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/after/index.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/server/request/connection.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/server.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/types/global.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/types/compiled.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/types.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/index.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/image-types/global.d.ts\",\"./.next/types/routes.d.ts\",\"./next-env.d.ts\",\"./next.config.ts\",\"./node_modules/.pnpm/source-map-js@1.2.1/node_modules/source-map-js/source-map.d.ts\",\"./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/previous-map.d.ts\",\"./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/input.d.ts\",\"./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/css-syntax-error.d.ts\",\"./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/declaration.d.ts\",\"./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/root.d.ts\",\"./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/warning.d.ts\",\"./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/lazy-result.d.ts\",\"./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/no-work-result.d.ts\",\"./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/processor.d.ts\",\"./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/result.d.ts\",\"./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/document.d.ts\",\"./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/rule.d.ts\",\"./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/node.d.ts\",\"./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/comment.d.ts\",\"./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/container.d.ts\",\"./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/at-rule.d.ts\",\"./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/list.d.ts\",\"./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/postcss.d.ts\",\"./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/postcss.d.mts\",\"./node_modules/.pnpm/tailwindcss@3.4.17/node_modules/tailwindcss/types/generated/corepluginlist.d.ts\",\"./node_modules/.pnpm/tailwindcss@3.4.17/node_modules/tailwindcss/types/generated/colors.d.ts\",\"./node_modules/.pnpm/tailwindcss@3.4.17/node_modules/tailwindcss/types/config.d.ts\",\"./node_modules/.pnpm/tailwindcss@3.4.17/node_modules/tailwindcss/types/index.d.ts\",\"./tailwind.config.ts\",\"./app/site.ts\",\"./app/robots.ts\",\"./app/sitemap.ts\",\"./app/components/modal/hooks.ts\",\"./app/i18n/el.ts\",\"./app/i18n/en.ts\",\"./app/i18n/id.ts\",\"./app/i18n/ja.ts\",\"./app/i18n/ko.ts\",\"./app/i18n/pl.ts\",\"./app/i18n/ru.ts\",\"./app/i18n/tr.ts\",\"./app/i18n/uk.ts\",\"./app/i18n/zh.ts\",\"./app/i18n/zh-hant.ts\",\"./app/i18n/context.tsx\",\"./app/i18n/de.ts\",\"./app/i18n/format.ts\",\"./node_modules/.pnpm/swr@2.3.6_react@19.1.1/node_modules/swr/dist/_internal/events.d.mts\",\"./node_modules/.pnpm/swr@2.3.6_react@19.1.1/node_modules/swr/dist/_internal/types.d.mts\",\"./node_modules/.pnpm/swr@2.3.6_react@19.1.1/node_modules/swr/dist/_internal/constants.d.mts\",\"./node_modules/.pnpm/dequal@2.0.3/node_modules/dequal/index.d.ts\",\"./node_modules/.pnpm/swr@2.3.6_react@19.1.1/node_modules/swr/dist/_internal/index.d.mts\",\"./node_modules/.pnpm/swr@2.3.6_react@19.1.1/node_modules/swr/dist/index/index.d.mts\",\"./app/services/utils.ts\",\"./app/services/github.ts\",\"./app/components/flowfield/flowfield.tsx\",\"./app/components/modal/modal.tsx\",\"./app/components/magnetic/magnetic.tsx\",\"./app/components/languageselector/languageselector.tsx\",\"./node_modules/.pnpm/motion-dom@11.18.1/node_modules/motion-dom/dist/index.d.ts\",\"./node_modules/.pnpm/motion-utils@11.18.1/node_modules/motion-utils/dist/index.d.ts\",\"./node_modules/.pnpm/framer-motion@11.18.2_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/framer-motion/dist/index.d.ts\",\"./app/components/reveal/reveal.tsx\",\"./app/components/easingplayground/easingplayground.tsx\",\"./app/components/copybutton/copybutton.tsx\",\"./app/components/herocurvepanel/herocurvepanel.tsx\",\"./app/components/bentocard/bentocard.tsx\",\"./app/home-client.tsx\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/compiled/@next/font/dist/types.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/compiled/@next/font/dist/google/index.d.ts\",\"./node_modules/.pnpm/next@16.1.6_@babel+core@7.29.0_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/font/google/index.d.ts\",\"./app/providers.tsx\",\"./app/layout.tsx\",\"./app/page.tsx\",\"./.next/types/validator.ts\",\"./.next/dev/types/cache-life.d.ts\",\"./.next/dev/types/routes.d.ts\",\"./.next/dev/types/validator.ts\",\"./node_modules/@types/estree/index.d.ts\",\"./node_modules/@types/json-schema/index.d.ts\",\"./node_modules/@types/json5/index.d.ts\"],\"fileIdsList\":[[97,139,456,457,458,459],[97,139],[97,139,266,503,577,578,581],[97,139,266,503,506,577,578],[85,97,139,266,566],[85,97,139,266],[85,97,139,266,549],[97,139,266,566],[97,139,266,537,549,561,562],[85,97,139,191,193,266],[85,97,139,266,476,505,549,551,559,560,562,563,566,567,568,569,570,571],[85,97,139,266,538,539,540,541,542,543,544,545,546,547,548,550],[97,139,266,549],[97,139,266],[97,139,266,491,534,575,576],[97,139,266,504,534,572],[97,139,266,504,534],[97,139,266,557,558],[97,139,504,505,506],[97,139,266,504],[97,136,139],[97,138,139],[139],[97,139,144,173],[97,139,140,145,151,159,170,181],[97,139,140,141,151,159],[92,93,94,97,139],[97,139,142,182],[97,139,143,144,152,160],[97,139,144,170,178],[97,139,145,147,151,159],[97,138,139,146],[97,139,147,148],[97,139,149,151],[97,138,139,151],[97,139,151,152,153,170,181],[97,139,151,152,153,166,170,173],[97,134,139],[97,139,147,151,154,159,170,181],[97,139,151,152,154,155,159,170,178,181],[97,139,154,156,170,178,181],[95,96,97,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187],[97,139,151,157],[97,139,158,181,186],[97,139,147,151,159,170],[97,139,160],[97,139,161],[97,138,139,162],[97,136,137,138,139,140,141,142,143,144,145,146,147,148,149,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187],[97,139,164],[97,139,165],[97,139,151,166,167],[97,139,166,168,182,184],[97,139,151,170,171,173],[97,139,172,173],[97,139,170,171],[97,139,173],[97,139,174],[97,136,139,170,175],[97,139,151,176,177],[97,139,176,177],[97,139,144,159,170,178],[97,139,179],[97,139,159,180],[97,139,154,165,181],[97,139,144,182],[97,139,170,183],[97,139,158,184],[97,139,185],[97,139,151,153,162,170,173,181,184,186],[97,139,170,187],[85,89,97,139,189,190,191,193,451,497],[85,97,139],[85,89,97,139,189,190,191,192,409,451,497],[85,97,139,193,409],[85,89,97,139,190,192,193,451,497],[85,89,97,139,189,192,193,451,497],[83,84,97,139],[85,97,139,266,564,565],[97,139,454],[97,139,198,200,204,215,405,434,447],[97,139,200,210,211,212,214,447],[97,139,200,247,249,251,252,255,447,449],[97,139,200,204,206,207,208,238,333,405,424,425,433,447,449],[97,139,447],[97,139,211,303,413,422,442],[97,139,200],[97,139,194,303,442],[97,139,257],[97,139,256,447],[97,139,154,403,413,502],[97,139,154,371,383,422,441],[97,139,154,314],[97,139,427],[97,139,426,427,428],[97,139,426],[91,97,139,154,194,200,204,207,209,211,215,216,229,230,257,333,344,423,434,447,451],[97,139,198,200,213,247,248,253,254,447,502],[97,139,213,502],[97,139,198,230,358,447,502],[97,139,502],[97,139,200,213,214,502],[97,139,250,502],[97,139,216,424,432],[97,139,165,266,442],[97,139,266,442],[85,97,139,375],[97,139,301,311,312,442,479,486],[97,139,300,419,480,481,482,483,485],[97,139,418],[97,139,418,419],[97,139,238,303,304,308],[97,139,303],[97,139,303,307,309],[97,139,303,304,305,306],[97,139,484],[85,97,139,201,473],[85,97,139,181],[85,97,139,213,293],[85,97,139,213,434],[97,139,291,295],[85,97,139,292,453],[97,139,573],[85,89,97,139,154,188,189,190,192,193,451,495,496],[97,139,154],[97,139,154,204,237,289,334,355,357,429,430,434,447,448],[97,139,229,431],[97,139,451],[97,139,199],[85,97,139,360,373,382,392,394,441],[97,139,165,360,373,391,392,393,441,501],[97,139,385,386,387,388,389,390],[97,139,387],[97,139,391],[97,139,264,265,266,268],[85,97,139,258,259,260,261,267],[97,139,264,267],[97,139,262],[97,139,263],[85,97,139,266,292,453],[85,97,139,266,452,453],[85,97,139,266,453],[97,139,334,436],[97,139,436],[97,139,154,448,453],[97,139,379],[97,138,139,378],[97,139,239,303,320,357,366,369,371,372,412,441,444,448],[97,139,285,303,400],[97,139,371,441],[85,97,139,371,376,377,379,380,381,382,383,384,395,396,397,398,399,401,402,441,442,502],[97,139,365],[97,139,154,165,201,237,240,261,286,287,334,344,355,356,412,435,447,448,449,451,502],[97,139,441],[97,138,139,211,287,344,368,435,437,438,439,440,448],[97,139,371],[97,138,139,237,274,320,361,362,363,364,365,366,367,369,370,441,442],[97,139,154,274,275,361,448,449],[97,139,211,334,344,357,435,441,448],[97,139,154,447,449],[97,139,154,170,444,448,449],[97,139,154,165,181,194,204,213,239,240,242,271,276,281,285,286,287,289,318,320,322,325,327,330,331,332,333,355,357,434,435,442,444,447,448,449],[97,139,154,170],[97,139,200,201,202,209,444,445,446,451,453,502],[97,139,198,447],[97,139,270],[97,139,154,170,181,232,255,257,258,259,260,261,268,269,502],[97,139,165,181,194,232,247,280,281,282,318,319,320,325,333,334,340,343,345,355,357,435,442,444,447],[97,139,209,216,229,333,344,435,447],[97,139,154,181,201,204,320,338,444,447],[97,139,359],[97,139,154,270,341,342,352],[97,139,444,447],[97,139,366,368],[97,139,287,320,434,453],[97,139,154,165,243,247,319,325,340,343,347,444],[97,139,154,216,229,247,348],[97,139,200,242,350,434,447],[97,139,154,181,261,447],[97,139,154,213,241,242,243,252,270,349,351,434,447],[91,97,139,154,287,354,451,453],[97,139,317,355],[97,139,154,165,181,204,215,216,229,239,240,276,280,281,282,286,318,319,320,322,334,335,337,339,355,357,434,435,442,443,444,453],[97,139,154,170,216,340,346,352,444],[97,139,219,220,221,222,223,224,225,226,227,228],[97,139,271,326],[97,139,328],[97,139,326],[97,139,328,329],[97,139,154,204,207,237,238,448],[97,139,154,165,199,201,239,285,286,287,288,316,355,444,449,451,453],[97,139,154,165,181,203,238,288,320,366,435,443,448],[97,139,361],[97,139,362],[97,139,303,333,412],[97,139,363],[97,139,231,235],[97,139,154,204,231,239],[97,139,234,235],[97,139,236],[97,139,231,232],[97,139,231,283],[97,139,231],[97,139,271,324,443],[97,139,323],[97,139,232,442,443],[97,139,321,443],[97,139,232,442],[97,139,412],[97,139,204,233,239,287,303,320,354,357,360,366,373,374,404,405,408,411,434,444,448],[97,139,296,299,301,302,311,312],[85,97,139,191,193,266,406,407],[85,97,139,191,193,266,406,407,410],[97,139,421],[97,139,211,275,287,354,357,371,379,383,414,415,416,417,419,420,423,434,441,447],[97,139,311],[97,139,154,316],[97,139,316],[97,139,154,239,284,289,313,315,354,444,451,453],[97,139,296,297,298,299,301,302,311,312,452],[91,97,139,154,165,181,231,232,240,286,287,320,352,353,355,434,435,444,447,448,451],[97,139,275,277,280,435],[97,139,154,271,447],[97,139,274,371],[97,139,273],[97,139,275,276],[97,139,272,274,447],[97,139,154,203,275,277,278,279,447,448],[85,97,139,303,310,442],[97,139,196,197],[85,97,139,201],[85,97,139,300,442],[85,91,97,139,286,287,451,453],[97,139,201,473,474],[85,97,139,295],[85,97,139,165,181,199,254,290,292,294,453],[97,139,213,442,448],[97,139,336,442],[85,97,139,152,154,165,198,199,249,295,451,452],[85,97,139,189,190,192,193,451,497],[85,86,87,88,89,97,139],[97,139,144],[97,139,244,245,246],[97,139,244],[85,89,97,139,154,156,165,188,189,190,191,192,193,194,199,240,347,391,449,450,453,497],[97,139,461],[97,139,463],[97,139,465],[97,139,574],[97,139,467],[97,139,469,470,471],[97,139,475],[90,97,139,455,460,462,464,466,468,472,476,478,488,489,491,500,501,502,503],[97,139,477],[97,139,487],[97,139,292],[97,139,490],[97,138,139,275,277,278,280,492,493,494,497,498,499],[97,139,188],[97,139,524],[97,139,522,524],[97,139,513,521,522,523,525,527],[97,139,511],[97,139,514,519,524,527],[97,139,510,527],[97,139,514,515,518,519,520,527],[97,139,514,515,516,518,519,527],[97,139,511,512,513,514,515,519,520,521,523,524,525,527],[97,139,527],[97,139,509,511,512,513,514,515,516,518,519,520,521,522,523,524,525,526],[97,139,509,527],[97,139,514,516,517,519,520,527],[97,139,518,527],[97,139,519,520,524,527],[97,139,512,522],[97,139,170,188],[85,97,139,552,553,554,555],[97,139,552,557],[85,97,139,556],[97,139,529,530],[97,139,528,531],[97,106,110,139,181],[97,106,139,170,181],[97,101,139],[97,103,106,139,178,181],[97,139,159,178],[97,101,139,188],[97,103,106,139,159,181],[97,98,99,102,105,139,151,170,181],[97,106,113,139],[97,98,104,139],[97,106,127,128,139],[97,102,106,139,173,181,188],[97,127,139,188],[97,100,101,139,188],[97,106,139],[97,100,101,102,103,104,105,106,107,108,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,128,129,130,131,132,133,139],[97,106,121,139],[97,106,113,114,139],[97,104,106,114,115,139],[97,105,139],[97,98,101,106,139],[97,106,110,114,115,139],[97,110,139],[97,104,106,109,139,181],[97,98,103,106,113,139],[97,139,170],[97,101,106,127,139,186,188],[97,139,266,532]],\"fileInfos\":[{\"version\":\"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4\",\"impliedFormat\":1},{\"version\":\"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75\",\"impliedFormat\":1},{\"version\":\"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962\",\"impliedFormat\":1},{\"version\":\"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8\",\"impliedFormat\":1},{\"version\":\"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7\",\"impliedFormat\":1},{\"version\":\"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4\",\"impliedFormat\":1},{\"version\":\"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569\",\"impliedFormat\":1},{\"version\":\"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2\",\"impliedFormat\":1},{\"version\":\"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10\",\"impliedFormat\":1},{\"version\":\"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe\",\"impliedFormat\":1},{\"version\":\"2ab096661c711e4a81cc464fa1e6feb929a54f5340b46b0a07ac6bbf857471f0\",\"impliedFormat\":1},{\"version\":\"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"60037901da1a425516449b9a20073aa03386cce92f7a1fd902d7602be3a7c2e9\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"22adec94ef7047a6c9d1af3cb96be87a335908bf9ef386ae9fd50eeb37f44c47\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"4245fee526a7d1754529d19227ecbf3be066ff79ebb6a380d78e41648f2f224d\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"73f78680d4c08509933daf80947902f6ff41b6230f94dd002ae372620adb0f60\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"c5239f5c01bcfa9cd32f37c496cf19c61d69d37e48be9de612b541aac915805b\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"170d4db14678c68178ee8a3d5a990d5afb759ecb6ec44dbd885c50f6da6204f6\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9\",\"impliedFormat\":1},{\"version\":\"bea6c0f5b819cf8cba6608bf3530089119294f949640714011d46ec8013b61c2\",\"impliedFormat\":1},{\"version\":\"acd8fd5090ac73902278889c38336ff3f48af6ba03aa665eb34a75e7ba1dccc4\",\"impliedFormat\":1},{\"version\":\"d6258883868fb2680d2ca96bc8b1352cab69874581493e6d52680c5ffecdb6cc\",\"impliedFormat\":1},{\"version\":\"1b61d259de5350f8b1e5db06290d31eaebebc6baafd5f79d314b5af9256d7153\",\"impliedFormat\":1},{\"version\":\"f258e3960f324a956fc76a3d3d9e964fff2244ff5859dcc6ce5951e5413ca826\",\"impliedFormat\":1},{\"version\":\"643f7232d07bf75e15bd8f658f664d6183a0efaca5eb84b48201c7671a266979\",\"impliedFormat\":1},{\"version\":\"21da358700a3893281ce0c517a7a30cbd46be020d9f0c3f2834d0a8ad1f5fc75\",\"impliedFormat\":1},{\"version\":\"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a\",\"impliedFormat\":1},{\"version\":\"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"49a5a44f2e68241a1d2bd9ec894535797998841c09729e506a7cbfcaa40f2180\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f\",\"impliedFormat\":1},{\"version\":\"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4\",\"impliedFormat\":1},{\"version\":\"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc\",\"impliedFormat\":1},{\"version\":\"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8\",\"impliedFormat\":1},{\"version\":\"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21\",\"impliedFormat\":1},{\"version\":\"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195\",\"impliedFormat\":1},{\"version\":\"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75\",\"impliedFormat\":1},{\"version\":\"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43\",\"impliedFormat\":1},{\"version\":\"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5\",\"impliedFormat\":1},{\"version\":\"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd\",\"impliedFormat\":1},{\"version\":\"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20\",\"impliedFormat\":1},{\"version\":\"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219\",\"impliedFormat\":1},{\"version\":\"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7\",\"impliedFormat\":1},{\"version\":\"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb\",\"impliedFormat\":1},{\"version\":\"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882\",\"impliedFormat\":1},{\"version\":\"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd\",\"impliedFormat\":1},{\"version\":\"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e\",\"impliedFormat\":1},{\"version\":\"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9\",\"impliedFormat\":1},{\"version\":\"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a\",\"impliedFormat\":1},{\"version\":\"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da\",\"impliedFormat\":1},{\"version\":\"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2\",\"impliedFormat\":1},{\"version\":\"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43\",\"impliedFormat\":1},{\"version\":\"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9\",\"impliedFormat\":1},{\"version\":\"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17\",\"impliedFormat\":1},{\"version\":\"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e\",\"impliedFormat\":1},{\"version\":\"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6\",\"impliedFormat\":1},{\"version\":\"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8\",\"impliedFormat\":1},{\"version\":\"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a\",\"impliedFormat\":1},{\"version\":\"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2\",\"impliedFormat\":1},{\"version\":\"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f\",\"impliedFormat\":1},{\"version\":\"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656\",\"impliedFormat\":1},{\"version\":\"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88\",\"impliedFormat\":1},{\"version\":\"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00\",\"impliedFormat\":1},{\"version\":\"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f\",\"impliedFormat\":1},{\"version\":\"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6\",\"impliedFormat\":1},{\"version\":\"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605\",\"impliedFormat\":1},{\"version\":\"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107\",\"impliedFormat\":1},{\"version\":\"1ca84b44ad1d8e4576f24904d8b95dd23b94ea67e1575f89614ac90062fc67f4\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"6d586db0a09a9495ebb5dece28f54df9684bfbd6e1f568426ca153126dac4a40\",\"impliedFormat\":1},{\"version\":\"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419\",\"impliedFormat\":1},{\"version\":\"8c0bcd6c6b67b4b503c11e91a1fb91522ed585900eab2ab1f61bba7d7caa9d6f\",\"impliedFormat\":1},{\"version\":\"567b7f607f400873151d7bc63a049514b53c3c00f5f56e9e95695d93b66a138e\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"823f9c08700a30e2920a063891df4e357c64333fdba6889522acc5b7ae13fc08\",\"impliedFormat\":1},{\"version\":\"84c1930e33d1bb12ad01bcbe11d656f9646bd21b2fb2afd96e8e10615a021aef\",\"impliedFormat\":1},{\"version\":\"35ec8b6760fd7138bbf5809b84551e31028fb2ba7b6dc91d95d098bf212ca8b4\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a\",\"impliedFormat\":1},{\"version\":\"4b87f767c7bc841511113c876a6b8bf1fd0cb0b718c888ad84478b372ec486b1\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"8d04e3640dd9eb67f7f1e5bd3d0bf96c784666f7aefc8ac1537af6f2d38d4c29\",\"impliedFormat\":1},{\"version\":\"9d19808c8c291a9010a6c788e8532a2da70f811adb431c97520803e0ec649991\",\"impliedFormat\":1},{\"version\":\"2bf469abae4cc9c0f340d4e05d9d26e37f936f9c8ca8f007a6534f109dcc77e4\",\"impliedFormat\":1},{\"version\":\"4aacb0dd020eeaef65426153686cc639a78ec2885dc72ad220be1d25f1a439df\",\"impliedFormat\":1},{\"version\":\"f0bd7e6d931657b59605c44112eaf8b980ba7f957a5051ed21cb93d978cf2f45\",\"impliedFormat\":1},{\"version\":\"71450bbc2d82821d24ca05699a533e72758964e9852062c53b30f31c36978ab8\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"0ada07543808f3b967624645a8e1ccd446f8b01ade47842acf1328aec899fed0\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"4c21aaa8257d7950a5b75a251d9075b6a371208fc948c9c8402f6690ef3b5b55\",\"impliedFormat\":1},{\"version\":\"685657a3ec619ef12aa7f754eee3b28598d3bf9749da89839a72a343fffef5ff\",\"impliedFormat\":1},{\"version\":\"54c4f21f578864961efc94e8f42bc893a53509e886370ec7dd602e0151b9266c\",\"impliedFormat\":1},{\"version\":\"de735eca2c51dd8b860254e9fdb6d9ec19fe402dfe597c23090841ce3937cfc5\",\"impliedFormat\":1},{\"version\":\"4ff41188773cbf465807dd2f7059c7494cbee5115608efc297383832a1150c43\",\"impliedFormat\":1},{\"version\":\"5650cf3dace09e7c25d384e3e6b818b938f68f4e8de96f52d9c5a1b3db068e86\",\"impliedFormat\":1},{\"version\":\"1354ca5c38bd3fd3836a68e0f7c9f91f172582ba30ab15bb8c075891b91502b7\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"5155da3047ef977944d791a2188ff6e6c225f6975cc1910ab7bb6838ab84cede\",\"impliedFormat\":1},{\"version\":\"93f437e1398a4f06a984f441f7fa7a9f0535c04399619b5c22e0b87bdee182cb\",\"impliedFormat\":1},{\"version\":\"afbe24ab0d74694372baa632ecb28bb375be53f3be53f9b07ecd7fc994907de5\",\"impliedFormat\":1},{\"version\":\"e16d218a30f6a6810b57f7e968124eaa08c7bb366133ea34bbf01e7cd6b8c0ad\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"eb8692dea24c27821f77e397272d9ed2eda0b95e4a75beb0fdda31081d15a8ae\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"9e043a1bc8fbf2a255bccf9bf27e0f1caf916c3b0518ea34aa72357c0afd42ec\",\"impliedFormat\":1},{\"version\":\"b4f70ec656a11d570e1a9edce07d118cd58d9760239e2ece99306ee9dfe61d02\",\"impliedFormat\":1},{\"version\":\"3bc2f1e2c95c04048212c569ed38e338873f6a8593930cf5a7ef24ffb38fc3b6\",\"impliedFormat\":1},{\"version\":\"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2\",\"impliedFormat\":1},{\"version\":\"f9d9d753d430ed050dc1bf2667a1bab711ccbb1c1507183d794cc195a5b085cc\",\"impliedFormat\":1},{\"version\":\"9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e\",\"impliedFormat\":1},{\"version\":\"5b6844ad931dcc1d3aca53268f4bd671428421464b1286746027aede398094f2\",\"impliedFormat\":1},{\"version\":\"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972\",\"impliedFormat\":1},{\"version\":\"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093\",\"impliedFormat\":1},{\"version\":\"0225ecb9ed86bdb7a2c7fd01f1556906902929377b44483dc4b83e03b3ef227d\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"1851a3b4db78664f83901bb9cac9e45e03a37bb5933cc5bf37e10bb7e91ab4eb\",\"impliedFormat\":1},{\"version\":\"461e54289e6287e8494a0178ba18182acce51a02bca8dea219149bf2cf96f105\",\"impliedFormat\":1},{\"version\":\"12ed4559eba17cd977aa0db658d25c4047067444b51acfdcbf38470630642b23\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"f3ffabc95802521e1e4bcba4c88d8615176dc6e09111d920c7a213bdda6e1d65\",\"impliedFormat\":1},{\"version\":\"e31e51c55800014d926e3f74208af49cb7352803619855c89296074d1ecbb524\",\"impliedFormat\":1},{\"version\":\"ae56f65caf3be91108707bd8dfbccc2a57a91feb5daabf7165a06a945545ed26\",\"impliedFormat\":1},{\"version\":\"a136d5de521da20f31631a0a96bf712370779d1c05b7015d7019a9b2a0446ca9\",\"impliedFormat\":1},{\"version\":\"dfb96ba5177b68003deec9e773c47257da5c4c8a74053d8956389d832df72002\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"92d3070580cf72b4bb80959b7f16ede9a3f39e6f4ef2ac87cfa4561844fdc69f\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"d3dffd70e6375b872f0b4e152de4ae682d762c61a24881ecc5eb9f04c5caf76f\",\"impliedFormat\":1},{\"version\":\"613deebaec53731ff6b74fe1a89f094b708033db6396b601df3e6d5ab0ec0a47\",\"impliedFormat\":1},{\"version\":\"d91a7d8b5655c42986f1bdfe2105c4408f472831c8f20cf11a8c3345b6b56c8c\",\"impliedFormat\":1},{\"version\":\"e56eb632f0281c9f8210eb8c86cc4839a427a4ffffcfd2a5e40b956050b3e042\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"e8a979b8af001c9fc2e774e7809d233c8ca955a28756f52ee5dee88ccb0611d2\",\"impliedFormat\":1},{\"version\":\"cac793cc47c29e26e4ac3601dcb00b4435ebed26203485790e44f2ad8b6ad847\",\"impliedFormat\":1},{\"version\":\"dde642b5a1d66bcb88d8a24691c6c9b864902cebb77c54329f6e92b291079962\",\"impliedFormat\":1},{\"version\":\"8ba30ff8de9957e5b0a7135c3c90502798e854a426ecd785486f903f46c1affa\",\"impliedFormat\":1},{\"version\":\"a0acca63c9e39580f32a10945df231815f0fe554c074da96ba6564010ffbd2d8\",\"impliedFormat\":1},{\"version\":\"c9d1207e10abc45f95aedfc0bea31ebdf9c1c9b584331516f8ac3d1577ed1bb0\",\"impliedFormat\":1},{\"version\":\"ee4630965cc6a24ae679e5720b8930f872860ab34d64cb1fb8e570319f59bc07\",\"impliedFormat\":1},{\"version\":\"413df52d4ea14472c2fa5bee62f7a40abd1eb49be0b9722ee01ee4e52e63beb2\",\"impliedFormat\":1},{\"version\":\"db6d2d9daad8a6d83f281af12ce4355a20b9a3e71b82b9f57cddcca0a8964a96\",\"impliedFormat\":1},{\"version\":\"446a50749b24d14deac6f8843e057a6355dd6437d1fac4f9e5ce4a5071f34bff\",\"impliedFormat\":1},{\"version\":\"182e9fcbe08ac7c012e0a6e2b5798b4352470be29a64fdc114d23c2bab7d5106\",\"impliedFormat\":1},{\"version\":\"5c9b31919ea1cb350a7ae5e71c9ced8f11723e4fa258a8cc8d16ae46edd623c7\",\"impliedFormat\":1},{\"version\":\"4aa42ce8383b45823b3a1d3811c0fdd5f939f90254bc4874124393febbaf89f6\",\"impliedFormat\":1},{\"version\":\"96ffa70b486207241c0fcedb5d9553684f7fa6746bc2b04c519e7ebf41a51205\",\"impliedFormat\":1},{\"version\":\"3677988e03b749874eb9c1aa8dc88cd77b6005e5c4c39d821cda7b80d5388619\",\"impliedFormat\":1},{\"version\":\"a86f82d646a739041d6702101afa82dcb935c416dd93cbca7fd754fd0282ce1f\",\"impliedFormat\":1},{\"version\":\"ad0d1d75d129b1c80f911be438d6b61bfa8703930a8ff2be2f0e1f8a91841c64\",\"impliedFormat\":1},{\"version\":\"ce75b1aebb33d510ff28af960a9221410a3eaf7f18fc5f21f9404075fba77256\",\"impliedFormat\":1},{\"version\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\"impliedFormat\":1},{\"version\":\"02436d7e9ead85e09a2f8e27d5f47d9464bced31738dec138ca735390815c9f0\",\"impliedFormat\":1},{\"version\":\"f4625edcb57b37b84506e8b276eb59ca30d31f88c6656d29d4e90e3bc58e69df\",\"impliedFormat\":1},{\"version\":\"78a2869ad0cbf3f9045dda08c0d4562b7e1b2bfe07b19e0db072f5c3c56e9584\",\"impliedFormat\":1},{\"version\":\"f8d5ff8eafd37499f2b6a98659dd9b45a321de186b8db6b6142faed0fea3de77\",\"impliedFormat\":1},{\"version\":\"c86fe861cf1b4c46a0fb7d74dffe596cf679a2e5e8b1456881313170f092e3fa\",\"impliedFormat\":1},{\"version\":\"c685d9f68c70fe11ce527287526585a06ea13920bb6c18482ca84945a4e433a7\",\"impliedFormat\":1},{\"version\":\"540cc83ab772a2c6bc509fe1354f314825b5dba3669efdfbe4693ecd3048e34f\",\"impliedFormat\":1},{\"version\":\"121b0696021ab885c570bbeb331be8ad82c6efe2f3b93a6e63874901bebc13e3\",\"impliedFormat\":1},{\"version\":\"4e01846df98d478a2a626ec3641524964b38acaac13945c2db198bf9f3df22ee\",\"impliedFormat\":1},{\"version\":\"678d6d4c43e5728bf66e92fc2269da9fa709cb60510fed988a27161473c3853f\",\"impliedFormat\":1},{\"version\":\"ffa495b17a5ef1d0399586b590bd281056cee6ce3583e34f39926f8dcc6ecdb5\",\"impliedFormat\":1},{\"version\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\"impliedFormat\":1},{\"version\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\"impliedFormat\":1},{\"version\":\"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881\",\"impliedFormat\":1},{\"version\":\"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881\",\"impliedFormat\":1},{\"version\":\"aa14cee20aa0db79f8df101fc027d929aec10feb5b8a8da3b9af3895d05b7ba2\",\"impliedFormat\":1},{\"version\":\"493c700ac3bd317177b2eb913805c87fe60d4e8af4fb39c41f04ba81fae7e170\",\"impliedFormat\":1},{\"version\":\"aeb554d876c6b8c818da2e118d8b11e1e559adbe6bf606cc9a611c1b6c09f670\",\"impliedFormat\":1},{\"version\":\"acf5a2ac47b59ca07afa9abbd2b31d001bf7448b041927befae2ea5b1951d9f9\",\"impliedFormat\":1},{\"version\":\"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881\",\"impliedFormat\":1},{\"version\":\"d71291eff1e19d8762a908ba947e891af44749f3a2cbc5bd2ec4b72f72ea795f\",\"impliedFormat\":1},{\"version\":\"c0480e03db4b816dff2682b347c95f2177699525c54e7e6f6aa8ded890b76be7\",\"impliedFormat\":1},{\"version\":\"e2a37ac938c4bede5bb284b9d2d042da299528f1e61f6f57538f1bd37d760869\",\"impliedFormat\":1},{\"version\":\"76def37aff8e3a051cf406e10340ffba0f28b6991c5d987474cc11137796e1eb\",\"impliedFormat\":1},{\"version\":\"b620391fe8060cf9bedc176a4d01366e6574d7a71e0ac0ab344a4e76576fcbb8\",\"impliedFormat\":1},{\"version\":\"3e7efde639c6a6c3edb9847b3f61e308bf7a69685b92f665048c45132f51c218\",\"impliedFormat\":1},{\"version\":\"df45ca1176e6ac211eae7ddf51336dc075c5314bc5c253651bae639defd5eec5\",\"impliedFormat\":1},{\"version\":\"106c6025f1d99fd468fd8bf6e5bda724e11e5905a4076c5d29790b6c3745e50c\",\"impliedFormat\":1},{\"version\":\"ee8df1cb8d0faaca4013a1b442e99130769ce06f438d18d510fed95890067563\",\"impliedFormat\":1},{\"version\":\"bfb7f8475428637bee12bdd31bd9968c1c8a1cc2c3e426c959e2f3a307f8936f\",\"impliedFormat\":1},{\"version\":\"6f491d0108927478d3247bbbc489c78c2da7ef552fd5277f1ab6819986fdf0b1\",\"impliedFormat\":1},{\"version\":\"594fe24fc54645ab6ccb9dba15d3a35963a73a395b2ef0375ea34bf181ccfd63\",\"impliedFormat\":1},{\"version\":\"7cb0ee103671d1e201cd53dda12bc1cd0a35f1c63d6102720c6eeb322cb8e17e\",\"impliedFormat\":1},{\"version\":\"15a234e5031b19c48a69ccc1607522d6e4b50f57d308ecb7fe863d44cd9f9eb3\",\"impliedFormat\":1},{\"version\":\"148679c6d0f449210a96e7d2e562d589e56fcde87f843a92808b3ff103f1a774\",\"impliedFormat\":1},{\"version\":\"6459054aabb306821a043e02b89d54da508e3a6966601a41e71c166e4ea1474f\",\"impliedFormat\":1},{\"version\":\"2f9c89cbb29d362290531b48880a4024f258c6033aaeb7e59fbc62db26819650\",\"impliedFormat\":1},{\"version\":\"bb37588926aba35c9283fe8d46ebf4e79ffe976343105f5c6d45f282793352b2\",\"impliedFormat\":1},{\"version\":\"05c97cddbaf99978f83d96de2d8af86aded9332592f08ce4a284d72d0952c391\",\"impliedFormat\":1},{\"version\":\"72179f9dd22a86deaad4cc3490eb0fe69ee084d503b686985965654013f1391b\",\"impliedFormat\":1},{\"version\":\"2e6114a7dd6feeef85b2c80120fdbfb59a5529c0dcc5bfa8447b6996c97a69f5\",\"impliedFormat\":1},{\"version\":\"7b6ff760c8a240b40dab6e4419b989f06a5b782f4710d2967e67c695ef3e93c4\",\"impliedFormat\":1},{\"version\":\"c8f004e6036aa1c764ad4ec543cf89a5c1893a9535c80ef3f2b653e370de45e6\",\"impliedFormat\":1},{\"version\":\"dd80b1e600d00f5c6a6ba23f455b84a7db121219e68f89f10552c54ba46e4dc9\",\"impliedFormat\":1},{\"version\":\"b064c36f35de7387d71c599bfcf28875849a1dbc733e82bd26cae3d1cd060521\",\"impliedFormat\":1},{\"version\":\"05c7280d72f3ed26f346cbe7cbbbb002fb7f15739197cbbee6ab3fd1a6cb9347\",\"impliedFormat\":1},{\"version\":\"8de9fe97fa9e00ec00666fa77ab6e91b35d25af8ca75dabcb01e14ad3299b150\",\"impliedFormat\":1},{\"version\":\"803cd2aaf1921c218916c2c7ee3fce653e852d767177eb51047ff15b5b253893\",\"impliedFormat\":1},{\"version\":\"dba114fb6a32b355a9cfc26ca2276834d72fe0e94cd2c3494005547025015369\",\"impliedFormat\":1},{\"version\":\"7ab12b2f1249187223d11a589f5789c75177a0b597b9eb7f8e2e42d045393347\",\"impliedFormat\":1},{\"version\":\"ad37fb4be61c1035b68f532b7220f4e8236cf245381ce3b90ac15449ecfe7305\",\"impliedFormat\":1},{\"version\":\"93436bd74c66baba229bfefe1314d122c01f0d4c1d9e35081a0c4f0470ac1a6c\",\"impliedFormat\":1},{\"version\":\"f974e4a06953682a2c15d5bd5114c0284d5abf8bc0fe4da25cb9159427b70072\",\"impliedFormat\":1},{\"version\":\"50256e9c31318487f3752b7ac12ff365c8949953e04568009c8705db802776fb\",\"impliedFormat\":1},{\"version\":\"7d73b24e7bf31dfb8a931ca6c4245f6bb0814dfae17e4b60c9e194a631fe5f7b\",\"impliedFormat\":1},{\"version\":\"d130c5f73768de51402351d5dc7d1b36eaec980ca697846e53156e4ea9911476\",\"impliedFormat\":1},{\"version\":\"413586add0cfe7369b64979d4ec2ed56c3f771c0667fbde1bf1f10063ede0b08\",\"impliedFormat\":1},{\"version\":\"06472528e998d152375ad3bd8ebcb69ff4694fd8d2effaf60a9d9f25a37a097a\",\"impliedFormat\":1},{\"version\":\"50b5bc34ce6b12eccb76214b51aadfa56572aa6cc79c2b9455cdbb3d6c76af1d\",\"impliedFormat\":1},{\"version\":\"b7e16ef7f646a50991119b205794ebfd3a4d8f8e0f314981ebbe991639023d0e\",\"impliedFormat\":1},{\"version\":\"42c169fb8c2d42f4f668c624a9a11e719d5d07dacbebb63cbcf7ef365b0a75b3\",\"impliedFormat\":1},{\"version\":\"a401617604fa1f6ce437b81689563dfdc377069e4c58465dbd8d16069aede0a5\",\"impliedFormat\":1},{\"version\":\"6e9082e91370de5040e415cd9f24e595b490382e8c7402c4e938a8ce4bccc99f\",\"impliedFormat\":1},{\"version\":\"8695dec09ad439b0ceef3776ea68a232e381135b516878f0901ed2ea114fd0fe\",\"impliedFormat\":1},{\"version\":\"304b44b1e97dd4c94697c3313df89a578dca4930a104454c99863f1784a54357\",\"impliedFormat\":1},{\"version\":\"d682336018141807fb602709e2d95a192828fcb8d5ba06dda3833a8ea98f69e3\",\"impliedFormat\":1},{\"version\":\"6124e973eab8c52cabf3c07575204efc1784aca6b0a30c79eb85fe240a857efa\",\"impliedFormat\":1},{\"version\":\"0d891735a21edc75df51f3eb995e18149e119d1ce22fd40db2b260c5960b914e\",\"impliedFormat\":1},{\"version\":\"3b414b99a73171e1c4b7b7714e26b87d6c5cb03d200352da5342ab4088a54c85\",\"impliedFormat\":1},{\"version\":\"4fbd3116e00ed3a6410499924b6403cc9367fdca303e34838129b328058ede40\",\"impliedFormat\":1},{\"version\":\"b01bd582a6e41457bc56e6f0f9de4cb17f33f5f3843a7cf8210ac9c18472fb0f\",\"impliedFormat\":1},{\"version\":\"0a437ae178f999b46b6153d79095b60c42c996bc0458c04955f1c996dc68b971\",\"impliedFormat\":1},{\"version\":\"74b2a5e5197bd0f2e0077a1ea7c07455bbea67b87b0869d9786d55104006784f\",\"impliedFormat\":1},{\"version\":\"4a7baeb6325920044f66c0f8e5e6f1f52e06e6d87588d837bdf44feb6f35c664\",\"impliedFormat\":1},{\"version\":\"12d218a49dbe5655b911e6cc3c13b2c655e4c783471c3b0432137769c79e1b3c\",\"impliedFormat\":1},{\"version\":\"7274fbffbd7c9589d8d0ffba68157237afd5cecff1e99881ea3399127e60572f\",\"impliedFormat\":1},{\"version\":\"6b0fc04121360f752d196ba35b6567192f422d04a97b2840d7d85f8b79921c92\",\"impliedFormat\":1},{\"version\":\"65a15fc47900787c0bd18b603afb98d33ede930bed1798fc984d5ebb78b26cf9\",\"impliedFormat\":1},{\"version\":\"9d202701f6e0744adb6314d03d2eb8fc994798fc83d91b691b75b07626a69801\",\"impliedFormat\":1},{\"version\":\"a365c4d3bed3be4e4e20793c999c51f5cd7e6792322f14650949d827fbcd170f\",\"impliedFormat\":1},{\"version\":\"c5426dbfc1cf90532f66965a7aa8c1136a78d4d0f96d8180ecbfc11d7722f1a5\",\"impliedFormat\":1},{\"version\":\"9c82171d836c47486074e4ca8e059735bf97b205e70b196535b5efd40cbe1bc5\",\"impliedFormat\":1},{\"version\":\"f374cb24e93e7798c4d9e83ff872fa52d2cdb36306392b840a6ddf46cb925cb6\",\"impliedFormat\":1},{\"version\":\"42b81043b00ff27c6bd955aea0f6e741545f2265978bf364b614702b72a027ab\",\"impliedFormat\":1},{\"version\":\"de9d2df7663e64e3a91bf495f315a7577e23ba088f2949d5ce9ec96f44fba37d\",\"impliedFormat\":1},{\"version\":\"c7af78a2ea7cb1cd009cfb5bdb48cd0b03dad3b54f6da7aab615c2e9e9d570c5\",\"impliedFormat\":1},{\"version\":\"1ee45496b5f8bdee6f7abc233355898e5bf9bd51255db65f5ff7ede617ca0027\",\"impliedFormat\":1},{\"version\":\"97e5ccc7bb88419005cbdf812243a5b3186cdef81b608540acabe1be163fc3e4\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"3fbdd025f9d4d820414417eeb4107ffa0078d454a033b506e22d3a23bc3d9c41\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"a8f8e6ab2fa07b45251f403548b78eaf2022f3c2254df3dc186cb2671fe4996d\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"fa6c12a7c0f6b84d512f200690bfc74819e99efae69e4c95c4cd30f6884c526e\",\"impliedFormat\":1},{\"version\":\"f1c32f9ce9c497da4dc215c3bc84b722ea02497d35f9134db3bb40a8d918b92b\",\"impliedFormat\":1},{\"version\":\"b73c319af2cc3ef8f6421308a250f328836531ea3761823b4cabbd133047aefa\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"e433b0337b8106909e7953015e8fa3f2d30797cea27141d1c5b135365bb975a6\",\"impliedFormat\":1},{\"version\":\"9f9bb6755a8ce32d656ffa4763a8144aa4f274d6b69b59d7c32811031467216e\",\"impliedFormat\":1},{\"version\":\"5c32bdfbd2d65e8fffbb9fbda04d7165e9181b08dad61154961852366deb7540\",\"impliedFormat\":1},{\"version\":\"ddff7fc6edbdc5163a09e22bf8df7bef75f75369ebd7ecea95ba55c4386e2441\",\"impliedFormat\":1},{\"version\":\"6b3453eebd474cc8acf6d759f1668e6ce7425a565e2996a20b644c72916ecf75\",\"impliedFormat\":1},{\"version\":\"0c05e9842ec4f8b7bfebfd3ca61604bb8c914ba8da9b5337c4f25da427a005f2\",\"impliedFormat\":1},{\"version\":\"89cd3444e389e42c56fd0d072afef31387e7f4107651afd2c03950f22dc36f77\",\"impliedFormat\":1},{\"version\":\"7f2aa4d4989a82530aaac3f72b3dceca90e9c25bee0b1a327e8a08a1262435ad\",\"impliedFormat\":1},{\"version\":\"e39a304f882598138a8022106cb8de332abbbb87f3fee71c5ca6b525c11c51fc\",\"impliedFormat\":1},{\"version\":\"faed7a5153215dbd6ebe76dfdcc0af0cfe760f7362bed43284be544308b114cf\",\"impliedFormat\":1},{\"version\":\"fcdf3e40e4a01b9a4b70931b8b51476b210c511924fcfe3f0dae19c4d52f1a54\",\"impliedFormat\":1},{\"version\":\"345c4327b637d34a15aba4b7091eb068d6ab40a3dedaab9f00986253c9704e53\",\"impliedFormat\":1},{\"version\":\"3a788c7fb7b1b1153d69a4d1d9e1d0dfbcf1127e703bdb02b6d12698e683d1fb\",\"impliedFormat\":1},{\"version\":\"2e4f37ffe8862b14d8e24ae8763daaa8340c0df0b859d9a9733def0eee7562d9\",\"impliedFormat\":1},{\"version\":\"d38530db0601215d6d767f280e3a3c54b2a83b709e8d9001acb6f61c67e965fc\",\"impliedFormat\":1},{\"version\":\"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff\",\"impliedFormat\":1},{\"version\":\"4805f6161c2c8cefb8d3b8bd96a080c0fe8dbc9315f6ad2e53238f9a79e528a6\",\"impliedFormat\":1},{\"version\":\"b83cb14474fa60c5f3ec660146b97d122f0735627f80d82dd03e8caa39b4388c\",\"impliedFormat\":1},{\"version\":\"2b5b70d7782fe028487a80a1c214e67bd610532b9f978b78fa60f5b4a359f77e\",\"impliedFormat\":1},{\"version\":\"7ee86fbb3754388e004de0ef9e6505485ddfb3be7640783d6d015711c03d302d\",\"impliedFormat\":1},{\"version\":\"1a82deef4c1d39f6882f28d275cad4c01f907b9b39be9cbc472fcf2cf051e05b\",\"impliedFormat\":1},{\"version\":\"7580e62139cb2b44a0270c8d01abcbfcba2819a02514a527342447fa69b34ef1\",\"impliedFormat\":1},{\"version\":\"b73cbf0a72c8800cf8f96a9acfe94f3ad32ca71342a8908b8ae484d61113f647\",\"impliedFormat\":1},{\"version\":\"bae6dd176832f6423966647382c0d7ba9e63f8c167522f09a982f086cd4e8b23\",\"impliedFormat\":1},{\"version\":\"20865ac316b8893c1a0cc383ccfc1801443fbcc2a7255be166cf90d03fac88c9\",\"impliedFormat\":1},{\"version\":\"c9958eb32126a3843deedda8c22fb97024aa5d6dd588b90af2d7f2bfac540f23\",\"impliedFormat\":1},{\"version\":\"461d0ad8ae5f2ff981778af912ba71b37a8426a33301daa00f21c6ccb27f8156\",\"impliedFormat\":1},{\"version\":\"e927c2c13c4eaf0a7f17e6022eee8519eb29ef42c4c13a31e81a611ab8c95577\",\"impliedFormat\":1},{\"version\":\"fcafff163ca5e66d3b87126e756e1b6dfa8c526aa9cd2a2b0a9da837d81bbd72\",\"impliedFormat\":1},{\"version\":\"70246ad95ad8a22bdfe806cb5d383a26c0c6e58e7207ab9c431f1cb175aca657\",\"impliedFormat\":1},{\"version\":\"f00f3aa5d64ff46e600648b55a79dcd1333458f7a10da2ed594d9f0a44b76d0b\",\"impliedFormat\":1},{\"version\":\"772d8d5eb158b6c92412c03228bd9902ccb1457d7a705b8129814a5d1a6308fc\",\"impliedFormat\":1},{\"version\":\"802e797bcab5663b2c9f63f51bdf67eff7c41bc64c0fd65e6da3e7941359e2f7\",\"impliedFormat\":1},{\"version\":\"8b4327413e5af38cd8cb97c59f48c3c866015d5d642f28518e3a891c469f240e\",\"impliedFormat\":1},{\"version\":\"7e6ac205dcb9714f708354fd863bffa45cee90740706cc64b3b39b23ebb84744\",\"impliedFormat\":1},{\"version\":\"61dc6e3ac78d64aa864eedd0a208b97b5887cc99c5ba65c03287bf57d83b1eb9\",\"impliedFormat\":1},{\"version\":\"4b20fcf10a5413680e39f5666464859fc56b1003e7dfe2405ced82371ebd49b6\",\"impliedFormat\":1},{\"version\":\"c06ef3b2569b1c1ad99fcd7fe5fba8d466e2619da5375dfa940a94e0feea899b\",\"impliedFormat\":1},{\"version\":\"f7d628893c9fa52ba3ab01bcb5e79191636c4331ee5667ecc6373cbccff8ae12\",\"impliedFormat\":1},{\"version\":\"1d879125d1ec570bf04bc1f362fdbe0cb538315c7ac4bcfcdf0c1e9670846aa6\",\"impliedFormat\":1},{\"version\":\"f730b468deecf26188ad62ee8950dc29aa2aea9543bb08ed714c3db019359fd9\",\"impliedFormat\":1},{\"version\":\"933aee906d42ea2c53b6892192a8127745f2ec81a90695df4024308ba35a8ff4\",\"impliedFormat\":1},{\"version\":\"d663134457d8d669ae0df34eabd57028bddc04fc444c4bc04bc5215afc91e1f4\",\"impliedFormat\":1},{\"version\":\"144bc326e90b894d1ec78a2af3ffb2eb3733f4d96761db0ca0b6239a8285f972\",\"impliedFormat\":1},{\"version\":\"a3e3f0efcae272ab8ee3298e4e819f7d9dd9ff411101f45444877e77cfeca9a4\",\"impliedFormat\":1},{\"version\":\"43e96a3d5d1411ab40ba2f61d6a3192e58177bcf3b133a80ad2a16591611726d\",\"impliedFormat\":1},{\"version\":\"58659b06d33fa430bee1105b75cf876c0a35b2567207487c8578aec51ca2d977\",\"impliedFormat\":1},{\"version\":\"71d9eb4c4e99456b78ae182fb20a5dfc20eb1667f091dbb9335b3c017dd1c783\",\"impliedFormat\":1},{\"version\":\"cfa846a7b7847a1d973605fbb8c91f47f3a0f0643c18ac05c47077ebc72e71c7\",\"impliedFormat\":1},{\"version\":\"30e6520444df1a004f46fdc8096f3fe06f7bbd93d09c53ada9dcdde59919ccca\",\"impliedFormat\":1},{\"version\":\"6c800b281b9e89e69165fd11536195488de3ff53004e55905e6c0059a2d8591e\",\"impliedFormat\":1},{\"version\":\"7d4254b4c6c67a29d5e7f65e67d72540480ac2cfb041ca484847f5ae70480b62\",\"impliedFormat\":1},{\"version\":\"a58beefce74db00dbb60eb5a4bb0c6726fb94c7797c721f629142c0ae9c94306\",\"impliedFormat\":1},{\"version\":\"41eeb453ccb75c5b2c3abef97adbbd741bd7e9112a2510e12f03f646dc9ad13d\",\"impliedFormat\":1},{\"version\":\"502fa5863df08b806dbf33c54bee8c19f7e2ad466785c0fc35465d7c5ff80995\",\"impliedFormat\":1},{\"version\":\"c91a2d08601a1547ffef326201be26db94356f38693bb18db622ae5e9b3d7c92\",\"impliedFormat\":1},{\"version\":\"888cda0fa66d7f74e985a3f7b1af1f64b8ff03eb3d5e80d051c3cbdeb7f32ab7\",\"impliedFormat\":1},{\"version\":\"60681e13f3545be5e9477acb752b741eae6eaf4cc01658a25ec05bff8b82a2ef\",\"impliedFormat\":1},{\"version\":\"9586918b63f24124a5ca1d0cc2979821a8a57f514781f09fc5aa9cae6d7c0138\",\"impliedFormat\":1},{\"version\":\"a57b1802794433adec9ff3fed12aa79d671faed86c49b09e02e1ac41b4f1d33a\",\"impliedFormat\":1},{\"version\":\"ad10d4f0517599cdeca7755b930f148804e3e0e5b5a3847adce0f1f71bbccd74\",\"impliedFormat\":1},{\"version\":\"1042064ece5bb47d6aba91648fbe0635c17c600ebdf567588b4ca715602f0a9d\",\"impliedFormat\":1},{\"version\":\"c49469a5349b3cc1965710b5b0f98ed6c028686aa8450bcb3796728873eb923e\",\"impliedFormat\":1},{\"version\":\"4a889f2c763edb4d55cb624257272ac10d04a1cad2ed2948b10ed4a7fda2a428\",\"impliedFormat\":1},{\"version\":\"7bb79aa2fead87d9d56294ef71e056487e848d7b550c9a367523ee5416c44cfa\",\"impliedFormat\":1},{\"version\":\"d88ea80a6447d7391f52352ec97e56b52ebec934a4a4af6e2464cfd8b39c3ba8\",\"impliedFormat\":1},{\"version\":\"55095860901097726220b6923e35a812afdd49242a1246d7b0942ee7eb34c6e4\",\"impliedFormat\":1},{\"version\":\"96171c03c2e7f314d66d38acd581f9667439845865b7f85da8df598ff9617476\",\"impliedFormat\":1},{\"version\":\"27ff4196654e6373c9af16b6165120e2dd2169f9ad6abb5c935af5abd8c7938c\",\"impliedFormat\":1},{\"version\":\"bb8f2dbc03533abca2066ce4655c119bff353dd4514375beb93c08590c03e023\",\"impliedFormat\":1},{\"version\":\"d193c8a86144b3a87b22bc1f5534b9c3e0f5a187873ec337c289a183973a58fe\",\"impliedFormat\":1},{\"version\":\"1a6e6ba8a07b74e3ad237717c0299d453f9ceb795dbc2f697d1f2dd07cb782d2\",\"impliedFormat\":1},{\"version\":\"58d70c38037fc0f949243388ff7ae20cf43321107152f14a9d36ca79311e0ada\",\"impliedFormat\":1},{\"version\":\"f56bdc6884648806d34bc66d31cdb787c4718d04105ce2cd88535db214631f82\",\"impliedFormat\":1},{\"version\":\"190da5eac6478d61ab9731ab2146fbc0164af2117a363013249b7e7992f1cccb\",\"impliedFormat\":1},{\"version\":\"01479d9d5a5dda16d529b91811375187f61a06e74be294a35ecce77e0b9e8d6c\",\"impliedFormat\":1},{\"version\":\"49f95e989b4632c6c2a578cc0078ee19a5831832d79cc59abecf5160ea71abad\",\"impliedFormat\":1},{\"version\":\"9666533332f26e8995e4d6fe472bdeec9f15d405693723e6497bf94120c566c8\",\"impliedFormat\":1},{\"version\":\"ce0df82a9ae6f914ba08409d4d883983cc08e6d59eb2df02d8e4d68309e7848b\",\"impliedFormat\":1},{\"version\":\"796273b2edc72e78a04e86d7c58ae94d370ab93a0ddf40b1aa85a37a1c29ecd7\",\"impliedFormat\":1},{\"version\":\"5df15a69187d737d6d8d066e189ae4f97e41f4d53712a46b2710ff9f8563ec9f\",\"impliedFormat\":1},{\"version\":\"1a4dc28334a926d90ba6a2d811ba0ff6c22775fcc13679521f034c124269fd40\",\"impliedFormat\":1},{\"version\":\"f05315ff85714f0b87cc0b54bcd3dde2716e5a6b99aedcc19cad02bf2403e08c\",\"impliedFormat\":1},{\"version\":\"8a8c64dafaba11c806efa56f5c69f611276471bef80a1db1f71316ec4168acef\",\"impliedFormat\":1},{\"version\":\"43ba4f2fa8c698f5c304d21a3ef596741e8e85a810b7c1f9b692653791d8d97a\",\"impliedFormat\":1},{\"version\":\"5fad3b31fc17a5bc58095118a8b160f5260964787c52e7eb51e3d4fcf5d4a6f0\",\"impliedFormat\":1},{\"version\":\"72105519d0390262cf0abe84cf41c926ade0ff475d35eb21307b2f94de985778\",\"impliedFormat\":1},{\"version\":\"d0a4cac61fa080f2be5ebb68b82726be835689b35994ba0e22e3ed4d2bc45e3b\",\"impliedFormat\":1},{\"version\":\"c857e0aae3f5f444abd791ec81206020fbcc1223e187316677e026d1c1d6fe08\",\"impliedFormat\":1},{\"version\":\"ccf6dd45b708fb74ba9ed0f2478d4eb9195c9dfef0ff83a6092fa3cf2ff53b4f\",\"impliedFormat\":1},{\"version\":\"2d7db1d73456e8c5075387d4240c29a2a900847f9c1bff106a2e490da8fbd457\",\"impliedFormat\":1},{\"version\":\"2b15c805f48e4e970f8ec0b1915f22d13ca6212375e8987663e2ef5f0205e832\",\"impliedFormat\":1},{\"version\":\"205a31b31beb7be73b8df18fcc43109cbc31f398950190a0967afc7a12cb478c\",\"impliedFormat\":1},{\"version\":\"8fca3039857709484e5893c05c1f9126ab7451fa6c29e19bb8c2411a2e937345\",\"impliedFormat\":1},{\"version\":\"35069c2c417bd7443ae7c7cafd1de02f665bf015479fec998985ffbbf500628c\",\"impliedFormat\":1},{\"version\":\"dba6c7006e14a98ec82999c6f89fbbbfd1c642f41db148535f3b77b8018829b8\",\"impliedFormat\":1},{\"version\":\"7f897b285f22a57a5c4dc14a27da2747c01084a542b4d90d33897216dceeea2e\",\"impliedFormat\":1},{\"version\":\"7e0b7f91c5ab6e33f511efc640d36e6f933510b11be24f98836a20a2dc914c2d\",\"impliedFormat\":1},{\"version\":\"045b752f44bf9bbdcaffd882424ab0e15cb8d11fa94e1448942e338c8ef19fba\",\"impliedFormat\":1},{\"version\":\"2894c56cad581928bb37607810af011764a2f511f575d28c9f4af0f2ef02d1ab\",\"impliedFormat\":1},{\"version\":\"0a72186f94215d020cb386f7dca81d7495ab6c17066eb07d0f44a5bf33c1b21a\",\"impliedFormat\":1},{\"version\":\"d96b39301d0ded3f1a27b47759676a33a02f6f5049bfcbde81e533fd10f50dcb\",\"impliedFormat\":1},{\"version\":\"2ded4f930d6abfaa0625cf55e58f565b7cbd4ab5b574dd2cb19f0a83a2f0be8b\",\"impliedFormat\":1},{\"version\":\"0aedb02516baf3e66b2c1db9fef50666d6ed257edac0f866ea32f1aa05aa474f\",\"impliedFormat\":1},{\"version\":\"ca0f4d9068d652bad47e326cf6ba424ac71ab866e44b24ddb6c2bd82d129586a\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"04d36005fcbeac741ac50c421181f4e0316d57d148d37cc321a8ea285472462b\",\"impliedFormat\":1},{\"version\":\"9e2739b32f741859263fdba0244c194ca8e96da49b430377930b8f721d77c000\",\"impliedFormat\":1},{\"version\":\"56ccb49443bfb72e5952f7012f0de1a8679f9f75fc93a5c1ac0bafb28725fc5f\",\"impliedFormat\":1},{\"version\":\"20fa37b636fdcc1746ea0738f733d0aed17890d1cd7cb1b2f37010222c23f13e\",\"impliedFormat\":1},{\"version\":\"d90b9f1520366d713a73bd30c5a9eb0040d0fb6076aff370796bc776fd705943\",\"impliedFormat\":1},{\"version\":\"88e9caa9c5d2ba629240b5913842e7c57c5c0315383b8dc9d436ef2b60f1c391\",\"impliedFormat\":1},{\"version\":\"c3fdbbd7360e302a9208655a01de8a942ea5f4d1d01317aa7ffe3c287b328a45\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"bef86adb77316505c6b471da1d9b8c9e428867c2566270e8894d4d773a1c4dc2\",\"impliedFormat\":1},{\"version\":\"a46dba563f70f32f9e45ae015f3de979225f668075d7a427f874e0f6db584991\",\"impliedFormat\":1},{\"version\":\"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff\",\"impliedFormat\":1},{\"version\":\"2652448ac55a2010a1f71dd141f828b682298d39728f9871e1cdf8696ef443fd\",\"impliedFormat\":1},{\"version\":\"02c4fc9e6bb27545fa021f6056e88ff5fdf10d9d9f1467f1d10536c6e749ac50\",\"impliedFormat\":1},{\"version\":\"120599fd965257b1f4d0ff794bc696162832d9d8467224f4665f713a3119078b\",\"impliedFormat\":1},{\"version\":\"5433f33b0a20300cca35d2f229a7fc20b0e8477c44be2affeb21cb464af60c76\",\"impliedFormat\":1},{\"version\":\"db036c56f79186da50af66511d37d9fe77fa6793381927292d17f81f787bb195\",\"impliedFormat\":1},{\"version\":\"bd4131091b773973ca5d2326c60b789ab1f5e02d8843b3587effe6e1ea7c9d86\",\"impliedFormat\":1},{\"version\":\"c7f6485931085bf010fbaf46880a9b9ec1a285ad9dc8c695a9e936f5a48f34b4\",\"impliedFormat\":1},{\"version\":\"14f6b927888a1112d662877a5966b05ac1bf7ed25d6c84386db4c23c95a5363b\",\"impliedFormat\":1},{\"version\":\"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff\",\"impliedFormat\":1},{\"version\":\"622694a8522b46f6310c2a9b5d2530dde1e2854cb5829354e6d1ff8f371cf469\",\"impliedFormat\":1},{\"version\":\"d24ff95760ea2dfcc7c57d0e269356984e7046b7e0b745c80fea71559f15bdd8\",\"impliedFormat\":1},{\"version\":\"a9e6c0ff3f8186fccd05752cf75fc94e147c02645087ac6de5cc16403323d870\",\"impliedFormat\":1},{\"version\":\"49c346823ba6d4b12278c12c977fb3a31c06b9ca719015978cb145eb86da1c61\",\"impliedFormat\":1},{\"version\":\"bfac6e50eaa7e73bb66b7e052c38fdc8ccfc8dbde2777648642af33cf349f7f1\",\"impliedFormat\":1},{\"version\":\"92f7c1a4da7fbfd67a2228d1687d5c2e1faa0ba865a94d3550a3941d7527a45d\",\"impliedFormat\":1},{\"version\":\"f53b120213a9289d9a26f5af90c4c686dd71d91487a0aa5451a38366c70dc64b\",\"impliedFormat\":1},{\"version\":\"83fe880c090afe485a5c02262c0b7cdd76a299a50c48d9bde02be8e908fb4ae6\",\"impliedFormat\":1},{\"version\":\"13c1b657932e827a7ed510395d94fc8b743b9d053ab95b7cd829b2bc46fb06db\",\"impliedFormat\":1},{\"version\":\"57d67b72e06059adc5e9454de26bbfe567d412b962a501d263c75c2db430f40e\",\"impliedFormat\":1},{\"version\":\"6511e4503cf74c469c60aafd6589e4d14d5eb0a25f9bf043dcbecdf65f261972\",\"impliedFormat\":1},{\"version\":\"078131f3a722a8ad3fc0b724cd3497176513cdcb41c80f96a3acbda2a143b58e\",\"impliedFormat\":1},{\"version\":\"8c70ddc0c22d85e56011d49fddfaae3405eb53d47b59327b9dd589e82df672e7\",\"impliedFormat\":1},{\"version\":\"a67b87d0281c97dfc1197ef28dfe397fc2c865ccd41f7e32b53f647184cc7307\",\"impliedFormat\":1},{\"version\":\"771ffb773f1ddd562492a6b9aaca648192ac3f056f0e1d997678ff97dbb6bf9b\",\"impliedFormat\":1},{\"version\":\"232f70c0cf2b432f3a6e56a8dc3417103eb162292a9fd376d51a3a9ea5fbbf6f\",\"impliedFormat\":1},{\"version\":\"9e155d2255348d950b1f65643fb26c0f14f5109daf8bd9ee24a866ad0a743648\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"0b103e9abfe82d14c0ad06a55d9f91d6747154ef7cacc73cf27ecad2bfb3afcf\",\"impliedFormat\":1},{\"version\":\"7a883e9c84e720810f86ef4388f54938a65caa0f4d181a64e9255e847a7c9f51\",\"impliedFormat\":1},{\"version\":\"a0ba218ac1baa3da0d5d9c1ec1a7c2f8676c284e6f5b920d6d049b13fa267377\",\"impliedFormat\":1},{\"version\":\"8a0e762ceb20c7e72504feef83d709468a70af4abccb304f32d6b9bac1129b2c\",\"impliedFormat\":1},{\"version\":\"d408d6f32de8d1aba2ff4a20f1aa6a6edd7d92c997f63b90f8ad3f9017cf5e46\",\"impliedFormat\":1},{\"version\":\"9252d498a77517aab5d8d4b5eb9d71e4b225bbc7123df9713e08181de63180f6\",\"impliedFormat\":1},{\"version\":\"b1f1d57fde8247599731b24a733395c880a6561ec0c882efaaf20d7df968c5af\",\"impliedFormat\":1},{\"version\":\"9d622ea608d43eb463c0c4538fd5baa794bc18ea0bb8e96cd2ab6fd483d55fe2\",\"impliedFormat\":1},{\"version\":\"35e6379c3f7cb27b111ad4c1aa69538fd8e788ab737b8ff7596a1b40e96f4f90\",\"impliedFormat\":1},{\"version\":\"1fffe726740f9787f15b532e1dc870af3cd964dbe29e191e76121aa3dd8693f2\",\"impliedFormat\":1},{\"version\":\"371bf6127c1d427836de95197155132501cb6b69ef8709176ce6e0b85d059264\",\"impliedFormat\":1},{\"version\":\"2bafd700e617d3693d568e972d02b92224b514781f542f70d497a8fdf92d52a2\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"5542d8a7ea13168cb573be0d1ba0d29460d59430fb12bb7bf4674efd5604e14c\",\"impliedFormat\":1},{\"version\":\"af48e58339188d5737b608d41411a9c054685413d8ae88b8c1d0d9bfabdf6e7e\",\"impliedFormat\":1},{\"version\":\"616775f16134fa9d01fc677ad3f76e68c051a056c22ab552c64cc281a9686790\",\"impliedFormat\":1},{\"version\":\"65c24a8baa2cca1de069a0ba9fba82a173690f52d7e2d0f1f7542d59d5eb4db0\",\"impliedFormat\":1},{\"version\":\"f9fe6af238339a0e5f7563acee3178f51db37f32a2e7c09f85273098cee7ec49\",\"impliedFormat\":1},{\"version\":\"1de8c302fd35220d8f29dea378a4ae45199dc8ff83ca9923aca1400f2b28848a\",\"impliedFormat\":1},{\"version\":\"77e71242e71ebf8528c5802993697878f0533db8f2299b4d36aa015bae08a79c\",\"impliedFormat\":1},{\"version\":\"98a787be42bd92f8c2a37d7df5f13e5992da0d967fab794adbb7ee18370f9849\",\"impliedFormat\":1},{\"version\":\"332248ee37cca52903572e66c11bef755ccc6e235835e63d3c3e60ddda3e9b93\",\"impliedFormat\":1},{\"version\":\"94e8cc88ae2ef3d920bb3bdc369f48436db123aa2dc07f683309ad8c9968a1e1\",\"impliedFormat\":1},{\"version\":\"4545c1a1ceca170d5d83452dd7c4994644c35cf676a671412601689d9a62da35\",\"impliedFormat\":1},{\"version\":\"320f4091e33548b554d2214ce5fc31c96631b513dffa806e2e3a60766c8c49d9\",\"impliedFormat\":1},{\"version\":\"a2d648d333cf67b9aeac5d81a1a379d563a8ffa91ddd61c6179f68de724260ff\",\"impliedFormat\":1},{\"version\":\"d90d5f524de38889d1e1dbc2aeef00060d779f8688c02766ddb9ca195e4a713d\",\"impliedFormat\":1},{\"version\":\"a3f41ed1b4f2fc3049394b945a68ae4fdefd49fa1739c32f149d32c0545d67f5\",\"impliedFormat\":1},{\"version\":\"b0309e1eda99a9e76f87c18992d9c3689b0938266242835dd4611f2b69efe456\",\"impliedFormat\":1},{\"version\":\"47699512e6d8bebf7be488182427189f999affe3addc1c87c882d36b7f2d0b0e\",\"impliedFormat\":1},{\"version\":\"6ceb10ca57943be87ff9debe978f4ab73593c0c85ee802c051a93fc96aaf7a20\",\"impliedFormat\":1},{\"version\":\"1de3ffe0cc28a9fe2ac761ece075826836b5a02f340b412510a59ba1d41a505a\",\"impliedFormat\":1},{\"version\":\"e46d6cc08d243d8d0d83986f609d830991f00450fb234f5b2f861648c42dc0d8\",\"impliedFormat\":1},{\"version\":\"1c0a98de1323051010ce5b958ad47bc1c007f7921973123c999300e2b7b0ecc0\",\"impliedFormat\":1},{\"version\":\"ff863d17c6c659440f7c5c536e4db7762d8c2565547b2608f36b798a743606ca\",\"impliedFormat\":1},{\"version\":\"5412ad0043cd60d1f1406fc12cb4fb987e9a734decbdd4db6f6acf71791e36fe\",\"impliedFormat\":1},{\"version\":\"ad036a85efcd9e5b4f7dd5c1a7362c8478f9a3b6c3554654ca24a29aa850a9c5\",\"impliedFormat\":1},{\"version\":\"fedebeae32c5cdd1a85b4e0504a01996e4a8adf3dfa72876920d3dd6e42978e7\",\"impliedFormat\":1},{\"version\":\"b6c1f64158da02580f55e8a2728eda6805f79419aed46a930f43e68ad66a38fc\",\"impliedFormat\":1},{\"version\":\"cdf21eee8007e339b1b9945abf4a7b44930b1d695cc528459e68a3adc39a622e\",\"impliedFormat\":1},{\"version\":\"bc9ee0192f056b3d5527bcd78dc3f9e527a9ba2bdc0a2c296fbc9027147df4b2\",\"impliedFormat\":1},{\"version\":\"330896c1a2b9693edd617be24fbf9e5895d6e18c7955d6c08f028f272b37314d\",\"impliedFormat\":1},{\"version\":\"1d9c0a9a6df4e8f29dc84c25c5aa0bb1da5456ebede7a03e03df08bb8b27bae6\",\"impliedFormat\":1},{\"version\":\"84380af21da938a567c65ef95aefb5354f676368ee1a1cbb4cae81604a4c7d17\",\"impliedFormat\":1},{\"version\":\"1af3e1f2a5d1332e136f8b0b95c0e6c0a02aaabd5092b36b64f3042a03debf28\",\"impliedFormat\":1},{\"version\":\"30d8da250766efa99490fc02801047c2c6d72dd0da1bba6581c7e80d1d8842a4\",\"impliedFormat\":1},{\"version\":\"03566202f5553bd2d9de22dfab0c61aa163cabb64f0223c08431fb3fc8f70280\",\"impliedFormat\":1},{\"version\":\"4c0a1233155afb94bd4d7518c75c84f98567cd5f13fc215d258de196cdb40d91\",\"impliedFormat\":1},{\"version\":\"e7765aa8bcb74a38b3230d212b4547686eb9796621ffb4367a104451c3f9614f\",\"impliedFormat\":1},{\"version\":\"1de80059b8078ea5749941c9f863aa970b4735bdbb003be4925c853a8b6b4450\",\"impliedFormat\":1},{\"version\":\"1d079c37fa53e3c21ed3fa214a27507bda9991f2a41458705b19ed8c2b61173d\",\"impliedFormat\":1},{\"version\":\"5bf5c7a44e779790d1eb54c234b668b15e34affa95e78eada73e5757f61ed76a\",\"impliedFormat\":1},{\"version\":\"5835a6e0d7cd2738e56b671af0e561e7c1b4fb77751383672f4b009f4e161d70\",\"impliedFormat\":1},{\"version\":\"5c634644d45a1b6bc7b05e71e05e52ec04f3d73d9ac85d5927f647a5f965181a\",\"impliedFormat\":1},{\"version\":\"4b7f74b772140395e7af67c4841be1ab867c11b3b82a51b1aeb692822b76c872\",\"impliedFormat\":1},{\"version\":\"27be6622e2922a1b412eb057faa854831b95db9db5035c3f6d4b677b902ab3b7\",\"impliedFormat\":1},{\"version\":\"a68d4b3182e8d776cdede7ac9630c209a7bfbb59191f99a52479151816ef9f9e\",\"impliedFormat\":99},{\"version\":\"39644b343e4e3d748344af8182111e3bbc594930fff0170256567e13bbdbebb0\",\"impliedFormat\":99},{\"version\":\"ed7fd5160b47b0de3b1571c5c5578e8e7e3314e33ae0b8ea85a895774ee64749\",\"impliedFormat\":99},{\"version\":\"63a7595a5015e65262557f883463f934904959da563b4f788306f699411e9bac\",\"impliedFormat\":1},{\"version\":\"4ba137d6553965703b6b55fd2000b4e07ba365f8caeb0359162ad7247f9707a6\",\"impliedFormat\":1},{\"version\":\"6de125ea94866c736c6d58d68eb15272cf7d1020a5b459fea1c660027eca9a90\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"8fac4a15690b27612d8474fb2fc7cc00388df52d169791b78d1a3645d60b4c8b\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"064ac1c2ac4b2867c2ceaa74bbdce0cb6a4c16e7c31a6497097159c18f74aa7c\",\"impliedFormat\":1},{\"version\":\"3dc14e1ab45e497e5d5e4295271d54ff689aeae00b4277979fdd10fa563540ae\",\"impliedFormat\":1},{\"version\":\"d3b315763d91265d6b0e7e7fa93cfdb8a80ce7cdd2d9f55ba0f37a22db00bdb8\",\"impliedFormat\":1},{\"version\":\"b789bf89eb19c777ed1e956dbad0925ca795701552d22e68fd130a032008b9f9\",\"impliedFormat\":1},{\"version\":\"a384610388221cd70cffb4503cee7853b8b076f2b4a55324b20a4bdbd25a3538\",\"affectsGlobalScope\":true},\"7b550dda9686c16f36a17bf9051d5dbf31e98555b30d114ac49fc49a1e712651\",\"5bf9ab3868c590e9d44c283b9c4768ca41fd4ed042b8ee8d22de923c3867fa21\",{\"version\":\"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b\",\"impliedFormat\":1},{\"version\":\"8885cf05f3e2abf117590bbb951dcf6359e3e5ac462af1c901cfd24c6a6472e2\",\"impliedFormat\":1},{\"version\":\"333caa2bfff7f06017f114de738050dd99a765c7eb16571c6d25a38c0d5365dc\",\"impliedFormat\":1},{\"version\":\"e61df3640a38d535fd4bc9f4a53aef17c296b58dc4b6394fd576b808dd2fe5e6\",\"impliedFormat\":1},{\"version\":\"459920181700cec8cbdf2a5faca127f3f17fd8dd9d9e577ed3f5f3af5d12a2e4\",\"impliedFormat\":1},{\"version\":\"4719c209b9c00b579553859407a7e5dcfaa1c472994bd62aa5dd3cc0757eb077\",\"impliedFormat\":1},{\"version\":\"7ec359bbc29b69d4063fe7dad0baaf35f1856f914db16b3f4f6e3e1bca4099fa\",\"impliedFormat\":1},{\"version\":\"70790a7f0040993ca66ab8a07a059a0f8256e7bb57d968ae945f696cbff4ac7a\",\"impliedFormat\":1},{\"version\":\"d1b9a81e99a0050ca7f2d98d7eedc6cda768f0eb9fa90b602e7107433e64c04c\",\"impliedFormat\":1},{\"version\":\"a022503e75d6953d0e82c2c564508a5c7f8556fad5d7f971372d2d40479e4034\",\"impliedFormat\":1},{\"version\":\"b215c4f0096f108020f666ffcc1f072c81e9f2f95464e894a5d5f34c5ea2a8b1\",\"impliedFormat\":1},{\"version\":\"644491cde678bd462bb922c1d0cfab8f17d626b195ccb7f008612dc31f445d2d\",\"impliedFormat\":1},{\"version\":\"dfe54dab1fa4961a6bcfba68c4ca955f8b5bbeb5f2ab3c915aa7adaa2eabc03a\",\"impliedFormat\":1},{\"version\":\"1251d53755b03cde02466064260bb88fd83c30006a46395b7d9167340bc59b73\",\"impliedFormat\":1},{\"version\":\"47865c5e695a382a916b1eedda1b6523145426e48a2eae4647e96b3b5e52024f\",\"impliedFormat\":1},{\"version\":\"4cdf27e29feae6c7826cdd5c91751cc35559125e8304f9e7aed8faef97dcf572\",\"impliedFormat\":1},{\"version\":\"331b8f71bfae1df25d564f5ea9ee65a0d847c4a94baa45925b6f38c55c7039bf\",\"impliedFormat\":1},{\"version\":\"2a771d907aebf9391ac1f50e4ad37952943515eeea0dcc7e78aa08f508294668\",\"impliedFormat\":1},{\"version\":\"0146fd6262c3fd3da51cb0254bb6b9a4e42931eb2f56329edd4c199cb9aaf804\",\"impliedFormat\":1},{\"version\":\"183f480885db5caa5a8acb833c2be04f98056bdcc5fb29e969ff86e07efe57ab\",\"impliedFormat\":99},{\"version\":\"b558c9a18ea4e6e4157124465c3ef1063e64640da139e67be5edb22f534f2f08\",\"impliedFormat\":1},{\"version\":\"01374379f82be05d25c08d2f30779fa4a4c41895a18b93b33f14aeef51768692\",\"impliedFormat\":1},{\"version\":\"b0dee183d4e65cf938242efaf3d833c6b645afb35039d058496965014f158141\",\"impliedFormat\":1},{\"version\":\"c0bbbf84d3fbd85dd60d040c81e8964cc00e38124a52e9c5dcdedf45fea3f213\",\"impliedFormat\":1},{\"version\":\"37bc7dde69065714efba13f8e1757f32478dfda2f9518b0cb7ed020f166c295d\",\"signature\":\"c5fa16b2175f3829cd81e4b02c97e6b713e9a849189bd311f65c5723f130a2a3\"},\"08d42cfd2b190a39fb933820a34bede0b59868f51b4732eaf3e9fd3c0adf6eaa\",\"460f6ae656d716a3d49fddc80072d0a8e5a8a60075827d5f4ca849a19c9f8b91\",\"b3b86cc2949111280d7794bbdf99dc452c4fd0ce9ca3501e98040a0696e8e025\",\"8766997f2760c8af4d6e7b0427e30597d4345f72c57a843958c48def6937a90a\",\"86f2ceea80f842c2bc9ca011c73f9f778f95a0155cfcaa2a3f6a6fb61793afff\",\"27b3169a95030cddf7ba0b295a76580094aaa686fdac3e5462e0c50754c157c7\",\"1fd85da7472fb913a514b3576e5b73be150a0f89cf8e1977a4687b98a2e57de6\",\"8a6732726de224ecaaee162399ba50743aeb0e24330e0b5ed98d7992b3343a96\",\"e1b2d9f086df120ca5009e8cf5d676ef29b618f48f766a35b9cf96d60f4e1bb1\",\"fd78677a40b71d2660fd503fcce4400f924e500c8009083c7687a9ee31b10573\",\"f0bde4726060fa8215e0480df0aef2949b11bd410bffa176103460134abb812e\",\"be1d66c7fc30e2b7b386c411b34dee86fde75cfeaded70e448fd540078a54667\",\"56eb59c3e0e1e8b032362541d56ddedf1c0dfd348575e5af975145a190db3cdc\",\"5dacb8ec035fc25303d008359b61c578d7f653116917948bd230266fa6939b56\",\"61cade50f41a34674b2cbf258813ad20ee00e318c9f87d0faf9f50283f99b64d\",\"31a491310785bb3f63d78655318f8cbf2fb0800f090d81228296adc46b309a6a\",\"ed2c4b46d0b8ec3b61ac30433092b37f312fdbcd2ba9590f7167b30a3dbd19b9\",\"6b548df91f8d21e64de54af0bd62bf46fc0d205ea9bfddd4e8cd4bb85a832868\",{\"version\":\"02b3b77a8d29c9ac409edc1c7a4efa339e2a07e3c5b5e6ea16f108c6eef9e20e\",\"impliedFormat\":99},{\"version\":\"ad2019bdab0ec396959c19dbfcb838f53fb47065488aeb83d7adccf36db75554\",\"impliedFormat\":99},{\"version\":\"d5602055e69da5aaf7dafa987dbf645f608f8c66536c7965680fe65420fed2fe\",\"impliedFormat\":99},{\"version\":\"41a5ae482e864a6128e6054e88f1c0e06884793f92aff5c67144fb02d2373079\",\"impliedFormat\":1},{\"version\":\"b8f01261ee1417ef9ca6e0e55e4b66ce3eaf79e711f8d165b27f4d211dc9fb24\",\"impliedFormat\":99},{\"version\":\"b06f68391bbdb8d64498b6510bb4211519049ae526d0026e84d5afd0dca9043f\",\"impliedFormat\":99},\"15dd61885af05c0c6e8b361d1e104c8688923f52eb4e6eda7ca6a28ad37a97bf\",\"3f548424f35341fe7ee5a26ed1d025aabe26905e49b06cb8046e559ab8d95ee5\",{\"version\":\"22bf7a668df721ea3df8409a9caabaa3b8afe68e653cca1e3b2715e60953442a\",\"signature\":\"f336369ff193a7a0a9f7c4162c2d50b8aada2950cd065d4aae0f551fa1c016a7\"},\"e404b826985b91e8b5419f4a85b94630eea98652241976dd0758cee618ac7b45\",\"5c8a2fcdc62ca40ebc68f12dba32c66c87d1afd01fa5191e6fcfcf27286c97ab\",\"a94efd8b39b12ca6cd460d396f76925edbca2aba0419d93cbbfa9d6fca94d629\",{\"version\":\"38479e9851ea5f43f60baaa6bc894a49dba0a74dd706ce592d32bcb8b59e3be9\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"9592f843d45105b9335c4cd364b9b2562ce4904e0895152206ac4f5b2d1bb212\",\"impliedFormat\":1},{\"version\":\"f9ff719608ace88cae7cb823f159d5fb82c9550f2f7e6e7d0f4c6e41d4e4edb4\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"292109ed5a7384c4a89b2aeb0723c3c5dffb8bb720686065c1d54ddd2b3db1cd\",\"signature\":\"b6beb904eb0a186d6487c0238a9a6221cd895ff7f4f2160771d1483e02c1004d\"},\"cfecf937bb85becf4b771fddfc7ba1e3c8e1d6734430c18049d2cd5ed6ea7e8b\",\"440e69937d5a6189e9d35e2e7aa735e0a4b75e305293799ef00d320f448d7363\",{\"version\":\"83d05a25ff98ede3065ca2cc368c9ba1db611a950e986f8aac7d8e16ac203bb1\",\"signature\":\"44d7d8ba76821d74e948208eb4135fefa58e397363a633679f147011fd1aa1c1\"},{\"version\":\"a07b806a82c249ae8c8d93172ebfac0f854dbcb89491e35efd3d15a48e5649c6\",\"signature\":\"ea89c2e1d59342ffa636b312a1d8b4229ff11901612fc8b43c9c954a0467ad9a\"},{\"version\":\"1c6eda4d63eef7e5b3c178cac84cad2aaf99264b4be796b2d399941e21be221d\",\"signature\":\"924f321892e8ae98c580b39d76fb24620b3797280dca4270a2778de8d71d9eb8\"},{\"version\":\"fe93c474ab38ac02e30e3af073412b4f92b740152cf3a751fdaee8cbea982341\",\"impliedFormat\":1},{\"version\":\"f5705d196b442afbdbd971b6e44bad96f4e32afb53cebfa2e5afe3140017bfc6\",\"impliedFormat\":1},{\"version\":\"1e00b8bf9e3766c958218cd6144ffe08418286f89ff44ba5a2cc830c03dd22c7\",\"impliedFormat\":1},\"1b272df3013c964ba647802d9704e53f4cc89680ead0167cc6f31e77890f07ee\",\"c93d286e1043f451ec66ffa873ad1fbc36c7f10b3569e946ed281cd6dfa1aed3\",\"31dca2ee108274b3ae7b46dce2c286d2be31aa6c4578f4ddf34b33651352528b\",\"8c738d7ab02122bec55d98eab2f5e875f5306ebffe56a6be96f2da0916a7ea71\",\"d1986184a09a52db8228cb2bb2a61a8c05c9354e5b93cec8e2628d8579c892d7\",{\"version\":\"a384610388221cd70cffb4503cee7853b8b076f2b4a55324b20a4bdbd25a3538\",\"affectsGlobalScope\":true},\"ac965c40df1c4a3d53cebda90c50063ebda4522b0a054741dc3d2bd98bc852e6\",{\"version\":\"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d\",\"impliedFormat\":1},{\"version\":\"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1\",\"impliedFormat\":1},{\"version\":\"96d14f21b7652903852eef49379d04dbda28c16ed36468f8c9fa08f7c14c9538\",\"impliedFormat\":1}],\"root\":[[506,508],[533,551],[558,563],[567,572],[576,582]],\"options\":{\"allowJs\":true,\"esModuleInterop\":true,\"jsx\":4,\"module\":99,\"skipLibCheck\":true,\"strict\":true,\"target\":4},\"referencedMap\":[[580,1],[581,2],[582,3],[506,2],[579,4],[571,5],[569,6],[568,7],[560,6],[570,8],[563,9],[562,6],[537,6],[561,10],[567,5],[572,11],[549,12],[550,13],[538,13],[539,14],[551,14],[540,13],[541,13],[542,13],[543,13],[544,13],[545,13],[546,13],[548,13],[547,13],[577,15],[578,16],[576,13],[535,17],[559,18],[558,14],[534,14],[536,17],[507,19],[508,20],[249,2],[136,21],[137,21],[138,22],[97,23],[139,24],[140,25],[141,26],[92,2],[95,27],[93,2],[94,2],[142,28],[143,29],[144,30],[145,31],[146,32],[147,33],[148,33],[150,2],[149,34],[151,35],[152,36],[153,37],[135,38],[96,2],[154,39],[155,40],[156,41],[188,42],[157,43],[158,44],[159,45],[160,46],[161,47],[162,48],[163,49],[164,50],[165,51],[166,52],[167,52],[168,53],[169,2],[170,54],[172,55],[171,56],[173,57],[174,58],[175,59],[176,60],[177,61],[178,62],[179,63],[180,64],[181,65],[182,66],[183,67],[184,68],[185,69],[186,70],[187,71],[192,72],[409,73],[193,74],[191,73],[410,75],[189,76],[407,2],[190,77],[83,2],[85,78],[406,73],[266,73],[84,2],[555,2],[566,79],[564,2],[565,2],[455,80],[460,1],[450,81],[213,82],[253,83],[434,84],[248,85],[230,2],[405,2],[211,2],[423,86],[279,87],[212,2],[333,88],[256,89],[257,90],[404,91],[420,92],[315,93],[428,94],[429,95],[427,96],[426,2],[424,97],[255,98],[214,99],[358,2],[359,100],[285,101],[215,102],[286,101],[281,101],[202,101],[251,103],[250,2],[433,104],[445,2],[238,2],[380,105],[381,106],[375,73],[482,2],[383,2],[384,6],[376,107],[487,108],[486,109],[481,2],[300,2],[419,110],[418,2],[480,111],[377,73],[309,112],[305,113],[310,114],[308,2],[307,115],[306,2],[483,2],[479,2],[485,116],[484,2],[304,113],[474,117],[477,118],[294,119],[293,120],[292,121],[490,73],[291,122],[273,2],[493,2],[574,123],[573,2],[496,2],[495,73],[497,124],[195,2],[430,125],[431,126],[432,127],[208,2],[241,2],[207,128],[194,2],[396,73],[200,129],[395,130],[394,131],[385,2],[386,2],[393,2],[388,2],[391,132],[387,2],[389,133],[392,134],[390,133],[210,2],[205,2],[206,101],[261,2],[267,135],[268,136],[265,137],[263,138],[264,139],[259,2],[402,6],[288,6],[454,140],[461,141],[465,142],[437,143],[436,2],[276,2],[498,144],[449,145],[378,146],[379,147],[373,148],[364,2],[401,149],[439,73],[365,150],[403,151],[398,152],[397,2],[399,2],[370,2],[357,153],[438,154],[441,155],[367,156],[371,157],[362,158],[415,159],[448,160],[319,161],[334,162],[203,163],[447,164],[199,165],[269,166],[260,2],[270,167],[346,168],[258,2],[345,169],[91,2],[339,170],[240,2],[360,171],[335,2],[204,2],[234,2],[343,172],[209,2],[271,173],[369,174],[435,175],[368,2],[342,2],[262,2],[348,176],[349,177],[425,2],[351,178],[353,179],[352,180],[243,2],[341,163],[355,181],[318,182],[340,183],[347,184],[218,2],[222,2],[221,2],[220,2],[225,2],[219,2],[228,2],[227,2],[224,2],[223,2],[226,2],[229,185],[217,2],[327,186],[326,2],[331,187],[328,188],[330,189],[332,187],[329,188],[239,190],[289,191],[444,192],[499,2],[469,193],[471,194],[366,195],[470,196],[442,154],[382,154],[216,2],[320,197],[235,198],[236,199],[237,200],[233,201],[414,201],[283,201],[321,202],[284,202],[232,203],[231,2],[325,204],[324,205],[323,206],[322,207],[443,208],[413,209],[412,210],[374,211],[408,212],[411,213],[422,214],[421,215],[417,216],[317,217],[314,218],[316,219],[313,220],[354,221],[344,2],[459,2],[356,222],[416,2],[272,223],[363,125],[361,224],[274,225],[277,226],[494,2],[275,227],[278,227],[457,2],[456,2],[458,2],[492,2],[280,228],[440,2],[311,229],[303,73],[254,2],[198,230],[287,2],[463,73],[197,2],[473,231],[302,73],[467,6],[301,232],[452,233],[299,231],[201,2],[475,234],[297,73],[298,73],[290,2],[196,2],[296,235],[295,236],[242,237],[372,51],[282,51],[350,2],[337,238],[336,2],[400,113],[312,73],[446,128],[453,239],[86,73],[89,240],[90,241],[87,73],[88,2],[252,242],[247,243],[246,2],[245,244],[244,2],[451,245],[462,246],[464,247],[466,248],[575,249],[468,250],[472,251],[505,252],[476,252],[504,253],[478,254],[488,255],[489,256],[491,257],[500,258],[503,128],[502,2],[501,259],[525,260],[523,261],[524,262],[512,263],[513,261],[520,264],[511,265],[516,266],[526,2],[517,267],[522,268],[528,269],[527,270],[510,271],[518,272],[519,273],[514,274],[521,260],[515,275],[338,276],[509,2],[554,2],[552,2],[556,277],[553,278],[557,279],[531,280],[530,2],[529,2],[532,281],[81,2],[82,2],[13,2],[14,2],[16,2],[15,2],[2,2],[17,2],[18,2],[19,2],[20,2],[21,2],[22,2],[23,2],[24,2],[3,2],[25,2],[26,2],[4,2],[27,2],[31,2],[28,2],[29,2],[30,2],[32,2],[33,2],[34,2],[5,2],[35,2],[36,2],[37,2],[38,2],[6,2],[42,2],[39,2],[40,2],[41,2],[43,2],[7,2],[44,2],[49,2],[50,2],[45,2],[46,2],[47,2],[48,2],[8,2],[54,2],[51,2],[52,2],[53,2],[55,2],[9,2],[56,2],[57,2],[58,2],[60,2],[59,2],[61,2],[62,2],[10,2],[63,2],[64,2],[65,2],[11,2],[66,2],[67,2],[68,2],[69,2],[70,2],[1,2],[71,2],[72,2],[12,2],[76,2],[74,2],[79,2],[78,2],[73,2],[77,2],[75,2],[80,2],[113,282],[123,283],[112,282],[133,284],[104,285],[103,286],[132,259],[126,287],[131,288],[106,289],[120,290],[105,291],[129,292],[101,293],[100,259],[130,294],[102,295],[107,296],[108,2],[111,296],[98,2],[134,297],[124,298],[115,299],[116,300],[118,301],[114,302],[117,303],[127,259],[109,304],[110,305],[119,306],[99,307],[122,298],[121,296],[125,2],[128,308],[583,2],[584,2],[585,2],[533,309]],\"affectedFilesPendingEmit\":[582,579,571,569,568,560,570,563,562,537,561,567,572,549,550,538,539,551,540,541,542,543,544,545,546,548,547,577,578,576,535,559,558,534,536,508,533],\"version\":\"5.9.2\"}"
  }
]