[
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\ngithub: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]\npatreon: # Replace with a single Patreon username\nopen_collective: # Replace with a single Open Collective username\nko_fi: winboat\ntidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel\ncommunity_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry\nliberapay: # Replace with a single Liberapay username\nissuehunt: # Replace with a single IssueHunt username\nlfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry\npolar: # Replace with a single Polar username\nbuy_me_a_coffee: # Replace with a single Buy Me a Coffee username\nthanks_dev: # Replace with a single thanks.dev username\ncustom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/1-bug-report.yml",
    "content": "name: 🚨 Bug Report\ndescription: Report an issue that you've encountered\ntitle: \"[Bug] \"\nlabels:\n    - bug\n    - needs-triage\nbody:\n    - type: markdown\n      attributes:\n          value: |\n              Thanks for taking your time reporting an issue.\n              Please make sure to look through the [issue tracker](https://github.com/TibixDev/winboat/issues) before submitting an issue as to avoid duplicates.\n    - type: input\n      attributes:\n          label: What version of WinBoat are you running?\n      validations:\n          required: true\n    - type: textarea\n      attributes:\n          label: Your Environment\n          placeholder: |\n              Linux Distro used: \n              Desktop Environment used:\n              FreeRDP type and version used: (e.g. flatpak 3.17.1)\n              Anything else you may find relevant...\n      validations:\n          required: true\n    - type: textarea\n      attributes:\n          label: Steps to Reproduce / Context\n          description: |\n              Please provide clear steps to reproduce this issue. \n              If the issue is not completely reproducible, please provide some context about your case.\n      validations:\n          required: true\n    - type: textarea\n      attributes:\n          label: Logs\n          description: |\n              Please drag 'n drop your `.log` files from `~/.winboat`, then format them accordingly. \n              WARNING: winboat.log contains your VM's password in plaintext, so if it's sensitive make sure to remove it before uploading.\"\n          placeholder: |\n              - [winboat.log](https://github.com/user-attachments/files/.../winboat.log)\n              - [install.log](https://github.com/user-attachments/files/.../install.log)\n              - [qmp.log](https://github.com/user-attachments/files/.../qmp.log)\n              ...\n      validations:\n          required: true\n    - type: textarea\n      attributes:\n          label: Expected Behavior\n          description: Describe what should happen in this case.\n      validations:\n          required: true\n    - type: textarea\n      attributes:\n          label: Current Behavior\n          description: Tell us what happens instead of the Expected Behavior\n      validations:\n          required: true\n    - type: textarea\n      attributes:\n          label: Possible Solution\n          description: Optionally, suggest a fix/reason for the issue.\n    - type: checkboxes\n      attributes:\n          label: Quality Notice\n          options:\n              - label: I have checked the issue tracker and verified that this bug is a unique case.\n                required: true\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/2-feature-request.yml",
    "content": "name: 🧩 Feature Request\ndescription: Suggest a new feature, enhancement, or just share your idea\ntitle: \"[Feature] \"\nlabels:\n    - enhancement\nbody:\n    - type: markdown\n      attributes:\n          value: |\n              Thank you for taking your time submitting a Feature Request\n              Please make sure to look through the [issue tracker](https://github.com/TibixDev/winboat/issues) before submitting a Feature Request as to avoid duplicates.\n    - type: textarea\n      attributes:\n          label: Feature Description\n          description: Please take your time in outlining your Feature Request, as it helps others understand it more clearly.\n      validations:\n          required: true\n    - type: textarea\n      attributes:\n          label: Use-Case\n          description: Why do you think this Feature would be useful?\n      validations:\n          required: true\n    - type: textarea\n      attributes:\n          label: Proposed Implementation\n          description: Optionally, you could provide us with a proposal as to how you'd implement this feature.\n    - type: checkboxes\n      attributes:\n          label: Notice\n          options:\n              - label: I have checked the issue tracker and verified that this Feature Request has not been proposed before.\n                required: true\n              - label: I would like to help out implementing this feature\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\ncontact_links:\n    - name: Ask for Help\n      about: If you have any questions regarding WinBoat, join our Discord\n      url: https://discord.gg/MEwmpWm4tN\n"
  },
  {
    "path": ".github/renovate.json5",
    "content": "{\n    $schema: \"https://docs.renovatebot.com/renovate-schema.json\",\n    extends: [\"config:recommended\", \":disableRateLimiting\"],\n    includePaths: [\"**/src/renderer/lib/**\"],\n    regexManagers: [\n        {\n            fileMatch: [\"src/renderer/lib/install\\\\.ts$\"],\n            matchStrings: ['\"image\":\\\\s*\"(?<depName>ghcr\\\\.io/dockur/windows):(?<currentValue>[^\"]+)\"'],\n            datasourceTemplate: \"docker\",\n            depTypeTemplate: \"container\",\n        },\n    ],\n}\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "name: Build WinBoat\npermissions:\n    contents: write\non:\n    push:\n        branches:\n            - main\n        tags:\n            - \"v*\"\n    workflow_dispatch:\n        inputs:\n            build_type:\n                description: \"Build type\"\n                required: true\n                default: \"all\"\n                type: choice\n                options:\n                    - all\n                    - linux-only\n                    - guest-server-only\njobs:\n    build:\n        runs-on: ubuntu-22.04\n        if: >-\n            (github.event_name == 'push' && !startsWith(github.ref, 'refs/tags/')) ||\n            (github.event_name == 'workflow_dispatch' && github.event.inputs.build_type != 'guest-server-only')\n        steps:\n            - name: Checkout code\n              uses: actions/checkout@v5\n            - name: Update USB IDs database\n              run: |\n                  echo \"Removing old usb.ids file...\"\n                  rm -f data/usb.ids\n                  echo \"Downloading latest usb.ids from linux-usb.org...\"\n                  curl -o data/usb.ids http://www.linux-usb.org/usb.ids\n                  echo \"USB IDs database updated successfully\"\n            - name: Show build type\n              run: |\n                  if [ \"${{ github.event_name }}\" = \"workflow_dispatch\" ]; then\n                    echo \"Manual workflow triggered with build type: ${{ github.event.inputs.build_type }}\"\n                  else\n                    echo \"Automatic workflow triggered by ${{ github.event_name }}\"\n                  fi\n            - name: Install system dependencies\n              run: |\n                  sudo apt-get update\n                  sudo apt-get install -y libudev-dev libusb-1.0-0-dev\n            - name: Set up Bun\n              uses: oven-sh/setup-bun@v2\n            - name: Set up Go\n              uses: actions/setup-go@v5\n              with:\n                  go-version: \"stable\"\n                  cache-dependency-path: \"guest_server/go.sum\"\n            - name: Install dependencies\n              run: bun ci\n            - name: Build guest server and app\n              run: bun run build:linux-gs\n              env:\n                  GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n                  ELECTRON_BUILDER_COMPRESSION_LEVEL: 5\n            - name: Derive artifact naming\n              id: meta\n              shell: bash\n              run: |\n                  bun -e \"const p=require('./package.json'); console.log('NAME='+p.name)\" >> \"$GITHUB_OUTPUT\"\n                  bun -e \"const p=require('./package.json'); console.log('VERSION='+p.version)\" >> \"$GITHUB_OUTPUT\"\n                  ARCH_FROM_FILE=$(ls dist/*.{AppImage,deb,rpm,tar.bz2} 2>/dev/null | head -n1 | xargs -I{} basename {} | sed -E 's/.*-([A-Za-z0-9_]+)\\.[^.]+$/\\1/')\n                  if [ -n \"$ARCH_FROM_FILE\" ]; then\n                    echo \"ARCH=$ARCH_FROM_FILE\" >> \"$GITHUB_OUTPUT\"\n                  else\n                    BUN_ARCH=$(bun -p \"process.arch\")\n                    case \"$BUN_ARCH\" in\n                      x64)   echo \"ARCH=x86_64\" >> \"$GITHUB_OUTPUT\" ;;\n                      arm64) echo \"ARCH=arm64\"  >> \"$GITHUB_OUTPUT\" ;;\n                      arm)   echo \"ARCH=armv7l\" >> \"$GITHUB_OUTPUT\" ;;\n                      *)     echo \"ARCH=$BUN_ARCH\" >> \"$GITHUB_OUTPUT\" ;;\n                    esac\n                  fi\n            - name: Upload AppImage\n              uses: actions/upload-artifact@v4\n              with:\n                  name: ${{ steps.meta.outputs.NAME }}-${{ steps.meta.outputs.VERSION }}-${{ steps.meta.outputs.ARCH }}.appimage\n                  path: dist/*.AppImage\n                  if-no-files-found: ignore\n            - name: Upload DEB\n              uses: actions/upload-artifact@v4\n              with:\n                  name: ${{ steps.meta.outputs.NAME }}-${{ steps.meta.outputs.VERSION }}-${{ steps.meta.outputs.ARCH }}.deb\n                  path: dist/*.deb\n                  if-no-files-found: ignore\n            - name: Upload RPM\n              uses: actions/upload-artifact@v4\n              with:\n                  name: ${{ steps.meta.outputs.NAME }}-${{ steps.meta.outputs.VERSION }}-${{ steps.meta.outputs.ARCH }}.rpm\n                  path: dist/*.rpm\n                  if-no-files-found: ignore\n            - name: Upload TAR.BZ2\n              uses: actions/upload-artifact@v4\n              with:\n                  name: ${{ steps.meta.outputs.NAME }}-${{ steps.meta.outputs.VERSION }}-${{ steps.meta.outputs.ARCH }}.tar.bz2\n                  path: dist/*.tar.bz2\n                  if-no-files-found: ignore\n            - name: Upload unpacked directory\n              uses: actions/upload-artifact@v4\n              with:\n                  name: ${{ steps.meta.outputs.NAME }}-${{ steps.meta.outputs.VERSION }}-${{ steps.meta.outputs.ARCH }}-unpacked.zip\n                  path: dist/linux-unpacked/**\n                  if-no-files-found: ignore\n            - name: Upload guest server zip\n              uses: actions/upload-artifact@v4\n              with:\n                  name: ${{ steps.meta.outputs.NAME }}-${{ steps.meta.outputs.VERSION }}-${{ steps.meta.outputs.ARCH }}-guest_server.zip\n                  path: dist/linux-unpacked/resources/guest_server/winboat_guest_server.zip\n                  if-no-files-found: ignore\n            # - name: Upload metadata\n            #   uses: actions/upload-artifact@v4\n            #   with:\n            #     name: ${{ steps.meta.outputs.NAME }}-${{ steps.meta.outputs.VERSION }}-${{ steps.meta.outputs.ARCH }}-metadata\n            #     path: |\n            #       dist/latest-linux.yml\n            #       dist/linux-unpacked/resources/guest_server/winboat_guest_server.zip\n            #     if-no-files-found: ignore\n    guest-server-only:\n        runs-on: ubuntu-22.04\n        if: github.event_name == 'workflow_dispatch' && github.event.inputs.build_type == 'guest-server-only'\n        steps:\n            - name: Checkout code\n              uses: actions/checkout@v5\n            - name: Show build type\n              run: |\n                  echo \"Manual workflow triggered with build type: guest-server-only\"\n            - name: Set up Go\n              uses: actions/setup-go@v5\n              with:\n                  go-version: \"stable\"\n                  cache-dependency-path: \"guest_server/go.sum\"\n            - name: Build guest server only\n              run: bash build-guest-server.sh\n            - name: Upload guest server artifacts\n              uses: actions/upload-artifact@v4\n              with:\n                  name: guest-server-artifacts\n                  path: guest_server/\n    release:\n        runs-on: ubuntu-22.04\n        if: >-\n            startsWith(github.ref, 'refs/tags/') ||\n            (github.event_name == 'workflow_dispatch' && github.event.inputs.build_type == 'all')\n        steps:\n            - name: Checkout code\n              uses: actions/checkout@v5\n            - name: Update USB IDs database\n              run: |\n                  echo \"Removing old usb.ids file...\"\n                  rm -f data/usb.ids\n                  echo \"Downloading latest usb.ids from linux-usb.org...\"\n                  curl -o data/usb.ids http://www.linux-usb.org/usb.ids\n                  echo \"USB IDs database updated successfully\"\n            - name: Show build type\n              run: |\n                  if [ \"${{ github.event_name }}\" = \"workflow_dispatch\" ]; then\n                    echo \"Manual workflow triggered with build type: ${{ github.event.inputs.build_type }}\"\n                  else\n                    echo \"Release workflow triggered by tag: ${{ github.ref_name }}\"\n                  fi\n            - name: Install system dependencies\n              run: |\n                  sudo apt-get update\n                  sudo apt-get install -y libudev-dev libusb-1.0-0-dev\n            - name: Set up Bun\n              uses: oven-sh/setup-bun@v2\n            - name: Set up Go\n              uses: actions/setup-go@v5\n              with:\n                  go-version: \"stable\"\n                  cache-dependency-path: \"guest_server/go.sum\"\n            - name: Install dependencies\n              run: bun ci\n            - name: Build guest server and app\n              run: bun run build:linux-gs\n              env:\n                  GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n                  ELECTRON_BUILDER_COMPRESSION_LEVEL: 5\n            - name: Zip unpacked variant\n              run: cd dist && zip -r winboat-linux-unpacked.zip linux-unpacked/\n            - name: Create GitHub Release\n              uses: softprops/action-gh-release@v1\n              with:\n                  files: |\n                      dist/*.AppImage\n                      dist/*.deb\n                      dist/*.rpm\n                      dist/*.tar.bz2\n                      dist/winboat-linux-unpacked.zip\n                      dist/latest-linux.yml\n                      dist/linux-unpacked/resources/guest_server/winboat_guest_server.zip\n                  draft: false\n                  prerelease: false\n                  generate_release_notes: true\n              env:\n                  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".gitignore",
    "content": "node_modules\ndist\nbuild\n\n.vscode\n.idea\n\nresult\n\npackage-lock.json\n# src/renderer/public/*\n\n# Custom\n# *.exe\ntemp\nguest_server/winboat_guest_server.exe\nguest_server/winboat_guest_server.zip"
  },
  {
    "path": ".npmrc",
    "content": "engine-strict=true"
  },
  {
    "path": ".prettierignore",
    "content": "\n# Ignore xel's files\n/src/renderer/public/xel\n"
  },
  {
    "path": ".prettierrc",
    "content": "{\n    \"tabWidth\": 4,\n    \"printWidth\": 120,\n    \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "The WinBoat code of conduct is derived from [Ladybird](https://github.com/LadybirdBrowser/ladybird/blob/master/CODE_OF_CONDUCT.md).\n\n- Participants will be tolerant of opposing views.\n- Participants must ensure that their language and actions are free of personal attacks and disparaging personal remarks.\n- When interpreting the words and actions of others, participants should always assume good intentions.\n- Behavior that can be reasonably considered harassment will not be tolerated.\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# WinBoat Contribution Guidelines\n\nThis document outlines the general contribution guidelines that apply to WinBoat.\n\n> [!TIP]\n> If you're new to open source, the [Open Source Etiquette](https://developer.mozilla.org/en-US/docs/MDN/Community/Open_source_etiquette) is an excellent read that you should check out before reading the rest of this document.\n\n> [!IMPORTANT]\n> Basic familiarity with Git and GitHub is required: If you are also new to these tools, visit [GitHub for complete beginners](https://github.com/git-guides#learning-git-basics) for a comprehensive introduction to them.\n\n## General\n\n1. **Avoid vibe-coding large features** - While probably most of us use AI while coding in our day to day lives, you should try to use it in a clever and targetted manner. Avoid submitting large vibe-coded features, because in 99% of the cases they will not behave as expected. These kinds of PR-s drain our energy and time that could be focused on something more useful, because what took a few seconds for the AI assistant to pump out will take us hours to test, discuss, and ultimately scrap because it doesn't take into account half the things a real programmer probably would. If you made heavy use of AI in your pull request, **indicate it**.\n\n2. **Do not break existing code** - WinBoat aims to provide a seamless user experience, so please avoid the breakage of any existing features to the best of your abilities. Ensure that folks potentially upgrading to a new version that includes your changes won't have any problems, and address any migrations if they're required.\n\n3. **Do rigorous testing** - WinBoat is used by tens of thousands of folks every day on a wide range of Linux distros, make sure that the PR you submit doesn't break compatibility on any of the mainstream distros.\n\n4. **If you're unsure, ask** - If you want to start working on something large that you then intend for us to merge into WinBoat, it may be worth asking us first in an issue to understand if the feature is compatible with the philosophy of WinBoat and whether we want to include it. The same idea applies if you're unsure how to implement a feature in a way that's compatible with how WinBoat operates.\n\n5. **Avoid introducing new programming languages** - WinBoat uses TypeScript & Vue for the Electron app, and Go & PowerShell for the Guest Server. Use these for getting things done.\n\n6. **Avoid introducing new foreign dependencies** - Chances are there's an NPM / Go package for what you're trying to achieve or at least something similar. If there isn't, and it's a must to include it, discuss with us first.\n\n## Branch Management\n\nBefore contributing, you should always create a personal fork of WinBoat, where you can create a dedicated branch for the changes you're aiming to make. Once you're finished with your changes, you can go ahead and create a PR aiming to merge your changes to WinBoat's main branch. If you're still in the process of development, but you'd still like to open a PR for visibility or discussion, make sure that you open a draft PR instead.\n\n**Branch naming convention:** Use descriptive names like `feat/your-feature-name` or `fix/issue-description`\n\n## Pull Requests & Commits\n\nYour PR title should include what it's trying to do, e.g. `feat: Add VNC port into Configuration`, while the description should outline it in more detail, potentially explaining how the feature works, details on the implementation, and/or why the feature is useful.\n\nMake sure you reference any issues that are potentially linked to your Pull Request using GitHub's [keywords](https://docs.github.com/en/issues/tracking-your-work-with-issues/using-issues/linking-a-pull-request-to-an-issue), either via comments or commit messages.\n\nWinBoat generally uses the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) naming scheme. You should aim to stick to these conventions whenever possible.\n\n## Review & Merging Process\n\nAfter you've submitted your changes as a PR, a maintainer may request changes to your code before merging. If everything goes well, your PR will be merged and shipped in the next version of WinBoat.\n\nIn case we find issues later on, the PR commits might be reverted and additional discussion will take place in the PR thread or a separate issue.\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2026 TibixDev\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "<div align=\"left\">\n  <table>\n    <tr>\n      <td>\n        <img src=\"icons/winboat_logo.svg\" alt=\"WinBoat Logo\" width=\"150\">\n      </td>\n      <td>\n        <h1 style=\"color: #7C86FF; margin: 0; font-size: 32px;\">WinBoat</h1>\n        <p style=\"color: oklch(90% 0 0); font-size: 14px; margin: 5px 0;\">Windows for Penguins.<br>\n        Run Windows apps on 🐧 Linux with ✨ seamless integration</p>\n      </td>\n    </tr>\n  </table>\n</div>\n\n## Screenshots\n\n<div align=\"center\">\n  <img src=\"gh-assets/features/feat_dash.png\" alt=\"WinBoat Dashboard\" width=\"45%\">\n  <img src=\"gh-assets/features/feat_apps.png\" alt=\"WinBoat Apps\" width=\"45%\">\n  <img src=\"gh-assets/features/feat_native.png\" alt=\"Native Windows\" width=\"45%\">\n</div>\n\n## ⚠️ Work in Progress ⚠️\n\nWinBoat is currently in beta, so expect to occasionally run into hiccups and bugs. You should be comfortable with some level of troubleshooting if you decide to try it, however we encourage you to give it a shot anyway.\n\n## Features\n\n- **🎨 Elegant Interface**: Sleek and intuitive interface that seamlessly integrates Windows into your Linux desktop environment, making it feel like a native experience\n- **📦 Automated Installs**: Simple installation process through our interface - pick your preferences & specs and let us handle the rest\n- **🚀 Run Any App**: If it runs on Windows, it can run on WinBoat. Enjoy the full range of Windows applications as native OS-level windows in your Linux environment\n- **🖥️ Full Windows Desktop**: Access the complete Windows desktop experience when you need it, or run individual apps seamlessly integrated into your Linux workflow\n- **📁 Filesystem Integration**: Your home directory is mounted in Windows, allowing easy file sharing between the two systems without any hassle\n- **✨ And many more**: Smartcard passthrough, resource monitoring, and more features being added regularly\n\n## How Does It Work?\n\nWinBoat is an Electron app which allows you to run Windows apps on Linux using a containerized approach. Windows runs as a VM inside a Docker/Podman container, we communicate with it using the [WinBoat Guest Server](https://github.com/TibixDev/winboat/tree/main/guest_server) to retrieve data we need from Windows. For compositing applications as native OS-level windows, we use FreeRDP together with Windows's RemoteApp protocol.\n\n## Prerequisites\n\nBefore running WinBoat, ensure your system meets the following requirements:\n\n- **RAM**: At least 4 GB of RAM\n- **CPU**: At least 2 CPU threads\n- **Storage**: At least 32 GB free space on the drive your selected install folder corresponds to\n- **Virtualization**: KVM enabled in BIOS/UEFI\n    - [How to enable virtualization](https://duckduckgo.com/?t=h_&q=how+to+enable+virtualization+in+%3Cmotherboard+brand%3E+bios&ia=web)\n- **In case of Docker:**\n  - **Docker**: Required for containerization\n      - [Installation Guide](https://docs.docker.com/engine/install/)\n      - **⚠️ NOTE:** Docker Desktop is **not** supported, you will run into issues if you use it\n  - **Docker Compose v2**: Required for compatibility with docker-compose.yml files\n      - [Installation Guide](https://docs.docker.com/compose/install/#plugin-linux-only)\n  - **Docker User Group**: Add your user to the `docker` group\n      - [Setup Instructions](https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user)\n- **In case of Podman:**\n  - **Podman**: Required for containerization\n      - [Installation Guide](https://podman.io/docs/installation#installing-on-linux)\n  - **Podman Compose**: Required for compatibility with podman-compose.yml files\n      - [Installation Guide](https://github.com/containers/podman-compose?tab=readme-ov-file#installation)\n- **FreeRDP**: Required for remote desktop connection (Please make sure you have **Version 3.x.x** with sound support included)\n    - [Installation Guide](https://github.com/FreeRDP/FreeRDP/wiki/PreBuilds)\n- [OPTIONAL] **Kernel Modules**: The `iptables` / `nftables` and `iptable_nat` kernel modules can be loaded for network autodiscovery and better shared filesystem performance, but this is not obligatory in newer versions of WinBoat\n    - [Module loading instructions](https://rentry.org/rmfq2e5e)\n\n## Downloading\n\nYou can download the latest Linux builds under the [Releases](https://github.com/TibixDev/winboat/releases) tab. We currently offer four variants:\n\n- **AppImage:** A popular & portable app format which should run fine on most distributions\n- **Unpacked:** The raw unpacked files, simply run the executable (`linux-unpacked/winboat`)\n- **.deb:** The intended format for Debian based distributions\n- **.rpm:** The intended format for Fedora based distributions\n- **Nix (Nixpkgs)**\n    1. Add the winboat package to your config (ensure using nixpkgs-unstable)\n    using `environment.systemPackages = [pkgs.winboat];` or `home.packages = [pkgs.winboat];` if using home manager.\n    2. Add the following lines to your nix configuration\n    ```nix\n    virtualisation.docker.enable = true;\n    users.users.{yourUser}.extraGroups = [\"docker\"];\n    ```\n## Known Issues About Container Runtimes\n\n- Docker Desktop is **unsupported** for now\n- USB passthrough via Podman is currently **unsupported**\n\n## Building WinBoat\n\n- For building you need to have Bun and Go installed on your system\n- Clone the repo (`git clone https://github.com/TibixDev/WinBoat`)\n- Install the dependencies (`bun i`)\n- Build the app and the guest server using `bun run build:linux-gs`\n- You can now find the built app under `dist` with an AppImage and an Unpacked variant\n\n## Running WinBoat in development mode\n\n- Make sure you meet the [prerequisites](#prerequisites)\n- Additionally, for development you need to have Bun and Go installed on your system\n- Clone the repo (`git clone https://github.com/TibixDev/WinBoat`)\n- Install the dependencies (`bun i`)\n- Build the guest server (`bun run build:gs`)\n- Run the app (`bun run dev`)\n\n## Contributing\n\nContributions are welcome! Whether it's bug fixes, feature improvements, or documentation updates, we appreciate your help making WinBoat better.\n\n**Please note**: We maintain a focus on technical contributions only. Pull requests containing political/sexual content, or other sensitive/controversial topics will not be accepted. Let's keep things focused on making great software! 🚀\n\nFeel free to:\n\n- Report bugs and issues\n- Submit feature requests\n- Contribute code improvements\n- Help with documentation\n- Share feedback and suggestions\n\nCheck out our issues page to get started, or feel free to open a new issue if you've found something that needs attention.\n\n## License\n\nWinBoat is licensed under the [MIT](https://github.com/TibixDev/winboat/blob/main/LICENSE) license\n\n## Inspiration / Alternatives\n\nThese past few years some cool projects have surfaced with similar concepts, some of which we've also taken inspirations from.\\\nThey're awesome and you should check them out:\n\n- [WinApps](https://github.com/winapps-org/winapps)\n- [Cassowary](https://github.com/casualsnek/cassowary)\n- [dockur/windows](https://github.com/dockur/windows) (🌟 Also used in WinBoat)\n\n## Socials & Contact\n\n- [![Website](https://img.shields.io/badge/Website-winboat.app-blue?style=flat&logo=googlechrome&logoColor=white)](https://www.winboat.app/)\n- [![Twitter](https://img.shields.io/badge/Twitter-@winboat__app-1DA1F2?style=flat&logo=x&logoColor=white)](https://x.com/winboat_app)\n- [![Mastodon](https://img.shields.io/badge/Mastodon-@winboat-6364FF?style=flat&logo=mastodon&logoColor=white)](https://fosstodon.org/@winboat)\n- [![Bluesky](https://img.shields.io/badge/Bluesky-winboat.app-00A8E8?style=flat&logo=bluesky&logoColor=white)](http://bsky.app/profile/winboat.app)\n- [![Discord](https://img.shields.io/badge/Discord-Join_Community-5865F2?style=flat&logo=discord&logoColor=white)](http://discord.gg/MEwmpWm4tN)\n- [![Email](https://img.shields.io/badge/Email-staff@winboat.app-D14836?style=flat&logo=gmail&logoColor=white)](mailto:staff@winboat.app)\n- [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/TibixDev/winboat)\n\n## Star History\n\n<a href=\"https://www.star-history.com/#tibixdev/winboat&Date\">\n <picture>\n   <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/svg?repos=tibixdev/winboat&type=Date&theme=dark\" />\n   <source media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/svg?repos=tibixdev/winboat&type=Date\" />\n   <img alt=\"Star History Chart\" src=\"https://api.star-history.com/svg?repos=tibixdev/winboat&type=Date\" />\n </picture>\n</a>\n"
  },
  {
    "path": "SECURITY.md",
    "content": "# Security Policy\n\nWinBoat takes security very seriously, if you believe you have found a security vulnerability within WinBoat, do the following steps:\n\n1. Construct a PoC (Proof of Concept) showcasing how the vulnerability can be used in real world scenarios.\n2. Make a video showcasing the vulnerability.\n3. Send an email to `staff@winboat.app` with the subject line `[SECURITY] Example Vulnerability` or contact any maintainer on [Discord](https://discord.gg/MEwmpWm4tN) (faster).\n4. We will respond as soon as possible and begin working on a fix if your vulnerability qualifies. During this time, please avoid disclosing it to any third parties or the general public for obvious reasons. Our commit messages will likely not indicate that it's a fix for a security vulnerability in specific, this is to minimize any N-day attacks.\n5. A release will be made including the fix for the vulnerability, which will be mentioned in the patch notes.\n"
  },
  {
    "path": "build-guest-server.sh",
    "content": "#!/bin/bash\nset -e\n\necho \"Building guest server...\"\n\n# Variables\nexport GOOS=windows\nexport GOARCH=amd64\nexport PACKAGE=winboat-server\nexport VERSION=\"$(bun -p \"require('./package.json').version\")\"\nexport COMMIT_HASH=\"$(git rev-parse --short HEAD)\"\nexport BUILD_TIMESTAMP=$(date '+%Y-%m-%dT%H:%M:%S')\nexport LDFLAGS=(\n  \"-X 'main.Version=${VERSION}'\"\n  \"-X 'main.CommitHash=${COMMIT_HASH}'\"\n  \"-X 'main.BuildTimestamp=${BUILD_TIMESTAMP}'\"\n)\n\necho \"Version: ${VERSION}\"\necho \"Commit Hash: ${COMMIT_HASH}\"\necho \"Build Timestamp: ${BUILD_TIMESTAMP}\"\n\n# Enter build directory\ncd guest_server\n\n# Verify nssm.exe integrity\necho \"Verifying nssm.exe integrity...\"\nif [ -f \"nssm.exe\" ] && [ -f \"nssm.sha1.txt\" ]; then\n    COMPUTED_HASH=$(sha1sum nssm.exe | cut -d' ' -f1)\n    EXPECTED_HASH=$(cat nssm.sha1.txt | tr -d '[:space:]')\n    \n    if [ \"$COMPUTED_HASH\" = \"$EXPECTED_HASH\" ]; then\n        echo \"✓ nssm.exe integrity verified (SHA-1: $COMPUTED_HASH)\"\n    else\n        echo \"✗ nssm.exe integrity check FAILED!\"\n        echo \"  Expected: $EXPECTED_HASH\"\n        echo \"  Computed: $COMPUTED_HASH\"\n        exit 1\n    fi\nelse\n    echo \"⚠ Warning: nssm.exe or nssm.sha1.txt not found, skipping integrity check\"\nfi\n\n# Build the guest server\ngo build -ldflags=\"${LDFLAGS[*]}\" -o winboat_guest_server.exe *.go\nrm -f winboat_guest_server.zip\nzip -r winboat_guest_server.zip .\n\necho \"Guest server built: guest_server/winboat_guest_server.zip\""
  },
  {
    "path": "data/usb.ids",
    "content": "#\n#\tList of USB ID's\n#\n#\tMaintained by Stephen J. Gowdy <linux.usb.ids@gmail.com>\n#\tIf you have any new entries, please submit them via\n#\t\thttp://www.linux-usb.org/usb-ids.html\n#\tor send entries as patches (diff -u old new) in the\n#\tbody of your email (a bot will attempt to deal with it).\n#\tThe latest version can be obtained from\n#\t\thttp://www.linux-usb.org/usb.ids\n#\n# Version: 2025.09.15\n# Date:    2025-09-15 20:34:02\n#\n\n# Vendors, devices and interfaces. Please keep sorted.\n\n# Syntax:\n# vendor  vendor_name\n#\tdevice  device_name\t\t\t\t<-- single tab\n#\t\tinterface  interface_name\t\t<-- two tabs\n\n0001  Fry's Electronics\n\t7778  Counterfeit flash drive [Kingston]\n0002  Ingram\n\t0002  passport00\n\t7007  HPRT XT300\n0003  Club Mac\n0004  Nebraska Furniture Mart\n0011  Unknown\n\t7788  counterfeit flash drive\n001f  Walmart\n\t0b21  AB13X Headset Adapter\n0040  Anyware Corporation\n\t073d  Mini Multimedia 2.4GHz Wireless Keyboard with Touch Pad\n0042  DMT\n0053  Planex\n\t5301  GW-US54ZGL 802.11bg\n0078  Microntek\n\t0006  Joystick\n0079  DragonRise Inc.\n\t0006  PC TWIN SHOCK Gamepad\n\t0011  Gamepad\n\t1800  Mayflash Wii U Pro Game Controller Adapter [DirectInput]\n\t181b  Venom Arcade Joystick\n\t1843  Mayflash GameCube Controller Adapter\n\t1844  Mayflash GameCube Controller\n0080  Unknown\n\ta001  JMS578 based SATA bridge\n0085  Boeye Technology Co., Ltd.\n\t0600  eBook Reader\n0102  miniSTREAK\n0105  Trust International B.V.\n\t145f  NW-3100 802.11b/g 54Mbps Wireless Network Adapter [zd1211]\n0127  IBP\n\t0002  HDM Interface\n\t0127  ibp\n0145  Unknown\n\t0112  Card Reader\n017c  MLK\n\t145f  Trust Deskset\n019c  mek\n\t0042  mek_42\n0200  TP-Link\n\t0201  MA180 UMTS Modem\n0204  Chipsbank Microelectronics Co., Ltd\n\t6025  CBM2080 / CBM2090 Flash drive controller\n\t6026  CBM1180 Flash drive controller\n0218  Hangzhou Worlde\n\t0301  MIDI Port\n0231  Sonuus Limited\n02ad  HUMAX Co., Ltd.\n\t138c  PVR Mass Storage\n0300  Ajazz\n\t1010  Akp153E Desktop Controller\n\t1020  AKP153R Desktop Controller\n0303  Mini Automation Controller\n0324  OCZ Technology Inc\n\tbc06  OCZ ATV USB 2.0 Flash Drive\n\tbc08  OCZ Rally2/ATV USB 2.0 Flash Drive\n0325  OCZ Technology Inc\n\tac02  ATV Turbo / Rally2 Dual Channel USB 2.0 Flash Drive\n0386  LTS\n\t0001  PSX for USB Converter\n03c3  ZWO\n\t120e  ASI120MC-S Planetary Camera\n\t1f10  EFF\n\t294f  ASI294MC Pro\n03d9  Shenzhen Sinote Tech-Electron Co., Ltd\n\t0499  SE340D PC Remote Control\n03da  Bernd Walter Computer Technology\n\t0002  HD44780 LCD interface\n03e7  Intel\n\t2150  Myriad VPU [Movidius Neural Compute Stick]\n\t2485  Movidius MyriadX\n\tf63b  Myriad VPU [Movidius Neural Compute Stick]\n03e8  EndPoints, Inc.\n\t0004  SE401 Webcam\n\t0008  101 Ethernet [klsi]\n\t0015  ATAPI Enclosure\n\t2123  SiPix StyleCam Deluxe\n\t8004  Aox 99001\n03e9  Melexis (formerly Thesys Microelectronics)\n03ea  Data Broadcasting Corp.\n03eb  Atmel Corp.\n\t0902  4-Port Hub\n\t2002  Mass Storage Device\n\t2015  at90usbkey sample firmware (HID keyboard)\n\t2018  at90usbkey sample firmware (CDC ACM)\n\t2019  stk525 sample firmware (microphone)\n\t201c  at90usbkey sample firmware (HID mouse)\n\t201d  at90usbkey sample firmware (HID generic)\n\t2022  at90usbkey sample firmware (composite device)\n\t2040  LUFA Test PID\n\t2041  LUFA Mouse Demo Application\n\t2042  LUFA Keyboard Demo Application\n\t2043  LUFA Joystick Demo Application\n\t2044  LUFA CDC Demo Application\n\t2045  LUFA Mass Storage Demo Application\n\t2046  LUFA Audio Output Demo Application\n\t2047  LUFA Audio Input Demo Application\n\t2048  LUFA MIDI Demo Application\n\t2049  Stripe Snoop Magnetic Stripe Reader\n\t204a  LUFA CDC Class Bootloader\n\t204b  LUFA USB to Serial Adapter Project\n\t204c  LUFA RNDIS Demo Application\n\t204d  LUFA Combined Mouse and Keyboard Demo Application\n\t204e  LUFA Dual CDC Demo Application\n\t204f  LUFA Generic HID Demo Application\n\t2060  Benito Programmer Project\n\t2061  LUFA Combined Mass Storage and Keyboard Demo Application\n\t2062  LUFA Combined CDC and Mouse Demo Application\n\t2063  LUFA Datalogger Device\n\t2064  Interfaceless Control-Only LUFA Devices\n\t2065  LUFA Test and Measurement Demo Application\n\t2066  LUFA Multiple Report HID Demo\n\t2067  LUFA HID Class Bootloader\n\t2068  LUFA Virtual Serial/Mass Storage Demo\n\t2069  LUFA Webserver Project\n\t2103  JTAG ICE mkII\n\t2104  AVR ISP mkII\n\t2105  AVRONE!\n\t2106  STK600 development board\n\t2107  AVR Dragon\n\t2109  STK541 ZigBee Development Board\n\t210a  AT86RF230 [RZUSBSTICK] transceiver\n\t210d  XPLAIN evaluation kit (CDC ACM)\n\t2110  AVR JTAGICE3 Debugger and Programmer\n\t2111  Xplained Pro board debugger and programmer\n\t2122  XMEGA-A1 Explained evaluation kit\n\t2140  AVR JTAGICE3 (v3.x) Debugger and Programmer\n\t2141  ICE debugger\n\t2145  ATMEGA328P-XMINI (CDC ACM)\n\t2310  EVK11xx evaluation board\n\t2404  The Micro\n\t2fe4  ATxmega32A4U DFU bootloader\n\t2fe6  Cactus V6 (DFU)\n\t2fea  Cactus RF60 (DFU)\n\t2fee  atmega8u2 DFU bootloader\n\t2fef  atmega16u2 DFU bootloader\n\t2ff0  atmega32u2 DFU bootloader\n\t2ff1  at32uc3a3 DFU bootloader\n\t2ff3  atmega16u4 DFU bootloader\n\t2ff4  atmega32u4 DFU bootloader\n\t2ff6  at32uc3b0/1 DFU bootloader\n\t2ff7  at90usb82 DFU bootloader\n\t2ff8  at32uc3a0/1 DFU bootloader\n\t2ff9  at90usb646/647 DFU bootloader\n\t2ffa  at90usb162 DFU bootloader\n\t2ffb  at90usb AVR DFU bootloader\n\t2ffd  at89c5130/c5131 DFU bootloader\n\t2fff  at89c5132/c51snd1c DFU bootloader\n\t3301  at43301 4-Port Hub\n\t3312  4-Port Hub\n\t4102  AirVast W-Buddie WN210\n\t5601  at76c510 Prism-II 802.11b Access Point\n\t5603  Cisco 7920 WiFi IP Phone\n\t6119  AT91SAM CDC Demo Application\n\t6124  at91sam SAMBA bootloader\n\t6127  AT91SAM HID Keyboard Demo Application\n\t6129  AT91SAM Mass Storage Demo Application\n\t6200  AT91SAM HID Mouse Demo Application\n\t7603  D-Link DWL-120 802.11b Wireless Adapter [Atmel at76c503a]\n\t7604  at76c503a 802.11b Adapter\n\t7605  at76c503a 802.11b Adapter\n\t7606  at76c505 802.11b Adapter\n\t7611  at76c510 rfmd2948 802.11b Access Point\n\t7613  WL-1130 USB\n\t7614  AT76c505a Wireless Adapter\n\t7615  AT76C505AMX Wireless Adapter\n\t7617  AT76C505AS Wireless Adapter\n\t7800  Mini Album\n\t800c  Airspy HF+\n\tff01  WootingOne\n\tff02  WootingTwo\n\tff07  Tux Droid fish dongle\n03ec  Iwatsu America, Inc.\n03ed  Mitel Corp.\n03ee  Mitsumi\n\t0000  CD-R/RW Drive\n\t2501  eHome Infrared Receiver\n\t2502  eHome Infrared Receiver\n\t5609  Japanese Keyboard\n\t641f  WIF-0402C Bluetooth Adapter\n\t6438  Bluetooth Device\n\t6440  WML-C52APR Bluetooth Adapter\n\t6901  SmartDisk FDD\n\t6902  Floppy Disk Drive\n\t7500  CD-R/RW\n\tffff  Dongle with BlueCore in DFU mode\n03f0  HP, Inc\n\t0004  DeskJet 895c\n\t0011  OfficeJet G55\n\t0012  DeskJet 1125C Printer Port\n\t0024  KU-0316 Keyboard\n\t002a  LaserJet P1102\n\t0036  CCID Smartcard Keyboard KUS0133\n\t0053  DeskJet 2620 All-in-One Printer\n\t0101  ScanJet 4100c\n\t0102  PhotoSmart S20\n\t0104  DeskJet 880c/970c\n\t0105  ScanJet 4200c\n\t0107  CD-Writer Plus\n\t010c  Multimedia Keyboard Hub\n\t0111  G55xi Printer/Scanner/Copier\n\t0117  LaserJet 3200\n\t011c  hn210w 802.11b Adapter\n\t011d  Bluetooth 1.2 Interface [Broadcom BCM2035]\n\t0121  HP 39g+ [F2224A], 39gs [F2223A], 40gs [F2225A], 48gII [F2226A], 49g+ [F2228A], 50g [F2229A, NW240AA]\n\t0122  HID Internet Keyboard\n\t0125  DAT72 Tape\n\t0139  Barcode Scanner 4430\n\t0201  ScanJet 6200c\n\t0202  PhotoSmart S20\n\t0204  DeskJet 815c\n\t0205  ScanJet 3300c\n\t0207  CD-Writer Plus 8200e\n\t020c  Multimedia Keyboard\n\t0211  OfficeJet G85\n\t0212  DeskJet 1220C\n\t0217  LaserJet 2200\n\t0218  APOLLO P2500/2600\n\t0221  StreamSmart 400 [F2235AA]\n\t0223  Digital Drive Flash Reader\n\t022a  LaserJet CP1525nw/x\n\t0241  Link-5 micro dongle\n\t0304  DeskJet 810c/812c\n\t0305  ScanJet 4300c\n\t0307  CD-Writer+ CD-4e\n\t0311  OfficeJet G85xi\n\t0312  Color Inkjet CP1700\n\t0314  designjet 30/130 series\n\t0317  LaserJet 1200\n\t0324  SK-2885 keyboard\n\t034a  Elite Keyboard\n\t0401  ScanJet 5200c\n\t0404  DeskJet 830c/832c\n\t0405  ScanJet 3400cse\n\t0411  OfficeJet G95\n\t0412  Printing Support\n\t0417  LaserJet 1200 series\n\t0423  HS-COMBO Cardreader\n\t042a  LaserJet M1132 MFP\n\t0441  Prime [NW280AA, G8X92AA]\n\t046b  Dock G5\n\t0483  Engage Go 10 Tablet\n\t0504  DeskJet 885c\n\t0505  ScanJet 2100c\n\t0507  DVD+RW\n\t050c  5219 Wireless Keyboard\n\t0511  OfficeJet K60\n\t0512  DeskJet 450\n\t0517  LaserJet 1000\n\t051d  Bluetooth Interface\n\t052a  LaserJet M1212nf MFP\n\t0583  Engage Go 10 Tablet\n\t0601  ScanJet 6300c\n\t0604  DeskJet 840c\n\t0605  ScanJet 2200c\n\t0610  Z24i Monitor Hub\n\t0611  OfficeJet K60xi\n\t0612  business inkjet 3000\n\t0624  Bluetooth Dongle\n\t0641  X1200 Optical Mouse\n\t0653  DeskJet 3700 series\n\t0683  Engage Go 10 Tablet\n\t0701  ScanJet 5300c/5370c\n\t0704  DeskJet 825c\n\t0705  ScanJet 4400c\n\t070c  Personal Media Drive\n\t0711  OfficeJet K80\n\t0712  DeskJet 1180c\n\t0714  Printing Support\n\t0741  Prime Wireless Kit [FOK65AA]\n\t0801  ScanJet 7400c\n\t0804  DeskJet 816c\n\t0805  HP4470C\n\t0811  OfficeJet K80xi\n\t0817  LaserJet 3300\n\t0853  ENVY 5000 series\n\t0901  ScanJet 2300c\n\t0904  DeskJet 845c\n\t0912  Printing Support\n\t0917  LaserJet 3330\n\t0924  Modular Smartcard Keyboard\n\t0941  X500 Optical Mouse\n\t094a  Optical Mouse [672662-001]\n\t0a01  ScanJet 2400c\n\t0a17  color LaserJet 3700\n\t0b01  ScanJet 82x0C\n\t0b0c  Wireless Keyboard and Optical Mouse receiver\n\t0b17  LaserJet 2300d\n\t0c17  LaserJet 1010\n\t0c24  Bluetooth Dongle\n\t0d12  OfficeJet 9100 series\n\t0d17  LaserJet 1012\n\t0d4a  SK-2025 Keyboard\n\t0e17  LaserJet 1015\n\t0f0c  Wireless Keyboard and Optical Mouse receiver\n\t0f11  OfficeJet V40\n\t0f12  Printing Support\n\t0f17  LaserJet 1150\n\t0f2a  LaserJet 400 color M451dn\n\t1001  Photo Scanner 1000\n\t1002  PhotoSmart 140 series\n\t1004  DeskJet 970c/970cse\n\t1005  ScanJet 5400c\n\t1011  OfficeJet V40xi\n\t1016  Jornada 548 / iPAQ HW6515 Pocket PC\n\t1017  LaserJet 1300\n\t1024  Smart Card Keyboard\n\t1027  Virtual keyboard and mouse\n\t102a  LaserJet Professional P 1102w\n\t1102  PhotoSmart 240 series\n\t1104  DeskJet 959c\n\t1105  ScanJet 5470c/5490c\n\t110c  Pocket Media Drive\n\t1111  OfficeJet v60\n\t1116  Jornada 568 Pocket PC\n\t1117  LaserJet 1300n\n\t1151  PSC-750xi Printer/Scanner/Copier\n\t1198  HID-compliant mouse\n\t1202  PhotoSmart 320 series\n\t1204  DeskJet 930c\n\t1205  ScanJet 4500C/5550C\n\t1211  OfficeJet v60xi\n\t1217  LaserJet 2300L\n\t1227  Virtual CD-ROM\n\t1302  PhotoSmart 370 series\n\t1305  ScanJet 4570c\n\t1311  OfficeJet V30\n\t1312  DeskJet 460\n\t1317  LaserJet 1005\n\t1327  iLO Virtual Hub\n\t134a  Optical Mouse\n\t1405  ScanJet 3670\n\t1411  PSC 750\n\t1424  f2105 Monitor Hub\n\t1502  PhotoSmart 420 series\n\t1504  DeskJet 920c\n\t150c  Mood Lighting (Microchip Technology Inc.)\n\t1511  PSC 750xi\n\t1512  Printing Support\n\t1517  color LaserJet 3500\n\t1524  Smart Card Keyboard - KR\n\t1539  Mini Magnetic Stripe Reader\n\t1541  Prime [G8X92AA]\n\t154a  Laser Mouse\n\t1602  PhotoSmart 330 series\n\t1604  DeskJet 940c\n\t1605  ScanJet 5530C PhotoSmart\n\t1611  psc 780\n\t1617  LaserJet 3015\n\t161d  Wireless Rechargeable Optical Mouse (HID)\n\t1624  Smart Card Keyboard - JP\n\t1647  Z27n G2 Monitor Hub\n\t1702  PhotoSmart 380 series\n\t1704  DeskJet 948C\n\t1705  ScanJet 5590\n\t1711  psc 780xi\n\t1712  Printing Support\n\t1717  LaserJet 3020\n\t171d  Bluetooth 2.0 Interface [Broadcom BCM2045]\n\t1801  Inkjet P-2000U\n\t1802  PhotoSmart 470 series\n\t1804  DeskJet 916C\n\t1805  ScanJet 7650\n\t1811  PSC 720\n\t1812  OfficeJet Pro K550\n\t1817  LaserJet 3030\n\t181d  Bluetooth 2.0 Interface\n\t1902  PhotoSmart A430 series\n\t1904  DeskJet 3820\n\t1911  OfficeJet V45\n\t1917  LaserJet 3380\n\t1a02  PhotoSmart A510 series\n\t1a11  OfficeJet 5100 series\n\t1a17  color LaserJet 4650\n\t1b02  PhotoSmart A610 series\n\t1b04  DeskJet 3810\n\t1b05  ScanJet 4850C/4890C\n\t1b07  Premium Starter Webcam\n\t1c02  PhotoSmart A710 series\n\t1c17  Color LaserJet 2550l\n\t1d02  PhotoSmart A310 series\n\t1d17  LaserJet 1320\n\t1d24  Barcode scanner\n\t1e02  PhotoSmart A320 Printer series\n\t1e11  PSC-950\n\t1e17  LaserJet 1160 series\n\t1f02  PhotoSmart A440 Printer series\n\t1f11  PSC 920\n\t1f12  OfficeJet Pro K5300\n\t1f17  color LaserJet 5550\n\t1f1d  un2400 Gobi Wireless Modem\n\t2001  Floppy\n\t2002  Hub\n\t2004  DeskJet 640c\n\t2005  ScanJet 3570c\n\t2012  OfficeJet Pro K5400\n\t201d  un2400 Gobi Wireless Modem (QDL mode)\n\t2039  Cashdrawer\n\t2102  PhotoSmart 7345\n\t2104  DeskJet 630c\n\t2112  OfficeJet Pro L7500\n\t211d  Sierra MC5725 [ev2210]\n\t2202  PhotoSmart 7600 series\n\t2205  ScanJet 3500c\n\t2212  OfficeJet Pro L7600\n\t2217  color LaserJet 9500 MFP\n\t222a  LaserJet Pro MFP M125nw\n\t2302  PhotoSmart 7600 series\n\t2304  DeskJet 656c\n\t2305  ScanJet 3970c\n\t2311  OfficeJet d series\n\t2312  OfficeJet Pro L7700\n\t2317  LaserJet 4350\n\t231d  Broadcom 2070 Bluetooth Combo\n\t2402  PhotoSmart 7700 series\n\t2404  Deskjet F2280 series\n\t2405  ScanJet 4070 PhotoSmart\n\t2417  LaserJet 4250\n\t241d  Gobi 2000 Wireless Modem (QDL mode)\n\t2424  LP1965 19\" Monitor Hub\n\t2441  Prime G2 [2AP18AA]\n\t2502  PhotoSmart 7700 series\n\t2504  DeskJet F4200 series\n\t2505  ScanJet 3770\n\t2512  OfficeJet Pro L7300 / Compaq LA2405 series monitor\n\t2514  4-port hub\n\t2517  LaserJet 2410\n\t251d  Gobi 2000 Wireless Modem\n\t2524  LP3065 30\" Monitor Hub\n\t2602  PhotoSmart A520 series\n\t2605  ScanJet 3800c\n\t2611  OfficeJet 7100 series\n\t2617  Color LaserJet 2820 series\n\t2624  Pole Display (HP522 2 x 20 Line Display)\n\t2702  PhotoSmart A620 series\n\t2704  DeskJet 915\n\t2717  Color LaserJet 2830\n\t2724  Magnetic Stripe Reader IDRA-334133-HP\n\t2805  Scanjet G2710\n\t2811  PSC-2100\n\t2817  Color LaserJet 2840\n\t2841  OMEN MINDFRAME [3XT27AA]\n\t2902  PhotoSmart A820 series\n\t2911  PSC 2200\n\t2917  LaserJet 2420\n\t2a11  PSC 2150 series\n\t2a17  LaserJet 2430\n\t2a1d  Integrated Module with Bluetooth 2.1 Wireless technology\n\t2b11  PSC 2170 series\n\t2b17  LaserJet 1020\n\t2b4a  Business Slim Keyboard\n\t2c12  Officejet J4680\n\t2c17  LaserJet 1022\n\t2c24  Logitech M-UAL-96 Mouse\n\t2d05  Scanjet 7000\n\t2d11  OfficeJet 6110\n\t2d17  Printing Support\n\t2d2a  LaserJet Pro MFP M225dw\n\t2e11  PSC 1000\n\t2e17  LaserJet 2600n\n\t2e24  LP2275w Monitor Hub\n\t2f11  PSC 1200\n\t2f17  Color LaserJet 2605dn\n\t2f24  LP2475w Monitor Hub\n\t3002  PhotoSmart P1000\n\t3004  DeskJet 980c\n\t3005  ScanJet 4670v\n\t3011  PSC 1100 series\n\t3017  Printing Support\n\t304a  Slim Keyboard\n\t3102  PhotoSmart P1100 Printer w/ Card Reader\n\t3104  DeskJet 960c\n\t3111  OfficeJet 4100 series\n\t3117  EWS 2605dtn\n\t311d  Atheros AR9285 Malbec Bluetooth Adapter\n\t312a  LaserJet Pro M701n\n\t3202  PhotoSmart 1215\n\t3207  4 GB flash drive\n\t3211  OfficeJet 4105 series\n\t3217  LaserJet 3050\n\t3302  PhotoSmart 1218\n\t3304  DeskJet 990c\n\t3307  v125w Stick\n\t3312  OfficeJet J6410\n\t3317  LaserJet 3052\n\t3402  PhotoSmart 1115\n\t3404  DeskJet 6122\n\t3417  LaserJet 3055\n\t3502  PhotoSmart 230\n\t3504  DeskJet 6127c\n\t3511  PSC 2300\n\t3517  LaserJet 3390\n\t354a  Slim Keyboard\n\t3602  PhotoSmart 1315\n\t3611  PSC 2410 PhotoSmart\n\t3612  Officejet Pro 8000 A809\n\t3617  Color LaserJet 2605\n\t3711  PSC 2500\n\t3717  EWS UPD\n\t3724  Webcam\n\t3802  PhotoSmart 100\n\t3807  c485w Flash Drive\n\t3817  LaserJet P2015 series\n\t3902  PhotoSmart 130\n\t3912  Officejet Pro 8500\n\t3917  LaserJet P2014\n\t3a02  PhotoSmart 7150\n\t3a11  OfficeJet 5500 series\n\t3a17  Printing Support\n\t3a1d  hs2340 HSPA+ mobile broadband\n\t3b02  PhotoSmart 7150~\n\t3b05  Scanjet N8460\n\t3b11  PSC 1300 series\n\t3b17  LaserJet M1005 MFP\n\t3b2a  Color LaserJet MFP M277dw\n\t3c02  PhotoSmart 7350\n\t3c05  Scanjet Professional 1000 Mobile Scanner\n\t3c11  PSC 1358\n\t3c17  EWS UPD\n\t3d02  PhotoSmart 7350~\n\t3d11  OfficeJet 4215\n\t3d17  LaserJet P1005\n\t3e02  PhotoSmart 7550\n\t3e07  x755w Flash Drive\n\t3e17  LaserJet P1006\n\t3f02  PhotoSmart 7550~\n\t3f11  PSC-1315/PSC-1317\n\t3f17  Laserjet P1505\n\t4002  PhotoSmart 635/715/720/735/935/E337 (storage)\n\t4004  CP1160\n\t4102  PhotoSmart 618\n\t4105  ScanJet 4370\n\t4111  OfficeJet 7200 series\n\t4117  LaserJet 1018\n\t4202  PhotoSmart 812\n\t4205  ScanJet G3010\n\t4211  OfficeJet 7300 series\n\t4217  EWS CM1015\n\t4302  PhotoSmart 850 (ptp)\n\t4305  ScanJet G3110\n\t4311  OfficeJet 7400 series\n\t4317  Color LaserJet CM1017\n\t4402  PhotoSmart 935 (ptp)\n\t4417  EWS UPD\n\t4502  PhotoSmart 945 (PTP mode)\n\t4505  ScanJet G4010\n\t4507  External HDD\n\t4511  PhotoSmart 2600\n\t4512  E709n [Officejet 6500 Wireless]\n\t4517  EWS UPD\n\t4605  ScanJet G4050\n\t4611  PhotoSmart 2700\n\t4717  Color LaserJet CP1215\n\t4811  PSC 1600\n\t484a  Elite Dock G4\n\t4911  PSC 2350\n\t4b11  OfficeJet 6200\n\t4c11  PSC 1500 series\n\t4c17  EWS UPD\n\t4d11  PSC 1400\n\t4d17  EWS UPD\n\t4e11  PhotoSmart 2570 series\n\t4f11  OfficeJet 5600 (USBHUB)\n\t4f17  Color LaserJet CM1312 MFP\n\t5004  DeskJet 995c\n\t5011  PhotoSmart 3100 series\n\t5017  EWS UPD\n\t5111  PhotoSmart 3200 series\n\t5211  PhotoSmart 3300 series\n\t5307  v165w Stick\n\t5311  OfficeJet 6300\n\t5312  Officejet Pro 8500A\n\t5317  Color LaserJet CP2025 series\n\t5411  OfficeJet 4300\n\t5511  DeskJet F300 series\n\t5611  PhotoSmart C3180\n\t5617  LaserJet M1120 MFP\n\t5711  PhotoSmart C4100 series\n\t5717  LaserJet M1120n MFP\n\t5811  PhotoSmart C5100 series\n\t5817  LaserJet M1319f MFP\n\t581d  lt4112 Gobi 4G Module Network Device\n\t5911  PhotoSmart C6180\n\t5912  Officejet Pro 8600\n\t5a11  PhotoSmart C7100 series\n\t5b11  OfficeJet J2100 series\n\t5b12  Officejet Pro 8100\n\t5c11  PhotoSmart C4200 Printer series\n\t5c12  OfficeJet 6700\n\t5c17  LaserJet P2055 series\n\t5d11  PhotoSmart C5200 series\n\t5e11  PhotoSmart D7400 series\n\t6004  DeskJet 5550\n\t6102  Hewlett Packard Digital Camera\n\t6104  DeskJet 5650c\n\t6117  color LaserJet 3550\n\t6202  PhotoSmart 215\n\t6204  DeskJet 5150c\n\t6217  Color LaserJet 4700\n\t6302  PhotoSmart 318/612\n\t6317  Color LaserJet 4730mfp\n\t632a  LaserJet M203-M206\n\t6402  PhotoSmart 715 (ptp)\n\t6411  PhotoSmart C8100 series\n\t6417  LaserJet 5200\n\t6502  PhotoSmart 120 (ptp)\n\t6511  PhotoSmart C7200 series\n\t6602  PhotoSmart 320\n\t6611  PhotoSmart C4380 series\n\t6617  LaserJet 5200L\n\t6702  PhotoSmart 720 (ptp)\n\t6717  Color LaserJet 3000\n\t6802  PhotoSmart 620 (ptp)\n\t6811  PhotoSmart D5300 series\n\t6817  Color LaserJet 3800\n\t6911  PhotoSmart D7200 series\n\t6917  Color LaserJet 3600\n\t6a02  PhotoSmart 735 (ptp)\n\t6a11  PhotoSmart C6200 series\n\t6a17  LaserJet 4240\n\t6b02  PhotoSmart R707 (PTP mode)\n\t6b11  Photosmart C4500 series\n\t6c11  Photosmart C4480\n\t6c17  Color LaserJet 4610\n\t6f17  Color LaserJet CP6015 series\n\t7004  DeskJet 3320c\n\t7102  PhotoSmart 635 (PTP mode)\n\t7104  DeskJet 3420c\n\t7117  CM8060 Color MFP with Edgeline Technology\n\t7202  PhotoSmart 43x (ptp)\n\t7204  DeskJet 36xx\n\t7217  LaserJet M5035 MFP\n\t7302  PhotoSmart M307 (PTP mode)\n\t7304  DeskJet 35xx\n\t7311  Photosmart Premium C309\n\t7317  LaserJet P3005\n\t7404  Printing Support\n\t7417  LaserJet M4345 MFP\n\t7504  Printing Support\n\t7517  LaserJet M3035 MFP\n\t7604  DeskJet 3940\n\t7611  DeskJet F2492 All-in-One\n\t7617  LaserJet P3004\n\t7702  PhotoSmart R817 (PTP mode)\n\t7704  DeskJet D4100\n\t7717  CM8050 Color MFP with Edgeline Technology\n\t7804  DeskJet D1360\n\t7817  Color LaserJet CP3505\n\t7917  LaserJet M5025 MFP\n\t7a02  PhotoSmart M415 (PTP mode)\n\t7a04  DeskJet D2460\n\t7a11  Photosmart B109\n\t7a17  LaserJet M3027 MFP\n\t7b02  PhotoSmart M23 (PTP mode)\n\t7b17  Color LaserJet CP4005\n\t7c17  Color LaserJet CM6040 series\n\t7d04  DeskJet F2100 Printer series\n\t7d17  Color LaserJet CM4730 MFP\n\t7e04  DeskJet F4100 Printer series\n\t8017  LaserJet P4515\n\t8104  Printing Support\n\t8117  LaserJet P4015\n\t811c  Ethernet HN210E\n\t8204  Printing Support\n\t8207  FHA-3510 2.4GHz Wireless Optical Mobile Mouse\n\t8217  LaserJet P4014\n\t8317  LaserJet M9050 MFP\n\t8404  DeskJet 6800 series\n\t8417  LaserJet M9040 MFP\n\t8504  DeskJet 6600 series\n\t8604  DeskJet 5440\n\t8607  Optical Mobile Mouse\n\t8704  DeskJet 5940\n\t8711  Deskjet 2050 J510\n\t8804  DeskJet 6980 series\n\t8904  DeskJet 6940 series\n\t8911  Deskjet 1050 J410\n\t8c07  Digital Stereo Headset\n\t8c11  Deskjet F4500 series\n\t9002  PhotoSmart M437\n\t9102  PhotoSmart M537\n\t9207  HD-4110 Webcam\n\t9302  PhotoSmart R930 series\n\t9402  PhotoSmart R837\n\t942a  LaserJet Pro M12a\n\t9502  PhotoSmart R840 series\n\t952a  LaserJet Pro M12w\n\t9602  PhotoSmart M730 series\n\t9702  PhotoSmart R740 series\n\t9802  PhotoSmart Mz60 series\n\t9902  PhotoSmart M630 series\n\t9a02  PhotoSmart E330 series\n\t9b02  PhotoSmart M540 series\n\t9b07  Portable Drive\n\t9c02  PhotoSmart M440 series\n\ta004  DeskJet 5850c\n\ta011  Deskjet 3050A\n\ta407  Wireless Optical Comfort Mouse\n\tb002  PhotoSmart 7200 series\n\tb102  PhotoSmart 7200 series\n\tb107  v255w/c310w Flash Drive\n\tb116  Webcam\n\tb202  PhotoSmart 7600 series\n\tb302  PhotoSmart 7600 series\n\tb402  PhotoSmart 7700 series\n\tb502  PhotoSmart 7700 series\n\tb602  PhotoSmart 7900 series\n\tb702  PhotoSmart 7900 series\n\tb802  PhotoSmart 7400 series\n\tb902  PhotoSmart 7800 series\n\tba02  PhotoSmart 8100 series\n\tbb02  PhotoSmart 8400 series\n\tbc02  PhotoSmart 8700 series\n\tbc11  Photosmart 7520 series\n\tbd02  PhotoSmart Pro B9100 series\n\tbef4  NEC Picty760\n\tc002  PhotoSmart 7800 series\n\tc102  PhotoSmart 8000 series\n\tc111  Deskjet 1510\n\tc202  PhotoSmart 8200 series\n\tc211  Deskjet 2540 series\n\tc302  DeskJet D2300\n\tc402  PhotoSmart D5100 series\n\tc502  PhotoSmart D6100 series\n\tc602  PhotoSmart D7100 series\n\tc702  PhotoSmart D7300 series\n\tc802  PhotoSmart D5060 Printer\n\td104  Bluetooth Dongle\n\td507  39gII [NW249AA]\n\tefbe  NEC Picty900\n\tf0be  NEC Picty920\n\tf1be  NEC Picty800\n03f1  Genoa Technology\n03f2  Oak Technology, Inc.\n03f3  Adaptec, Inc.\n\t0020  AWN-8020 WLAN [Intersil PRISM 2.5]\n\t0080  AVC-1100 Audio Capture\n\t0083  AVC-2200 Device\n\t0087  AVC-2210 Loader\n\t0088  AVC-2210 Device\n\t008b  AVC-2310 Loader\n\t008c  AVC-2310 Device\n\t0094  eHome Infrared Receiver\n\t009b  AVC-1410 GameBridge TV NTSC\n\t2000  USBXchange Firmware Loader\n\t2001  USBXchange Adapter\n\t2002  USB2-Xchange Firmware Loader\n\t2003  USB2-Xchange Adapter\n\t4000  4-port hub\n\tadcc  Composite Device Support\n03f4  Diebold, Inc.\n03f5  Siemens Electromechanical\n03f8  Epson Imaging Technology Center\n03f9  KeyTronic Corp.\n\t0100  KT-2001 Keyboard\n\t0101  Keyboard\n\t0102  Keyboard Mouse\n03fb  OPTi, Inc.\n03fc  Elitegroup Computer Systems\n03fd  Xilinx, Inc.\n\t0008  Platform Cable USB II\n\t0050  dfu downloader\n03fe  Farallon Comunications\n0400  National Semiconductor Corp.\n\t05dc  Rigol Technologies DS1000USB Oscilloscope\n\t0807  Bluetooth Dongle\n\t080a  Bluetooth Device\n\t09c4  Rigol Technologies DG1022 Arbitrary Waveform Generator\n\t1000  Mustek BearPaw 1200 Scanner\n\t1001  Mustek BearPaw 2400 Scanner\n\t1237  Hub\n\ta000  Smart Display Reference Device\n\tc359  Logitech Harmony\n\tc35b  Printing Support\n\tc55d  Rigol Technologies DS5000USB Oscilloscope\n0401  National Registry, Inc.\n0402  ALi Corp.\n\t5462  M5462 IDE Controller\n\t5602  M5602 Video Camera Controller\n\t5603  M5603 Video Camera Controller\n\t5606  M5606 Video Camera Controller [UVC]\n\t5621  M5621 High-Speed IDE Controller\n\t5623  M5623 Scanner Controller\n\t5627  Welland ME-740PS USB2 3.5\" Power Saving Enclosure\n\t5632  M5632 Host-to-Host Link\n\t5635  M5635 Flash Card Reader\n\t5636  USB 2.0 Storage Device\n\t5637  M5637 IDE Controller\n\t5642  Storage Device\n\t5661  M5661 MP3 player\n\t5667  M5667 MP3 player\n\t8841  Newmine Camera\n\t9665  Gateway Webcam\n0403  Future Technology Devices International, Ltd\n\t0000  H4SMK 7 Port Hub / Bricked Counterfeit FT232 Serial (UART) IC\n\t0232  Serial Converter\n\t1060  JTAG adapter\n\t1234  IronLogic RFID Adapter [Z-2 USB]\n\t1235  Iron Logic Z-397 RS-485/422 converter\n\t6001  FT232 Serial (UART) IC\n\t6002  Lumel PD12\n\t6007  Serial Converter\n\t6008  Serial Converter\n\t6009  Serial Converter\n\t6010  FT2232C/D/H Dual UART/FIFO IC\n\t6011  FT4232H Quad HS USB-UART/FIFO IC\n\t6014  FT232H Single HS USB-UART/FIFO IC\n\t6015  Bridge(I2C/SPI/UART/FIFO)\n\t601e  FT600 16-bit FIFO IC\n\t601f  FT601 32-bit FIFO IC\n\t6ee0  EZO Carrier Board\n\t6f70  HB-RF-USB\n\t7150  FT2232x wired for MPSSE+UART\n\t7151  FT2232x wired for MPSSE+UART\n\t7152  FreeCalypso dual UART with boot control\n\t7be8  FT232R\n\t8028  Dev board JTAG (FT232H based)\n\t8040  4 Port Hub\n\t8070  7 Port Hub\n\t8140  Vehicle Explorer Interface\n\t8210  MGTimer - MGCC (Vic) Timing System\n\t8348  FT232BM [SIENNA Serial Interface]\n\t8370  7 Port Hub\n\t8371  PS/2 Keyboard And Mouse\n\t8372  FT8U100AX Serial Port\n\t8508  Selectronic SP PRO\n\t87d0  Cressi Dive Computer Interface\n\t8a28  Rainforest Automation ZigBee Controller\n\t8a98  TIAO Multi-Protocol Adapter\n\t8b28  Alpermann+Velte TCI70\n\t8b29  Alpermann+Velte TC60 CLS\n\t8b2a  Alpermann+Velte Rubidium Q1\n\t8b2b  Alpermann+Velte TCD\n\t8b2c  Alpermann+Velte TCC70\n\t9090  SNAP Stick 200\n\t9132  LCD and Temperature Interface\n\t9133  CallerID\n\t9134  Virtual keyboard\n\t9135  Rotary Pub alarm\n\t9136  Pulsecounter\n\t9137  Ledbutton interface\n\t9e90  Marvell OpenRD Base/Client\n\t9f08  CIB-1894 Conclusion SmartLink Box:\n\t9f80  Ewert Energy Systems CANdapter\n\ta6d0  Texas Instruments XDS100v2 JTAG / BeagleBone A3\n\ta951  HCP HIT GSM/GPRS modem [Cinterion MC55i]\n\ta9a0  FT2232D - Dual UART/FIFO IC - FTDI\n\tabb8  Lego Mindstorms NXTCam\n\tb0c0  microSensys RFID device\n\tb0c1  microSensys RFID device\n\tb0c2  iID contactless RFID device\n\tb0c3  iID contactless RFID device\n\tb0c4  RFID device\n\tb0c5  RFID device\n\tb810  US Interface Navigator (CAT and 2nd PTT lines)\n\tb811  US Interface Navigator (WKEY and FSK lines)\n\tb812  US Interface Navigator (RS232 and CONFIG lines)\n\tb9b0  Fujitsu SK-16FX-100PMC V1.1\n\tbaf8  Amontec JTAGkey\n\tbcd8  Stellaris Development Board\n\tbcd9  Stellaris Evaluation Board\n\tbcda  Stellaris ICDI Board\n\tbd90  PICAXE Download Cable [AXE027]\n\tbdc8  Egnite GmbH - JTAG/RS-232 adapter\n\tbfd8  OpenDCC\n\tbfd9  OpenDCC (Sniffer)\n\tbfda  OpenDCC (Throttle)\n\tbfdb  OpenDCC (Gateway)\n\tbfdc  OpenDCC (GBM)\n\tc580  HID UNIKEY dongle [F-Response]\n\tc630  lcd2usb interface\n\tc631  i2c-tiny-usb interface\n\tc632  xu1541 c64 floppy drive interface\n\tc633  TinyCrypt dongle\n\tc634  glcd2usb interface\n\tc7d0  RR-CirKits LocoBuffer-USB\n\tc8b8  Alpermann+Velte MTD TCU\n\tc8b9  Alpermann+Velte MTD TCU 1HE\n\tc8ba  Alpermann+Velte Rubidium H1\n\tc8bb  Alpermann+Velte Rubidium H3\n\tc8bc  Alpermann+Velte Rubidium S1\n\tc8bd  Alpermann+Velte Rubidium T1\n\tc8be  Alpermann+Velte Rubidium D1\n\tc8bf  Alpermann+Velte TC60 RLV\n\tcc48  Tactrix OpenPort 1.3 Mitsubishi\n\tcc49  Tactrix OpenPort 1.3 Subaru\n\tcc4a  Tactrix OpenPort 1.3 Universal\n\tcff8  Amontec JTAGkey\n\td010  SCS PTC-IIusb\n\td011  SCS Position-Tracker/TNC\n\td012  SCS DRAGON 1\n\td013  SCS DRAGON 1\n\td388  Xsens converter\n\td389  Xsens Wireless Receiver\n\td38a  Xsens serial converter\n\td38b  Xsens serial converter\n\td38c  Xsens Wireless Receiver\n\td38d  Xsens Awinda Station\n\td38e  Xsens serial converter\n\td38f  Xsens serial converter\n\td491  Zolix Omni 1509 monochromator\n\td578  Accesio USB-COM-4SM\n\td678  GammaScout\n\td6f8  UNI Black BOX\n\td738  Propox JTAGcable II\n\td739  Propox ISPcable III\n\td9a9  Actisense USG-1 NMEA Serial Gateway\n\td9aa  Actisense NGT-1 NMEA2000 PC Interface\n\td9ab  Actisense NGT-1 NMEA2000 Gateway\n\tdaf4  Qundis Serial Infrared Head\n\te0d0  Total Phase Aardvark I2C/SPI Host Adapter\n\te518  IBR IMB-usb\n\te521  EVER Sinline XL Series UPS\n\te6c8  PYRAMID Computer GmbH LCD\n\te700  Elster Unicom III Optical Probe\n\te729  Segway Robotic Mobility Platforms 200\n\te888  Expert ISDN Control USB\n\te889  USB-RS232 OptoBridge\n\te88a  Expert mouseCLOCK USB II\n\te88b  Precision Clock MSF USB\n\te88c  Expert mouseCLOCK USB II HBG\n\te8d8  Aaronia AG Spectran Spectrum Analyzer\n\te8dc  Aaronia AG UBBV Preamplifier\n\tea90  Eclo 1-Wire Adapter\n\tecd9  miControl miCan-Stick\n\ted71  HAMEG HO870 Serial Port\n\ted72  HAMEG HO720 Serial Port\n\ted73  HAMEG HO730 Serial Port\n\ted74  HAMEG HO820 Serial Port\n\teea2  PCStage Lite 32 channel DMX512 Interface\n\tef10  FT1245BL\n\tf070  Serial Converter 422/485 [Vardaan VEUSB422R3]\n\tf0c8  SPROG Decoder Programmer\n\tf0c9  SPROG-DCC CAN-USB\n\tf0e9  Tagsys L-P101\n\tf0ee  Tagsys Medio P200x\n\tf1a0  Asix PRESTO Programmer\n\tf208  Papenmeier Braille-Display\n\tf3c0  4N-GALAXY Serial Converter\n\tf458  ABACUS ELECTRICS Optical Probe\n\tf608  CTI USB-485-Mini\n\tf60b  CTI USB-Nano-485\n\tf680  Suunto Sports Instrument\n\tf758  GW Instek GDS-8x0 Oscilloscope\n\tf7c0  ZeitControl Cardsystems TagTracer MIFARE\n\tf850  USB-UIRT (Universal Infrared Receiver+Transmitter)\n\tf918  Ant8 Logic Probe\n\tf9d9  Wetterempfanger 147.3kHz\n\tfa00  Matrix Orbital USB Serial\n\tfa01  Matrix Orbital MX2 or MX3\n\tfa02  Matrix Orbital MX4 or MX5\n\tfa03  Matrix Orbital VK/LK202 Family\n\tfa04  Matrix Orbital VK/LK204 Family\n\tfa20  Ross-Tech HEX-USB\n\tfc08  Crystalfontz CFA-632 USB LCD\n\tfc09  Crystalfontz CFA-634 USB LCD\n\tfc0b  Crystalfontz CFA-633 USB LCD\n\tfc0c  Crystalfontz CFA-631 USB LCD\n\tfc0d  Crystalfontz CFA-635 USB LCD\n\tfc0e  Crystalfontz CFA-533\n\tfc82  SEMC DSS-20/DSS-25 SyncStation\n\tfd48  ShipModul MiniPlex-4xUSB NMEA Multiplexer\n\tfd49  ShipModul MiniPlex-4xUSB-AIS NMEA Multiplexer\n\tfd4b  ShipModul MiniPlex NMEA Multiplexer\n\tff08  ToolHouse LoopBack Adapter\n\tff18  ScienceScope Logbook ML\n\tff19  Logbook Bus\n\tff1a  Logbook Bus\n\tff1b  Logbook Bus\n\tff1c  ScienceScope Logbook LS\n\tff1d  ScienceScope Logbook HS\n\tff1e  Logbook Bus\n\tff1f  Logbook Bus\n0404  NCR Corp.\n\t0202  78XX Scanner\n\t0203  78XX Scanner - Embedded System\n\t0310  K590 Printer, Self-Service\n\t0311  7167 Printer, Receipt/Slip\n\t0312  7197 Printer Receipt\n\t0320  5932-USB Keyboard\n\t0321  5953-USB Dynakey\n\t0322  5932-USB Enhanced Keyboard\n\t0323  5932-USB Enhanced Keyboard, Flash-Recovery/Download\n\t0324  5953-USB Enhanced Dynakey\n\t0325  5953-USB Enhanced Dynakey Flash-Recovery/Download\n\t0328  K016: USB-MSR ISO 3-track MSR: POS Standard (See HID pages)\n\t0329  K018: USB-MSR JIS 2-Track MSR: POS Standard\n\t032a  K016: USB-MSR ISO 3-Track MSR: HID Keyboard Mode\n\t032b  K016/K018: USB-MSR Flash-Recovery/Download\n0405  Synopsys, Inc.\n0406  Fujitsu-ICL Computers\n0407  Fujitsu Personal Systems, Inc.\n0408  Quanta Computer, Inc.\n\t0103  FV TouchCam N1 (Audio)\n\t030c  HP Webcam\n\t03b2  HP Webcam\n\t03f4  HP Webcam\n\t1030  FV TouchCam N1 (Video)\n\t3000  Optical dual-touch panel\n\t3001  Optical Touch Screen\n\t3008  Optical Touch Screen\n\t4033  HD Webcam\n\ta060  HD Webcam\n0409  NEC Corp.\n\t0011  PC98 Series Layout Keyboard Mouse\n\t0012  ATerm IT75DSU ISDN TA\n\t0014  Japanese Keyboard\n\t0019  109 Japanese Keyboard with Bus-Powered Hub\n\t001a  PC98 Series Layout Keyboard with Bus-Powered Hub\n\t0025  Mini Keyboard with Bus-Powered Hub\n\t0027  MultiSync Monitor\n\t002c  Clik!-USB Drive\n\t0034  109 Japanese Keyboard with One-touch start buttons\n\t003f  Wireless Keyboard with One-touch start buttons\n\t0040  Floppy\n\t004e  SuperScript 1400 Series\n\t004f  Wireless Keyboard with One-touch start buttons\n\t0050  7-port hub\n\t0056  uPD720133 IDE bridge\n\t0058  HighSpeed Hub\n\t0059  HighSpeed Hub\n\t005a  HighSpeed Hub\n\t006a  Conceptronic USB Harddisk Box\n\t007d  MINICUBE2\n\t007e  PG-FP5 Flash Memory Programmer\n\t0081  SuperScript 1400 Series\n\t0082  SuperScript 1400 Series\n\t0094  Japanese Keyboard with One-touch start buttons\n\t0095  Japanese Keyboard\n\t00a9  AtermIT21L 128K Support Standard\n\t00aa  AtermITX72 128K Support Standard\n\t00ab  AtermITX62 128K Support Standard\n\t00ac  AtermIT42 128K Support Standard\n\t00ae  INSMATEV70G-MAX Standard\n\t00af  AtermITX70 128K Support Standard\n\t00b0  AtermITX80 128K Support Standard\n\t00b2  AtermITX80D 128K Support Standard\n\t00c0  Wireless Remocon\n\t00f7  Smart Display PK-SD10\n\t011d  e228 Mobile Phone\n\t0193  RVT-R Writer\n\t0203  HID Audio Controls\n\t021d  Aterm WL54SU2 802.11g Wireless Adapter [Atheros AR5523]\n\t0248  Aterm PA-WL54GU\n\t0249  Aterm WL300NU-G\n\t02b4  Aterm WL300NU-AG\n\t02b6  Aterm WL300NU-GS 802.11n Wireless Adapter\n\t02bc  Computer Monitor\n\t0300  LifeTouch Note\n\t0301  LifeTouch Note (debug mode)\n\t55aa  Hub\n\t55ab  Hub [iMac/iTouch kbd]\n\t8010  Intellibase Hub\n\t8011  Intellibase Hub\n\tefbe  P!cty 900 [HP DJ]\n\tf0be  P!cty 920 [HP DJ 812c]\n040a  Kodak Co.\n\t0001  DVC-323\n\t0002  DVC-325\n\t0100  DC-220\n\t0110  DC-260\n\t0111  DC-265\n\t0112  DC-290\n\t0120  DC-240\n\t0121  DC-240 (PTP firmware)\n\t0130  DC-280\n\t0131  DC-5000\n\t0132  DC-3400\n\t0140  DC-4800\n\t0160  DC4800\n\t0170  DX3900\n\t0200  Digital Camera\n\t0300  EZ-200\n\t0400  MC3\n\t0402  Digital Camera\n\t0403  Z7590\n\t0500  DX3500\n\t0510  DX3600\n\t0525  DX3215\n\t0530  DX3700\n\t0535  EasyShare CX4230 Camera\n\t0540  LS420\n\t0550  DX4900\n\t0555  DX4330\n\t0560  CX4200\n\t0565  CX4210\n\t0566  CX4300\n\t0567  LS753\n\t0568  LS443\n\t0569  LS663\n\t0570  DX6340\n\t0571  CX6330\n\t0572  DX6440\n\t0573  CX6230\n\t0574  CX6200\n\t0575  DX6490\n\t0576  DX4530\n\t0577  DX7630\n\t0578  CX7300/CX7310\n\t0579  CX7220\n\t057a  CX7330\n\t057b  CX7430\n\t057c  CX7530\n\t057d  DX7440\n\t057e  C300\n\t057f  DX7590\n\t0580  Z730\n\t0581  Digital Camera\n\t0582  Digital Camera\n\t0583  Digital Camera\n\t0584  CX6445\n\t0585  Digital Camera\n\t0586  CX7525\n\t0587  Digital Camera\n\t0588  Digital Camera\n\t0589  EasyShare C360\n\t058a  C310\n\t058b  Digital Camera\n\t058c  C330\n\t058d  C340\n\t058e  V530\n\t058f  V550\n\t0590  Digital Camera\n\t0591  Digital Camera\n\t0592  Digital Camera\n\t0593  Digital Camera\n\t0594  Digital Camera\n\t0595  Digital Camera\n\t0596  Digital Camera\n\t0597  Digital Camera\n\t0598  EASYSHARE M1033 digital camera\n\t0599  Digital Camera\n\t059a  Digital Camera\n\t059b  Digital Camera\n\t059c  Digital Camera\n\t059d  Digital Camera\n\t059e  Digital Camera\n\t059f  Digital Camera\n\t05a0  Digital Camera\n\t05a1  Digital Camera\n\t05a2  Digital Camera\n\t05a3  Digital Camera\n\t05a4  Digital Camera\n\t05a5  Digital Camera\n\t05a6  Digital Camera\n\t05a7  Digital Camera\n\t05a8  Digital Camera\n\t05a9  Digital Camera\n\t05aa  Digital Camera\n\t05ab  Digital Camera\n\t05ac  Digital Camera\n\t05ad  Digital Camera\n\t05ae  Digital Camera\n\t05af  Digital Camera\n\t05b0  Digital Camera\n\t05b1  Digital Camera\n\t05b2  Digital Camera\n\t05b3  EasyShare Z710 Camera\n\t05b4  Digital Camera\n\t05b5  Digital Camera\n\t05b6  Digital Camera\n\t05b7  Digital Camera\n\t05b8  Digital Camera\n\t05b9  Digital Camera\n\t05ba  Digital Camera\n\t05bb  Digital Camera\n\t05bc  Digital Camera\n\t05bd  Digital Camera\n\t05be  Digital Camera\n\t05bf  Digital Camera\n\t05c0  Digital Camera\n\t05c1  Digital Camera\n\t05c2  Digital Camera\n\t05c3  Digital Camera\n\t05c4  Digital Camera\n\t05c5  Digital Camera\n\t05c8  EASYSHARE Z1485 IS Digital Camera\n\t05d3  EasyShare M320 Camera\n\t05d4  EasyShare C180 Digital Camera\n\t1001  EasyShare SV811 Digital Picture Frame\n\t4000  InkJet Color Printer\n\t4021  Photo Printer 6800\n\t4022  1400 Digital Photo Printer\n\t4023  Photo Printer 8800 / 9810\n\t402b  Photo Printer 6850\n\t402e  605 Photo Printer\n\t4034  805 Photo Printer\n\t4035  7000 Photo Printer\n\t4037  7010 Photo Printer\n\t4038  7015 Photo Printer\n\t404d  8810 Photo Printer\n\t404f  305 Photo Printer\n\t4056  ESP 7200 Series AiO\n\t4109  EasyShare Printer Dock Series 3\n\t410d  EasyShare G600 Printer Dock\n\t5010  Wireless Adapter\n\t5012  DBT-220 Bluetooth Adapter\n\t6001  i30\n\t6002  i40\n\t6003  i50\n\t6004  i60\n\t6005  i80\n\t6029  i900\n\t602a  i900\n040b  Weltrend Semiconductor\n\t0a68  Func MS-3 gaming mouse [WT6573F MCU]\n\t2000  wired Keyboard [Dynex DX-WRK1401]\n\t2367  Human Interface Device [HP CalcPad 200 Calculator and Numeric Keypad]\n\t6510  Weltrend Bar Code Reader\n\t6520  Xploder Xbox Memory Unit (8MB)\n\t6533  Speed-Link Competition Pro\n\t6543  Manhattan Magnetic Card Strip Reader\n040c  VTech Computers, Ltd\n040d  VIA Technologies, Inc.\n\t3184  VNT VT6656 USB-802.11 Wireless LAN Adapter\n\t340b  FX-Audio DAC-X6\n\t340f  Audinst HUD-mx2\n\t6204  Vectro VT6204 IDE bridge\n\t6205  USB 2.0 Card Reader\n040e  MCCI\n040f  Echo Speech Corp.\n0411  BUFFALO INC. (formerly MelCo., Inc.)\n\t0001  LUA-TX Ethernet [pegasus]\n\t0005  LUA-TX Ethernet\n\t0006  WLI-USB-L11 Wireless LAN Adapter\n\t0009  LUA2-TX Ethernet\n\t000b  WLI-USB-L11G-WR Wireless LAN Adapter\n\t000d  WLI-USB-L11G Wireless LAN Adapter\n\t0012  LUA-KTX Ethernet\n\t0013  USB2-IDE Adapter\n\t0016  WLI-USB-S11 802.11b Adapter\n\t0018  USB2-IDE Adapter\n\t001c  USB-IDE Bridge: DUB-PxxG\n\t0027  WLI-USB-KS11G 802.11b Adapter\n\t002a  SMSC USB97C202 \"HD-HB300V2-EU\"\n\t003d  LUA-U2-KTX Ethernet\n\t0044  WLI-USB-KB11 Wireless LAN Adapter\n\t004b  WLI-USB-G54 802.11g Adapter [Broadcom 4320 USB]\n\t004d  WLI-USB-B11 Wireless LAN Adapter\n\t0050  WLI2-USB2-G54 Wireless LAN Adapter\n\t005e  WLI-U2-KG54-YB WLAN\n\t0065  Python2 WDM Encoder\n\t0066  WLI-U2-KG54 WLAN\n\t0067  WLI-U2-KG54-AI WLAN\n\t006e  LUA-U2-GT 10/100/1000 Ethernet Adapter\n\t0089  RUF-C/U2 Flash Drive\n\t008b  Nintendo Wi-Fi\n\t0091  WLI-U2-KAMG54 Wireless LAN Adapter\n\t0092  WLI-U2-KAMG54 Bootloader\n\t0097  WLI-U2-KG54-BB\n\t00a9  WLI-U2-AMG54HP Wireless LAN Adapter\n\t00aa  WLI-U2-AMG54HP Bootloader\n\t00b3  PC-OP-RS1 RemoteStation\n\t00bc  WLI-U2-KG125S 802.11g Adapter [Broadcom 4320 USB]\n\t00ca  802.11n Network Adapter\n\t00cb  WLI-U2-G300N 802.11n Adapter\n\t00d8  WLI-U2-SG54HP\n\t00d9  WLI-U2-G54HP\n\t00da  WLI-U2-KG54L 802.11bg [ZyDAS ZD1211B]\n\t00db  External Hard Drive HD-PF32OU2 [Buffalo Ministation]\n\t00e8  WLI-UC-G300N Wireless LAN Adapter [Ralink RT2870]\n\t00f9  Portable DVD Writer (DVSM-PL58U2)\n\t0105  External Hard Drive HD-CEU2 [Drive Station]\n\t012c  SATA Bridge\n\t012e  WLI-UC-AG300N Wireless LAN Adapter\n\t0148  WLI-UC-G300HP Wireless LAN Adapter\n\t0150  WLP-UC-AG300 Wireless LAN Adapter\n\t0157  External Hard Drive HD-PEU2\n\t0158  WLI-UC-GNHP Wireless LAN Adapter\n\t015d  WLI-UC-GN Wireless LAN Adapter [Ralink RT3070]\n\t016f  WLI-UC-G301N Wireless LAN Adapter [Ralink RT3072]\n\t017f  Sony UWA-BR100 802.11abgn Wireless Adapter [Atheros AR7010+AR9280]\n\t019e  WLI-UC-GNP Wireless LAN Adapter\n\t01a1  MiniStation Metro\n\t01a2  WLI-UC-GNM Wireless LAN Adapter [Ralink RT8070]\n\t01ba  SATA Bridge\n\t01dc  Ultra-Slim Portable DVD Writer (DVSM-PC58U2V)\n\t01de  External Hard Drive HD-PCTU3 [Buffalo MiniStation]\n\t01ea  SATA Bridge\n\t01ee  WLI-UC-GNM2 Wireless LAN Adapter [Ralink RT3070]\n\t01f1  SATA Adapter [HD-LBU3]\n\t01fd  WLI-UC-G450 Wireless LAN Adapter\n\t027e  HD-LCU3\n0412  Award Software International\n0413  Leadtek Research, Inc.\n\t1310  WinFast TV - NTSC + FM\n\t1311  WinFast TV - NTSC + MTS + FM\n\t1312  WinFast TV - PAL BG + FM\n\t1313  WinFast TV - PAL BG+TXT + FM\n\t1314  WinFast TV Audio - PHP PAL I\n\t1315  WinFast TV Audio - PHP PAL I+TXT\n\t1316  WinFast TV Audio - PHP PAL DK\n\t1317  WinFast TV Audio - PHP PAL DK+TXT\n\t1318  WinFast TV - PAL I/DK + FM\n\t1319  WinFast TV - PAL N + FM\n\t131a  WinFast TV Audio - PHP SECAM LL\n\t131b  WinFast TV Audio - PHP SECAM LL+TXT\n\t131c  WinFast TV Audio - PHP SECAM DK\n\t131d  WinFast TV - SECAM DK + TXT + FM\n\t131e  WinFast TV - NTSC Japan + FM\n\t1320  WinFast TV - NTSC\n\t1321  WinFast TV - NTSC + MTS\n\t1322  WinFast TV - PAL BG\n\t1323  WinFast TV - PAL BG+TXT\n\t1324  WinFast TV Audio - PHP PAL I\n\t1325  WinFast TV Audio - PHP PAL I+TXT\n\t1326  WinFast TV Audio - PHP PAL DK\n\t1327  WinFast TV Audio - PHP PAL DK+TXT\n\t1328  WinFast TV - PAL I/DK\n\t1329  WinFast TV - PAL N\n\t132a  WinFast TV Audio - PHP SECAM LL\n\t132b  WinFast TV Audio - PHP SECAM LL+TXT\n\t132c  WinFast TV Audio - PHP SECAM DK\n\t132d  WinFast TV - SECAM DK + TXT\n\t132e  WinFast TV - NTSC Japan\n\t6023  EMP Audio Device\n\t6024  WinFast PalmTop/Novo TV Video\n\t6025  WinFast DTV Dongle (cold state)\n\t6026  WinFast DTV Dongle (warm state)\n\t6029  WinFast DTV Dongle Gold\n\t6125  WinFast DTV Dongle\n\t6126  WinFast DTV Dongle BDA Driver\n\t6a03  RTL2832 [WinFast DTV Dongle Mini]\n\t6f00  WinFast DTV Dongle (STK7700P based)\n0414  Giga-Byte Technology Co., Ltd\n0416  Winbond Electronics Corp.\n\t0035  W89C35 802.11bg WLAN Adapter\n\t0101  Hub\n\t0961  AVL Flash Card Reader\n\t3810  Smart Card Controller\n\t3811  Generic Controller - Single interface\n\t3812  Smart Card Controller_2Interface\n\t3813  Panel Display\n\t5011  Virtual Com Port\n\t511b  Nuvoton Nu-Link1 ICE\n\t511c  Nuvoton Nu-Link1 ICE\n\t511d  Nuvoton Nu-Link1 ICE/VCOM\n\t511e  Nuvoton Nu-Link1 MSC/VCOM\n\t5200  Nuvoton Nu-Link2-ME ICE/MSC/VCOM\n\t5201  Nuvoton Nu-Link2-Pro ICE/MSC/VCOM\n\t5210  Nuvoton Nu-Link2 MSC FW UPGRADE\n\t5211  Nuvoton Nu-Link2 HID FW UPGRADE\n\t5518  4-Port Hub\n\t551a  PC Sync Keypad\n\t551b  PC Async Keypad\n\t551c  Sync Tenkey\n\t551d  Async Tenkey\n\t551e  Keyboard\n\t551f  Keyboard w/ Sys and Media\n\t5521  Keyboard\n\t6481  16-bit Scanner\n\t7721  Memory Stick Reader/Writer\n\t7722  Memory Stick Reader/Writer\n\t7723  SD Card Reader\n\tb23c  Gaming Keyboard\n\tc141  Barcode Scanner\n0417  Symbios Logic\n0418  AST Research\n0419  Samsung Info. Systems America, Inc.\n\t0001  IrDA Remote Controller / Creative Cordless Mouse\n\t0600  Desktop Wireless 6000\n\t2694  Laila\n\t3001  Xerox P1202 Laser Printer\n\t3003  Olivetti PG L12L\n\t3201  Docuprint P8ex\n\t3404  SCX-5x12 series\n\t3406  MFP 830 series\n\t3407  ML-912\n\t3601  InkJet Color Printer\n\t3602  InkJet Color Printer\n\t4602  Remote NDIS Network Device\n\t8001  Hub\n\t8002  SyncMaster HID Monitor Control\n\taa03  SDAS-3 MP3 Player\n041a  Phoenix Technologies, Ltd\n041b  d'TV\n041d  S3, Inc.\n041e  Creative Technology, Ltd\n\t0414  HS-720 Headset\n\t1002  Nomad II\n\t1003  Blaster GamePad Cobra\n\t1050  GamePad Cobra\n\t1053  Mouse Gamer HD7600L\n\t200c  MuVo V100\n\t2020  Zen X-Fi 2\n\t2029  ZiiO\n\t2801  Prodikeys PC-MIDI multifunction keyboard\n\t3000  SoundBlaster Extigy\n\t3002  SB External Composite Device\n\t3010  SoundBlaster MP3+\n\t3014  SB External Composite Device\n\t3015  Sound Blaster Digital Music LX\n\t3020  SoundBlaster Audigy 2 NX\n\t3030  SB External Composite Device\n\t3040  SoundBlaster Live! 24-bit External SB0490\n\t3042  Sound Blaster X-Fi Surround 5.1\n\t3060  Sound Blaster Audigy 2 ZS External\n\t3061  SoundBlaster Audigy 2 ZS Video Editor\n\t3090  Sound Blaster Digital Music SX\n\t30d0  Xmod\n\t30d3  Sound Blaster Play!\n\t3100  IR Receiver (SB0540)\n\t3121  WoW tap chat\n\t3220  Sound Blaster Tactic(3D) Sigma sound card\n\t3232  Sound Blaster Premium HD [SBX]\n\t3237  SB X-Fi Surround 5.1 Pro\n\t3241  Sound Blaster JAM\n\t3263  SB X-Fi Surround 5.1 Pro\n\t3f00  E-Mu Xboard 25 MIDI Controller\n\t3f02  E-Mu 0202\n\t3f04  E-Mu 0404\n\t3f07  E-Mu Xmidi 1x1\n\t3f0a  E-Mu Tracker Pre\n\t3f0e  Xmidi 1x1 Tab\n\t4003  VideoBlaster Webcam Go Plus [W9967CF]\n\t4004  Nomad II MG\n\t4005  Webcam Blaster Go ES\n\t4007  Go Mini\n\t400a  PC-Cam 300\n\t400b  PC-Cam 600\n\t400c  Webcam 5 [pwc]\n\t400d  Webcam PD1001\n\t400f  PC-CAM 550 (Composite)\n\t4011  Webcam PRO eX\n\t4012  PC-CAM350\n\t4013  PC-Cam 750\n\t4015  CardCam Value\n\t4016  CardCam\n\t4017  Webcam Mobile [PD1090]\n\t4018  Webcam Vista [PD1100]\n\t4019  Audio Device\n\t401a  Webcam Vista [PD1100]\n\t401c  Webcam NX [PD1110]\n\t401d  Webcam NX Ultra\n\t401e  Webcam NX Pro\n\t401f  Webcam Notebook [PD1171]\n\t4020  Webcam NX\n\t4021  Webcam NX Ultra\n\t4022  Webcam NX Pro\n\t4028  Vista Plus cam [VF0090]\n\t4029  Webcam Live!\n\t402f  DC-CAM 3000Z\n\t4034  Webcam Instant\n\t4035  Webcam Instant\n\t4036  Webcam Live!/Live! Pro\n\t4037  Webcam Live!\n\t4038  ORITE CCD Webcam [PC370R]\n\t4039  Webcam Live! Effects\n\t403a  Webcam NX Pro 2\n\t403b  Creative Webcam Vista [VF0010]\n\t403c  Webcam Live! Ultra\n\t403d  Webcam Notebook Ultra\n\t403e  Webcam Vista Plus\n\t4041  Webcam Live! Motion\n\t4043  Vibra Plus Webcam\n\t4045  Live! Cam Voice\n\t4049  Live! Cam Voice\n\t4051  Live! Cam Notebook Pro [VF0250]\n\t4052  Live! Cam Vista IM\n\t4053  Live! Cam Video IM\n\t4054  Live! Cam Video IM\n\t4055  Live! Cam Video IM Pro\n\t4056  Live! Cam Video IM Pro\n\t4057  Live! Cam Optia\n\t4058  Live! Cam Optia AF\n\t405f  WebCam Vista (VF0330)\n\t4061  Live! Cam Notebook Pro [VF0400]\n\t4063  Live! Cam Video IM Pro\n\t4068  Live! Cam Notebook [VF0470]\n\t406c  Live! Cam Sync [VF0520]\n\t4083  Live! Cam Socialize [VF0640]\n\t4087  Live! Cam Socialize HD 1080 [VF0680]\n\t4088  Live! Cam Chat HD [VF0700]\n\t4095  Live! Cam Sync HD [VF0770]\n\t4097  Live! Cam Chat HD [VF0700/VF0790]\n\t4099  Creative VF0800 [RealSense Camera SR300]\n\t40a3  Live! Cam V3 2K [VF-0900]\n\t4100  Nomad Jukebox 2\n\t4101  Nomad Jukebox 3\n\t4102  NOMAD MuVo^2\n\t4106  Nomad MuVo\n\t4107  NOMAD MuVo\n\t4108  Nomad Jukebox Zen\n\t4109  Nomad Jukebox Zen NX\n\t410b  Nomad Jukebox Zen USB 2.0\n\t410c  Nomad MuVo NX\n\t410f  NOMAD MuVo^2 (Flash)\n\t4110  Nomad Jukebox Zen Xtra\n\t4111  Dell Digital Jukebox\n\t4116  MuVo^2\n\t4117  Nomad MuVo TX\n\t411b  Zen Touch\n\t411c  Nomad MuVo USB 2.0\n\t411d  Zen\n\t411e  Zen Micro\n\t4120  Nomad MuVo TX FM\n\t4123  Zen Portable Media Center\n\t4124  MuVo^2 FM (uHDD)\n\t4126  Dell DJ (2nd gen)\n\t4127  Dell DJ\n\t4128  NOMAD Jukebox Zen Xtra (mtp)\n\t412b  MuVo N200 with FM radio\n\t412f  Dell Digital Jukebox 2.Gen\n\t4130  Zen Micro (mtp)\n\t4131  DAP-HD0014 [Zen Touch] (MTP)\n\t4133  Mass Storage Device\n\t4134  Zen Neeon\n\t4136  Zen Sleek\n\t4137  Zen Sleek (mtp)\n\t4139  Zen Nano Plus\n\t413c  Zen MicroPhoto\n\t4150  Zen V (MTP)\n\t4151  Zen Vision:M (mtp)\n\t4152  Zen V Plus\n\t4153  Zen Vision W\n\t4154  Zen Stone\n\t4155  Zen Stone plus\n\t4157  Zen (MTP)\n\t500f  Broadband Blaster 8012U-V\n\t5015  TECOM Bluetooth Device\n\tffff  Webcam Live! Ultra\n041f  LCS Telegraphics\n0420  Chips and Technologies\n\t1307  Celly SIM Card Reader\n0421  Nokia Mobile Phones\n\t0001  E61i (PC Suite mode)\n\t0018  6288 GSM Smartphone\n\t0019  6288 GSM Smartphone (imaging mode)\n\t001a  6288 GSM Smartphone (file transfer mode)\n\t0024  5610 XpressMusic (Storage mode)\n\t0025  5610 XpressMusic (PC Suite mode)\n\t0028  5610 XpressMusic (Imaging mode)\n\t002d  6120 Phone (Mass storage mode)\n\t002e  6120 Phone (Media-Player mode)\n\t002f  6120 Phone (PC-Suite mode)\n\t0042  E51 (PC Suite mode)\n\t0064  3109c GSM Phone\n\t006b  5310 Xpress Music (PC Suite mode)\n\t006c  5310 Xpress music (Storage mode)\n\t006d  N95 (Storage mode)\n\t006e  N95 (Multimedia mode)\n\t006f  N95 (Printing mode)\n\t0070  N95 (PC Suite mode)\n\t0096  N810 Internet Tablet\n\t00aa  E71 (Mass storage mode)\n\t00ab  E71 (PC Suite mode)\n\t00e4  E71 (Media transfer mode)\n\t0103  ADL Flashing Engine AVALON Parent\n\t0104  ADL Re-Flashing Engine Parent\n\t0105  Nokia Firmware Upgrade Mode\n\t0106  ROM Parent\n\t010d  E75 (Storage Mode)\n\t010e  E75 (PC Suite mode)\n\t010f  E75 (Media transfer mode)\n\t0110  E75 (Imaging Mode)\n\t0154  5800 XpressMusic (PC Suite mode)\n\t0155  5800 XpressMusic (Multimedia mode)\n\t0156  5800 XpressMusic (Storage mode)\n\t0157  5800 XpressMusic (Imaging mode)\n\t0189  N810 Internet Tablet WiMAX\n\t0199  6700 Classic (msc)\n\t019a  6700 Classic (PC Suite)\n\t019b  6700 Classic (mtp)\n\t01b0  6303 classic Phone (PC Suite mode)\n\t01b1  6303 classic Phone (Mass storage mode)\n\t01b2  6303 classic Phone (Printing and media mode)\n\t01c7  N900 (Storage Mode)\n\t01c8  N900/N950 (PC-Suite Mode)\n\t0228  5530 XpressMusic\n\t023a  6730 Classic\n\t026a  N97 (mass storage)\n\t026b  N97 (Multimedia)\n\t026c  N97 (PC Suite)\n\t026d  N97 (Pictures)\n\t0295  660i/6600i Slide Phone (Mass Storage)\n\t0297  660i/6600i Slide Phone (Still Image)\n\t02e1  5230 (Storage mode)\n\t02e2  5230 (Multimedia mode)\n\t02e3  5230 (PC-Suite mode)\n\t02e4  5230 (Imaging mode)\n\t0360  C1-01 Ovi Suite Mode\n\t0396  C7-00 (Modem mode)\n\t03a4  C5 (Storage mode)\n\t03c0  C7-00 (Mass storage mode)\n\t03c1  C7-00 (Media transfer mode)\n\t03c2  Sim\n\t03cd  C7-00 (Nokia Suite mode)\n\t03d1  N950 (Storage Mode)\n\t03d2  N950 (PC Suite mode)\n\t0400  7600 Phone Parent\n\t0401  6650 GSM Phone\n\t0402  6255 Phone Parent\n\t0404  5510\n\t0405  9500 GSM Communicator\n\t0407  Music Player HDR-1(tm)\n\t040b  N-Gage GSM Phone\n\t040d  6620 Phone Parent\n\t040e  6651 Phone Parent\n\t040f  6230 GSM Phone\n\t0410  6630 Imaging Smartphone\n\t0411  7610 Phone Parent\n\t0413  6260 Phone Parent\n\t0414  7370\n\t0415  9300 GSM Smartphone\n\t0416  6170 Phone Parent\n\t0417  7270 Phone Parent\n\t0418  E70 (PC Suite mode)\n\t0419  E60 (PC Suite mode)\n\t041a  9500 GSM Communicator (RNDIS)\n\t041b  9300 GSM Smartphone (RNDIS)\n\t041c  7710 Phone Parent\n\t041d  6670 Phone Parent\n\t041e  6680\n\t041f  6235 Phone Parent\n\t0421  3230 Phone Parent\n\t0422  6681 Phone Parent\n\t0423  6682 Phone Parent\n\t0428  6230i Modem\n\t0429  6230i MultiMedia Card\n\t0431  770/N800 Internet Tablet\n\t0432  N90 Phone Parent\n\t0435  E70 (IP Passthrough/RNDIS mode)\n\t0436  E60 (IP Passthrough/RNDIS mode)\n\t0437  6265 Phone Parent\n\t043a  N70 USB Phone Parent\n\t043b  3155 Phone Parent\n\t043c  6155 Phone Parent\n\t043d  6270 Phone Parent\n\t0443  N70 Phone Parent\n\t0444  N91\n\t044c  NM850iG Phone Parent\n\t044d  E61 (PC Suite mode)\n\t044e  E61 (Data Exchange mode)\n\t044f  E61 (IP Passthrough/RNDIS mode)\n\t0453  9300 Phone Parent\n\t0456  6111 Phone Parent\n\t0457  6111 Phone (Printing mode)\n\t045a  6280 Phone Parent\n\t045d  6282 Phone Parent\n\t046e  6110 Navigator\n\t0471  6110 Navigator\n\t0485  MTP Device\n\t04b9  5300\n\t04bc  5200 (Nokia mode)\n\t04bd  5200 (Storage mode)\n\t04be  5200 (MTP mode)\n\t04c3  N800 Internet Tablet\n\t04ce  E90 Communicator (PC Suite mode)\n\t04cf  E90 Communicator (Storage mode)\n\t04f0  Nokia N95 (PC Suite mode)\n\t04f9  6300 (PC Suite mode)\n\t0508  E65 (PC Suite mode)\n\t0509  E65 (Storage mode)\n\t0518  N9 (Storage mode)\n\t0519  N9 (RNDIS/Ethernet mode)\n\t051a  N9 (PC Suite mode)\n\t054d  C2-01\n\t0600  Digital Pen SU-1B\n\t0610  CS-15 (Internet Stick 3G modem)\n\t0661  Lumia 620/920\n\t0662  301 Dual SIM (Mass Storage)\n\t0663  301 Dual SIM\n\t069a  130 [RM-1035] (Charging only)\n\t06fc  Lumia 640 Phone\n\t0720  X (RM-980)\n\t0800  Connectivity Cable DKU-5\n\t0801  Data Cable DKU-6\n\t0802  CA-42 Phone Parent\n0422  ADI Systems, Inc.\n0423  Computer Access Technology Corp.\n\t000a  NetMate Ethernet\n\t000c  NetMate2 Ethernet\n\t000d  USB Chief Analyzer\n\t0100  Generic Universal Protocol Analyzer\n\t0101  UPA USBTracer\n\t0200  Generic 10K Universal Protocol Analyzer\n\t020a  PETracer ML\n\t0300  Generic Universal Protocol Analyzer\n\t0301  2500H Tracer Trainer\n\t030a  PETracer x1\n\t1237  Andromeda Hub\n0424  Microchip Technology, Inc. (formerly SMSC)\n\t0001  Integrated Hub\n\t0007  ULPI Transciever [USB3320]\n\t0140  LPC47M14x hub\n\t0acd  Sitecom Internal Multi Memory reader/writer MD-005\n\t0fdc  Floppy\n\t10cd  Sitecom Internal Multi Memory reader/writer MD-005\n\t2020  USB Hub\n\t20cd  Sitecom Internal Multi Memory reader/writer MD-005\n\t20fc  6-in-1 Card Reader\n\t2134  Hub\n\t2228  9-in-2 Card Reader\n\t223a  8-in-1 Card Reader\n\t2412  Hub\n\t2503  USB 2.0 Hub\n\t2504  Hub\n\t2507  hub\n\t2512  USB 2.0 Hub\n\t2513  2.0 Hub\n\t2514  USB 2.0 Hub\n\t2517  Hub\n\t2524  USB MultiSwitch Hub\n\t2602  USB 2.0 Hub\n\t2640  USB 2.0 Hub\n\t2660  Hub\n\t2744  Hub\n\t274d  HTC Hub Controller\n\t2807  Hub\n\t3fc7  RME Babyface audio system\n\t3fcc  RME MADIface\n\t4041  Hub and media card controller\n\t4060  Ultra Fast Media Reader\n\t4063  xD/SD/MS/MMC Reader\n\t4064  Ultra Fast Media Reader\n\t4712  USB4712 high-speed hub\n\t4713  USB4715 high-speed hub (2 ports disabled)\n\t4714  USB4715 high-speed hub (1 port disabled)\n\t4715  USB4715 high-speed hub\n\t4910  USB491x hub integrated functions (primary)\n\t4912  USB4912 high-speed hub (1 port disabled)\n\t4914  USB4914 high-speed hub\n\t4916  USB4916 high-speed hub\n\t4920  USB491x hub integrated functions (secondary)\n\t4925  USB4925 high-speed hub (primary upstream)\n\t4927  USB4927 high-speed hub (primary upstream)\n\t4931  USB4925/4927 high-speed hub (secondary upstream)\n\t4940  USB47xx/49xx hub integrated WinUSB\n\t4942  USB47xx/49xx hub integrated I2S audio port\n\t4943  USB47xx/49xx hub integrated I2S audio + HID port\n\t4944  USB47xx/49xx hub integrated serial port\n\t4946  USB47xx/49xx hub integrated serial + I2S audio port\n\t4947  USB47xx/49xx hub integrated serial + I2S audio + HID port\n\t494a  USB47xx/49xx hub integrated WinUSB + I2S audio port\n\t494b  USB47xx/49xx hub integrated WinUSB + I2S audio + HID port\n\t494c  USB47xx/49xx hub integrated WinUSB + serial port\n\t494e  USB47xx/49xx hub integrated WinUSB + serial + I2S audio port\n\t494f  USB47xx/49xx hub integrated WinUSB + serial + I2S audio + HID port\n\t5434  Hub\n\t5534  Hub\n\t5744  Hub\n\t5807  Hub\n\t7500  LAN7500 Ethernet 10/100/1000 Adapter\n\t9500  LAN9500/LAN9500i\n\t9512  SMC9512/9514 USB Hub\n\t9514  SMC9514 Hub\n\t9904  LAN9512/LAN9514 Ethernet 10/100 Adapter (SAL10)\n\t9e00  LAN9500A/LAN9500Ai\n\ta700  2 Port Hub\n\tec00  SMSC9512/9514 Fast Ethernet Adapter\n0425  Motorola Semiconductors HK, Ltd\n\t0101  G-Tech Wireless Mouse & Keyboard\n\tf102  G-Tech U+P Wireless Mouse\n0426  Integrated Device Technology, Inc.\n\t0426  WDM Driver\n0427  Motorola Electronics Taiwan, Ltd\n0428  Advanced Gravis Computer Tech, Ltd\n\t4001  GamePad Pro\n0429  Cirrus Logic\n042a  Ericsson Austrian, AG\n042b  Intel Corp.\n\t9316  8x931Hx Customer Hub\n042c  Innovative Semiconductors, Inc.\n042d  Micronics\n042e  Acer, Inc.\n\t0380  MP3 Player\n042f  Molex, Inc.\n0430  Fujitsu Component Limited\n\t0002  109 Keyboard\n\t0005  Type 6 Keyboard\n\t000a  109 Japanese Keyboard\n\t000b  109 Japanese Keyboard\n\t0082  109 Japanese Keyboard\n\t0083  109 Japanese Keyboard\n\t00a2  Type 7 Keyboard\n\t0100  3-button Mouse\n\t0406  KVM Switch\n\t0502  Panasonic CF-19 HID Touch Panel\n\t100e  24.1\" LCD Monitor v4 / FID-638 Mouse\n\t36ba  Bus Powered Hub\n\ta101  remote key/mouse for P3 chip\n\ta102  remote key/mouse/storage for P3 chip\n\ta103  remote storage for P3 chip\n\ta111  remote keyboard for P4 chip\n\ta112  remote mouse for P4 chip\n\ta113  remote storage for P4 chip\n\ta4a2  Ethernet (RNDIS and CDC ethernet)\n\tcdab  Raritan KVM dongle\n0431  Itac Systems, Inc.\n\t0100  Mouse-Trak 3-button Track Ball\n0432  Unisys Corp.\n\t0031  Document Processor\n0433  Alps Electric, Inc.\n\t1101  IBM Game Controller\n\tabab  Keyboard\n0434  Samsung Info. Systems America, Inc.\n0435  Hyundai Electronics America\n0436  Taugagreining HF\n\t0005  CameraMate (DPCM_USB)\n0437  Framatome Connectors USA\n0438  Advanced Micro Devices, Inc.\n\t7900  Root Hub\n0439  Voice Technologies Group\n043d  Lexmark International, Inc.\n\t0001  Laser Printer\n\t0002  Optra E310 Printer\n\t0003  Laser Printer\n\t0004  Laser Printer\n\t0005  Laser Printer\n\t0006  Laser Printer\n\t0007  Laser Printer\n\t0008  Inkjet Color Printer\n\t0009  Optra S2450 Printer\n\t000a  Laser Printer\n\t000b  Inkjet Color Printer\n\t000c  Optra E312 Printer\n\t000d  Laser Printer\n\t000e  Laser Printer\n\t000f  Laser Printer\n\t0010  Laser Printer\n\t0011  Laser Printer\n\t0012  Inkjet Color Printer\n\t0013  Inkjet Color Printer\n\t0014  InkJet Color Printer\n\t0015  InkJet Color Printer\n\t0016  Z12 Color Jetprinter\n\t0017  Z32 printer\n\t0018  Z52 Printer\n\t0019  Forms Printer\n\t001a  Z65 Printer\n\t001b  InkJet Photo Printer\n\t001c  Kodak Personal Picture Maker 200 Printer\n\t001d  InkJet Color Printer\n\t001e  InkJet Photo Printer\n\t001f  Kodak Personal Picture Maker 200 Card Reader\n\t0020  Z51 Printer\n\t0021  Z33 Printer\n\t0022  InkJet Color Printer\n\t0023  Laser Printer\n\t0024  Laser Printer\n\t0025  InkJet Color Printer\n\t0026  InkJet Color Printer\n\t0027  InkJet Color Printer\n\t0028  InkJet Color Printer\n\t0029  Scan Print Copy\n\t002a  Scan Print Copy\n\t002b  Scan Print Copy\n\t002c  Scan Print Copy\n\t002d  X70/X73 Scan/Print/Copy\n\t002e  Scan Print Copy\n\t002f  Scan Print Copy\n\t0030  Scan Print Copy\n\t0031  Scan Print Copy\n\t0032  Scan Print Copy\n\t0033  Scan Print Copy\n\t0034  Scan Print Copy\n\t0035  Scan Print Copy\n\t0036  Scan Print Copy\n\t0037  Scan Print Copy\n\t0038  Scan Print Copy\n\t0039  Scan Print Copy\n\t003a  Scan Print Copy\n\t003b  Scan Print Copy\n\t003c  Scan Print Copy\n\t003d  X83 Scan/Print/Copy\n\t003e  Scan Print Copy\n\t003f  Scan Print Copy\n\t0040  Scan Print Copy\n\t0041  Scan Print Copy\n\t0042  Scan Print Copy\n\t0043  Scan Print Copy\n\t0044  Scan Print Copy\n\t0045  Scan Print Copy\n\t0046  Scan Print Copy\n\t0047  Scan Print Copy\n\t0048  Scan Print Copy\n\t0049  Scan Print Copy\n\t004a  Scan Print Copy\n\t004b  Scan Print Copy\n\t004c  Scan Print Copy\n\t004d  Laser Printer\n\t004e  Laser Printer\n\t004f  InkJet Color Printer\n\t0050  InkJet Color Printer\n\t0051  Laser Printer\n\t0052  Laser Printer\n\t0053  InkJet Color Printer\n\t0054  InkJet Color Printer\n\t0057  Z35 Printer\n\t0058  Laser Printer\n\t005a  X63\n\t005c  InkJet Color Printer\n\t0060  X74/X75 Scanner\n\t0061  X74 Hub\n\t0065  X5130\n\t0069  X74/X75 Printer\n\t006d  X125\n\t006e  C510\n\t0072  X6170 Printer\n\t0073  InkJet Color Printer\n\t0078  InkJet Color Printer\n\t0079  InkJet Color Printer\n\t007a  Generic Hub\n\t007b  InkJet Color Printer\n\t007c  X1110/X1130/X1140/X1150/X1170/X1180/X1185\n\t007d  Photo 3150\n\t008a  4200 series\n\t008b  InkJet Color Printer\n\t008c  to CF/SM/SD/MS Card Reader\n\t008e  InkJet Color Printer\n\t008f  X422\n\t0091  Laser Printer E232\n\t0093  X5250\n\t0095  E220 Printer\n\t0096  2200 series\n\t0097  P6250\n\t0098  7100 series\n\t009e  P910 series Human Interface Device\n\t009f  InkJet Color Printer\n\t00a9  IBM Infoprint 1410 MFP\n\t00ab  InkJet Color Printer\n\t00b2  3300 series\n\t00b8  7300 series\n\t00b9  8300 series\n\t00ba  InkJet Color Printer\n\t00bb  2300 series\n\t00bd  Printing Support\n\t00be  Printing Support\n\t00bf  Printing Support\n\t00c0  6300 series\n\t00c1  4300 series\n\t00c7  Printing Support\n\t00c8  Printing Support\n\t00c9  Printing Support\n\t00cb  Printing Support\n\t00cc  E120(n)\n\t00d0  9300 series\n\t00d3  X340 Scanner\n\t00d4  X342n Scanner\n\t00d5  Printing Support\n\t00d6  X340 Scanner\n\t00e8  X642e\n\t00e9  2400 series\n\t00f6  3400 series\n\t00f7  InkJet Color Printer\n\t00ff  InkJet Color Printer\n\t010b  2500 series\n\t010d  3500-4500 series\n\t010f  6500 series\n\t0142  X3650 (Printer, Scanner, Copier)\n\t01bd  S800 Series Scanner\n\t01fa  S310 series\n\t020e  RICOH Aficio SP 4410SF\n\t4303  Xerox WorkCentre Pro 412\n043e  LG Electronics USA, Inc.\n\t3001  AN-WF100 802.11abgn Wireless Adapter [Broadcom BCM4323]\n\t3004  TWFM-B003D 802.11abgn Wireless Module [Broadcom BCM43236B]\n\t3009  VC400\n\t3101  AN-WF500 802.11abgn + BT Wireless Adapter [Broadcom BCM43242]\n\t42bd  Flatron 795FT Plus Monitor\n\t4a4d  Flatron 915FT Plus Monitor\n\t7001  MF-PD100 Soul Digital MP3 Player\n\t7013  MP3 Player\n\t70d7  Mouse Scanner LSM-150 [LG Smart Scan Mouse]\n\t70f5  External HDD\n\t8484  LPC-U30 Webcam II\n\t8585  LPC-UC35 Webcam\n\t8888  Electronics VCS Camera II(LPC-U20)\n\t9800  Remote Control Receiver_iMON\n\t9803  eHome Infrared Receiver\n\t9804  DMB Receiver Control\n\t9a10  34UC88-B\n\t9a11  34UC88-B\n\t9a39  27UP850 - WK.AEUDCSN - External Monitor 4K\n\t9a57  UltraGear Monitor\n\t9c01  LGE Sync\n043f  RadiSys Corp.\n0440  Eizo Nanao Corp.\n0441  Winbond Systems Lab.\n\t1456  Hub\n0442  Ericsson, Inc.\n\tabba  Bluetooth Device\n0443  Gateway, Inc.\n\t000e  Multimedia Keyboard\n\t002e  Millennium Keyboard\n0445  Lucent Technologies, Inc.\n0446  NMB Technologies Corp.\n\t6781  Keyboard with PS/2 Mouse Port\n\t6782  Keyboard\n0447  Momentum Microsystems\n0449  Duta Multi Robotik\n\t0128  Menengah\n\t0210  Dasar\n\t0612  Lanjutan\n044a  Shamrock Tech. Co., Ltd\n044b  WSI\n044c  CCL/ITRI\n044d  Siemens Nixdorf AG\n044e  Alps Electric Co., Ltd\n\t1104  Japanese Keyboard\n\t1218  Electric Touchpad\n\t2002  MD-5500 Printer\n\t2014  Bluetooth Device\n\t3001  UGTZ4 Bluetooth\n\t3002  Bluetooth Device\n\t3003  Bluetooth Device\n\t3004  Bluetooth Adapter\n\t3005  Integrated Bluetooth Device\n\t3006  Bluetooth Adapter\n\t3007  Bluetooth Controller (ALPS/UGX)\n\t300c  Bluetooth Controller (ALPS/UGPZ6)\n\t300d  Bluetooth Controller (ALPS/UGPZ6)\n\t3010  Bluetooth Adapter\n\t3017  BCM2046 Bluetooth Device\n\tffff  Compaq Bluetooth Multiport Module\n044f  ThrustMaster, Inc.\n\t0400  HOTAS Cougar\n\t0402  HOTAS Warthog Joystick\n\t0404  HOTAS Warthog Throttle\n\t044f  GP XID\n\t0f00  Steering Wheel for Xbox\n\t0f03  Steering Wheel for Xbox\n\t0f07  Controller for Xbox\n\t0f0c  Xbox Memory Unit (8MB)\n\t0f10  Modena GT Wheel\n\ta003  Rage 3D Game Pad\n\ta01b  PK-GP301 Driving Wheel\n\ta0a0  Top Gun Joystick\n\ta0a1  Top Gun Joystick (rev2)\n\ta0a3  Fusion Digital GamePad\n\ta201  PK-GP201 PlayStick\n\tb108  T-Flight Hotas X Flight Stick\n\tb10a  T.16000M Joystick\n\tb203  360 Modena Pro Wheel\n\tb300  Firestorm Dual Power\n\tb303  FireStorm Dual Analog 2\n\tb304  Firestorm Dual Power\n\tb307  vibrating Upad\n\tb30b  Wireless VibrationPad\n\tb315  Firestorm Dual Analog 3\n\tb320  Dual Trigger gamepad PC/PS2 2.0\n\tb323  Dual Trigger 3-in-1 (PC Mode)\n\tb324  Dual Trigger 3-in-1 (PS3 Mode)\n\tb326  Gamepad GP XID\n\tb351  F16 MFD 1\n\tb352  F16 MFD 2\n\tb365  UbiSoft UbiConnect\n\tb603  force feedback Wheel\n\tb605  force feedback Racing Wheel\n\tb651  Ferrari GT Rumble Force Wheel\n\tb653  RGT Force Feedback Clutch Racing Wheel\n\tb654  Ferrari GT Force Feedback Wheel\n\tb677  T150 Racing Wheel\n\tb678  T.Flight Rudder Pedals\n\tb679  T-Rudder\n\tb687  TWCS Throttle\n\tb700  Tacticalboard\n0450  DFI, Inc.\n0451  Texas Instruments, Inc.\n\t0422  TUSB422 Port Controller with Power Delivery\n\t1234  Bluetooth Device\n\t1428  Hub\n\t1446  TUSB2040/2070 Hub\n\t16a2  CC Debugger\n\t16a6  BM-USBD1 BlueRobin RF heart rate sensor receiver\n\t16a8  CC2531 ZigBee\n\t16ae  CC2531 Dongle\n\t2036  TUSB2036 Hub\n\t2046  TUSB2046 Hub\n\t2077  TUSB2077 Hub\n\t2f90  SM-USB-DIG\n\t3200  TUSB3200 Boot Loader\n\t3410  TUSB3410 Microcontroller\n\t3f00  OMAP1610\n\t3f02  SMC WSKP100 Wi-Fi Phone\n\t505f  TUSB5052 Serial\n\t5153  TUSB5052 Hub\n\t5409  Frontier Labs NEX IA+ Digital Audio Player\n\t6000  AU5 ADSL Modem (pre-reenum)\n\t6001  AU5 ADSL Modem\n\t6060  RNDIS/BeWAN ADSL2+\n\t6070  RNDIS/BeWAN ADSL2+\n\t625f  TUSB6250 ATA Bridge\n\t8041  Hub\n\t8042  Hub\n\t8043  Hub\n\t8140  TUSB8041 4-Port Hub\n\t8142  TUSB8041 4-Port Hub\n\t9261  TUSB9261 SerialATA-Bridge\n\t926b  TUSB9260 Boot Loader\n\tbef3  CC1352R1 Launchpad\n\tdbc0  Device Bay Controller\n\te001  GraphLink [SilverLink]\n\te003  TI-84 Plus Calculator\n\te004  TI-89 Titanium Calculator\n\te008  TI-84 Plus Silver Calculator\n\te00e  TI-89 Titanium Presentation Link\n\te00f  TI-84 Plus Presentation Link\n\te010  TI SmartPad Keyboard\n\te011  Nspire CAS+ prototype\n\te012  TI-Nspire Calculator\n\te013  Network Bridge\n\te01c  Data Collection Sled [Nspire Lab Cradle, Nspire Datatracker Cradle]\n\te01e  Nspire CX Navigator Access Point\n\te01f  Python Adapter (firmware install mode)\n\te020  Python Adapter\n\te022  Nspire CX II\n\tf430  MSP-FET430UIF JTAG Tool\n\tf432  eZ430 Development Tool\n\tffff  Bluetooth Device\n0452  Mitsubishi Electronics America, Inc.\n\t0021  HID Monitor Controls\n\t0050  Diamond Pro 900u CRT Monitor\n\t0051  Integrated Hub\n\t0100  Control Panel for Leica TCS SP5\n0453  CMD Technology\n\t6781  NMB Keyboard\n\t6783  Chicony Composite Keyboard\n0454  Vobis Microcomputer AG\n0455  Telematics International, Inc.\n0456  Analog Devices, Inc.\n\t7031  FX2 SPI/I2C Interface\n\tb672  Libiio based instrument [ADALM2000]\n\tb673  LibIIO based AD9363 Software Defined Radio [ADALM-PLUTO]\n\tf000  FT2232 JTAG ICE [gnICE]\n\tf001  FT2232H Hi-Speed JTAG ICE [gnICE+]\n0457  Silicon Integrated Systems Corp.\n\t0150  Super Talent 1GB Flash Drive\n\t0151  Super Flash 1GB / GXT  64MB Flash Drive\n\t0162  SiS162 usb Wireless LAN Adapter\n\t0163  SiS163U 802.11 Wireless LAN Adapter\n\t0817  SiS-184-ASUS-4352.17 touch panel\n\t10e1  HID Touch Controller\n\t5401  Wireless Adapter RO80211GS-USB\n0458  KYE Systems Corp. (Mouse Systems)\n\t0001  Mouse\n\t0002  Genius NetMouse Pro\n\t0003  Genius NetScroll+\n\t0006  Easy Mouse+\n\t0007  Trackbar Emotion\n\t000b  NetMouse Wheel(P+U)\n\t000c  TACOMA Fingerprint V1.06.01\n\t000e  Genius NetScroll Optical\n\t0013  TACOMA Fingerprint Mouse V1.06.01\n\t001a  Genius WebScroll+\n\t002e  NetScroll + Traveler / NetScroll 110\n\t0036  Pocket Mouse LE\n\t0039  NetScroll+ Superior\n\t003a  NetScroll+ Mini Traveler / Genius NetScroll 120\n\t004c  Slimstar Pro Keyboard\n\t0056  Ergo 300 Mouse\n\t0057  Enhanced Gaming Device\n\t0059  Enhanced Laser Device\n\t005a  Enhanced Device\n\t005b  Enhanced Device\n\t005c  Enhanced Laser Gaming Device\n\t005d  Enhanced Device\n\t0061  Bluetooth Dongle\n\t0066  Genius Traveler 1000 Wireless Mouse\n\t0072  Navigator 335\n\t0083  Bluetooth Dongle\n\t0087  Ergo 525V Laser Mouse\n\t0088  Genius Traveler 515 Laser\n\t0089  Genius Traveler 350\n\t00ca  Pen Mouse\n\t0100  EasyPen Tablet\n\t0101  CueCat\n\t011b  NetScroll T220\n\t0186  Genius DX-120 Mouse\n\t1001  Joystick\n\t1002  Game Pad\n\t1003  Genius VideoCam\n\t1004  Flight2000 F-23 Joystick\n\t100a  Aashima Technology Trust Sight Fighter Vibration Feedback Joystick\n\t2001  ColorPage-Vivid Pro Scanner\n\t2004  ColorPage-HR6 V1 Scanner\n\t2005  ColorPage-HR6/Vivid3\n\t2007  ColorPage-HR6 V2 Scanner\n\t2008  ColorPage-HR6 V2 Scanner\n\t2009  ColorPage-HR6A Scanner\n\t2011  ColorPage-Vivid3x Scanner\n\t2012  Plustek Scanner\n\t2013  ColorPage-HR7 Scanner\n\t2014  ColorPage-Vivid4\n\t2015  ColorPage-HR7LE Scanner\n\t2016  ColorPage-HR6X Scanner\n\t2017  ColorPage-Vivid3xe\n\t2018  ColorPage-HR7X\n\t2019  ColorPage-HR6X Slim\n\t201a  ColorPage-Vivid4xe\n\t201b  ColorPage-Vivid4x\n\t201c  ColorPage-HR8\n\t201d  ColorPage-Vivid 1200 X\n\t201e  ColorPage-Slim 1200\n\t201f  ColorPage-Vivid 1200 XE\n\t2020  ColorPage-Slim 1200 USB2\n\t2021  ColorPage-SF600\n\t3017  SPEED WHEEL 3 Vibration\n\t3018  Wireless 2.4Ghz Game Pad\n\t3019  10-Button USB Joystick with Vibration\n\t301a  MaxFire G-12U Vibration\n\t301c  Genius MaxFighter F-16U\n\t301d  Genius MaxFire MiniPad\n\t400f  Genius TVGo DVB-T02Q MCE\n\t4012  TVGo DVB-T03 [AF9015]\n\t5003  G-pen 560 Tablet\n\t5004  G-pen Tablet\n\t5005  Genius EasyPen M406\n\t5012  Genius EasyPen M406W\n\t5014  Genius EasyPen 340\n\t505e  Genius iSlim 330\n\t6001  GF3000F Ethernet Adapter\n\t7004  VideoCAM Express V2\n\t7006  Dsc 1.3 Smart Camera Device\n\t7007  VideoCAM Web\n\t7009  G-Shot G312 Still Camera Device\n\t700c  VideoCAM Web V3\n\t700d  G-Shot G511 Composite Device\n\t700f  VideoCAM Web\n\t7012  WebCAM USB2.0\n\t7014  VideoCAM Live V3\n\t701c  G-Shot G512 Still Camera\n\t7020  Sim 321C\n\t7025  Eye 311Q Camera\n\t7029  Genius Look 320s (SN9C201 + HV7131R)\n\t702c  Trek 320R Camera\n\t702f  Genius Slim 322\n\t7035  i-Look 325T Camera\n\t7045  Genius Look 1320 V2\n\t704c  Genius i-Look 1321\n\t704d  Slim 1322AF\n\t7055  Slim 2020AF camera\n\t705a  Asus USB2.0 Webcam\n\t705c  Genius iSlim 1300AF\n\t7061  Genius iLook 1321 V2\n\t7066  Acer Crystal Eye Webcam\n\t7067  Genius iSlim 1300AF V2\n\t7068  Genius eFace 1325R\n\t706d  Genius iSlim 2000AF V2\n\t7076  Genius FaceCam 312\n\t7079  FaceCam 2025R\n\t707f  TVGo DVB-T03 [RTL2832]\n\t7088  WideCam 1050\n\t7089  Genius FaceCam 320\n\t708c  Genius WideCam F100\n0459  Adobe Systems, Inc.\n045a  SONICblue, Inc.\n\t07da  Supra Express 56K modem\n\t0b4a  SupraMax 2890 56K Modem [Lucent Atlas]\n\t0b68  SupraMax 56K Modem\n\t5001  Rio 600 MP3 Player\n\t5002  Rio 800 MP3 Player\n\t5003  Nike Psa/Play MP3 Player\n\t5005  Rio S10 MP3 Player\n\t5006  Rio S50 MP3 Player\n\t5007  Rio S35 MP3 Player\n\t5008  Rio 900 MP3 Player\n\t5009  Rio S30 MP3 Player\n\t500d  Fuse MP3 Player\n\t500e  Chiba MP3 Player\n\t500f  Cali MP3 Player\n\t5010  Rio S11 MP3 Player\n\t501c  Virgin MPF-1000\n\t501d  Rio Fuse\n\t501e  Rio Chiba\n\t501f  Rio Cali\n\t503f  Cali256 MP3 Player\n\t5042  Rio Forge\n\t5202  Rio Riot MP3 Player\n\t5210  Rio Karma Music Player\n\t5220  Rio Nitrus MP3 Player\n\t5221  Rio Eigen\n045b  Hitachi, Ltd\n\t0053  RX610 RX-Stick\n\t0229  mSATA Adapter [renkforce Pi-102]\n045d  Nortel Networks, Ltd\n045e  Microsoft Corp.\n\t0007  SideWinder Game Pad\n\t0008  SideWinder Precision Pro\n\t0009  IntelliMouse\n\t000b  Natural Keyboard Elite\n\t000e  SideWinder® Freestyle Pro\n\t0014  Digital Sound System 80\n\t001a  SideWinder Precision Racing Wheel\n\t001b  SideWinder Force Feedback 2 Joystick\n\t001c  Internet Keyboard Pro\n\t001d  Natural Keyboard Pro\n\t001e  IntelliMouse Explorer\n\t0023  Trackball Optical\n\t0024  Trackball Explorer\n\t0025  IntelliEye Mouse\n\t0026  SideWinder GamePad Pro\n\t0027  SideWinder PnP GamePad\n\t0028  SideWinder Dual Strike\n\t0029  IntelliMouse Optical\n\t002b  Internet Keyboard Pro\n\t002d  Internet Keyboard\n\t002f  Integrated Hub\n\t0033  Sidewinder Strategic Commander\n\t0034  SideWinder Force Feedback Wheel\n\t0038  SideWinder Precision 2\n\t0039  IntelliMouse Optical\n\t003b  SideWinder Game Voice\n\t003c  SideWinder Joystick\n\t0040  Wheel Mouse Optical\n\t0047  IntelliMouse Explorer 3.0\n\t0048  Office Keyboard 1.0A\n\t0053  Optical Mouse\n\t0059  Wireless IntelliMouse Explorer\n\t005c  Office Keyboard (106/109)\n\t005f  Wireless MultiMedia Keyboard\n\t0061  Wireless MultiMedia Keyboard (106/109)\n\t0063  Wireless Natural MultiMedia Keyboard\n\t0065  Wireless Natural MultiMedia Keyboard (106/109)\n\t006a  Wireless Optical Mouse (IntelliPoint)\n\t006d  eHome Remote Control Keyboard keys\n\t006e  MN-510 802.11b Wireless Adapter [Intersil ISL3873B]\n\t006f  Smart Display Reference Device\n\t0070  Wireless MultiMedia Keyboard\n\t0071  Wireless MultiMedia Keyboard (106/109)\n\t0072  Wireless Natural MultiMedia Keyboard\n\t0073  Wireless Natural MultiMedia Keyboard (106/109)\n\t0079  IXI Ogo CT-17 handheld device\n\t007a  10/100 USB NIC\n\t007d  Notebook Optical Mouse\n\t007e  Wireless Transceiver for Bluetooth\n\t0080  Digital Media Pro Keyboard\n\t0083  Basic Optical Mouse\n\t0084  Basic Optical Mouse\n\t008a  Wireless Optical Desktop Receiver 2.0A\n\t008b  Dual Receiver Wireless Mouse (IntelliPoint)\n\t008c  Wireless Intellimouse Explorer 2.0\n\t0095  IntelliMouse Explorer 4.0 (IntelliPoint)\n\t009c  Wireless Transceiver for Bluetooth 2.0\n\t009d  Wireless Optical Desktop 3.0\n\t00a0  eHome Infrared Receiver\n\t00a4  Compact Optical Mouse, model 1016\n\t00b0  Digital Media Pro Keyboard\n\t00b4  Digital Media Keyboard 1.0A\n\t00b9  Wireless Optical Mouse 3.0\n\t00bb  Fingerprint Reader\n\t00bc  Fingerprint Reader\n\t00bd  Fingerprint Reader\n\t00c2  MN-710 802.11g Wireless Adapter [Intersil ISL3886]\n\t00c9  MTP Device\n\t00ca  Fingerprint Reader\n\t00cb  Basic Optical Mouse v2.0\n\t00ce  Generic PPC Flash device\n\t00d1  Optical Mouse with Tilt Wheel\n\t00d2  Notebook Optical Mouse with Tilt Wheel\n\t00da  eHome Infrared Receiver\n\t00db  Natural Ergonomic Keyboard 4000 V1.0\n\t00dd  Comfort Curve Keyboard 2000 V1.0\n\t00e1  Wireless Laser Mouse 6000 Receiver\n\t00f4  LifeCam VX-6000 (SN9C20x + OV9650)\n\t00f5  LifeCam VX-3000\n\t00f6  Comfort Optical Mouse 1000\n\t00f7  LifeCam VX-1000\n\t00f8  LifeCam NX-6000\n\t00f9  Wireless Desktop Receiver 3.1\n\t0202  Xbox Controller\n\t0280  Xbox Memory Unit (8MB)\n\t0283  Xbox Communicator\n\t0284  Xbox DVD Playback Kit\n\t0285  Xbox Controller S\n\t0288  Xbox Controller S Hub\n\t0289  Xbox Controller S\n\t028b  Xbox360 DVD Emulator\n\t028d  Xbox360 Memory Unit 64MB\n\t028e  Xbox360 Controller\n\t028f  Xbox360 Wireless Controller via Plug & Charge Cable\n\t0290  Xbox360 Performance Pipe (PIX)\n\t0291  Xbox 360 Wireless Receiver for Windows\n\t0292  Xbox360 Wireless Networking Adapter\n\t029c  Xbox360 HD-DVD Drive\n\t029d  Xbox360 HD-DVD Drive\n\t029e  Xbox360 HD-DVD Memory Unit\n\t02a0  Xbox360 Big Button IR\n\t02a8  Xbox360 Wireless N Networking Adapter [Atheros AR7010+AR9280]\n\t02ad  Xbox NUI Audio\n\t02ae  Xbox NUI Camera\n\t02b0  Xbox NUI Motor\n\t02b6  Xbox360 Bluetooth Wireless Headset\n\t02bb  Kinect Audio\n\t02be  Kinect for Windows NUI Audio\n\t02bf  Kinect for Windows NUI Camera\n\t02c2  Kinect for Windows NUI Motor\n\t02d1  Xbox One Controller\n\t02d5  Xbox One Digital TV Tuner\n\t02dd  Xbox One Controller (Firmware 2015)\n\t02e0  Xbox One Wireless Controller\n\t02e3  Xbox One Elite Controller\n\t02e6  Xbox Wireless Adapter for Windows\n\t02ea  Xbox One Controller\n\t02f3  Xbox One Chatpad\n\t02fd  Xbox One S Controller [Bluetooth]\n\t02fe  Xbox Wireless Adapter for Windows\n\t0306  Surface Pro 7 SD Card Reader\n\t0400  Windows Powered Pocket PC 2002\n\t0401  Windows Powered Pocket PC 2002\n\t0402  Windows Powered Pocket PC 2002\n\t0403  Windows Powered Pocket PC 2002\n\t0404  Windows Powered Pocket PC 2002\n\t0405  Windows Powered Pocket PC 2002\n\t0406  Windows Powered Pocket PC 2002\n\t0407  Windows Powered Pocket PC 2002\n\t0408  Windows Powered Pocket PC 2002\n\t0409  Windows Powered Pocket PC 2002\n\t040a  Windows Powered Pocket PC 2002\n\t040b  Windows Powered Pocket PC 2002\n\t040c  Windows Powered Pocket PC 2002\n\t040d  Windows Powered Pocket PC 2002\n\t040e  Windows Powered Pocket PC 2002\n\t040f  Windows Powered Pocket PC 2002\n\t0410  Windows Powered Pocket PC 2002\n\t0411  Windows Powered Pocket PC 2002\n\t0412  Windows Powered Pocket PC 2002\n\t0413  Windows Powered Pocket PC 2002\n\t0414  Windows Powered Pocket PC 2002\n\t0415  Windows Powered Pocket PC 2002\n\t0416  Windows Powered Pocket PC 2002\n\t0417  Windows Powered Pocket PC 2002\n\t0432  Windows Powered Pocket PC 2003\n\t0433  Windows Powered Pocket PC 2003\n\t0434  Windows Powered Pocket PC 2003\n\t0435  Windows Powered Pocket PC 2003\n\t0436  Windows Powered Pocket PC 2003\n\t0437  Windows Powered Pocket PC 2003\n\t0438  Windows Powered Pocket PC 2003\n\t0439  Windows Powered Pocket PC 2003\n\t043a  Windows Powered Pocket PC 2003\n\t043b  Windows Powered Pocket PC 2003\n\t043c  Windows Powered Pocket PC 2003\n\t043d  Becker Traffic Assist Highspeed 7934\n\t043e  Windows Powered Pocket PC 2003\n\t043f  Windows Powered Pocket PC 2003\n\t0440  Windows Powered Pocket PC 2003\n\t0441  Windows Powered Pocket PC 2003\n\t0442  Windows Powered Pocket PC 2003\n\t0443  Windows Powered Pocket PC 2003\n\t0444  Windows Powered Pocket PC 2003\n\t0445  Windows Powered Pocket PC 2003\n\t0446  Windows Powered Pocket PC 2003\n\t0447  Windows Powered Pocket PC 2003\n\t0448  Windows Powered Pocket PC 2003\n\t0449  Windows Powered Pocket PC 2003\n\t044a  Windows Powered Pocket PC 2003\n\t044b  Windows Powered Pocket PC 2003\n\t044c  Windows Powered Pocket PC 2003\n\t044d  Windows Powered Pocket PC 2003\n\t044e  Windows Powered Pocket PC 2003\n\t044f  Windows Powered Pocket PC 2003\n\t0450  Windows Powered Pocket PC 2003\n\t0451  Windows Powered Pocket PC 2003\n\t0452  Windows Powered Pocket PC 2003\n\t0453  Windows Powered Pocket PC 2003\n\t0454  Windows Powered Pocket PC 2003\n\t0455  Windows Powered Pocket PC 2003\n\t0456  Windows Powered Pocket PC 2003\n\t0457  Windows Powered Pocket PC 2003\n\t0458  Windows Powered Pocket PC 2003\n\t0459  Windows Powered Pocket PC 2003\n\t045a  Windows Powered Pocket PC 2003\n\t045b  Windows Powered Pocket PC 2003\n\t045c  Windows Powered Pocket PC 2003\n\t045d  Windows Powered Pocket PC 2003\n\t045e  Windows Powered Pocket PC 2003\n\t045f  Windows Powered Pocket PC 2003\n\t0460  Windows Powered Pocket PC 2003\n\t0461  Windows Powered Pocket PC 2003\n\t0462  Windows Powered Pocket PC 2003\n\t0463  Windows Powered Pocket PC 2003\n\t0464  Windows Powered Pocket PC 2003\n\t0465  Windows Powered Pocket PC 2003\n\t0466  Windows Powered Pocket PC 2003\n\t0467  Windows Powered Pocket PC 2003\n\t0468  Windows Powered Pocket PC 2003\n\t0469  Windows Powered Pocket PC 2003\n\t046a  Windows Powered Pocket PC 2003\n\t046b  Windows Powered Pocket PC 2003\n\t046c  Windows Powered Pocket PC 2003\n\t046d  Windows Powered Pocket PC 2003\n\t046e  Windows Powered Pocket PC 2003\n\t046f  Windows Powered Pocket PC 2003\n\t0470  Windows Powered Pocket PC 2003\n\t0471  Windows Powered Pocket PC 2003\n\t0472  Windows Powered Pocket PC 2003\n\t0473  Windows Powered Pocket PC 2003\n\t0474  Windows Powered Pocket PC 2003\n\t0475  Windows Powered Pocket PC 2003\n\t0476  Windows Powered Pocket PC 2003\n\t0477  Windows Powered Pocket PC 2003\n\t0478  Windows Powered Pocket PC 2003\n\t0479  Windows Powered Pocket PC 2003\n\t047a  Windows Powered Pocket PC 2003\n\t047b  Windows Powered Pocket PC 2003\n\t04c8  Windows Powered Smartphone 2002\n\t04c9  Windows Powered Smartphone 2002\n\t04ca  Windows Powered Smartphone 2002\n\t04cb  Windows Powered Smartphone 2002\n\t04cc  Windows Powered Smartphone 2002\n\t04cd  Windows Powered Smartphone 2002\n\t04ce  Windows Powered Smartphone 2002\n\t04d7  Windows Powered Smartphone 2003\n\t04d8  Windows Powered Smartphone 2003\n\t04d9  Windows Powered Smartphone 2003\n\t04da  Windows Powered Smartphone 2003\n\t04db  Windows Powered Smartphone 2003\n\t04dc  Windows Powered Smartphone 2003\n\t04dd  Windows Powered Smartphone 2003\n\t04de  Windows Powered Smartphone 2003\n\t04df  Windows Powered Smartphone 2003\n\t04e0  Windows Powered Smartphone 2003\n\t04e1  Windows Powered Smartphone 2003\n\t04e2  Windows Powered Smartphone 2003\n\t04e3  Windows Powered Smartphone 2003\n\t04e4  Windows Powered Smartphone 2003\n\t04e5  Windows Powered Smartphone 2003\n\t04e6  Windows Powered Smartphone 2003\n\t04e7  Windows Powered Smartphone 2003\n\t04e8  Windows Powered Smartphone 2003\n\t04e9  Windows Powered Smartphone 2003\n\t04ea  Windows Powered Smartphone 2003\n\t04ec  Windows Phone (Zune)\n\t063e  Zune HD Media Player\n\t0640  KIN Phone\n\t0641  KIN Phone\n\t0642  KIN Phone\n\t0707  Wireless Laser Mouse 8000\n\t0708  Transceiver v 3.0 for Bluetooth\n\t070a  Charon Bluetooth Dongle (DFU)\n\t070f  LifeChat LX-3000 Headset\n\t0710  Zune Media Player\n\t0713  Wireless Presenter Mouse 8000\n\t0719  Xbox 360 Wireless Adapter\n\t071f  Mouse/Keyboard 2.4GHz Transceiver V2.0\n\t0721  LifeCam NX-3000 (UVC-compliant)\n\t0723  LifeCam VX-7000 (UVC-compliant)\n\t0724  SideWinder Mouse\n\t0728  LifeCam VX-5000\n\t0730  Digital Media Keyboard 3000\n\t0734  Wireless Optical Desktop 700\n\t0736  Sidewinder X5 Mouse\n\t0737  Compact Optical Mouse 500\n\t0745  Nano Transceiver v1.0 for Bluetooth\n\t074a  LifeCam VX-500 [1357]\n\t0750  Wired Keyboard 600\n\t0752  Wired Keyboard 400\n\t075d  LifeCam Cinema\n\t0761  LifeCam VX-2000\n\t0765  Xbox360 Slim Internal Wireless Module (1400) [Marvell 88W8786U]\n\t0766  LifeCam VX-800\n\t0768  Sidewinder X4\n\t076c  Comfort Mouse 4500\n\t076d  LifeCam HD-5000\n\t0770  LifeCam VX-700\n\t0772  LifeCam Studio\n\t0779  LifeCam HD-3000\n\t077f  LifeChat LX-6000 Headset\n\t0780  Comfort Curve Keyboard 3000\n\t0797  Optical Mouse 200\n\t0799  Surface Pro embedded keyboard\n\t07a5  Wireless Receiver 1461C\n\t07b2  2.4GHz Transceiver v8.0 used by mouse Wireless Desktop 900\n\t07b6  Comfort Curve Keyboard 3000\n\t07b9  Wired Keyboard 200\n\t07c6  RTL8153 GigE [Surface Ethernet Adapter]\n\t07ca  Surface Pro 3 Docking Station Audio Device\n\t07cd  Surface Keyboard\n\t07f8  Wired Keyboard 600 (model 1576)\n\t07fd  Nano Transceiver 1.1\n\t0800  Wireless keyboard (All-in-One-Media)\n\t0810  LifeCam HD-3000\n\t0823  Classic IntelliMouse\n\t082a  Pro Intellimouse\n\t0900  Surface Dock Hub\n\t0901  Surface Dock Hub\n\t0902  Surface Dock Hub\n\t0903  Surface Dock Hub\n\t0904  Surface Dock Extender\n\t0905  Surface Dock Audio\n\t090b  Hub\n\t090c  SD Card\n\t091a  Hub\n\t0927  RTL8153B GigE [Surface Ethernet Adapter]\n\t0955  Hub\n\t0957  Hub\n\t097a  Generic Superspeed Hub [Azure Kinect]\n\t097b  Generic Hub [Azure Kinect]\n\t097c  Azure Kinect Depth Camera\n\t097d  Azure Kinect 4K Camera\n\t097e  Azure Kinect Microphone Array\n\t09a0  RTL8153B GigE [Surface Ethernet Adapter]\n\t09c0  Surface Type Cover\n\t0a00  Lumia 950 (RM-1104/RM-1118)\n\t0b00  Xbox Elite Series 2 Controller (model 1797)\n\t0b12  Xbox Controller\n\t930a  ISOUSB.SYS Intel 82930 Isochronous IO Test Board\n\tffca  Catalina\n\tfff8  Keyboard\n\tffff  Windows CE Mass Storage\n0460  Ace Cad Enterprise Co., Ltd\n\t0004  Tablet (5x3.75)\n\t0006  LCD Tablet (12x9)\n\t0008  Tablet (3x2.25)\n0461  Primax Electronics, Ltd\n\t0010  HP PR1101U / Primax PMX-KPR1101U Keyboard\n\t0300  G2-300 Scanner\n\t0301  G2E-300 Scanner\n\t0302  G2-300 #2 Scanner\n\t0303  G2E-300 #2 Scanner\n\t0340  Colorado 9600 Scanner\n\t0341  Colorado 600u Scanner\n\t0345  Visioneer 6200 Scanner\n\t0346  Memorex Maxx 6136u Scanner\n\t0347  Primascan Colorado 2600u/Visioneer 4400 Scanner\n\t0360  Colorado 19200 Scanner\n\t0361  Colorado 1200u Scanner\n\t0363  VistaScan Astra 3600(ENG)\n\t0364  LG Electronics Scanworks 600U Scanner\n\t0365  VistaScan Astra 3600(ENG)\n\t0366  6400\n\t0367  VistaScan Astra 3600(ENG)\n\t0371  Visioneer Onetouch 8920 Scanner\n\t0374  UMAX Astra 2500\n\t0375  VistaScan Astra 3600(ENG)\n\t0377  Medion MD 5345 Scanner\n\t0378  VistaScan Astra 3600(ENG)\n\t037b  Medion MD 6190 Scanner\n\t037c  VistaScan Astra 3600(ENG)\n\t0380  G2-600 Scanner\n\t0381  ReadyScan 636i Scanner\n\t0382  G2-600 #2 Scanner\n\t0383  G2E-600 Scanner\n\t038a  UMAX Astra 3000/3600\n\t038b  Xerox 2400 Onetouch\n\t038c  UMAX Astra 4100\n\t0392  Medion/Lifetec/Tevion/Cytron MD 6190\n\t03a8  9420M\n\t0813  IBM UltraPort Camera\n\t0815  Micro Innovations IC200 Webcam\n\t0819  Fujifilm IX-30 Camera [webcam mode]\n\t081a  Fujifilm IX-30 Camera [storage mode]\n\t081c  Elitegroup ECS-C11 Camera\n\t081d  Elitegroup ECS-C11 Storage\n\t0a00  Micro Innovations Web Cam 320\n\t4d01  Comfort Keyboard / Kensington Orbit Elite\n\t4d02  Mouse-in-a-Box\n\t4d03  Kensington Mouse-in-a-box\n\t4d04  Mouse\n\t4d06  Balless Mouse (HID)\n\t4d0f  HP Optical Mouse\n\t4d15  Dell Optical Mouse\n\t4d17  Optical Mouse\n\t4d20  HP Optical Mouse\n\t4d2a  PoPo Elixir Mouse (HID)\n\t4d2b  Wireless Laser Mini Mouse (HID)\n\t4d2c  PoPo Mini Pointer Mouse (HID)\n\t4d2e  Optical Mobile Mouse (HID)\n\t4d51  0Y357C PMX-MMOCZUL (B) [Dell Laser Mouse]\n\t4d62  HP Laser Mobile Mini Mouse\n\t4d64  Asus wired optical mouse - Model MOEWUO\n\t4d75  Rocketfish RF-FLBTAD Bluetooth Adapter\n\t4d81  Dell N889 Optical Mouse\n\t4d8a  HP Multimedia Keyboard\n\t4d91  Laser mouse M-D16DL\n\t4d92  Optical mouse M-D17DR\n\t4db1  Dell Laptop Integrated Webcam 2Mpix\n\t4de3  HP 5-Button Optical Comfort Mouse\n\t4de7  webcam\n\t4e04  Lenovo Keyboard KB1021\n\t4e22  Dell Mouse, 2 Buttons, Modell: MS111-P\n\t4e26  Asus wired keyboard - model KB73211\n\t4e6f  Acer Wired Keyboard Model KBAY211\n\t4e72  Acer Wired Keyboard Model KBAY211\n0463  MGE UPS Systems\n\t0001  UPS\n\tffff  UPS\n0464  AMP/Tycoelectronics Corp.\n0467  AT&T Paradyne\n0468  Wieson Technologies Co., Ltd\n046a  CHERRY\n\t0001  Keyboard\n\t0003  My3000 Hub\n\t0004  CyBoard Keyboard\n\t0005  XX33 SmartCard Reader Keyboard\n\t0008  Wireless Keyboard and Mouse\n\t0010  SmartBoard XX44\n\t0011  G83 (RS 6000) Keyboard\n\t0021  CyMotion Expert Combo\n\t0023  Keyboard\n\t0027  CyMotion Master Solar Keyboard\n\t002a  Wireless Mouse & Keyboard\n\t002d  SmartTerminal XX44\n\t003c  Raptor Gaming Keyboard\n\t003d  Raptor Gaming Keyboard Integrated Hub\n\t003e  SmartTerminal ST-2xxx\n\t0041  G86 6240 Keyboard\n\t0076  MX-Board 3.0 G80-3850\n\t0077  MX BOARD 3.0S FL NBL Keyboard\n\t0079  MX BOARD 3.0S FL RGB Keyboard\n\t0080  eHealth Terminal ST 1503\n\t0081  eHealth Keyboard G87 1504\n\t0083  MX BOARD 3.0S FL RGB (KOREAN) Keyboard\n\t0084  eHealth Terminal ST1506\n\t0085  eHealth PIN-Pad PP1516\n\t00a1  SmartCard Reader Keyboard KC 1000 SC\n\t00ab  MX 1.0 FL BL Keyboard\n\t00ac  MX BOARD 1.0 TKL RGB Keyboard\n\t00b7  MX BOARD 8.0 TKL RGB Keyboard\n\t00bb  MX BOARD 10.0 FL RGB Keyboard\n\t00c3  G80 3000 TKL NBL Keyboard\n\t00c4  MX BOARD 2.0S FL RGB Keyboard\n\t00c5  G80 3000 TKL RGB Keyboard\n\t00c7  MV BOARD 3.0 FL RGB\n\t00c9  CCF MX 8.0 TKL BL Keyboard\n\t00ca  CCF MX 1.0 TKL BL Keyboard\n\t00cb  CCF MX 1.0 TKL NBL Keyboard\n\t00cd  G80 3000 TKL NBL (KOREAN) Keyboard\n\t00ce  MX BOARD 2.0S FL NBL Keyboard\n\t00d2  MX 1.0 FL NBL Keyboard\n\t00d3  MX 1.0 FL RGB Keyboard\n\t00dd  G80-3000N RGB TKL Keyboard\n\t00de  G80-3000N FL RGB Keyboard\n\t00df  MX BOARD 10.0N FL RGB Keyboard\n\t0106  R-300 Wireless Mouse Receiver\n\t010d  MX-Board 3.0 Keyboard\n\t0113  KC 6000 Slim Keyboard\n\t0180  Strait 3.0\n\t01a4  MC 2.1 Mouse\n\t01a6  MX BOARD 2.0S FL RGB DE Keyboard\n\t0201  Smart Board 1150\n\t0202  Smart Terminal 1150\n\tb090  Keyboard\n\tb091  Mouse\n\tc099  Stream Keyboard TKL\n\tc110  KC 4500 Ergo Keyboard\n046b  American Megatrends, Inc.\n\t0001  Keyboard\n\t0101  PS/2 Keyboard, Mouse & Joystick Ports\n\t0301  USB 1.0 Hub\n\t0500  Serial & Parallel Ports\n\tff10  Virtual Keyboard and Mouse\n\tff20  Virtual CDROM\n046c  Toshiba Corp., Digital Media Equipment\n046d  Logitech, Inc.\n\t0082  Acer Aspire 5672 Webcam\n\t0200  WingMan Extreme Joystick\n\t0203  M2452 Keyboard\n\t0242  Chillstream for Xbox 360\n\t0301  M4848 Mouse\n\t0401  HP PageScan\n\t0402  NEC PageScan\n\t040f  Logitech/Storm PageScan\n\t0430  Mic (Cordless)\n\t0801  QuickCam Home\n\t0802  Webcam C200\n\t0804  Webcam C250\n\t0805  Webcam C300\n\t0807  Webcam B500\n\t0808  Webcam C600\n\t0809  Webcam Pro 9000\n\t080a  Portable Webcam C905\n\t080f  Webcam C120\n\t0810  QuickCam Pro\n\t0819  Webcam C210\n\t081a  Webcam C260\n\t081b  Webcam C310\n\t081d  HD Webcam C510\n\t0820  QuickCam VC\n\t0821  HD Webcam C910\n\t0823  HD Webcam B910\n\t0825  Webcam C270\n\t0826  HD Webcam C525\n\t0828  HD Webcam B990\n\t082b  Webcam C170\n\t082c  HD Webcam C615\n\t082d  HD Pro Webcam C920\n\t0830  QuickClip\n\t0836  B525 HD Webcam\n\t0837  BCC950 ConferenceCam\n\t0838  BCC950 ConferenceCam audio\n\t0839  BCC950 ConferenceCam integated hub\n\t0840  QuickCam Express\n\t0843  Webcam C930e\n\t0845  ConferenceCam CC3000e Camera\n\t0846  ConferenceCam CC3000e Speakerphone\n\t084b  ConferenceCam Connect Video\n\t084c  ConferenceCam Connect Audio\n\t084e  ConferenceCam Connect\n\t0850  QuickCam Web\n\t0857  Logi Group Speakerphone\n\t085c  C922 Pro Stream Webcam\n\t085e  BRIO Ultra HD Webcam\n\t086b  BRIO 4K Stream Edition\n\t0870  QuickCam Express\n\t0882  Logi Group Speakerphone\n\t0890  QuickCam Traveler\n\t0892  C920 HD Pro Webcam\n\t0893  StreamCam\n\t0894  CrystalCam\n\t0895  QuickCam for Dell Notebooks\n\t0896  OrbiCam\n\t0897  QuickCam for Dell Notebooks\n\t0899  QuickCam for Dell Notebooks\n\t089d  QuickCam E2500 series\n\t08a0  QuickCam IM\n\t08a1  QuickCam IM with sound\n\t08a2  Labtec Webcam Pro\n\t08a3  QuickCam QuickCam Chat\n\t08a6  QuickCam IM\n\t08a7  QuickCam Image\n\t08a9  Notebook Deluxe\n\t08aa  Labtec Notebooks\n\t08ac  QuickCam Cool\n\t08ad  QuickCam Communicate STX\n\t08ae  QuickCam for Notebooks\n\t08af  QuickCam Easy/Cool\n\t08b0  QuickCam 3000 Pro [pwc]\n\t08b1  QuickCam Notebook Pro\n\t08b2  QuickCam Pro 4000\n\t08b3  QuickCam Zoom\n\t08b4  QuickCam Zoom\n\t08b5  QuickCam Sphere\n\t08b9  QuickCam IM\n\t08bd  Microphone (Pro 4000)\n\t08c0  QuickCam Pro 3000\n\t08c1  QuickCam Fusion\n\t08c2  QuickCam PTZ\n\t08c3  Camera (Notebooks Pro)\n\t08c5  QuickCam Pro 5000\n\t08c6  QuickCam for DELL Notebooks\n\t08c7  QuickCam OEM Cisco VT Camera II\n\t08c9  QuickCam Ultra Vision\n\t08ca  Mic (Fusion)\n\t08cb  Mic (Notebooks Pro)\n\t08cc  Mic (PTZ)\n\t08ce  QuickCam Pro 5000\n\t08cf  QuickCam UpdateMe\n\t08d0  QuickCam Express\n\t08d7  QuickCam Communicate STX\n\t08d8  QuickCam for Notebook Deluxe\n\t08d9  QuickCam IM/Connect\n\t08da  QuickCam Messenger\n\t08dd  QuickCam for Notebooks\n\t08e0  QuickCam Express\n\t08e1  Labtec Webcam\n\t08e4  C505e HD Webcam\n\t08e5  C920 PRO HD Webcam\n\t08f0  QuickCam Messenger\n\t08f1  QuickCam Express\n\t08f2  Microphone (Messenger)\n\t08f3  QuickCam Express\n\t08f4  Labtec Webcam\n\t08f5  QuickCam Messenger Communicate\n\t08f6  QuickCam Messenger Plus\n\t0900  ClickSmart 310\n\t0901  ClickSmart 510\n\t0903  ClickSmart 820\n\t0905  ClickSmart 820\n\t0910  QuickCam Cordless\n\t0920  QuickCam Express\n\t0921  Labtec Webcam\n\t0922  QuickCam Live\n\t0928  QuickCam Express\n\t0929  Labtec Webcam Pro\n\t092a  QuickCam for Notebooks\n\t092b  Labtec Webcam Plus\n\t092c  QuickCam Chat\n\t092d  QuickCam Express / Go\n\t092e  QuickCam Chat\n\t092f  QuickCam Express Plus\n\t0950  Pocket Camera\n\t0960  ClickSmart 420\n\t0970  Pocket750\n\t0990  QuickCam Pro 9000\n\t0991  QuickCam Pro for Notebooks\n\t0992  QuickCam Communicate Deluxe\n\t0994  QuickCam Orbit/Sphere AF\n\t09a1  QuickCam Communicate MP/S5500\n\t09a2  QuickCam Communicate Deluxe/S7500\n\t09a4  QuickCam E 3500\n\t09a5  Quickcam 3000 For Business\n\t09a6  QuickCam Vision Pro\n\t09b0  Acer OrbiCam\n\t09b2  Fujitsu Webcam\n\t09c0  QuickCam for Dell Notebooks Mic\n\t09c1  QuickCam Deluxe for Notebooks\n\t0a01  USB Headset\n\t0a02  Premium Stereo USB Headset 350\n\t0a03  Logitech USB Microphone\n\t0a04  V20 portable speakers (USB powered)\n\t0a07  Z-10 Speakers\n\t0a0b  ClearChat Pro USB\n\t0a0c  Clear Chat Comfort USB Headset\n\t0a10  V10 Notebook Speakers\n\t0a13  Z-5 Speakers\n\t0a14  USB Headset\n\t0a15  G35 Headset\n\t0a17  G330 Headset\n\t0a1f  G930\n\t0a23  Laptop Speaker Z305\n\t0a29  H600 [Wireless Headset]\n\t0a37  USB Headset H540\n\t0a38  Headset H340\n\t0a44  Headset H390\n\t0a45  960 Headset\n\t0a4d  G430 Surround Sound Gaming Headset\n\t0a4f  MINI BOOM\n\t0a5b  G933 Wireless Headset Dongle\n\t0a5d  G933 Headset Battery Charger\n\t0a66  [G533 Wireless Headset Dongle]\n\t0a8f  H390 headset with microphone\n\t0a90  Zone Receiver\n\t0aaa  Logitech G PRO X Gaming Headset\n\t0ac4  G535 Wireless Gaming Headset\n\t0b02  C-UV35 [Bluetooth Mini-Receiver] (HID proxy mode)\n\t8801  Video Camera\n\tb014  Bluetooth Mouse M336/M337/M535\n\tb305  BT Mini-Receiver\n\tbfe4  Premium Optical Wheel Mouse\n\tc000  N43 [Pilot Mouse]\n\tc001  N48/M-BB48/M-UK96A [FirstMouse Plus]\n\tc002  M-BA47 [MouseMan Plus]\n\tc003  MouseMan\n\tc004  WingMan Gaming Mouse\n\tc005  WingMan Gaming Wheel Mouse\n\tc00b  MouseMan Wheel\n\tc00c  Optical Wheel Mouse\n\tc00d  MouseMan Wheel+\n\tc00e  M-BJ58/M-BJ69 Optical Wheel Mouse\n\tc00f  MouseMan Traveler/Mobile\n\tc011  Optical MouseMan\n\tc012  Mouseman Dual Optical\n\tc014  Corded Workstation Mouse\n\tc015  Corded Workstation Mouse\n\tc016  Optical Wheel Mouse\n\tc018  Optical Wheel Mouse\n\tc019  Optical Tilt Wheel Mouse\n\tc01a  M-BQ85 Optical Wheel Mouse\n\tc01b  MX310 Optical Mouse\n\tc01c  Optical Mouse\n\tc01d  MX510 Optical Mouse\n\tc01e  MX518 Optical Mouse\n\tc024  MX300 Optical Mouse\n\tc025  MX500 Optical Mouse\n\tc030  iFeel Mouse\n\tc031  iFeel Mouse+\n\tc032  MouseMan iFeel\n\tc033  iFeel MouseMan+\n\tc034  MouseMan Optical\n\tc035  Mouse\n\tc036  Mouse\n\tc037  Mouse\n\tc038  Mouse\n\tc03d  M-BT96a Pilot Optical Mouse\n\tc03e  Premium Optical Wheel Mouse (M-BT58)\n\tc03f  M-BT85 [UltraX Optical Mouse]\n\tc040  Corded Tilt-Wheel Mouse\n\tc041  G5 Laser Mouse\n\tc042  G3 Laser Mouse\n\tc043  MX320/MX400 Laser Mouse\n\tc044  LX3 Optical Mouse\n\tc045  Optical Mouse\n\tc046  RX1000 Laser Mouse\n\tc047  Laser Mouse M-UAL120\n\tc048  G9 Laser Mouse\n\tc049  G5 Laser Mouse\n\tc050  RX 250 Optical Mouse\n\tc051  G3 (MX518) Optical Mouse\n\tc053  Laser Mouse\n\tc054  Bluetooth mini-receiver\n\tc058  M115 Mouse\n\tc05a  M90/M100 Optical Mouse\n\tc05b  M-U0004 810-001317 [B110 Optical USB Mouse]\n\tc05d  Optical Mouse\n\tc05f  M115 Optical Mouse\n\tc061  RX1500 Laser Mouse\n\tc062  M-UAS144 [LS1 Laser Mouse]\n\tc063  DELL Laser Mouse\n\tc064  M110 corded optical mouse (M-B0001)\n\tc066  G9x Laser Mouse\n\tc068  G500 Laser Mouse\n\tc069  M-U0007 [Corded Mouse M500]\n\tc06a  USB Optical Mouse\n\tc06b  G700 Wireless Gaming Mouse\n\tc06c  Optical Mouse\n\tc077  Mouse\n\tc07c  M-R0017 [G700s Rechargeable Gaming Mouse]\n\tc07d  G502 Mouse\n\tc07e  G402 Gaming Mouse\n\tc080  G303 Gaming Mouse\n\tc083  G403 Prodigy Gaming Mouse\n\tc084  G203 Gaming Mouse\n\tc088  G Pro Wireless gaming mouse (wired mode)\n\tc08b  G502 SE HERO Gaming Mouse\n\tc08e  G MX518 Gaming Mouse (MU0053)\n\tc092  G102/G203 LIGHTSYNC Gaming Mouse\n\tc093  M500s Optical Mouse\n\tc09d  G102 LIGHTSYNC Gaming Mouse\n\tc101  UltraX Media Remote\n\tc110  Harmony 785/880/885 Remote\n\tc111  Harmony 525 Remote\n\tc112  Harmony 890 Remote\n\tc11f  Harmony 900/1100 Remote\n\tc121  Harmony One Remote\n\tc122  Harmony 650/700 Remote\n\tc124  Harmony 300/350 Remote\n\tc125  Harmony 200 Remote\n\tc126  Harmony Link\n\tc129  Harmony Hub\n\tc12b  Harmony Touch/Ultimate Remote\n\tc201  WingMan Extreme Joystick with Throttle\n\tc202  WingMan Formula\n\tc207  WingMan Extreme Digital 3D\n\tc208  WingMan Gamepad Extreme\n\tc209  WingMan Gamepad\n\tc20a  WingMan RumblePad\n\tc20b  WingMan Action Pad\n\tc20c  WingMan Precision\n\tc20d  WingMan Attack 2\n\tc20e  WingMan Formula GP\n\tc211  iTouch Cordless Receiver\n\tc212  WingMan Extreme Digital 3D\n\tc213  J-UH16 (Freedom 2.4 Cordless Joystick)\n\tc214  ATK3 (Attack III Joystick)\n\tc215  Extreme 3D Pro\n\tc216  F310 Gamepad [DirectInput Mode]\n\tc218  F510 Gamepad [DirectInput Mode]\n\tc219  F710 Gamepad [DirectInput Mode]\n\tc21a  Precision Gamepad\n\tc21c  G13 Advanced Gameboard\n\tc21d  F310 Gamepad [XInput Mode]\n\tc21e  F510 Gamepad [XInput Mode]\n\tc21f  F710 Wireless Gamepad [XInput Mode]\n\tc221  G11/G15 Keyboard / Keyboard\n\tc222  G15 Keyboard / LCD\n\tc223  G11/G15 Keyboard / USB Hub\n\tc225  G11/G15 Keyboard / G keys\n\tc226  G15 Refresh Keyboard\n\tc227  G15 Refresh Keyboard\n\tc228  G19 Gaming Keyboard\n\tc229  G19 Gaming Keyboard Macro Interface\n\tc22a  Gaming Keyboard G110\n\tc22b  Gaming Keyboard G110 G-keys\n\tc22d  G510 Gaming Keyboard\n\tc22e  G510 Gaming Keyboard onboard audio\n\tc231  G13 Virtual Mouse\n\tc232  Gaming Virtual Keyboard\n\tc245  G400 Optical Mouse\n\tc246  Gaming Mouse G300\n\tc247  G100S Optical Gaming Mouse\n\tc248  G105 Gaming Keyboard\n\tc24a  G600 Gaming Mouse\n\tc24c  G400s Optical Mouse\n\tc24d  G710 Gaming Keyboard\n\tc24e  G500s Laser Gaming Mouse\n\tc24f  G29 Driving Force Racing Wheel [PS3]\n\tc251  GamePanel for Dell XPS M1730\n\tc260  G29 Driving Force Racing Wheel [PS4]\n\tc262  G920 Driving Force Racing Wheel\n\tc281  WingMan Force\n\tc283  WingMan Force 3D\n\tc285  WingMan Strike Force 3D\n\tc286  Force 3D Pro\n\tc287  Flight System G940\n\tc291  WingMan Formula Force\n\tc293  WingMan Formula Force GP\n\tc294  Driving Force\n\tc295  Momo Force Steering Wheel\n\tc298  Driving Force Pro\n\tc299  G25 Racing Wheel\n\tc29a  Driving Force GT\n\tc29b  G27 Racing Wheel\n\tc29c  Speed Force Wireless Wheel for Wii\n\tc2a0  Wingman Force Feedback Mouse\n\tc2a1  WingMan Force Feedback Mouse\n\tc2ab  G13 Joystick\n\tc301  iTouch Keyboard\n\tc302  iTouch Pro Keyboard\n\tc303  iTouch Keyboard\n\tc305  Internet Keyboard\n\tc307  Internet Keyboard\n\tc308  Internet Navigator Keyboard\n\tc309  Y-BF37 [Internet Navigator Keyboard]\n\tc30a  iTouch Composite\n\tc30b  NetPlay Keyboard\n\tc30c  Internet Keys (X)\n\tc30d  Internet Keys\n\tc30e  UltraX Keyboard (Y-BL49)\n\tc30f  Logicool HID-Compliant Keyboard (106 key)\n\tc311  Y-UF49 [Internet Pro Keyboard]\n\tc312  DeLuxe 250 Keyboard\n\tc313  Internet 350 Keyboard\n\tc315  Classic Keyboard 200\n\tc316  HID-Compliant Keyboard\n\tc317  Wave Corded Keyboard\n\tc318  Illuminated Keyboard\n\tc31a  Comfort Wave 450\n\tc31b  Compact Keyboard K300\n\tc31c  Keyboard K120\n\tc31d  Media Keyboard K200\n\tc31f  Comfort Keyboard K290\n\tc326  Washable Keyboard K310\n\tc328  Corded Keyboard K280e\n\tc32b  G910 Orion Spark Mechanical Keyboard\n\tc332  G502 Proteus Spectrum Optical Mouse\n\tc335  G910 Orion Spectrum Mechanical Keyboard\n\tc336  G213 Prodigy Gaming Keyboard\n\tc33a  G413 Gaming Keyboard\n\tc33e  G915 Mechanical Keyboard\n\tc33f  G815 Mechanical Keyboard\n\tc401  TrackMan Marble Wheel\n\tc402  Marble Mouse (2-button)\n\tc403  Turbo TrackMan Marble FX\n\tc404  TrackMan Wheel\n\tc408  Marble Mouse (4-button)\n\tc501  Cordless Mouse Receiver\n\tc502  Cordless Mouse & iTouch Keys\n\tc503  Cordless Mouse+Keyboard Receiver\n\tc504  Cordless Mouse+Keyboard Receiver\n\tc505  Cordless Mouse+Keyboard Receiver\n\tc506  MX700 Cordless Mouse Receiver\n\tc508  Cordless Trackball\n\tc509  Cordless Keyboard & Mouse\n\tc50a  Cordless Mouse\n\tc50b  Cordless Desktop Optical\n\tc50c  Cordless Desktop S510\n\tc50d  Cordless Mouse\n\tc50e  Cordless Mouse Receiver\n\tc510  Cordless Mouse\n\tc512  LX-700 Cordless Desktop Receiver\n\tc513  MX3000 Cordless Desktop Receiver\n\tc514  Cordless Mouse\n\tc515  Cordless 2.4 GHz Presenter Presentation remote control\n\tc517  LX710 Cordless Desktop Laser\n\tc518  MX610 Laser Cordless Mouse\n\tc51a  MX Revolution/G7 Cordless Mouse\n\tc51b  V220 Cordless Optical Mouse for Notebooks\n\tc521  Cordless Mouse Receiver\n\tc525  MX Revolution Cordless Mouse\n\tc526  Nano Receiver\n\tc529  Logitech Keyboard + Mice\n\tc52b  Unifying Receiver\n\tc52d  R700 Remote Presenter receiver\n\tc52e  MK260 Wireless Combo Receiver\n\tc52f  Nano Receiver\n\tc531  C-U0007 [Unifying Receiver]\n\tc532  Unifying Receiver\n\tc534  Nano Receiver\n\tc537  Cordless Mouse Receiver\n\tc539  Lightspeed Receiver\n\tc53a  PowerPlay Wireless Charging System\n\tc53d  G631 Keyboard\n\tc542  M185 compact wireless mouse\n\tc548  Logi Bolt Receiver\n\tc603  3Dconnexion Spacemouse Plus XT\n\tc605  3Dconnexion CADman\n\tc606  3Dconnexion Spacemouse Classic\n\tc621  3Dconnexion Spaceball 5000\n\tc623  3Dconnexion Space Traveller 3D Mouse\n\tc625  3Dconnexion Space Pilot 3D Mouse\n\tc626  3Dconnexion Space Navigator 3D Mouse\n\tc627  3Dconnexion Space Explorer 3D Mouse\n\tc628  3Dconnexion Space Navigator for Notebooks\n\tc629  3Dconnexion SpacePilot Pro 3D Mouse\n\tc62b  3Dconnexion Space Mouse Pro\n\tc640  NuLOOQ navigator\n\tc702  Cordless Presenter\n\tc703  Elite Keyboard Y-RP20 + Mouse MX900 (Bluetooth)\n\tc704  diNovo Wireless Desktop\n\tc705  MX900 Bluetooth Wireless Hub (C-UJ16A)\n\tc707  Bluetooth wireless hub\n\tc708  Bluetooth wireless hub\n\tc709  BT Mini-Receiver (HCI mode)\n\tc70a  MX5000 Cordless Desktop\n\tc70b  BT Mini-Receiver (HID proxy mode)\n\tc70c  BT Mini-Receiver (HID proxy mode)\n\tc70d  Bluetooth wireless hub\n\tc70e  MX1000 Bluetooth Laser Mouse\n\tc70f  Bluetooth wireless hub\n\tc712  Bluetooth wireless hub\n\tc714  diNovo Edge Keyboard\n\tc715  Bluetooth wireless hub\n\tc71a  Bluetooth wireless hub\n\tc71d  Bluetooth wireless hub\n\tc71f  diNovo Mini Wireless Keyboard\n\tc720  Bluetooth wireless hub\n\tca03  MOMO Racing\n\tca04  Formula Vibration Feedback Wheel\n\tca84  Cordless Controller for Xbox\n\tca88  Thunderpad for Xbox\n\tca8a  Precision Vibration Feedback Wheel for Xbox\n\tcaa3  DriveFX Racing Wheel\n\tcab1  Cordless Keyboard for Wii HID Receiver\n\td001  QuickCam Pro\n\tf301  Controller\n046e  Behavior Tech. Computer Corp.\n\t0100  Keyboard\n\t3001  Mass Storage Device\n\t3002  Mass Storage Device\n\t3003  Mass Storage Device\n\t3005  Mass Storage Device\n\t3008  Mass Storage Device\n\t5250  KeyMaestro Multimedia Keyboard\n\t5273  KeyMaestro Multimedia Keyboard\n\t52e6  Cordless Mouse\n\t5308  KeyMaestro Keyboard\n\t5408  KeyMaestro Multimedia Keyboard/Hub\n\t5500  Portable Keyboard 86+9 keys (Model 6100C US)\n\t5550  5 button optical mouse model M873U\n\t5720  Smart Card Reader\n\t6782  BTC 7932 mouse+keyboard\n046f  Crystal Semiconductor\n0471  Philips (or NXP)\n\t0101  DSS350 Digital Speaker System\n\t0104  DSS330 Digital Speaker System [uda1321]\n\t0105  UDA1321\n\t014f  GoGear SA9200\n\t0160  MP3 Player\n\t0161  MP3 Player\n\t0163  GoGear SA1100\n\t0164  GoGear SA1110/02\n\t0165  GoGear SA1330\n\t0201  Hub\n\t0222  Creative Nomad Jukebox\n\t0302  PCA645VC Webcam [pwc]\n\t0303  PCA646VC Webcam [pwc]\n\t0304  Askey VC010 Webcam [pwc]\n\t0307  PCVC675K Webcam [pwc]\n\t0308  PCVC680K Webcam [pwc]\n\t030b  PC VGA Camera (Vesta Fun)\n\t030c  PCVC690K Webcam [pwc]\n\t0310  PCVC730K Webcam [pwc]\n\t0311  PCVC740K ToUcam Pro [pwc]\n\t0312  PCVC750K Webcam [pwc]\n\t0314  DMVC 1000K\n\t0316  DMVC 2000K Video Capture\n\t0321  FunCam\n\t0322  DMVC1300K PC Camera\n\t0325  SPC 200NC PC Camera\n\t0326  SPC 300NC PC Camera\n\t0327  Webcam SPC 6000 NC (Webcam w/ mic)\n\t0328  SPC 700NC PC Camera\n\t0329  SPC 900NC PC Camera / ORITE CCD Webcam(PC370R)\n\t032d  SPC 210NC PC Camera\n\t032e  SPC 315NC PC Camera\n\t0330  SPC 710NC PC Camera\n\t0331  SPC 1300NC PC Camera\n\t0332  SPC 1000NC PC Camera\n\t0333  SPC 620NC PC Camera\n\t0334  SPC 520/525NC PC Camera\n\t0401  Semiconductors CICT Keyboard\n\t0402  PS/2 Mouse on Semiconductors CICT Keyboard\n\t0406  15 inch Detachable Monitor\n\t0407  10 inch Mobile Monitor\n\t0408  SG3WA1/74 802.11b WLAN Adapter [Atmel AT76C503A]\n\t0471  Digital Speaker System\n\t0601  OVU1020 IR Dongle (Kbd+Mouse)\n\t0602  ATI Remote Wonder II Input Device\n\t0603  ATI Remote Wonder II Controller\n\t0608  eHome Infrared Receiver\n\t060a  TSU9600 Remote Control\n\t060c  Consumer Infrared Transceiver (HP)\n\t060d  Consumer Infrared Transceiver (SRM5100)\n\t060e  RF Dongle\n\t060f  Consumer Infrared Transceiver\n\t0613  Infrared Transceiver\n\t0617  IEEE802.15.4 RF Dongle\n\t0619  TSU9400 Remote Control\n\t0666  Hantek DDS-3005 Arbitrary Waveform Generator\n\t0700  Semiconductors CICT Hub\n\t0701  150P1 TFT Display\n\t0809  AVNET Bluetooth Device\n\t0811  JR24 CDRW\n\t0814  DCCX38/P data cable\n\t0815  eHome Infrared Receiver\n\t0844  SA2111/02 1GB Flash Audio Player\n\t084a  GoGear SA3125\n\t084e  GoGear SA60xx (mtp)\n\t0888  Hantek DDS-3005 Arbitrary Waveform Generator\n\t1103  Digital Speaker System\n\t1120  Creative Rhomba MP3 player\n\t1125  Nike psa[128max Player\n\t1137  HDD065 MP3 player\n\t1201  Arima Bluetooth Device\n\t1230  Wireless Adapter 11g\n\t1232  SNU6500 Wireless Adapter\n\t1233  Wireless Adapter Bootloader Download\n\t1236  SNU5600 802.11bg\n\t1237  TalkTalk SNU5630NS/05 802.11bg\n\t1552  ISP 1581 Hi-Speed USB MPEG2 Encoder Reference Kit\n\t1801  Diva MP3 player\n\t200a  Wireless Network Adapter\n\t200f  802.11n Wireless Adapter\n\t2021  SDE3273FC/97 2.5\" SATA HDD Enclosure [INIC-1608L]\n\t2022  GoGear SA52XX\n\t2034  Webcam SPC530NC\n\t2036  Webcam SPC1030NC\n\t203f  TSU9200 Remote Control\n\t2046  TSU9800 Remote Control\n\t204e  GoGear RaGa (SA1942/02)\n\t205e  TSU9300 Remote Control\n\t206c  MCE IR Receiver - Spinel plusf0r ASUS\n\t2070  GoGear Mix\n\t2076  GoGear Aria\n\t2079  GoGear Opus\n\t2088  MCE IR Receiver with ALS- Spinel plus for ASUS\n\t209e  PTA01 Wireless Adapter\n\t20b6  GoGear Vibe\n\t20d0  SPZ2000 Webcam [PixArt PAC7332]\n\t20e3  GoGear Raga\n\t20e4  GoGear ViBE 8GB\n\t2160  Mio LINK Heart Rate Monitor\n\t21e0  GoGEAR Raga\n\t262c  SPC230NC Webcam\n\t2721  PTA 317 TV Camera\n\t485d  Senselock SenseIV v2.x\n\tdf55  LPCXpresso LPC-Link\n0472  Chicony Electronics Co., Ltd\n\t0065  PFU-65 Keyboard [Chicony]\n\tb086  Asus USB2.0 Webcam\n\tb091  Webcam\n0473  Sanyo Information Business Co., Ltd\n0474  Sanyo Electric Co., Ltd\n\t0110  Digital Voice Recorder R200\n\t0217  Xacti J2\n\t022f  C5 Digital Media Camera (mass storage mode)\n\t0230  C5 Digital Media Camera (PictBridge mode)\n\t0231  C5 Digital Media Camera (PC control mode)\n\t0401  Optical Drive\n\t0701  SCP-4900 Cellphone\n\t071f  Usb Com Port Enumerator\n\t0722  W33SA Camera\n0475  Relisys/Teco Information System\n\t0100  NEC Petiscan\n\t0103  Eclipse 1200U/Episode\n\t0210  Scorpio Ultra 3\n0476  AESP\n0477  Seagate Technology, Inc.\n0478  Connectix Corp.\n\t0001  QuickCam\n\t0002  QuickClip\n\t0003  QuickCam Pro\n0479  Advanced Peripheral Laboratories\n047a  Semtech Corp.\n\t0004  ScreenCoder UR7HCTS2-USB\n047b  Silitek Corp.\n\t0001  Keyboard\n\t0002  Keyboard and Mouse\n\t0011  SK-1688U Keyboard\n\t00f9  SK-1789u Keyboard\n\t0101  BlueTooth Keyboard and Mouse\n\t020b  SK-3105 SmartCard Reader\n\t050e  Internet Compact Keyboard\n\t1000  Trust Office Scan USB 19200\n\t1002  HP ScanJet 4300c Parallel Port\n047c  Dell Computer Corp.\n\tffff  UPS Tower 500W LV\n047d  Kensington\n\t00f2  VeriMark Desktop\n\t1001  Mouse*in*a*Box\n\t1002  Expert Mouse Pro\n\t1003  Orbit TrackBall\n\t1004  MouseWorks\n\t1005  TurboBall\n\t1006  TurboRing\n\t1009  Orbit TrackBall for Mac\n\t1012  PocketMouse\n\t1013  Mouse*in*a*Box Optical Pro\n\t1014  Expert Mouse Pro Wireless\n\t1015  Expert Mouse\n\t1016  ADB/USB Orbit\n\t1018  Studio Mouse\n\t101d  Mouse*in*a*Box Optical Pro\n\t101e  Studio Mouse Wireless\n\t101f  PocketMouse Pro\n\t1020  Expert Mouse Trackball\n\t1021  Expert Mouse Wireless\n\t1022  Orbit Optical\n\t1023  Pocket Mouse Pro Wireless\n\t1024  PocketMouse\n\t1025  Mouse*in*a*Box Optical Elite Wireless\n\t1026  Pocket Mouse Pro\n\t1027  StudioMouse\n\t1028  StudioMouse Wireless\n\t1029  Mouse*in*a*Box Optical Elite\n\t102a  Mouse*in*a*Box Optical\n\t102b  PocketMouse\n\t102c  Iridio\n\t102d  Pilot Optical\n\t102e  Pilot Optical Pro\n\t102f  Pilot Optical Pro Wireless\n\t1042  Ci25m Notebook Optical Mouse [Diamond Eye Precision]\n\t1043  Ci65m Wireless Notebook Optical Mouse\n\t104a  PilotMouse Mini Retractable\n\t105d  PocketMouse Bluetooth\n\t105e  Bluetooth EDR Dongle\n\t1061  PocketMouse Grip\n\t1062  PocketMouse Max\n\t1063  PocketMouse Max Wireless\n\t1064  PocketMouse 2.0 Wireless\n\t1065  PocketMouse 2.0\n\t1066  PocketMouse Max Glow\n\t1067  ValueMouse\n\t1068  ValueOpt White\n\t1069  ValueOpt Black\n\t106a  PilotMouse Laser Wireless Mini\n\t106b  PilotMouse Laser - 3 Button\n\t106c  PilotMouse Laser - Gaming\n\t106d  PilotMouse Laser - Wired\n\t106e  PilotMouse Micro Laser\n\t1070  ValueOpt Travel\n\t1071  ValueOpt RF TX\n\t1072  PocketMouse Colour\n\t1073  PilotMouse Laser - 6 Button\n\t1074  PilotMouse Laser Wireless Mini\n\t1075  SlimBlade Presenter Media Mouse\n\t1076  SlimBlade Media Mouse\n\t1077  SlimBlade Presenter Mouse\n\t1152  Bluetooth EDR Dongle\n\t2002  Optical Elite Wireless\n\t2010  Wireless Presentation Remote\n\t2012  Wireless Presenter with Laser Pointer\n\t2021  PilotBoard Wireless\n\t2030  PilotBoard Wireless\n\t2034  SlimBlade Media Notebook Set\n\t2041  SlimBlade Trackball\n\t2048  Orbit Trackball with Scroll Ring\n\t4003  Gravis Xterminator Digital Gamepad\n\t4005  Gravis Eliminator GamePad Pro\n\t4006  Gravis Eliminator AfterShock\n\t4007  Gravis Xterminator Force\n\t4008  Gravis Destroyer TiltPad\n\t5001  Cabo I Camera\n\t5002  VideoCam CABO II\n\t5003  VideoCam\n\t8018  Expert Wireless Trackball Mouse (K72359WW)\n\t8068  Pro Fit Ergo Vertical Wireless Trackball\n047e  Agere Systems, Inc. (Lucent)\n\t0300  ORiNOCO Card\n\t1001  USS720 Parallel Port\n\t2892  Systems Soft Modem\n\tbad1  Lucent 56k Modem\n\tf101  Atlas Modem\n047f  Plantronics, Inc.\n\t0101  Bulk Driver\n\t02ee  BT600\n\t0301  Bulk Driver\n\t0411  Savi Office Base Station\n\t0ca1  USB DSP v4 Audio Interface\n\t4254  BUA-100 Bluetooth Adapter\n\taa05  DA45\n\tac01  Savi 7xx\n\tad01  GameCom 777 5.1 Headset\n\taf00  DA70\n\taf01  DA80\n\tc008  Audio 655 DSP\n\tc00e  Blackwire C310 headset\n\tc03b  HD1\n\tc053  Blackwire C5220 headset (remote control and 3.5mm audio adapter)\n\tc056  Blackwire C3220 Headset\n\tca01  Calisto 800 Series\n\tda60  DA60\n0480  Toshiba America Inc\n\t0001  InTouch Module\n\t0004  InTouch Module\n\t0011  InTouch Module\n\t0014  InTouch Module\n\t0100  Stor.E Slim USB 3.0\n\t0200  External Disk\n\t0212  Toshiba Canvio Connect II 500GB Portable Hard Drive\n\t0820  Canvio Advance Disk\n\t0821  Canvio Advance 2TB model DTC920\n\t0900  MQ04UBF100\n\ta006  UAS Controller\n\ta007  External Disk USB 3.0\n\ta009  Stor.E Basics\n\ta00d  STOR.E BASICS 500GB\n\ta100  Canvio Alu 2TB 2.5\" Black External Disk Model HDTH320EK3CA\n\ta102  Canvio Alu 2TB 2.5\" Black External Disk Model HDTH320EK3CA\n\ta202  Canvio Basics HDD\n\ta208  Canvio Basics 2TB USB 3.0 Portable Hard Drive\n\tb001  Stor.E Partner\n\tb207  Canvio Ready\n\td000  External Disk 2TB Model DT01ABA200\n\td010  External Disk 3TB\n\td011  Canvio Desk\n0481  Zenith Data Systems\n0482  Kyocera Corp.\n\t000e  FS-1020D Printer\n\t000f  FS-1920 Mono Printer\n\t0015  FS-1030D printer\n\t0100  Finecam S3x\n\t0101  Finecam S4\n\t0103  Finecam S5\n\t0105  Finecam L3\n\t0106  Finecam\n\t0107  Digital Camera Device\n\t0108  Digital Camera Device\n\t0203  AH-K3001V\n\t0204  iBurst Terminal\n\t0408  FS-1320D Printer\n\t0640  ECOSYS M6026cdn\n\t069b  ECOSYS M2635dn\n\t06b4  ECOSYS M5526cdw\n0483  STMicroelectronics\n\t0102  Remote NDIS Network device with Android debug (ADB)\n\t0103  Remote NDIS Network device\n\t0104  MTP device with Android debug (ADB)\n\t0105  MTP device\n\t0106  PTP device with Android debug (ADB)\n\t0107  PTP device\n\t0137  BeWAN ADSL USB ST (blue or green)\n\t0138  Unicorn II (ST70138B + MTC-20174TQ chipset)\n\t0adb  Android Debug Bridge (ADB) device\n\t0afb  Android Fastboot device\n\t1307  Cytronix 6in1 Card Reader\n\t163d  Cool Icam Digi-MP3\n\t2015  TouchChip® Fingerprint Reader\n\t2016  Fingerprint Reader\n\t2017  Biometric Smart Card Reader\n\t2018  BioSimKey\n\t2302  Portable Flash Device (PFD)\n\t3744  ST-LINK/V1\n\t3747  ST Micro Connect Lite\n\t3748  ST-LINK/V2\n\t374b  ST-LINK/V2.1\n\t374d  STLINK-V3 Loader\n\t374e  STLINK-V3\n\t374f  STLINK-V3\n\t3752  ST-LINK/V2.1\n\t3753  STLINK-V3\n\t4810  ISDN adapter\n\t481d  BT Digital Access adapter\n\t5000  ST Micro/Ergenic ERG BT-002 Bluetooth Adapter\n\t5001  ST Micro Bluetooth Device\n\t5710  Joystick in FS Mode\n\t5720  Mass Storage Device\n\t5721  Interrupt Demo\n\t5722  Bulk Demo\n\t572a  STM32F401 microcontroller [ARM Cortex M4] [CDC/ACM serial port]\n\t5730  Audio Speaker\n\t5731  Microphone\n\t5740  Virtual COM Port\n\t5750  LED badge -- mini LED display -- 11x44\n\t7270  ST Micro Serial Bridge\n\t7554  56k SoftModem\n\t8213  ThermaData Logger Cradle\n\t8259  Probe\n\t91d1  Sensor Hub\n\ta171  ThermaData WiFi\n\ta2e0  BMeasure instrument\n\ta43f  inbed.io - Unified Controller (Gen 2)\n\tdf11  STM Device in DFU Mode\n\tff10  Swann ST56 Modem\n0484  Specialix\n0485  Nokia Monitors\n0486  ASUS Computers, Inc.\n\t0185  EeePC T91MT HID Touch Panel\n\t573c  Xreal Light Microcontroller\n0487  Stewart Connector\n0488  Cirque Corp.\n0489  Foxconn / Hon Hai\n\t0502  SmartMedia Card Reader Firmware Loader\n\t0503  SmartMedia Card Reader\n\td00c  Rollei Compactline (Storage Mode)\n\td00e  Rollei Compactline (Video Mode)\n\te000  T-Com TC 300\n\te003  Pirelli DP-L10\n\te00d  Broadcom Bluetooth 2.1 Device\n\te00f  Foxconn T77H114 BCM2070 [Single-Chip Bluetooth 2.1 + EDR Adapter]\n\te011  Acer Bluetooth module\n\te016  Ubee PXU1900 WiMAX Adapter [Beceem BCSM250]\n\te02c  Atheros AR5BBU12 Bluetooth Device\n\te032  Broadcom BCM20702 Bluetooth\n\te042  Broadcom BCM20702 Bluetooth\n\te04d  Atheros AR3012 Bluetooth\n\te055  BCM43142A0 broadcom bluetooth\n\te07a  Broadcom BCM20702A1 Bluetooth\n\te0c8  MediaTek MT7921 Bluetooth\n\te0cd  MediaTek Bluetooth Adapter\n\te0d8  Bluetooth 5.2 Adapter [MediaTek MT7922]\n048a  S-MOS Systems, Inc.\n048c  Alps Electric Ireland, Ltd\n048d  Integrated Technology Express, Inc.\n\t1165  IT1165 Flash Controller\n\t1172  Flash Drive\n\t1234  Chipsbank CBM2199 Flash Drive\n\t1336  SD/MMC Cardreader\n\t1345  Multi Cardreader\n\t5702  RGB LED Controller\n\t6008  8291 RGB keyboard backlight controller\n\t8297  IT8297 RGB LED Controller\n\t9006  IT9135 BDA Afatech DVB-T HDTV Dongle\n\t9009  Zolid HD DVD Maker\n\t9135  Zolid Mini DVB-T Stick\n\t9306  IT930x DVB stick\n\t9503  ITE it9503 feature-limited DVB-T transmission chip [ccHDtv]\n\t9507  ITE it9507 full featured DVB-T transmission chip [ccHDtv]\n\t9910  IT9910 chipset based grabber\n\tff59  Hdmi-CEC Bridge\n048f  Eicon Tech.\n0490  United Microelectronics Corp.\n0491  Capetronic\n\t0003  Taxan Monitor Control\n0492  Samsung SemiConductor, Inc.\n\t0140  MP3 player\n\t0141  MP3 Player\n0493  MAG Technology Co., Ltd\n0495  ESS Technology, Inc.\n0496  Micron Electronics\n0497  Smile International\n\tc001  Camera Device\n0498  Capetronic (Kaohsiung) Corp.\n0499  Yamaha Corp.\n\t1000  UX256 MIDI I/F\n\t1001  MU1000\n\t1002  MU2000\n\t1003  MU500\n\t1004  UW500\n\t1005  MOTIF6\n\t1006  MOTIF7\n\t1007  MOTIF8\n\t1008  UX96 MIDI I/F\n\t1009  UX16 MIDI I/F\n\t100a  EOS BX\n\t100c  UC-MX\n\t100d  UC-KX\n\t100e  S08\n\t100f  CLP-150\n\t1010  CLP-170\n\t1011  P-250\n\t1012  TYROS\n\t1013  PF-500\n\t1014  S90\n\t1015  MOTIF-R\n\t1016  MDP-5\n\t1017  CVP-204\n\t1018  CVP-206\n\t1019  CVP-208\n\t101a  CVP-210\n\t101b  PSR-1100\n\t101c  PSR-2100\n\t101d  CLP-175\n\t101e  PSR-K1\n\t101f  EZ-J24\n\t1020  EZ-250i\n\t1021  MOTIF ES 6\n\t1022  MOTIF ES 7\n\t1023  MOTIF ES 8\n\t1024  CVP-301\n\t1025  CVP-303\n\t1026  CVP-305\n\t1027  CVP-307\n\t1028  CVP-309\n\t1029  CVP-309GP\n\t102a  PSR-1500\n\t102b  PSR-3000\n\t102e  ELS-01/01C\n\t1030  PSR-295/293\n\t1031  DGX-205/203\n\t1032  DGX-305\n\t1033  DGX-505\n\t1037  PSR-E403\n\t103c  MOTIF-RACK ES\n\t1045  MM6\n\t1054  S90XS Keyboard/Music Synthesizer\n\t160f  P-105\n\t1613  Clavinova CLP535\n\t1617  PSR-E353 digital keyboard\n\t1704  Steinberg UR44\n\t2000  DGP-7\n\t2001  DGP-5\n\t3001  YST-MS55D USB Speaker\n\t3003  YST-M45D USB Speaker\n\t4000  NetVolante RTA54i Broadband&ISDN Router\n\t4001  NetVolante RTW65b Broadband Wireless Router\n\t4002  NetVolante RTW65i Broadband&ISDN Wireless Router\n\t4004  NetVolante RTA55i Broadband VoIP Router\n\t5000  CS1D\n\t5001  DSP1D\n\t5002  DME32\n\t5003  DM2000\n\t5004  02R96\n\t5005  ACU16-C\n\t5006  NHB32-C\n\t5007  DM1000\n\t5008  01V96\n\t5009  SPX2000\n\t500a  PM5D\n\t500b  DME64N\n\t500c  DME24N\n\t6001  CRW2200UX Lightspeed 2 External CD-RW Drive\n\t7000  DTX\n\t7010  UB99\n049a  Gandalf Technologies, Ltd\n049b  Curtis Computer Products\n049c  Acer Advanced Labs, Inc.\n\t0002  Keyboard (???)\n049d  VLSI Technology\n049f  Compaq Computer Corp.\n\t0002  InkJet Color Printer\n\t0003  iPAQ PocketPC\n\t000e  Internet Keyboard\n\t0012  InkJet Color Printer\n\t0018  PA-1/PA-2 MP3 Player\n\t0019  InkJet Color Printer\n\t001a  S4 100 Scanner\n\t001e  IJ650 Inkjet Printer\n\t001f  WL215 Adapter\n\t0021  S200 Scanner\n\t0027  Bluetooth Multiport Module by Compaq\n\t002a  1400P Inkjet Printer\n\t002b  A3000\n\t002c  Lexmark X125\n\t0032  802.11b Adapter [ipaq h5400]\n\t0033  Wireless LAN MultiPort W100 [Intersil PRISM 2.5]\n\t0036  Bluetooth Multiport Module\n\t0051  KU-0133 Easy Access Interner Keyboard\n\t0076  Wireless LAN MultiPort W200\n\t0080  GPRS Multiport\n\t0086  Bluetooth Device\n\t504a  Personal Jukebox PJB100\n\t505a  Linux-USB \"CDC Subset\" Device, or Itsy (experimental)\n\t8511  iPAQ Networking 10/100 Ethernet [pegasus2]\n04a0  Digital Equipment Corp.\n04a1  SystemSoft Corp.\n\tfff0  Telex Composite Device\n04a2  FirePower Systems\n04a3  Trident Microsystems, Inc.\n04a4  Hitachi, Ltd\n\t0004  DVD-CAM DZ-MV100A Camcorder\n\t001e  DVDCAM USB HS Interface\n04a5  Acer Peripherals Inc. (now BenQ Corp.)\n\t0001  Keyboard\n\t0002  API Ergo K/B\n\t0003  API Generic K/B Mouse\n\t12a6  AcerScan C310U\n\t1a20  Prisa 310U\n\t1a2a  Prisa 620U\n\t2022  Prisa 320U/340U\n\t2040  Prisa 620UT\n\t205e  ScanPrisa 640BU\n\t2060  Prisa 620U+/640U\n\t207e  Prisa 640BU\n\t209e  ScanPrisa 640BT\n\t20ae  S2W 3000U\n\t20b0  S2W 3300U/4300U\n\t20be  Prisa 640BT\n\t20c0  Prisa 1240UT\n\t20de  S2W 4300U+\n\t20f8  Benq 5000\n\t20fc  Benq 5000\n\t20fe  SW2 5300U\n\t2137  Benq 5150/5250\n\t2202  Benq 7400UT\n\t2311  Benq 5560\n\t3003  Benq Webcam\n\t3008  Benq 1500\n\t300a  Benq 3410\n\t300c  Benq 1016\n\t3019  Benq DC C40\n\t4000  P30 Composite Device\n\t4013  BenQ-Siemens EF82/SL91\n\t4044  BenQ-Siemens SF71\n\t4045  BenQ-Siemens E81\n\t4048  BenQ M7\n\t6001  Mass Storage Device\n\t6002  Mass Storage Device\n\t6003  ATA/ATAPI Adapter\n\t6004  Mass Storage Device\n\t6005  Mass Storage Device\n\t6006  Mass Storage Device\n\t6007  Mass Storage Device\n\t6008  Mass Storage Device\n\t6009  Mass Storage Device\n\t600a  Mass Storage Device\n\t600b  Mass Storage Device\n\t600c  Mass Storage Device\n\t600d  Mass Storage Device\n\t600e  Mass Storage Device\n\t600f  Mass Storage Device\n\t6010  Mass Storage Device\n\t6011  Mass Storage Device\n\t6012  Mass Storage Device\n\t6013  Mass Storage Device\n\t6014  Mass Storage Device\n\t6015  Mass Storage Device\n\t6125  MP3 Player\n\t6180  MP3 Player\n\t6200  MP3 Player\n\t7500  Hi-Speed Mass Storage Device\n\t8001  BenQ ZOWIE Gaming Mouse\n\t9000  AWL300 Wireless Adapter\n\t9001  AWL400 Wireless Adapter\n\t9213  Kbd Hub\n04a6  Nokia Display Products\n\t00b9  Audio\n\t0180  Hub Type P\n\t0181  HID Monitor Controls\n04a7  Visioneer\n\t0063  Visioneer DocuMate 152i\n\t0100  StrobePro\n\t0101  Strobe Pro Scanner (1.01)\n\t0102  StrobePro Scanner\n\t0211  OneTouch 7600 Scanner\n\t0221  OneTouch 5300 Scanner\n\t0223  OneTouch 8200\n\t0224  OneTouch 4800 USB/Microtek Scanport 3000\n\t0225  VistaScan Astra 3600(ENG)\n\t0226  OneTouch 5300 USB\n\t0229  OneTouch 7100\n\t022a  OneTouch 6600\n\t022c  OneTouch 9000/9020\n\t0231  6100 Scanner\n\t0311  6200 EPP/USB Scanner\n\t0321  OneTouch 8100 EPP/USB Scanner\n\t0331  OneTouch 8600 EPP/USB Scanner\n\t0341  6400\n\t0361  VistaScan Astra 3600(ENG)\n\t0362  OneTouch 9320\n\t0371  OneTouch 8700/8920\n\t0380  OneTouch 7700\n\t0382  Photo Port 7700\n\t0390  9650\n\t03a0  Xerox 4800 One Touch\n\t0410  OneTouch Pro 8800/8820\n\t0421  9450 USB\n\t0423  9750 Scanner\n\t0424  Strobe XP 450\n\t0425  Strobe XP 100\n\t0426  Strobe XP 200\n\t0427  Strobe XP 100\n\t0444  OneTouch 7300\n\t0445  CardReader 100\n\t0446  Xerox DocuMate 510\n\t0447  XEROX DocuMate 520\n\t0448  XEROX DocuMate 250\n\t0449  Xerox DocuMate 252\n\t044a  Xerox 6400\n\t044c  Xerox DocuMate 262\n\t0474  Strobe XP 300\n\t0475  Xerox DocuMate 272\n\t0478  Strobe XP 220\n\t0479  Strobe XP 470\n\t047a  9450\n\t047b  9650\n\t047d  9420\n\t0480  9520\n\t048f  Strobe XP 470\n\t0491  Strobe XP 450\n\t0493  9750\n\t0494  Strobe XP 120\n\t0497  Patriot 430\n\t0498  Patriot 680\n\t0499  Patriot 780\n\t049b  Strobe XP 100\n\t04a0  7400\n\t04ac  Xerox Travel Scanner 100\n\t04bb  strobe 400 scanner\n\t04cd  Xerox Travel Scanner 150\n\t04ee  Duplex Combo Scanner\n04a8  Multivideo Labs, Inc.\n\t0101  Hub\n\t0303  Peripheral Switch\n\t0404  Peripheral Switch\n04a9  Canon, Inc.\n\t1005  BJ Printer Hub\n\t1035  PD Printer Storage\n\t1050  BJC-8200\n\t1051  BJC-3000 Color Printer\n\t1052  BJC-6100\n\t1053  BJC-6200\n\t1054  BJC-6500\n\t1055  BJC-85\n\t1056  BJC-2110 Color Printer\n\t1057  LR1\n\t105a  BJC-55\n\t105b  S600 Printer\n\t105c  S400\n\t105d  S450 Printer\n\t105e  S800\n\t1062  S500 Printer\n\t1063  S4500\n\t1064  S300 Printer\n\t1065  S100\n\t1066  S630\n\t1067  S900\n\t1068  S9000\n\t1069  S820\n\t106a  S200 Printer\n\t106b  S520 Printer\n\t106d  S750 Printer\n\t106e  S820D\n\t1070  S530D\n\t1071  Sony MPR-501\n\t1072  I850 Printer\n\t1073  I550 Printer\n\t1074  S330 Printer\n\t1075  Sony MPR-505\n\t1076  i70\n\t1077  i950\n\t107a  S830D\n\t107b  i320\n\t107c  i470D\n\t107d  i9100\n\t107e  i450\n\t107f  i860\n\t1082  i350\n\t1084  i250\n\t1085  i255\n\t1086  i560\n\t1088  i965\n\t108a  i455\n\t108b  i900D\n\t108c  i475D\n\t108d  PIXMA iP2000\n\t108f  i80\n\t1090  i9900 Photo Printer\n\t1091  PIXMA iP1500\n\t1093  PIXMA iP4000\n\t1094  PIXMA iP3000x Printer\n\t1095  PIXMA iP6000D\n\t1097  PIXMA iP5000\n\t1098  PIXMA iP1000\n\t1099  PIXMA iP8500\n\t109c  PIXMA iP4000R\n\t109d  iP90\n\t10a0  PIXMA iP1600 Printer\n\t10a2  iP4200\n\t10a4  iP5200R\n\t10a5  iP5200\n\t10a7  iP6210D\n\t10a8  iP6220D\n\t10a9  iP6600D\n\t10b6  PIXMA iP4300 Printer\n\t10b7  PIXMA iP5300 Printer\n\t10c2  PIXMA iP1800 Printer\n\t10c4  Pixma iP4500 Printer\n\t10c9  PIXMA iP4600 Printer\n\t10ca  PIXMA iP3600 Printer\n\t10e3  PIXMA iX6850 Printer\n\t12fe  Printer in service mode\n\t1404  W6400PG\n\t1405  W8400PG\n\t150f  BIJ2350 PCL\n\t1510  BIJ1350 PCL\n\t1512  BIJ1350D PCL\n\t1601  DR-2080C Scanner\n\t1607  DR-6080 Scanner\n\t1608  DR-2580C Scanner\n\t1609  DR-3080CII\n\t160a  DR-2050C Scanner\n\t1700  PIXMA MP110 Scanner\n\t1701  PIXMA MP130 Scanner\n\t1702  MP410 Composite\n\t1703  MP430 Composite\n\t1704  MP330 Composite\n\t1706  PIXMA MP750 Scanner\n\t1707  PIXMA MP780/MP790\n\t1708  PIXMA MP760/MP770\n\t1709  PIXMA MP150 Scanner\n\t170a  PIXMA MP170 Scanner\n\t170b  PIXMA MP450 Scanner\n\t170c  PIXMA MP500 Scanner\n\t170d  PIXMA MP800 Scanner\n\t170e  PIXMA MP800R\n\t1710  MP950\n\t1712  PIXMA MP530\n\t1713  PIXMA MP830 Scanner\n\t1714  MP160\n\t1715  PIXMA MP180\n\t1716  PIXMA MP460\n\t1717  PIXMA MP510\n\t1718  PIXMA MP600\n\t1719  PIXMA MP600R\n\t171a  PIXMA MP810\n\t171b  PIXMA MP960\n\t171c  PIXMA MX7600\n\t1721  PIXMA MP210\n\t1722  PIXMA MP220\n\t1723  PIXMA MP470\n\t1724  PIXMA MP520 series\n\t1725  PIXMA MP610\n\t1726  PIXMA MP970\n\t1727  PIXMA MX300\n\t1728  PIXMA MX310 series\n\t1729  PIXMA MX700\n\t172b  MP140 ser\n\t172c  PIXMA MX850\n\t172d  PIXMA MP980\n\t172e  PIXMA MP630\n\t172f  PIXMA MP620\n\t1730  PIXMA MP540\n\t1731  PIXMA MP480\n\t1732  PIXMA MP240\n\t1733  PIXMA MP260\n\t1734  PIXMA MP190\n\t1735  PIXMA MX860\n\t1736  PIXMA MX320 series\n\t1737  PIXMA MX330\n\t173a  PIXMA MP250\n\t173b  PIXMA MP270 All-In-One Printer\n\t173c  PIXMA MP490\n\t173d  PIXMA MP550\n\t173e  PIXMA MP560\n\t173f  PIXMA MP640\n\t1740  PIXMA MP990\n\t1741  PIXMA MX340\n\t1742  PIXMA MX350\n\t1743  PIXMA MX870\n\t1746  PIXMA MP280\n\t1747  PIXMA MP495\n\t1748  PIXMA MG5100 Series\n\t1749  PIXMA MG5200 Series\n\t174a  PIXMA MG6100 Series\n\t174b  PIXMA MG8100 Series\n\t174d  PIXMA MX360\n\t174e  PIXMA MX410\n\t174f  PIXMA MX420\n\t1750  PIXMA MX880 Series\n\t1752  PIXMA MG3100 Series\n\t1753  PIXMA MG4100 Series\n\t1754  PIXMA MG5300 Series\n\t1755  PIXMA MG6200 Series\n\t1756  PIXMA MG8200 Series\n\t1757  PIXMA MP493\n\t1759  PIXMA MX370 Series\n\t175b  PIXMA MX430 Series\n\t175c  PIXMA MX510 Series\n\t175d  PIXMA MX710 Series\n\t175e  PIXMA MX890 Series\n\t175f  PIXMA MP230\n\t1762  PIXMA MG3200 Series\n\t1763  PIXMA MG4200 Series\n\t1764  PIXMA MG5400 Series\n\t1765  PIXMA MG6300 Series\n\t1766  PIXMA MX390 Series\n\t1768  PIXMA MX450 Series\n\t1769  PIXMA MX520 Series\n\t176a  PIXMA MX720 Series\n\t176b  PIXMA MX920 Series\n\t176d  PIXMA MG2500 Series\n\t176e  PIXMA MG3500 Series\n\t176f  PIXMA MG6500 Series\n\t1770  PIXMA MG6400 Series\n\t1771  PIXMA MG5500 Series\n\t1772  PIXMA MG7100 Series\n\t1774  PIXMA MX470 Series\n\t1775  PIXMA MX530 Series\n\t177c  PIXMA MG7500 Series\n\t177e  PIXMA MG6600 Series\n\t177f  PIXMA MG5600 Series\n\t1780  PIXMA MG2900 Series\n\t1787  PIXMA MX490 Series\n\t178a  PIXMA MG3600 Series\n\t178d  PIXMA MG6853\n\t180b  PIXMA MG3000 series\n\t183b  PIXMA MG3110 Series\n\t1856  PIXMA TS6250\n\t1900  CanoScan LiDE 90\n\t1901  CanoScan 8800F\n\t1904  CanoScan LiDE 100\n\t1905  CanoScan LiDE 200\n\t1906  CanoScan 5600F\n\t1907  CanoScan LiDE 700F\n\t1908  CanoScan 9000F\n\t1909  CanoScan LiDE 110\n\t190a  CanoScan LiDE 210\n\t190d  CanoScan 9000F Mark II\n\t190e  CanoScan LiDE 120\n\t190f  CanoScan LiDE 220\n\t1912  LiDE 400\n\t1913  CanoScan LiDE 300\n\t2200  CanoScan LiDE 25\n\t2201  CanoScan FB320U\n\t2202  CanoScan FB620U\n\t2204  CanoScan FB630U\n\t2205  CanoScan FB1210U\n\t2206  CanoScan N650U/N656U\n\t2207  CanoScan 1220U\n\t2208  CanoScan D660U\n\t220a  CanoScan D2400UF\n\t220b  CanoScan D646U\n\t220c  CanoScan D1250U2\n\t220d  CanoScan N670U/N676U/LiDE 20\n\t220e  CanoScan N1240U/LiDE 30\n\t220f  CanoScan 8000F\n\t2210  CanoScan 9900F\n\t2212  CanoScan 5000F\n\t2213  CanoScan LiDE 50/LiDE 35/LiDE 40\n\t2214  CanoScan LiDE 80\n\t2215  CanoScan 3000/3000F/3000ex\n\t2216  CanoScan 3200F\n\t2217  CanoScan 5200F\n\t2219  CanoScan 9950F\n\t221b  CanoScan 4200F\n\t221c  CanoScan LiDE 60\n\t221e  CanoScan 8400F\n\t221f  CanoScan LiDE 500F\n\t2220  CanoScan LIDE 25\n\t2224  CanoScan LiDE 600F\n\t2225  CanoScan LiDE 70\n\t2228  CanoScan 4400F\n\t2229  CanoScan 8600F\n\t2602  MultiPASS C555\n\t2603  MultiPASS C755\n\t260a  LBP810\n\t260e  LBP-2000\n\t2610  MPC600F\n\t2611  SmartBase MPC400\n\t2612  MultiPASS C855\n\t2617  LBP1210\n\t261a  iR1600\n\t261b  iR1610\n\t261c  iC2300\n\t261f  MPC200 Printer\n\t2621  iR2000\n\t2622  iR2010\n\t2623  FAX-B180C\n\t2629  FAXPHONE L75\n\t262b  LaserShot LBP-1120 Printer\n\t262c  imageCLASS D300\n\t262d  iR C3200\n\t262f  PIXMA MP730\n\t2630  PIXMA MP700\n\t2631  LASER CLASS 700\n\t2632  FAX-L2000\n\t2633  LASERCLASS 500\n\t2634  PC-D300/FAX-L400/ICD300\n\t2635  MPC190\n\t2636  LBP3200\n\t2637  iR C6800\n\t2638  iR C3100\n\t263c  PIXMA MP360\n\t263d  PIXMA MP370\n\t263e  PIXMA MP390\n\t263f  PIXMA MP375R\n\t2646  MF5530 Scanner Device V1.9.1\n\t2647  MF5550 Composite\n\t264c  PIXMA MP740\n\t264d  PIXMA MP710\n\t264e  MF5630\n\t264f  MF5650 (FAX)\n\t2650  iR 6800C EUR\n\t2651  iR 3100C EUR\n\t2654  LBP3600\n\t2655  FP-L170/MF350/L380/L398\n\t2656  iR1510-1670 CAPT Printer\n\t2657  LBP3210\n\t2659  MF8100\n\t265b  CAPT Printer\n\t265c  iR C3220\n\t265d  MF5730\n\t265e  MF5750\n\t265f  MF5770\n\t2660  MF3110\n\t2663  iR3570/iR4570\n\t2664  iR2270/iR2870\n\t2665  iR C2620\n\t2666  iR C5800\n\t2667  iR85PLUS\n\t2669  iR105PLUS\n\t266a  LBP3000\n\t266b  iR8070\n\t266c  iR9070\n\t266d  iR 5800C EUR\n\t266e  CAPT Device\n\t266f  iR2230\n\t2670  iR3530\n\t2671  iR5570/iR6570\n\t2672  iR C3170\n\t2673  iR 3170C EUR\n\t2674  FAX-L120\n\t2675  iR2830\n\t2676  LBP2900\n\t2677  iR C2570\n\t2678  iR 2570C EUR\n\t2679  LBP5000\n\t267a  iR2016\n\t267b  iR2020\n\t267d  MF7100 series\n\t267e  LBP3300\n\t2684  MF3200 series\n\t2686  MF6500 series\n\t2687  iR4530\n\t2688  LBP3460\n\t2689  FAX-L180/L380S/L398S\n\t268a  LC310/L390/L408S\n\t268b  LBP3500\n\t268c  iR C6870\n\t268d  iR 6870C EUR\n\t268e  iR C5870\n\t268f  iR 5870C EUR\n\t2691  iR7105\n\t26a1  LBP5300\n\t26a3  MF4100 series\n\t26a4  LBP5100\n\t26b0  MF4600 series\n\t26b4  MF4010 series\n\t26b5  MF4200 series\n\t26b6  FAX-L140/L130\n\t26b9  LBP3310\n\t26ba  LBP5050\n\t26da  LBP3010/LBP3018/LBP3050\n\t26db  LBP3100/LBP3108/LBP3150\n\t26e6  iR1024\n\t26ea  LBP9100C\n\t26ee  MF4320-4350\n\t26f1  LBP7200C\n\t26ff  LBP6300\n\t271a  LBP6000\n\t271b  LBP6200\n\t271c  LBP7010C/7018C\n\t2736  I-SENSYS MF4550d\n\t2737  MF4410\n\t2742  imageRUNNER1133 series\n\t2771  LBP6020\n\t2796  LBP6230/6240\n\t3041  PowerShot S10\n\t3042  CanoScan FS4000US Film Scanner\n\t3043  PowerShot S20\n\t3044  EOS D30\n\t3045  PowerShot S100\n\t3046  IXY Digital\n\t3047  Digital IXUS\n\t3048  PowerShot G1\n\t3049  PowerShot Pro90 IS\n\t304a  CP-10\n\t304b  IXY Digital 300\n\t304c  PowerShot S300\n\t304d  Digital IXUS 300\n\t304e  PowerShot A20\n\t304f  PowerShot A10\n\t3050  PowerShot unknown 1\n\t3051  PowerShot S110\n\t3052  Digital IXUS V\n\t3055  PowerShot G2\n\t3056  PowerShot S40\n\t3057  PowerShot S30\n\t3058  PowerShot A40\n\t3059  PowerShot A30\n\t305b  ZR45MC Digital Camcorder\n\t305c  PowerShot unknown 2\n\t3060  EOS D60\n\t3061  PowerShot A100\n\t3062  PowerShot A200\n\t3063  CP-100\n\t3065  PowerShot S200\n\t3066  Digital IXUS 330\n\t3067  MV550i Digital Video Camera\n\t3069  PowerShot G3\n\t306a  Digital unknown 3\n\t306b  MVX2i Digital Video Camera\n\t306c  PowerShot S45\n\t306d  PowerShot S45 PtP Mode\n\t306e  PowerShot G3 (normal mode)\n\t306f  PowerShot G3 (ptp)\n\t3070  PowerShot S230\n\t3071  PowerShot S230 (ptp)\n\t3072  PowerShot SD100 / Digital IXUS II (ptp)\n\t3073  PowerShot A70 (ptp)\n\t3074  PowerShot A60 (ptp)\n\t3075  IXUS 400 Camera\n\t3076  PowerShot A300\n\t3077  PowerShot S50\n\t3078  ZR70MC Digital Camcorder\n\t307a  MV650i (normal mode)\n\t307b  MV630i Digital Video Camera\n\t307c  CP-200\n\t307d  CP-300\n\t307f  Optura 20\n\t3080  MVX150i (normal mode) / Optura 20 (normal mode)\n\t3081  Optura 10\n\t3082  MVX100i / Optura 10\n\t3083  EOS 10D\n\t3084  EOS 300D / EOS Digital Rebel\n\t3085  PowerShot G5\n\t3087  Elura 50 (PTP mode)\n\t3088  Elura 50 (normal mode)\n\t308d  MVX3i\n\t308e  FV M1 (normal mode) / MVX 3i (normal mode) / Optura Xi (normal mode)\n\t3093  Optura 300\n\t3096  IXY DV M2 (normal mode) / MVX 10i (normal mode)\n\t3099  EOS 300D (ptp)\n\t309a  PowerShot A80\n\t309b  Digital IXUS (ptp)\n\t309c  PowerShot S1 IS\n\t309d  Powershot Pro 1\n\t309f  Camera\n\t30a0  Camera\n\t30a1  Camera\n\t30a2  Camera\n\t30a8  Elura 60E/Optura 40 (ptp)\n\t30a9  MVX25i (normal mode) / Optura 40 (normal mode)\n\t30b1  PowerShot S70 (normal mode) / PowerShot S70 (PTP mode)\n\t30b2  PowerShot S60 (normal mode) / PowerShot S60 (PTP mode)\n\t30b3  PowerShot G6 (normal mode) / PowerShot G6 (PTP mode)\n\t30b4  PowerShot S500\n\t30b5  PowerShot A75\n\t30b6  Digital IXUS II2  / Digital IXUS II2 (PTP mode) / PowerShot SD110 (PTP mode) / PowerShot SD110 Digital ELPH\n\t30b7  PowerShot A400 / PowerShot A400 (PTP mode)\n\t30b8  PowerShot A310 / PowerShot A310 (PTP mode)\n\t30b9  Powershot A85\n\t30ba  PowerShot S410 Digital Elph\n\t30bb  PowerShot A95\n\t30bd  CP-220\n\t30be  CP-330\n\t30bf  Digital IXUS 40\n\t30c0  Digital IXUS 30 (PTP mode) / PowerShot SD200 (PTP mode)\n\t30c1  Digital IXUS 50 (normal mode) / IXY Digital 55 (normal mode) / PowerShot A520 (PTP mode) / PowerShot SD400 (normal mode)\n\t30c2  PowerShot A510 (normal mode) / PowerShot A510 (PTP mode)\n\t30c4  Digital IXUS i5 (normal mode) / IXY Digital L2 (normal mode) / PowerShot SD20 (normal mode)\n\t30ea  EOS 1D Mark II (PTP mode)\n\t30eb  EOS 20D\n\t30ec  EOS 20D (ptp)\n\t30ee  EOS 350D\n\t30ef  EOS 350D (ptp)\n\t30f0  PowerShot S2 IS (PTP mode)\n\t30f2  Digital IXUS 700 (normal mode) / Digital IXUS 700 (PTP mode) / IXY Digital 600 (normal mode) / PowerShot SD500 (normal mode) / PowerShot SD500 (PTP mode)\n\t30f4  PowerShot SD30 / Ixus iZoom / IXY DIGITAL L3\n\t30f5  SELPHY CP500\n\t30f6  SELPHY CP400\n\t30f8  Powershot A430\n\t30f9  PowerShot A410 (PTP mode)\n\t30fa  PowerShot S80\n\t30fc  PowerShot A620 (PTP mode)\n\t30fd  PowerShot A610 (normal mode)/PowerShot A610 (PTP mode)\n\t30fe  Digital IXUS 65 (PTP mode)/PowerShot SD630 (PTP mode)\n\t30ff  Digital IXUS 55 (PTP mode)/PowerShot SD450 (PTP mode)\n\t3100  PowerShot TX1\n\t310b  SELPHY CP600\n\t310e  Digital IXUS 50 (PTP mode)\n\t310f  PowerShot A420\n\t3110  EOS Digital Rebel XTi\n\t3115  PowerShot SD900 / Digital IXUS 900 Ti / IXY DIGITAL 1000\n\t3116  Digital IXUS 750 / PowerShot SD550 (PTP mode)\n\t3117  PowerShot A700\n\t3119  PowerShot SD700 IS / Digital IXUS 800 IS / IXY Digital 800 IS\n\t311a  PowerShot S3 IS\n\t311b  PowerShot A540\n\t311c  PowerShot SD600 DIGITAL ELPH / DIGITAL IXUS 60 / IXY DIGITAL 70\n\t3125  PowerShot G7\n\t3126  PowerShot A530\n\t3127  SELPHY CP710\n\t3128  SELPHY CP510\n\t312d  Elura 100\n\t3136  PowerShot SD800 IS / Digital IXUS 850 IS / IXY DIGITAL 900 IS\n\t3137  PowerShot SD40 / Digital IXUS i7 IXY / DIGITAL L4\n\t3138  PowerShot A710 IS\n\t3139  PowerShot A640\n\t313a  PowerShot A630\n\t3141  SELPHY ES1\n\t3142  SELPHY CP730\n\t3143  SELPHY CP720\n\t3145  EOS 450D\n\t3146  EOS 40D\n\t3147  EOS 1Ds Mark III\n\t3148  PowerShot S5 IS\n\t3149  PowerShot A460\n\t314b  PowerShot SD850 IS DIGITAL ELPH / Digital IXUS 950 IS / IXY DIGITAL 810 IS\n\t314c  PowerShot A570 IS\n\t314d  PowerShot A560\n\t314e  PowerShot SD750 DIGITAL ELPH / DIGITAL IXUS 75 / IXY DIGITAL 90\n\t314f  PowerShot SD1000 DIGITAL ELPH / DIGITAL IXUS 70 / IXY DIGITAL 10\n\t3150  PowerShot A550\n\t3155  PowerShot A450\n\t315a  PowerShot G9\n\t315b  PowerShot A650 IS\n\t315d  PowerShot A720\n\t315e  PowerShot SX100 IS\n\t315f  PowerShot SD950 IS DIGITAL ELPH / DIGITAL IXUS 960 IS / IXY DIGITAL 2000 IS\n\t3160  Digital IXUS 860 IS\n\t3170  SELPHY CP750\n\t3171  SELPHY CP740\n\t3172  SELPHY CP520\n\t3173  PowerShot SD890 IS DIGITAL ELPH / Digital IXUS 970 IS / IXY DIGITAL 820 IS\n\t3174  PowerShot SD790 IS DIGITAL ELPH / Digital IXUS 90 IS / IXY DIGITAL 95 IS\n\t3175  IXY Digital 25 IS\n\t3176  PowerShot A590\n\t3177  PowerShot A580\n\t317a  PC1267 [Powershot A470]\n\t3184  Digital IXUS 80 IS (PTP mode)\n\t3185  SELPHY ES2\n\t3186  SELPHY ES20\n\t318d  PowerShot SX100 IS\n\t318e  PowerShot A1000 IS\n\t318f  PowerShot G10\n\t3191  PowerShot A2000 IS\n\t3192  PowerShot SX110 IS\n\t3193  PowerShot SD990 IS DIGITAL ELPH / Digital IXUS 980 IS / IXY DIGITAL 3000 IS\n\t3195  PowerShot SX1 IS\n\t3196  PowerShot SD880 IS DIGITAL ELPH / Digital IXUS 870 IS / IXY DIGITAL 920 IS\n\t3199  EOS 5D Mark II\n\t319a  EOS 7D\n\t319b  EOS 50D\n\t31aa  SELPHY CP770\n\t31ab  SELPHY CP760\n\t31ad  PowerShot E1\n\t31af  SELPHY ES3\n\t31b0  SELPHY ES30\n\t31b1  SELPHY CP530\n\t31bc  PowerShot D10\n\t31bd  PowerShot SD960 IS DIGITAL ELPH / Digital IXUS 110 IS / IXY DIGITAL 510 IS\n\t31be  PowerShot A2100 IS\n\t31bf  PowerShot A480\n\t31c0  PowerShot SX200 IS\n\t31c1  PowerShot SD970 IS DIGITAL ELPH / Digital IXUS 990 IS / IXY DIGITAL 830 IS\n\t31c2  PowerShot SD780 IS DIGITAL ELPH / Digital IXUS 100 IS / IXY DIGITAL 210 IS\n\t31c3  PowerShot A1100 IS\n\t31c4  PowerShot SD1200 IS DIGITAL ELPH / Digital IXUS 95 IS / IXY DIGITAL 110 IS\n\t31cf  EOS Rebel T1i / EOS 500D / EOS Kiss X3\n\t31dd  SELPHY CP780\n\t31df  PowerShot G11\n\t31e0  PowerShot SX120 IS\n\t31e1  PowerShot S90\n\t31e4  PowerShot SX20 IS\n\t31e5  Digital IXUS 200 IS\n\t31e6  PowerShot SD940 IS DIGITAL ELPH / Digital IXUS 120 IS / IXY DIGITAL 220 IS\n\t31e7  SELPHY CP790\n\t31ea  EOS Rebel T2i / EOS 550D / EOS Kiss X4\n\t31ee  SELPHY ES40\n\t31ef  PowerShot A495\n\t31f0  PowerShot A490\n\t31f1  PowerShot A3100 IS / PowerShot A3150 IS\n\t31f2  PowerShot A3000 IS\n\t31f3  PowerShot Digital ELPH SD1400 IS\n\t31f4  PowerShot SD1300 IS / IXUS 105\n\t31f5  Powershot SD3500 IS / IXUS 210 IS\n\t31f6  PowerShot SX210 IS\n\t31f7  Powershot SD4000 IS / IXUS 300 HS / IXY 30S\n\t31f8  Powershot SD4500 IS / IXUS 1000 HS / IXY 50S\n\t31ff  Digital IXUS 55\n\t3209  Vixia HF S21 A\n\t320f  PowerShot G12\n\t3210  Powershot SX30 IS\n\t3211  PowerShot SX130 IS\n\t3212  Powershot S95\n\t3214  SELPHY CP800\n\t3215  EOS 60D\n\t3218  EOS 600D / Rebel T3i (ptp)\n\t3219  EOS 1D X\n\t3223  PowerShot A3300 IS\n\t3224  PowerShot A3200 IS\n\t3225  PowerShot ELPH 500 HS / IXUS 310 HS\n\t3226  PowerShow A800\n\t3227  PowerShot ELPH 100 HS / IXUS 115 HS\n\t3228  PowerShot SX230 HS\n\t3229  PowerShot ELPH 300 HS / IXUS 220 HS\n\t322a  PowerShot A2200\n\t322b  Powershot A1200\n\t322c  PowerShot SX220 HS\n\t3233  PowerShot G1 X\n\t3234  PowerShot SX150 IS\n\t3235  PowerShot ELPH 510 HS / IXUS 1100 HS\n\t3236  PowerShot S100\n\t3237  PowerShot ELPH 310 HS / IXUS 230 HS\n\t3238  PowerShot SX40 HS\n\t323a  EOS 5D Mark III\n\t323b  EOS Rebel T4i\n\t323d  EOS M\n\t323e  PowerShot A1300\n\t323f  PowerShot A810\n\t3240  PowerShot ELPH 320 HS / IXUS 240 HS\n\t3241  PowerShot ELPH 110 HS / IXUS 125 HS\n\t3242  PowerShot D20\n\t3243  PowerShot A4000 IS\n\t3244  PowerShot SX260 HS\n\t3245  PowerShot SX240 HS\n\t3246  PowerShot ELPH 530 HS / IXUS 510 HS\n\t3247  PowerShot ELPH 520 HS / IXUS 500 HS\n\t3248  PowerShot A3400 IS\n\t3249  PowerShot A2400 IS\n\t324a  PowerShot A2300\n\t3250  EOS 6D\n\t3252  EOS 1D C\n\t3253  EOS 70D\n\t3255  SELPHY CP900\n\t3256  SELPHY CP810\n\t3258  PowerShot G15\n\t3259  PowerShot SX50 HS\n\t325a  PowerShot SX160 IS\n\t325b  PowerShot S110\n\t325c  PowerShot SX500 IS\n\t325e  PowerShot N\n\t325f  PowerShot SX280 HS\n\t3260  PowerShot SX270 HS\n\t3261  PowerShot A3500 IS\n\t3262  PowerShot A2600\n\t3263  PowerShot SX275 HS\n\t3264  PowerShot A1400\n\t3265  Powershot ELPH 130 IS / IXUS 140\n\t3266  Powershot ELPH 120 IS / IXUS 135\n\t3268  PowerShot ELPH 330 HS / IXUS 255 HS\n\t326f  EOS 7D Mark II\n\t3270  EOS 100D\n\t3271  PowerShot A2500\n\t3272  EOS 700D\n\t3274  PowerShot G16\n\t3275  PowerShot S120\n\t3276  PowerShot SX170 IS\n\t3277  PowerShot SX510 HS\n\t3278  PowerShot S200\n\t327a  SELPHY CP910\n\t327b  SELPHY CP820\n\t327d  Powershot ELPH 115 IS / IXUS 132\n\t327f  EOS Rebel T5 / EOS 1200D / EOS Kiss X70\n\t3284  PowerShot D30\n\t3285  PowerShot SX700 HS\n\t3286  PowerShot SX600 HS\n\t3287  PowerShot ELPH 140 IS / IXUS 150\n\t3288  Powershot ELPH 135 / IXUS 145\n\t3289  PowerShot ELPH 340 HS / IXUS 265 HS\n\t328a  PowerShot ELPH 150 IS / IXUS 155\n\t328b  PowerShot N Facebook(R) Ready\n\t3299  EOS M3\n\t329a  PowerShot SX60 HS\n\t329b  PowerShot SX520 HS\n\t329c  PowerShot SX400 IS\n\t329d  PowerShot G7 X\n\t329f  PowerShot SX530 HS\n\t32a0  EOS M10\n\t32a6  PowerShot SX710 HS\n\t32a7  PowerShot SX610 HS\n\t32a8  PowerShot G3 X\n\t32aa  Powershot ELPH 160 / IXUS 160\n\t32ab  PowerShot ELPH 350HS / IXUS 275 HS\n\t32ac  PowerShot ELPH 170 IS / IXUS 170\n\t32ad  PowerShot SX410 IS\n\t32b1  SELPHY CP1200\n\t32b2  PowerShot G9 X\n\t32b3  PowerShot G5 X\n\t32b4  EOS Rebel T6\n\t32bb  EOS M5\n\t32bf  PowerShot SX420 IS\n\t32c0  PowerShot ELPH 190IS\n\t32c1  PowerShot ELPH 180 / IXUS 175\n\t32c2  PowerShot SX720 HS\n\t32c5  EOS M6\n\t32cc  EOS 200D\n\t32d1  EOS M100\n\t32d2  EOS M50\n\t32d4  Powershot ELPH 185 / IXUS 185 / IXY 200\n\t32d5  PowerShot SX430 IS\n\t32db  SELPHY CP1300\n\t3302  SELPHY CP1500\n04aa  DaeWoo Telecom, Ltd\n04ab  Chromatic Research\n04ac  Micro Audiometrics Corp.\n04ad  Dooin Electronics\n\t2501  Bluetooth Device\n04af  Winnov L.P.\n04b0  Nikon Corp.\n\t0102  Coolpix 990\n\t0103  Coolpix 880\n\t0104  Coolpix 995\n\t0106  Coolpix 775\n\t0107  Coolpix 5000\n\t0108  Coolpix 2500\n\t0109  Coolpix 2500 (ptp)\n\t010a  Coolpix 4500\n\t010b  Coolpix 4500 (ptp)\n\t010d  Coolpix 5700 (ptp)\n\t010e  Coolpix 4300 (storage)\n\t010f  Coolpix 4300 (ptp)\n\t0110  Coolpix 3500 (Sierra Mode)\n\t0111  Coolpix 3500 (ptp)\n\t0112  Coolpix 885 (ptp)\n\t0113  Coolpix 5000 (ptp)\n\t0114  Coolpix 3100 (storage)\n\t0115  Coolpix 3100 (ptp)\n\t0117  Coolpix 2100 (ptp)\n\t0119  Coolpix 5400 (ptp)\n\t011d  Coolpix 3700 (ptp)\n\t0121  Coolpix 3200 (ptp)\n\t0122  Coolpix 2200 (ptp)\n\t0124  Coolpix 8400 (mass storage mode)\n\t0125  Coolpix 8400 (ptp)\n\t0126  Coolpix 8800\n\t0129  Coolpix 4800 (ptp)\n\t012c  Coolpix 4100 (storage)\n\t012d  Coolpix 4100 (ptp)\n\t012e  Coolpix 5600 (ptp)\n\t0130  Coolpix 4600 (ptp)\n\t0135  Coolpix 5900 (ptp)\n\t0136  Coolpix 7900 (storage)\n\t0137  Coolpix 7900 (ptp)\n\t013a  Coolpix 100 (storage)\n\t013b  Coolpix 100 (ptp)\n\t0141  Coolpix P2 (storage)\n\t0142  Coolpix P2 (ptp)\n\t0163  Coolpix P5100 (ptp)\n\t0169  Coolpix P50 (ptp)\n\t0202  Coolpix SQ (ptp)\n\t0203  Coolpix 4200 (mass storage mode)\n\t0204  Coolpix 4200 (ptp)\n\t0205  Coolpix 5200 (storage)\n\t0206  Coolpix 5200 (ptp)\n\t0301  Coolpix 2000 (storage)\n\t0302  Coolpix 2000 (ptp)\n\t0317  Coolpix L20 (ptp)\n\t0402  DSC D100 (ptp)\n\t0403  D2H (mass storage mode)\n\t0404  D2H SLR (ptp)\n\t0405  D70 (mass storage mode)\n\t0406  DSC D70 (ptp)\n\t0408  D2X SLR (ptp)\n\t0409  D50 digital camera\n\t040a  D50 (ptp)\n\t040c  D2Hs\n\t040e  DSC D70s (ptp)\n\t040f  D200 (mass storage mode)\n\t0410  D200 (ptp)\n\t0411  D80 (mass storage mode)\n\t0412  D80 (MTP/PTP mode)\n\t0413  D40 (mass storage mode)\n\t041e  D60 digital camera (mass storage mode)\n\t0422  D700 (ptp)\n\t0423  D5000\n\t0424  D3000\n\t0425  D300S\n\t0428  D7000\n\t0429  D5100\n\t042a  D800 (ptp)\n\t0430  D7100\n\t0434  D610\n\t0436  D810\n\t043f  D5600\n\t0455  Z50II\n\t0f03  PD-10 Wireless Printer Adapter\n\t4000  Coolscan LS 40 ED\n\t4001  LS 50 ED/Coolscan V ED\n\t4002  Super Coolscan LS-5000 ED\n04b1  Pan International\n04b3  IBM Corp.\n\t3003  Rapid Access III Keyboard\n\t3004  Media Access Pro Keyboard\n\t300a  Rapid Access IIIe Keyboard\n\t3016  UltraNav Keyboard Hub\n\t3018  UltraNav Keyboard\n\t301a  2-port low-power hub\n\t301b  SK-8815 Keyboard\n\t301c  Enhanced Performance Keyboard\n\t301e  Keyboard with UltraNav (SK-8845RC)\n\t3020  Enhanced Performance Keyboard\n\t3025  NetVista Full Width Keyboard\n\t3100  NetVista Mouse\n\t3103  ScrollPoint Pro Mouse\n\t3104  ScrollPoint Wireless Mouse\n\t3105  ScrollPoint Optical (HID)\n\t3107  ThinkPad 800dpi Optical Travel Mouse\n\t3108  800dpi Optical Mouse w/ Scroll Point\n\t3109  Optical ScrollPoint Pro Mouse\n\t310b  Red Wheel Mouse\n\t310c  Wheel Mouse\n\t4427  Portable CD ROM\n\t4482  Serial Converter\n\t4484  SMSC USB20H04 3-Port Hub [ThinkPad X4 UltraBase, Wistron S Note-3 Media Slice]\n\t4485  ThinkPad Dock Hub\n\t4524  40 Character Vacuum Fluorescent Display\n\t4525  Double sided CRT\n\t4535  4610 Suremark Printer\n\t4550  NVRAM (128 KB)\n\t4554  Cash Drawer\n\t4580  Hub w/ NVRAM\n\t4581  4800-2xx Hub w/ Cash Drawer\n\t4604  Keyboard w/ Card Reader\n\t4671  4820 LCD w/ MSR/KB\n04b4  Cypress Semiconductor Corp.\n\t0001  Mouse\n\t0002  CY7C63x0x Thermometer\n\t0008  CDC ACM serial port\n\t0033  Mouse\n\t0060  Wireless optical mouse\n\t00f3  FX3 micro-controller (DFU mode)\n\t0100  Cino FuzzyScan F760-B\n\t0101  Keyboard/Hub\n\t0102  Keyboard with APM\n\t0130  MyIRC Remote Receiver\n\t0306  Telephone Receiver\n\t0407  Optical Skype Mouse\n\t0818  AE-SMKD92-* [Thumb Keyboard]\n\t0bad  MetaGeek Wi-Spy\n\t1002  CY7C63001 R100 FM Radio\n\t1006  Human Interface Device\n\t2050  hub\n\t2830  Opera1 DVB-S (cold state)\n\t3813  NANO BIOS Programmer\n\t4235  Monitor 02 Driver\n\t4381  SCAPS USC-1 Scanner Controller\n\t4611  Storage Adapter FX2 (CY)\n\t4616  Flash Disk (TPP)\n\t4624  DS-Xtreme Flash Card\n\t4717  West Bridge\n\t5201  Combi Keyboard-Hub (Hub)\n\t5202  Combi Keyboard-Hub (Keyboard)\n\t5500  HID->COM RS232 Adapter\n\t5a9b  Dacal CD/DVD Library D-101/DC-300/DC-016RW\n\t6022  Hantek DSO-6022BE\n\t602a  Hantek DSO-6022BL\n\t6370  ViewMate Desktop Mouse CC2201\n\t6502  CY4609\n\t6506  CY4603\n\t650a  CY4613\n\t6560  CY7C65640 USB-2.0 \"TetraHub\"\n\t6570  Unprogrammed CY7C65632/34 hub HX2VL\n\t6572  Unprogrammed CY7C65642 hub\n\t6830  CY7C68300A EZ-USB AT2 USB 2.0 to ATA/ATAPI\n\t6831  Storage Adapter ISD-300LP (CY)\n\t7417  Wireless PC Lock/Ultra Mouse\n\t8329  USB To keyboard/Mouse Converter\n\t8613  CY7C68013 EZ-USB FX2 USB 2.0 Development Kit\n\t8614  DTV-DVB UDST7020BDA DVB-S Box(DVBS for MCE2005)\n\t861f  Anysee E30 USB 2.0 DVB-T Receiver\n\tbca1  Barcode Reader\n\tcc04  Centor USB RACIA-ALVAR USB PORT\n\tcc06  Centor-P RACIA-ALVAR USB PORT\n\td5d5  CY7C63x0x Zoltrix Z-Boxer GamePad\n\tde61  Barcode Reader\n\tde64  Barcode Reader\n\tf000  CY30700 Licorice evaluation board\n\tf111  CY8CKIT-002 PSoC MiniProg3 Rev A Program and debug kit\n\tf115  PSoC FirstTouch Programmer\n\tf139  KitProg\n\tf231  DELLY Changer 4in1 universal IR remote\n\tf232  Mono embedded computer\n\tfd10  Gembird MSIS-PM\n\tfd13  Energenie EG-PMS\n\tfd15  Energenie EG-PMS2\n04b5  ROHM LSI Systems USA, LLC\n\t3064  Hantek DSO-3064\n\t6022  Hantek DSO-6022BE\n\t602a  Hantek DSO-6022BL\n04b6  Hint Corp.\n04b7  Compal Electronics, Inc.\n04b8  Seiko Epson Corp.\n\t0001  Stylus Color 740 / Photo 750\n\t0002  ISD Smart Cable for Mac\n\t0003  ISD Smart Cable\n\t0004  Printer\n\t0005  Printer\n\t0006  Printer\n\t0007  Printer\n\t0015  Stylus Photo R3000\n\t0080  SC-P400 Series\n\t0101  GT-7000U [Perfection 636]\n\t0102  GT-2200\n\t0103  GT-6600U [Perfection 610]\n\t0104  GT-7600UF [Perfection 1200U/1200U Photo]\n\t0105  Stylus Scan 2000\n\t0106  Stylus Scan 2500\n\t0107  ES-2000 [Expression 1600U]\n\t0108  CC-700\n\t0109  ES-8500 [Expression 1640 XL]\n\t010a  GT-8700/GT-8700F [Perfection 1640SU/1640SU PHOTO]\n\t010b  GT-7700U [Perfection 1240U]\n\t010c  GT-6700U [Perfection 640]\n\t010d  CC-500L\n\t010e  ES-2200 [Perfection 1680]\n\t010f  GT-7200U [Perfection 1250/1250 PHOTO]\n\t0110  GT-8200U/GT-8200UF [Perfection 1650/1650 PHOTO]\n\t0112  GT-9700F [Perfection 2450 PHOTO]\n\t0114  Perfection 660\n\t0116  GT-9400UF [Perfection 3170]\n\t0118  GT-F600 [Perfection 4180]\n\t0119  GT-X750 [Perfection 4490 Photo]\n\t011a  CC-550L [1000 ICS]\n\t011b  GT-9300UF [Perfection 2400 PHOTO]\n\t011c  GT-9800F [Perfection 3200]\n\t011d  GT-7300U [Perfection 1260/1260 PHOTO]\n\t011e  GT-8300UF [Perfection 1660 PHOTO]\n\t011f  GT-8400UF [Perfection 1670/1670 PHOTO]\n\t0120  GT-7400U [Perfection 1270]\n\t0121  GT-F500/GT-F550 [Perfection 2480/2580 PHOTO]\n\t0122  GT-F520/GT-F570 [Perfection 3590 PHOTO]\n\t0126  ES-7000H [GT-15000]\n\t0128  GT-X700 [Perfection 4870]\n\t0129  ES-10000G [Expression 10000XL]\n\t012a  GT-X800 [Perfection 4990 PHOTO]\n\t012b  ES-H300 [GT-2500]\n\t012c  GT-X900 [Perfection V700/V750 Photo]\n\t012d  GT-F650 [GT-S600/Perfection V10/V100]\n\t012e  GT-F670 [Perfection V200 Photo]\n\t012f  GT-F700 [Perfection V350]\n\t0130  GT-X770 [Perfection V500]\n\t0131  GT-F720 [GT-S620/Perfection V30/V300 Photo]\n\t0133  GT-1500 [GT-D1000]\n\t0135  GT-X970\n\t0136  ES-D400 [GT-S80]\n\t0137  ES-D200 [GT-S50]\n\t0138  ES-H7200 [GT-20000]\n\t013a  GT-X820 [Perfection V600 Photo]\n\t0142  GT-F730 [GT-S630/Perfection V33/V330 Photo]\n\t0143  GT-S55\n\t0144  GT-S85\n\t0151  Perfection V800 Photo\n\t0202  Interface Card UB-U05 for Thermal Receipt Printers [M129C/TM-T70/TM-T88IV]\n\t0401  CP 800 Digital Camera\n\t0402  PhotoPC 850z\n\t0403  PhotoPC 3000z\n\t0509  JVC PIX-MC10\n\t0601  Stylus Photo 875DC Card Reader\n\t0602  Stylus Photo 895 Card Reader\n\t0801  CC-600PX [Stylus CX5200/CX5400/CX6600]\n\t0802  CC-570L [Stylus CX3100/CX3200]\n\t0803  Printer (Composite Device)\n\t0804  Storage Device\n\t0805  Stylus CX6300/CX6400\n\t0806  PM-A850 [Stylus Photo RX600/610]\n\t0807  Stylus Photo RX500/510\n\t0808  Stylus CX5200/CX5300/CX5400\n\t0809  Storage Device\n\t080a  F-3200\n\t080c  ME100 [Stylus CX1500]\n\t080d  Stylus CX4500/4600\n\t080e  PX-A550 [CX-3500/3600/3650 MFP]\n\t080f  Stylus Photo RX420/RX425/RX430\n\t0810  PM-A900 [Stylus Photo RX700]\n\t0811  PM-A870 [Stylus Photo RX620/RX630]\n\t0812  MFP Composite Device\n\t0813  Stylus CX6500/6600\n\t0814  PM-A700\n\t0815  LP-A500 [AcuLaser CX1]\n\t0816  Printer (Composite Device)\n\t0817  LP-M5500/LP-M5500F\n\t0818  Stylus CX3700/CX3800/DX3800\n\t0819  PX-A650 [Stylus CX4700/CX4800/DX4800/DX4850]\n\t081a  PM-A750 [Stylus Photo RX520/RX530]\n\t081b  MFP Composite Device\n\t081c  PM-A890 [Stylus Photo RX640/RX650]\n\t081d  PM-A950\n\t081e  MFP Composite Device\n\t081f  Stylus CX7700/7800\n\t0820  Stylus CX4100/CX4200/DX4200\n\t0821  Stylus CX5700F/CX5800F\n\t0822  Storage Device\n\t0823  MFP Composite Device\n\t0824  Storage Device\n\t0825  MFP Composite Device\n\t0826  Storage Device\n\t0827  PM-A820 [Stylus Photo RX560/RX580/RX585/RX590]\n\t0828  PM-A970\n\t0829  PM-T990\n\t082a  PM-A920\n\t082b  Stylus CX5900/CX5000/DX5000/DX5050\n\t082c  Storage Device\n\t082d  Storage Device\n\t082e  PX-A720 [Stylus CX5900/CX6000/DX6000]\n\t082f  PX-A620 [Stylus CX3900/DX4000/DX4050]\n\t0830  ME 200 [Stylus CX2800/CX2900]\n\t0831  Stylus CX6900F/CX7000F/DX7000F\n\t0832  MFP Composite Device\n\t0833  LP-M5600\n\t0834  LP-M6000\n\t0835  AcuLaser CX21\n\t0836  PM-T960\n\t0837  PM-A940 [Stylus Photo RX680/RX685/RX690]\n\t0838  PX-A640 [CX7300/CX7400/DX7400]\n\t0839  PX-A740 [CX8300/CX8400/DX8400]\n\t083a  PX-FA700 [CX9300F/CX9400Fax/DX9400F]\n\t083b  MFP Composite Device\n\t083c  PM-A840S [Stylus Photo RX595/RX610]\n\t083d  MFP Composite Device\n\t083e  MFP Composite Device\n\t083f  Stylus CX4300/CX4400/CX5500/CX5600/DX4400/DX4450\n\t0841  PX-401A [ME 300/Stylus NX100]\n\t0843  LP-M5000\n\t0844  EP-901A/EP-901F [Artisan 800/Stylus Photo PX800FW]\n\t0846  EP-801A [Artisan 700/Stylus Photo PX700W/TX700W]\n\t0847  PX-601F [ME Office 700FW/Stylus Office BX600FW/TX600FW]\n\t0848  ME Office 600F/Stylus Office BX300F/TX300F\n\t0849  Stylus SX205\n\t084a  PX-501A [Stylus NX400]\n\t084d  PX-402A [Stylus SX115/Stylus NX110 Series]\n\t084f  Multifunctional Printer Scanner [ME Office 510 / Epson Stylus SX215]\n\t0850  EP-702A [Stylus Photo PX650/TX650 Series]\n\t0851  Stylus SX410\n\t0852  EP-802A [Artisan 710 Series/Stylus Photo PX710W/TX720W Series]\n\t0853  EP-902A [Artisan 810 Series/Stylus Photo PX810FW Series]\n\t0854  ME OFFICE 650FN Series/Stylus Office BX310FN/TX520FN Series\n\t0855  PX-602F [Stylus Office BX610FW/TX620FW Series]\n\t0856  PX-502A [Stylus SX515W]\n\t085c  ME 320/330 Series [Stylus SX125]\n\t085d  PX-603F [ME OFFICE 960FWD Series/Stylus Office BX625FWD/TX620FWD Series]\n\t085e  PX-503A [ME OFFICE 900WD Series/Stylus Office BX525WD]\n\t085f  Stylus Office BX320FW/TX525FW Series\n\t0860  EP-903A/EP-903F [Artisan 835/Stylus Photo PX820FWD Series]\n\t0861  EP-803A/EP-803AW [Artisan 725/Stylus Photo PX720WD/TX720WD Series]\n\t0862  EP-703A [Stylus Photo PX660 Series]\n\t0863  ME OFFICE 620F Series/Stylus Office BX305F/BX305FW/TX320F\n\t0864  ME OFFICE 560W Series\n\t0865  ME OFFICE 520 Series\n\t0866  AcuLaser MX20DN/MX20DNF/MX21DNF\n\t0869  PX-1600F\n\t086a  PX-673F [Stylus Office BX925FWD]\n\t0870  Stylus Office BX305FW Plus\n\t0871  K200 Series\n\t0872  K300 Series\n\t0873  L200 Series\n\t0878  EP-704A\n\t0879  EP-904A/EP-904F [Artisan 837/Stylus Photo PX830FWD Series]\n\t087b  EP-804A/EP-804AR/EP-804AW [Stylus Photo PX730WD/Artisan 730 Series]\n\t087c  PX-1700F\n\t087d  PX-B750F/WP-4525 Series\n\t087f  PX-403A\n\t0880  PX-434A [Stylus NX330 Series]\n\t0881  PX-404A [ME OFFICE 535]\n\t0883  ME 340 Series/Stylus NX130 Series\n\t0884  Stylus NX430W Series\n\t0885  Stylus NX230/SX235W Series\n\t088f  Stylus Office BX635FWD\n\t0890  ME OFFICE 940FW Series/Stylus Office BX630FW Series\n\t0891  Stylus Office BX535WD\n\t0892  Stylus Office BX935FWD\n\t0893  EP-774A\n\t08d1  L220/L360 Series\n\t0e03  Thermal Receipt Printer [TM-T20]\n\t0e31  Thermal Receipt Printer [TM-L100]\n\t1114  XP-440 [Expression Home Small-in-One Printer]\n\t1115  ES-0133 [Expression Home XP-342]\n\t1129  ET-4750 [WorkForce ET-4750 EcoTank All-in-One]\n\t1168  Workforce WF-7820/7840 Series\n\t1186  ET-2820 Series [ET-2820 EcoTank All-in-One]\n\t118a  ET-2810/L3250 Series [EcoTank ET-2810/L3250]\n\t118b  ET-2850/L4260 Series [EcoTank ET-2850/L4260]\n\t11b0  XP-4200 Series [Expression Home XP-4200]\n\t11b9  ET-2830/L3550 Series [EcoTank ET-2830/L3550]\n\t11c8  ET-2860/L3270 Series [EcoTank ET-2860/L3270]\n04b9  Rainbow Technologies, Inc.\n\t0300  SafeNet USB SuperPro/UltraPro\n\t1000  iKey 1000 Token\n\t1001  iKey 1200 Token\n\t1002  iKey Token\n\t1003  iKey Token\n\t1004  iKey Token\n\t1005  iKey Token\n\t1006  iKey Token\n\t1200  iKey 2000 Token\n\t1201  iKey Token\n\t1202  iKey 2032 Token\n\t1203  iKey Token\n\t1204  iKey Token\n\t1205  iKey Token\n\t1206  iKey 4000 Token\n\t1300  iKey 3000 Token\n\t1301  iKey 3000\n\t1302  iKey Token\n\t1303  iKey Token\n\t1304  iKey Token\n\t1305  iKey Token\n\t1306  iKey Token\n\t8000  SafeNet Sentinel Hardware Key\n04ba  Toucan Systems, Ltd\n04bb  I-O Data Device, Inc.\n\t0101  USB2-IDE/ATAPI Bridge Adapter\n\t014a  HDCL-UT\n\t0201  USB2-IDE/ATAPI Bridge Adapter\n\t0204  DVD Multi-plus unit iU-CD2\n\t0206  DVD Multi-plus unit DVR-UEH8\n\t0301  Storage Device\n\t0314  USB-SSMRW SD-card\n\t0319  USB2-IDE/ATAPI Bridge Adapter\n\t031a  USB2-IDE/ATAPI Bridge Adapter\n\t031b  USB2-IDE/ATAPI Bridge Adapter\n\t031e  USB-SDRW SD-card\n\t0502  Nogatech Live! (BT)\n\t0528  GV-USB Video Capture\n\t0901  USB ETT\n\t0904  ET/TX Ethernet [pegasus]\n\t0913  ET/TX-S Ethernet [pegasus2]\n\t0919  USB WN-B11\n\t0922  IOData AirPort WN-B11/USBS 802.11b\n\t0930  ETG-US2\n\t0937  WN-WAG/USL Wireless LAN Adapter\n\t0938  WN-G54/USL Wireless LAN Adapter\n\t093b  WN-GDN/USB\n\t093f  WNGDNUS2 802.11n\n\t0944  WHG-AGDN/US Wireless LAN Adapter\n\t0945  WN-GDN/US3 Wireless LAN Adapter\n\t0947  WN-G150U Wireless LAN Adapter\n\t0948  WN-G300U Wireless LAN Adapter\n\t0a03  Serial USB-RSAQ1\n\t0a07  USB2-iCN Adapter\n\t0a08  USB2-iCN Adapter\n\t0c01  FM-10 Pro Disk\n04bd  Toshiba Electronics Taiwan Corp.\n04be  Telia Research AB\n04bf  TDK Corp.\n\t0100  MediaReader CF\n\t0115  USB-PDC Adapter UPA9664\n\t0116  USB-cdmaOne Adapter UCA1464\n\t0117  USB-PHS Adapter UHA6400\n\t0118  USB-PHS Adapter UPA6400\n\t0135  MediaReader Dual\n\t0202  73S1121F Smart Card Reader-\n\t0309  Bluetooth USB dongle\n\t030a  IBM Bluetooth Ultraport Module\n\t030b  Bluetooth Device\n\t030c  Ultraport Bluetooth Device\n\t0310  Integrated Bluetooth\n\t0311  Integrated Bluetooth Device\n\t0317  Bluetooth UltraPort Module from IBM\n\t0318  IBM Integrated Bluetooth\n\t0319  Bluetooth Adapter\n\t0320  Bluetooth Adapter\n\t0321  Bluetooth Device\n\t0a28  INDI AV-IN Device\n\t1301  Network Controller\n\t1302  i3 Gateway\n\t1303  i3 Micro Module\n\t1304  i3 Module\n\t1305  i3 Multi Sensing Module\n\t1400  Javelin Module Recovery\n\t1401  Javelin Module\n\t1500  Gas sensor demo board\n04c1  U.S. Robotics (3Com)\n\t0020  56K Voice Pro\n\t0022  56K Voice Pro\n\t007e  ISDN TA\n\t0082  OfficeConnect Analog Modem\n\t008f  Pro ISDN TA\n\t0097  OfficeConnect Analog\n\t009d  HomeConnect Webcam [vicam]\n\t00a9  ISDN Pro TA-U\n\t00b9  HomeConnect IDSL Modem\n\t3021  56k Voice FaxModem Pro\n04c2  Methode Electronics Far East PTE, Ltd\n04c3  Maxi Switch, Inc.\n\t1102  Mouse\n\t2102  Mouse\n04c4  Lockheed Martin Energy Research\n04c5  Fujitsu, Ltd\n\t1029  fi-4010c Scanner\n\t1033  fi-4110CU\n\t1041  fi-4120c Scanner\n\t1042  fi-4220c Scanner\n\t105b  AH-F401U Air H device\n\t1084  PalmSecure Sensor V2\n\t1096  fi-5110EOX\n\t1097  fi-5110C\n\t10ae  fi-4120C2\n\t10af  fi-4220C2\n\t10c7  fi-60f scanner\n\t10e0  fi-5120c Scanner\n\t10e1  fi-5220C\n\t10e7  fi-5900C\n\t10fe  S500\n\t1104  KD02906 Line Thermal Printer\n\t114f  fi-6130\n\t1150  fi-6230\n\t11f3  fi-6130Z\n\t125a  PalmSecure Sensor Device - MP\n\t132e  fi-7160\n\t1526  PalmSecure-F Pro\n\t159f  ScanSnap iX1500\n\t15ff  Fi-8170 Document Scanner [Ricoh fi-8170: High Performance Desktop Scanner - PFU]\n\t200f  Sigma DP2 (Mass Storage)\n\t2010  Sigma DP2 (PictBridge)\n\t201d  SATA 3.0 6Gbit/s Adaptor [GROOVY]\n04c6  Toshiba America Electronic Components\n04c7  Micro Macro Technologies\n04c8  Konica Corp.\n\t0720  Digital Color Camera\n\t0721  e-miniD Camera\n\t0722  e-mini\n\t0723  KD-200Z Camera\n\t0726  KD-310Z Camera\n\t0728  Revio C2 Mass Storage Device\n\t0729  Revio C2 Digital Camera\n\t072c  Revio KD20M\n\t072d  Revio KD410Z\n04ca  Lite-On Technology Corp.\n\t0020  USB Keyboard\n\t003a  Multimedia Keyboard\n\t004b  Keyboard\n\t004f  SK-9020 keyboard\n\t008a  Acer Wired Mouse Model SM-9023\n\t00f9  Multimedia Keyboard\n\t1766  HID Monitor Controls\n\t2004  Bluetooth 4.0 [Broadcom BCM20702A0]\n\t2006  Broadcom BCM43142A0 Bluetooth Device\n\t2007  Broadcom BCM43142A0 Bluetooth Device\n\t3005  Atheros Bluetooth\n\t300b  Atheros AR3012 Bluetooth\n\t300d  Atheros AR3012 Bluetooth\n\t300f  Atheros AR3012 Bluetooth\n\t3014  Qualcomm Atheros Bluetooth\n\t3015  Qualcomm Atheros QCA9377 Bluetooth\n\t3802  MediaTek Bluetooth MT7921\n\t7022  HP HD Webcam\n\t7025  HP HD Webcam\n\t7046  TOSHIBA Web Camera - HD\n\t7054  HP HD Webcam\n\t705a  HD Webcam (960×540)\n\t9304  Hub\n\tf01c  TT1280DA DVB-T TV Tuner\n04cb  Fuji Photo Film Co., Ltd\n\t0100  FinePix 30i/40i/50i, A101/201, 1300/2200, 1400/2400/2600/2800/4500/4700/4800/4900/6800/6900 Zoom\n\t0103  FinePix NX-500/NX-700 printer\n\t0104  FinePix A101, 2600/2800/4800/6800 Zoom (PC CAM)\n\t0108  FinePix F601 Zoom (DSC)\n\t0109  FinePix F601 Zoom (PC CAM)\n\t010a  FinePix S602 (Pro) Zoom (DSC)\n\t010b  FinePix S602 (Pro) Zoom (PC CAM)\n\t010d  FinePix S2 pro\n\t010e  FinePix F402 Zoom (DSC)\n\t010f  FinePix F402 Zoom (PC CAM)\n\t0110  FinePix M603 Zoom (DSC)\n\t0111  FinePix M603 Zoom (PC CAM)\n\t0112  FinePix A202, A200 Zoom (DSC)\n\t0113  FinePix A202, A200 Zoom (PC CAM)\n\t0114  FinePix F401 Zoom (DSC)\n\t0115  FinePix F401 Zoom (PC CAM)\n\t0116  FinePix A203 Zoom (DSC)\n\t0117  FinePix A203 Zoom (PC CAM)\n\t0118  FinePix A303 Zoom (DSC)\n\t0119  FinePix A303 Zoom (PC CAM)\n\t011a  FinePix S304/3800 Zoom (DSC)\n\t011b  FinePix S304/3800 Zoom (PC CAM)\n\t011c  FinePix A204/2650 Zoom (DSC)\n\t011d  FinePix A204/2650 Zoom (PC CAM)\n\t0120  FinePix F700 Zoom (DSC)\n\t0121  FinePix F700 Zoom (PC CAM)\n\t0122  FinePix F410 Zoom (DSC)\n\t0123  FinePix F410 Zoom (PC CAM)\n\t0124  FinePix A310 Zoom (DSC)\n\t0125  FinePix A310 Zoom (PC CAM)\n\t0126  FinePix A210 Zoom (DSC)\n\t0127  FinePix A210 Zoom (PC CAM)\n\t0128  FinePix A205(S) Zoom (DSC)\n\t0129  FinePix A205(S) Zoom (PC CAM)\n\t012a  FinePix F610 Zoom (DSC)\n\t012b  FinePix Digital Camera 030513\n\t012c  FinePix S7000 Zoom (DSC)\n\t012d  FinePix S7000 Zoom (PC CAM)\n\t012f  FinePix Digital Camera 030731\n\t0130  FinePix S5000 Zoom (DSC)\n\t0131  FinePix S5000 Zoom (PC CAM)\n\t013b  FinePix Digital Camera 030722\n\t013c  FinePix S3000 Zoom (DSC)\n\t013d  FinePix S3000 Zoom (PC CAM)\n\t013e  FinePix F420 Zoom (DSC)\n\t013f  FinePix F420 Zoom (PC CAM)\n\t0142  FinePix S7000 Zoom (PTP)\n\t0148  FinePix A330 Zoom (DSC)\n\t0149  FinePix A330 Zoom (UVC)\n\t014a  FinePix A330 Zoom (PTP)\n\t014b  FinePix A340 Zoom (DSC)\n\t014c  FinePix A340 Zoom (UVC)\n\t0159  FinePix F710 Zoom (DSC)\n\t0165  FinePix S3500 Zoom (DSC)\n\t0168  FinePix E500 Zoom (DSC)\n\t0169  FinePix E500 Zoom (UVC)\n\t016b  FinePix E510 Zoom (DSC)\n\t016c  FinePix E510 Zoom (PC CAM)\n\t016e  FinePix S5500 Zoom (DSC)\n\t016f  FinePix S5500 Zoom (UVC)\n\t0171  FinePix E550 Zoom (DSC)\n\t0172  FinePix E550 Zoom (UVC)\n\t0177  FinePix F10 (DSC)\n\t0179  Finepix F10 (PTP)\n\t0186  FinePix S5200/S5600 Zoom (DSC)\n\t0188  FinePix S5200/S5600 Zoom (PTP)\n\t018e  FinePix S9500 Zoom (DSC)\n\t018f  FinePix S9500 Zoom (PTP)\n\t0192  FinePix E900 Zoom (DSC)\n\t0193  FinePix E900 Zoom (PTP)\n\t019b  FinePix F30 (PTP)\n\t01af  FinePix A700 (PTP)\n\t01bf  FinePix F6000fd/S6500fd Zoom (PTP)\n\t01c0  FinePix F20 (PTP)\n\t01c1  FinePix F31fd (PTP)\n\t01c3  FinePix S5 Pro\n\t01c4  FinePix S5700 Zoom (PTP)\n\t01c5  FinePix F40fd (PTP)\n\t01c6  FinePix A820 Zoom (PTP)\n\t01d2  FinePix A800 Zoom (PTP)\n\t01d3  FinePix A920 (PTP)\n\t01d4  FinePix F50fd (PTP)\n\t01d5  FinePix F47 (PTP)\n\t01e7  Fujifilm A850 Digital Camera\n\t01f7  FinePix J250 (PTP)\n\t01fd  A160\n\t023e  FinePix AX300\n\t0240  FinePix S2950 Digital Camera\n\t0241  FinePix S3200 Digital Camera\n\t0278  FinePix JV300\n\t02c5  FinePix S9900W Digital Camera (PTP)\n\t02e0  X-T200 Digital Camera\n\t5006  ASK-300\n\t5007  DX100\n04cc  ST-Ericsson\n\t1122  Hub\n\t1520  USB 2.0 Hub (Avocent KVM)\n\t1521  USB 2.0 Hub\n\t1a62  GW Instek GSP-830 Spectrum Analyzer (HID)\n\t2323  Ux500 serial debug port\n\t2533  NFC device (PN533)\n\t8116  Camera\n04cd  Tatung Co. Of America\n04ce  ScanLogic Corp.\n\t0002  SL11R-IDE IDE Bridge\n\t0100  USB2PRN Printer Class\n\t0300  Phantom 336CX - C3 scanner\n\t04ce  SL11DEMO, VID: 0x4ce, PID: 0x4ce\n\t07d1  SL11R, VID: 0x4ce, PID: 0x07D1\n04cf  Myson Century, Inc.\n\t0022  OCZ Alchemy Series Elixir II Keyboard\n\t0800  MTP800 Mass Storage Device\n\t8810  CS8810 Mass Storage Device\n\t8811  CS8811 Mass Storage Device\n\t8813  CS8813 Mass Storage Device\n\t8818  USB2.0 to ATAPI Bridge Controller\n\t8819  USB 2.0 SD/MMC Reader\n\t9920  CS8819A2-114 Mass Storage Device\n04d0  Digi International\n04d1  ITT Canon\n04d2  Altec Lansing Technologies\n\t0070  ADA70 Speakers\n\t0305  Non-Compliant Audio Device\n\t0311  ADA-310 Speakers\n\t2060  Claritel-i750 - vp\n\tff05  ADA-305 Speakers\n\tff47  Lansing HID Audio Controls\n\tff49  Lansing HID Audio Controls\n04d3  VidUS, Inc.\n04d4  LSI Logic, Inc.\n04d5  Forte Technologies, Inc.\n04d6  Mentor Graphics\n\te301  Bio-Key TouchLock XL All Weather Keyless Bio-Lock with Fingerprint Recognition\n\te302  ZC3202 [4GB Green Book Digital Quran Reading Pen For Home Teaching Quran]\n04d7  Oki Semiconductor\n\t1be4  Bluetooth Device\n04d8  Microchip Technology, Inc.\n\t0002  PicoLCD 20x2\n\t0003  PICkit 2 Microcontroller Programmer\n\t000a  CDC RS-232 Emulation Demo\n\t000b  PIC18F2550 (32K Flashable 10 Channel, 10 Bit A/D USB Microcontroller)\n\t0032  PICkit1\n\t0033  PICkit2\n\t0036  PICkit Serial Analyzer\n\t00dd  MCP2221(a) UART/I2C Bridge\n\t00e0  PIC32 Starter Board\n\t04cd  28Cxxx EEPROM Programmer\n\t0a04  AGP LIN Serial Analyzer\n\t8000  In-Circuit Debugger\n\t8001  ICD2 in-circuit debugger\n\t8101  PIC24F Starter Kit\n\t8107  Microstick II\n\t8108  ChipKit Pro MX7 (PIC32MX)\n\t9004  Microchip REAL ICE\n\t9009  ICD3\n\t900a  PICkit3\n\t9012  PICkit4\n\t9015  ICD 4 In-Circuit Debugger\n\tc001  PicoLCD 20x4\n\te11c  TL866CS EEPROM Programmer [MiniPRO]\n\te72e  YuanCon\n\te7ee  travisgeis.com Bike Light\n\tec72  Joystick with Rotary Switch Creative Electronics Ltd\n\ted16  BeamiRC 2.0 CNC remote controller analoge\n\tedb4  micro PLC (ATSAMD51G19A) [Black Brix ECU II]\n\tedb5  ATMEGA32U4 [Black Brix ECU]\n\tf2c4  Macareux-labs Hygrometry Temperature Sensor\n\tf2f7  Yepkit YKUSH\n\tf3aa  Macareux-labs Usbce Bootloader mode\n\tf437  SBE Tech Ultrasonic Anemometer\n\tf4b5  SmartScope\n\tf5fe  TrueRNG\n\tf8da  Hughski Ltd. ColorHug\n\tf8e8  Harmony 300/350 Remote\n\tf91c  SPROG IIv3\n\tfaff  Dangerous Prototypes BusPirate v4 Bootloader mode\n\tfb00  Dangerous Prototypes BusPirate v4\n\tfbb2  GCUSB-nStep stepper motor controller\n\tfbba  DiscFerret Magnetic Disc Analyser (bootloader mode)\n\tfbbb  DiscFerret Magnetic Disc Analyser (active mode)\n\tfc1e  Bachrus Speedometer Interface\n\tfc92  Open Bench Logic Sniffer\n\tffee  Devantech USB-ISS\n\tffef  PICoPLC [APStech]\n04d9  Holtek Semiconductor, Inc.\n\t0006  Wired Keyboard (78/79 key) [RPI Wired Keyboard 5]\n\t0022  Portable Keyboard\n\t0129  Keyboard [KBPV8000]\n\t0169  Keyboard\n\t0198  Keyboard\n\t0348  Keyboard\n\t0407  Keyboard [TEX Shinobi]\n\t0462  Laser Gaming mouse\n\t048e  Optical Mouse\n\t0499  Optical Mouse\n\t1135  Mouse [MGK-15BU/MLK-15BU]\n\t1203  Keyboard\n\t1400  PS/2 keyboard + mouse controller\n\t1503  Keyboard\n\t1603  Keyboard\n\t1605  Keyboard\n\t1702  Keyboard LKS02\n\t1818  Keyboard [Diatec Filco Majestouch 2]\n\t2011  Keyboard [Diatec Filco Majestouch 1]\n\t2013  Keyboard [Das Keyboard]\n\t2206  Fujitsu Siemens Mouse Esprimo Q\n\t2221  Keyboard\n\t2323  Keyboard\n\t2519  Shenzhen LogoTech 2.4GHz receiver\n\t2832  HT82A832R Audio MCU\n\t2834  HT82A834R Audio MCU\n\t4545  Keyboard [Diatec Majestouch 2 Tenkeyless]\n\ta01c  wireless multimedia keyboard with trackball [Trust ADURA 17911]\n\ta050  Chatman V1\n\ta052  USB-zyTemp\n\ta055  Keyboard\n\ta075  Optical Gaming Mouse\n\ta096  Keyboard\n\ta09f  E-Signal LUOM G10 Mechanical Gaming Mouse\n\ta100  Mouse [HV-MS735]\n\ta11b  Mouse [MX-3200]\n\ta153  Optical Gaming Mouse\n\ta29f  Microarray fingerprint reader\n\tb534  LGT8F328P Microprocessor\n\te002  MCU\n\tfc2a  Gaming Mouse [Redragon M709]\n\tfc30  Gaming Mouse [Redragon M711]\n\tfc38  Gaming Mouse [Redragon M602-RGB]\n\tfc4d  Gaming Mouse [Redragon M908]\n\tfc55  Venus MMO Gaming Mouse\n04da  Panasonic (Matsushita)\n\t0901  LS-120 Camera\n\t0912  SDR-S10\n\t0b01  CD-R/RW Drive\n\t0b03  SuperDisk 240MB\n\t0d01  CD-R Drive KXL-840AN\n\t0d09  CD-R Drive KXL-RW32AN\n\t0d0a  CD-R Drive KXL-CB20AN\n\t0d0d  CDRCB03\n\t0d0e  DVD-ROM & CD-R/RW\n\t0d14  DVD-RAM MLT08\n\t0f07  KX-MB2030 Multifunction Laser Printer\n\t0f40  Printer\n\t104d  Elite Panaboard UB-T880 (HID)\n\t104e  Elite Panaboard Pen Adaptor (HID)\n\t1500  MFSUSB Driver\n\t1800  DY-WL10 802.11abgn Adapter [Broadcom BCM4323]\n\t1b00  MultiMediaCard\n\t2121  EB-VS6\n\t2316  DVC Mass Storage Device\n\t2317  DVC USB-SERIAL Driver for WinXP\n\t2318  NV-GS11/230/250 (webcam mode)\n\t2319  NV-GS15 (webcam mode)\n\t231a  NV-GS11/230/250 (DV mode)\n\t231d  DVC Web Camera Device\n\t231e  DVC DV Stream Device\n\t2372  Lumix Camera (Storage mode)\n\t2374  Lumix Camera (PTP mode)\n\t2451  HDC-SD9\n\t245b  HC-X920K (3MOS Full HD video camcorder)\n\t2477  SDR-H85 Camcorder (PC mode)\n\t2478  SDR-H85 Camcorder (recorder mode - SD card)\n\t2479  SDR-H85 Camcorder (recorder mode - HDD)\n\t2497  HDC-TM700\n\t250c  Gobi Wireless Modem (QDL mode)\n\t250d  Gobi Wireless Modem\n\t3904  N5HBZ0000055 802.11abgn Wireless Adapter [Atheros AR7010+AR9280]\n\t3908  N5HBZ0000062 802.11abgn Wireless Adapter [Atheros AR9374v1.1]\n\t3c04  JT-P100MR-20 [ePassport Reader]\n04db  Hypertec Pty, Ltd\n04dc  Huan Hsin Holdings, Ltd\n04dd  Sharp Corp.\n\t13a6  MFC2000\n\t6006  AL-1216\n\t6007  AL-1045\n\t6008  AL-1255\n\t6009  AL-1530CS\n\t600a  AL-1540CS\n\t600b  AL-1456\n\t600c  AL-1555\n\t600d  AL-1225\n\t600e  AL-1551CS\n\t600f  AR-122E\n\t6010  AR-152E\n\t6011  AR-157E\n\t6012  SN-1045\n\t6013  SN-1255\n\t6014  SN-1456\n\t6015  SN-1555\n\t6016  AR-153E\n\t6017  AR-122E N\n\t6018  AR-153E N\n\t6019  AR-152E N\n\t601a  AR-157E N\n\t601b  AL-1217\n\t601c  AL-1226\n\t601d  AR-123E\n\t6021  IS01\n\t7002  DVC Ver.1.0\n\t7004  VE-CG40U Digital Still Camera\n\t7005  VE-CG30 Digital Still Camera\n\t7007  VL-Z7S Digital Camcorder\n\t8004  Zaurus SL-5000D/SL-5500 PDA\n\t8005  Zaurus A-300\n\t8006  Zaurus SL-B500/SL-5600 PDA\n\t8007  Zaurus C-700 PDA\n\t9009  AR-M160\n\t9014  IM-DR80 Portable NetMD Player\n\t9031  Zaurus C-750/C-760/C-860/SL-C3000 PDA\n\t9032  Zaurus SL-6000\n\t903a  GSM GPRS\n\t9050  Zaurus C-860 PDA\n\t9056  Viewcam Z\n\t9073  AM-900\n\t9074  GSM GPRS\n\t90a9  Sharp Composite\n\t90d0  USB-to-Serial Comm. Port\n\t90f2  Sharp 3G GSM USB Control\n\t9120  WS004SH\n\t9122  WS007SH\n\t9123  W-ZERO3 ES Smartphone\n\t91a3  922SH Internet Machine\n\t939a  IS03\n04de  MindShare, Inc.\n04df  Interlink Electronics\n04e1  Iiyama North America, Inc.\n\t0201  Monitor Hub\n04e2  Exar Corp.\n\t0801  XR22801 Hub\n\t0802  XR22802 Hub\n\t0804  XR22804 Hub\n\t1100  XR2280x I2C Controller\n\t1200  XR2280x GPIO Controller\n\t1300  XR2280x 10/100 Ethernet\n\t1400  XR2280x UART Channel A\n\t1401  XR2280x UART Channel B\n\t1402  XR2280x UART Channel C\n\t1403  XR2280x UART Channel D\n\t1410  XR21V1410 USB-UART IC\n\t1411  XR21B1411 UART\n\t1412  XR21V1412 2-channel UART\n\t1414  XR21V1414 4-channel UART\n\t1420  XR21B1420 UART\n\t1422  XR21B1422 2-channel UART\n\t1424  XR21B1424 4-channel UART\n04e3  Zilog, Inc.\n04e4  ACC Microelectronics\n04e5  Promise Technology\n04e6  SCM Microsystems, Inc.\n\t0001  E-USB ATA Bridge\n\t0002  eUSCSI SCSI Bridge\n\t0003  eUSB SmartMedia Card Reader\n\t0005  eUSB SmartMedia/CompactFlash Card Reader\n\t0006  eUSB SmartMedia Card Reader\n\t0007  Hifd\n\t0009  eUSB ATA/ATAPI Adapter\n\t000a  eUSB CompactFlash Adapter\n\t000b  eUSCSI Bridge\n\t000c  eUSCSI Bridge\n\t000d  Dazzle MS\n\t0012  Dazzle SD/MMC\n\t0101  eUSB ATA Bridge (Sony Spressa USB CDRW)\n\t0311  Dazzle DM-CF\n\t0312  Dazzle DM-SD/MMC\n\t0313  Dazzle SM\n\t0314  Dazzle MS\n\t0322  e-Film Reader-5\n\t0325  eUSB ORCA Quad Reader\n\t0327  Digital Media Reader\n\t03fe  DMHS2 DFU Adapter\n\t0406  eUSB SmartDM Reader\n\t04e6  eUSB DFU Adapter\n\t04e7  STCII DFU Adapter\n\t04e8  eUSBDM DFU Adapter\n\t04e9  DM-E DFU Adapter\n\t0500  Veridicom 5thSense Fingerprint Sensor and eUSB SmartCard\n\t0701  DCS200 Loader Device\n\t0702  DVD Creation Station 200\n\t0703  DVC100 Loader Device\n\t0704  Digital Video Creator 100\n\t1001  SCR300 Smart Card Reader\n\t1010  USBAT-2 CompactFlash Card Reader\n\t1014  e-Film Reader-3\n\t1020  USBAT ATA/ATAPI Adapter\n\t2007  RSA SecurID ComboReader\n\t2009  Citibank Smart Card Reader\n\t200a  Reflex v.2 Smart Card Reader\n\t200d  STR391 Reader\n\t5111  SCR331-DI SmartCard Reader\n\t5113  SCR333 SmartCard Reader\n\t5114  SCR331-DI SmartCard Reader\n\t5115  SCR335 SmartCard Reader\n\t5116  SCR331-LC1 / SCR3310 SmartCard Reader\n\t5117  SCR3320 - Smart Card Reader\n\t5118  Expresscard SIM Card Reader\n\t5119  SCR3340 - ExpressCard54 Smart Card Reader\n\t511b  SmartCard Reader\n\t511d  SCR3311 Smart Card Reader\n\t5120  SCR331-DI SmartCard Reader\n\t5121  SDI010 Smart Card Reader\n\t5151  SCR338 Keyboard Smart Card Reader\n\t5292  SCL011 RFID reader\n\t5410  SCR35xx Smart Card Reader\n\t5591  SCL3711-NFC&RW\n\t5810  uTrust 2700 R Smart Card Reader\n\te000  SCRx31 Reader\n\te001  SCR331 SmartCard Reader\n\te003  SPR532 PinPad SmartCard Reader\n04e7  Elo TouchSystems\n\t0001  TouchScreen\n\t0002  Touchmonitor Interface 2600 Rev 2\n\t0004  4000U CarrollTouch® Touchmonitor Interface\n\t0007  2500U IntelliTouch® Touchmonitor Interface\n\t0008  3000U AccuTouch® Touchmonitor Interface\n\t0009  4000U CarrollTouch® Touchmonitor Interface\n\t0020  Touchscreen Interface (2700)\n\t0021  Touchmonitor Interface\n\t0030  4500U CarrollTouch® Touchmonitor Interface\n\t0032  Touchmonitor Interface\n\t0033  Touchmonitor Interface\n\t0041  5010 Surface Capacitive Touchmonitor Interface\n\t0042  Touchmonitor Interface\n\t0050  2216 AccuTouch® Touchmonitor Interface\n\t0071  Touchmonitor Interface\n\t0072  Touchmonitor Interface\n\t0081  Touchmonitor Interface\n\t0082  Touchmonitor Interface\n\t00ff  Touchmonitor Interface\n\t2902  WLIDS 21.5 Touchscreen\n04e8  Samsung Electronics Co., Ltd\n\t0001  Printer Bootloader\n\t0100  Kingston Flash Drive (128MB)\n\t0110  Connect3D Flash Drive\n\t0111  Connect3D Flash Drive\n\t0300  E2530 / GT-C3350 Phones (Mass storage mode)\n\t04e8  Galaxy (MIDI mode)\n\t1003  MP3 Player and Recorder\n\t1006  SDC-200Z\n\t130c  NX100\n\t1323  WB700 Camera\n\t1f05  S2 Portable [JMicron] (500GB)\n\t1f06  HX-MU064DA portable harddisk\n\t2018  WIS09ABGN LinkStick Wireless LAN Adapter\n\t2035  Digital Photo Frame Mass Storage\n\t2036  Digital Photo Frame Mini Monitor\n\t3004  ML-4600\n\t3005  Docuprint P1210\n\t3008  ML-6060 laser printer\n\t300c  ML-1210 Printer\n\t300e  Laser Printer\n\t3104  ML-3550N\n\t3210  ML-5200A Laser Printer\n\t3226  Laser Printer\n\t3228  Laser Printer\n\t322a  Laser Printer\n\t322c  Laser Printer\n\t3230  ML-1440\n\t3232  Laser Printer\n\t3236  ML-1450\n\t3238  ML-1430\n\t323a  ML-1710 Printer\n\t323b  Phaser 3130\n\t323c  Laser Printer\n\t323d  Phaser 3120\n\t323e  Laser Printer\n\t3240  Laser Printer\n\t3242  ML-1510 Laser Printer\n\t3248  Color Laser Printer\n\t324a  Laser Printer\n\t324c  ML-1740 Printer\n\t324d  Phaser 3121\n\t3256  ML-1520 Laser Printer\n\t325b  Xerox Phaser 3117 Laser Printer\n\t325f  Phaser 3425 Laser Printer\n\t3260  CLP-510 Color Laser Printer\n\t3268  ML-1610 Mono Laser Printer\n\t326c  ML-2010P Mono Laser Printer\n\t3276  ML-3050/ML-3051 Laser Printer\n\t327e  ML-2510 Series\n\t328e  CLP-310 Color Laser Printer\n\t3292  ML-1640 Series Laser Printer\n\t3296  ML-2580N Mono Laser Printer\n\t3297  ML-191x/ML-252x Laser Printer\n\t329f  CLP-325 Color Laser Printer\n\t3301  ML-1660 Series\n\t330c  ML-1865\n\t330f  ML-216x Series Laser Printer\n\t3310  ML-331x Series Laser Printer\n\t3315  ML-2540 Series Laser Printer\n\t331e  M262x/M282x Xpress Series Laser Printer\n\t3409  SCX-4216F Scanner\n\t340c  SCX-5x15 series\n\t340d  SCX-6x20 series\n\t340e  MFP 560 series\n\t340f  Printing Support\n\t3412  SCX-4x20 series\n\t3413  SCX-4100 Scanner\n\t3415  Composite Device\n\t3419  Composite Device\n\t341a  Printing Support\n\t341b  SCX-4200 series\n\t341c  Composite Device\n\t341d  Composite Device\n\t341f  Composite Device\n\t3420  Composite Device\n\t3426  SCX-4500 Laser Printer\n\t342d  SCX-4x28 Series\n\t344f  SCX-3400 Series\n\t347e  C48x Series Color Laser Multifunction Printer\n\t3605  InkJet Color Printer\n\t3606  InkJet Color Printer\n\t3609  InkJet Color Printer\n\t3902  InkJet Color Printer\n\t3903  Xerox WorkCentre XK50cx\n\t390f  InkJet Color Printer\n\t3911  SCX-1020 series\n\t4001  PSSD T7\n\t4005  GT-S8000 Jet (msc)\n\t4f1f  GT-S8000 Jet (mtp)\n\t5000  YP-MF series\n\t5001  YP-100\n\t5002  YP-30\n\t5003  YP-700\n\t5004  YP-30\n\t5005  YP-300\n\t5006  YP-750\n\t500d  MP3 Player\n\t5010  Yepp YP-35\n\t5011  YP-780\n\t5013  YP-60\n\t5015  yepp upgrade\n\t501b  MP3 Player\n\t5021  Yepp YP-ST5\n\t5026  YP-MT6V\n\t5027  YP-T7\n\t502b  YP-F1\n\t5032  YP-J70\n\t503b  YP-U1 MP3 Player\n\t503d  YP-T7F\n\t5041  YP-Z5\n\t5050  YP-U2 MP3 Player\n\t5051  YP-F2R\n\t5055  YP-T9\n\t507d  YP-U3 (mtp)\n\t507f  YP-T9J\n\t5080  Yepp YP-K3 (msc)\n\t5081  Yepp YP-K3 (mtp)\n\t5082  YP-P2 (msc)\n\t5083  YP-P2 (mtp)\n\t508a  YP-T10\n\t508b  YP-S5 MP3 Player\n\t508c  YP-S5\n\t5090  YP-S3 (msc)\n\t5091  YP-S3 (mtp)\n\t5092  YP-U4 (msc)\n\t5093  YP-U4 (mtp)\n\t5095  YP-S2\n\t510f  YP-R1\n\t5119  Yepp YP-P3\n\t511c  YP-Q2\n\t5121  YP-U5\n\t5123  Yepp YP-M1\n\t5a00  YP-NEU\n\t5a01  YP-NDU\n\t5a03  Yepp MP3 Player\n\t5a04  YP-800\n\t5a08  YP-90\n\t5a0f  Meizu M6 MiniPlayer\n\t5b01  Memory Stick Reader/Writer\n\t5b02  Memory Stick Reader/Writer\n\t5b03  Memory Stick Reader/Writer\n\t5b04  Memory Stick Reader/Writer\n\t5b05  Memory Stick Reader/Writer\n\t5b11  SEW-2001u Card\n\t5f00  NEXiO Sync\n\t5f01  NEXiO Sync\n\t5f02  NEXiO Sync\n\t5f03  NEXiO Sync\n\t5f04  NEXiO Sync\n\t5f05  STORY Station 1TB\n\t6032  G2 Portable hard drive\n\t6033  G2 Portable device\n\t6034  G2 Portable hard drive\n\t60b3  M2 Portable Hard Drive\n\t60c4  M2 Portable Hard Drive USB 3.0\n\t6124  D3 Station External Hard Drive\n\t6125  D3 Station External Hard Drive\n\t61b5  M3 Portable Hard Drive 2TB\n\t61b6  M3 Portable Hard Drive 1TB\n\t61b7  M3 Portable Hard Drive 4TB\n\t61f3  Portable SSD T3 (MU-PT250B, MU-PT500B)\n\t61f5  Portable SSD T5\n\t6601  Mobile Phone\n\t6602  Galaxy\n\t6603  Galaxy\n\t6611  MITs Sync\n\t6613  MITs Sync\n\t6615  MITs Sync\n\t6617  MITs Sync\n\t6619  MITs Sync\n\t661b  MITs Sync\n\t661e  Handheld\n\t6620  Handheld\n\t6622  Handheld\n\t6624  Handheld\n\t662e  MITs Sync\n\t6630  MITs Sync\n\t6632  MITs Sync\n\t663e  D900e/B2100 Phone\n\t663f  SGH-E720/SGH-E840\n\t6640  Usb Modem Enumerator\n\t6651  i8510 Innov8\n\t6702  X830\n\t6708  U600 Phone\n\t6709  U600\n\t6734  Juke\n\t6759  D900e/B2100 Media Player\n\t675a  D900e/B2100 Mass Storage\n\t675b  D900e Camera\n\t6772  Standalone LTE device (Trial)\n\t6795  S5230\n\t6802  Standalone HSPA device\n\t6806  Composite LTE device (Trial)\n\t6807  Composite HSPA device\n\t681c  Galaxy Portal/Spica/S\n\t681d  Galaxy Portal/Spica Android Phone\n\t6843  E2530 Phone (Samsung Kies mode)\n\t684e  Wave (GT-S8500)\n\t685b  GT-I9100 Phone [Galaxy S II] (mass storage mode)\n\t685c  GT-I9250 Phone [Galaxy Nexus] (Mass storage mode)\n\t685d  GT-I9100 Phone [Galaxy S II] (Download mode)\n\t685e  GT-I9100 / GT-C3350 Phones (USB Debugging mode)\n\t6860  Galaxy series, misc. (MTP mode)\n\t6863  Galaxy series, misc. (tethering mode)\n\t6864  GT-I9070 (network tethering, USB debugging enabled)\n\t6865  Galaxy (PTP mode)\n\t6866  Galaxy (debugging mode)\n\t6868  Escape Composite driver for Android Phones: Modem+Diagnostic+ADB\n\t6875  GT-B3710 Standalone LTE device (Commercial)\n\t6876  GT-B3710 LTE Modem\n\t6877  Galaxy S\n\t687a  GT-E2370 mobile phone\n\t6888  GT-B3730 Composite LTE device (Commercial)\n\t6889  GT-B3730 Composite LTE device (Commercial)\n\t689a  LTE Storage Driver [CMC2xx]\n\t689e  GT-S5670 [Galaxy Fit]\n\t68aa  Reality\n\t7011  SEW-2003U Card\n\t7021  Bluetooth Device\n\t7061  eHome Infrared Receiver\n\t7080  Anycall SCH-W580\n\t7081  Human Interface Device\n\t7301  Fingerprint Device\n\t8001  Handheld\n\t8002  Portable SSD 500GB Model Number: MU - P8500B\n\t8003  Portable SSD T1\n\td003  GT-I9003\n\te020  SERI E02 SCOM 6200 UMTS Phone\n\te021  SERI E02 SCOM 6200 Virtual UARTs\n\te022  SERI E02 SCOM 6200 Flash Load Disk\n\tf000  Intensity 3 (Mass Storage Mode)\n\tff30  SG_iMON\n04e9  PC-Tel, Inc.\n04ea  Brooktree Corp.\n04eb  Northstar Systems, Inc.\n\te004  eHome Infrared Transceiver\n04ec  Tokyo Electron Device, Ltd\n04ed  Annabooks\n04ef  Pacific Electronic International, Inc.\n04f0  Daewoo Electronics Co., Ltd\n04f1  Victor Company of Japan, Ltd\n\t0001  GC-QX3 Digital Still Camera\n\t0004  GR-DVL815U Digital Video Camera\n\t0006  DV Camera Storage\n\t0008  GZ-MG30AA/MC500E Digital Video Camera\n\t0009  GR-DX25EK Digital Video Camera\n\t000a  GR-D72 Digital Video Camera\n\t1001  GC-A50 Camera Device\n\t3008  MP-PRX1 Ethernet\n\t3009  MP-XP7250 WLAN Adapter\n04f2  Chicony Electronics Co., Ltd\n\t0001  KU-8933 Keyboard\n\t0002  NT68P81 Keyboard\n\t0110  KU-2971 Keyboard\n\t0111  KU-9908 Keyboard\n\t0112  KU-8933 Keyboard with PS/2 Mouse port\n\t0116  KU-2971/KU-0325 Keyboard\n\t0200  KBR-0108\n\t0201  Gaming Keyboard KPD0250\n\t0220  Wireless HID Receiver\n\t0402  Genius LuxeMate i200 Keyboard\n\t0403  KU-0420 keyboard\n\t0418  KU-0418 Tactical Pad\n\t0618  RG-0618U Wireless HID Receiver & KG-0609 Wireless Keyboard with Touchpad\n\t0718  wired mouse\n\t0760  Acer KU-0760 Keyboard\n\t0833  KU-0833 Keyboard\n\t0841  HP Multimedia Keyboard\n\t0860  2.4G Multimedia Wireless Kit\n\t0939  Amazon Basics mouse\n\t1061  HP KG-1061 Wireless Keyboard+Mouse\n\t1121  Periboard 717 Mini Wireless Keyboard\n\t2159  PERIBOARD-535 [Perixx Ergo Keyboard]\n\ta001  E-Video DC-100 Camera\n\ta120  ORITE CCD Webcam(PC370R)\n\ta121  ORITE CCD Webcam(PC370R)\n\ta122  ORITE CCD Webcam(PC370R)\n\ta123  ORITE CCD Webcam(PC370R)\n\ta124  ORITE CCD Webcam(PC370R)\n\ta128  PC Camera (SN9C202 + OV7663 + EEPROM)\n\ta133  Gateway Webcam\n\ta136  LabTec Webcam 5500\n\ta147  Medion Webcam\n\ta204  DSC WIA Device (1300)\n\ta208  DSC WIA Device (2320)\n\ta209  Labtec DC-2320\n\ta20a  DSC WIA Device (3310)\n\ta20c  DSC WIA Device (3320)\n\ta210  Audio Device\n\tb008  USB 2.0 Camera\n\tb009  Integrated Camera\n\tb010  Integrated Camera\n\tb012  1.3 MPixel UVC Webcam\n\tb013  USB 2.0 Camera\n\tb015  VGA 24fps UVC Webcam\n\tb016  VGA 30fps UVC Webcam\n\tb018  2M UVC Webcam\n\tb021  ViewSonic 1.3M, USB2.0 Webcam\n\tb022  Gateway USB 2.0 Webcam\n\tb023  Gateway USB 2.0 Webcam\n\tb024  USB 2.0 Webcam\n\tb025  Camera\n\tb027  Gateway USB 2.0 Webcam\n\tb028  VGA UVC Webcam\n\tb029  1.3M UVC Webcam\n\tb036  Asus Integrated 0.3M UVC Webcam\n\tb044  Acer CrystalEye Webcam\n\tb057  integrated USB webcam\n\tb059  CKF7037 HP webcam\n\tb064  CNA7137 Integrated Webcam\n\tb070  Camera\n\tb071  2.0M UVC Webcam / CNF7129\n\tb083  CKF7063 Webcam (HP)\n\tb091  Webcam\n\tb104  CNF7069 Webcam\n\tb107  CNF7070 Webcam\n\tb14c  CNF8050 Webcam\n\tb159  CNF8243 Webcam\n\tb15c  Sony Vaio Integrated Camera\n\tb175  4-Port Hub\n\tb1aa  Webcam-101\n\tb1ac  HP Laptop Integrated Webcam [2 MP Fixed]\n\tb1b4  Lenovo Integrated Camera\n\tb1b9  Asus Integrated Webcam\n\tb1bb  2.0M UVC WebCam\n\tb1cf  Lenovo Integrated Camera\n\tb1d6  CNF9055 Toshiba Webcam\n\tb1d8  1.3M Webcam\n\tb1e4  Toshiba Integrated Webcam\n\tb213  Fujitsu Integrated Camera\n\tb217  Lenovo Integrated Camera (0.3MP)\n\tb221  integrated camera\n\tb230  Integrated HP HD Webcam\n\tb249  HP Integrated Webcam\n\tb257  Lenovo Integrated Camera\n\tb26b  Sony Visual Communication Camera\n\tb272  Lenovo EasyCamera\n\tb2b0  Camera\n\tb2b9  Lenovo Integrated Camera UVC\n\tb2da  thinkpad t430s camera\n\tb2db  Thinkpad T430 camera\n\tb2ea  Integrated Camera [ThinkPad]\n\tb2f4  HP Webcam-50\n\tb330  Asus 720p CMOS webcam\n\tb354  UVC 1.00 device HD UVC WebCam\n\tb394  Integrated Camera\n\tb3eb  HP 720p HD Monitor Webcam\n\tb3f6  HD WebCam (Acer)\n\tb3fd  HD WebCam (Asus N-series)\n\tb40e  HP Truevision HD camera\n\tb420  Lenovo EasyCamera\n\tb444  Lenovo Integrated Webcam\n\tb49f  Bluetooth (RTL8723BE)\n\tb563  Integrated Camera\n\tb5ab  Integrated Camera\n\tb5ac  Integrated IR Camera\n\tb5ce  Integrated Camera\n\tb5cf  Integrated IR Camera\n\tb5db  HP Webcam\n\tb5f7  Integrated HD WebCam\n\tb604  Integrated Camera (1280x720@30)\n\tb681  ThinkPad T490 Webcam\n\tb71a  Integrated IR Camera\n\tb76b  SunplusIT Inc [HP HD Camera]\n\tb7b4  Integrated Camera (1920x1080)\n04f3  Elan Microelectronics Corp.\n\t000a  Touchscreen\n\t0103  ActiveJet K-2024 Multimedia Keyboard\n\t016f  Touchscreen\n\t01a4  Wireless Keyboard\n\t0201  Touchscreen\n\t0210  Optical Mouse\n\t0212  Laser Mouse\n\t0214  Lynx M9 Optical Mouse\n\t0230  3D Optical Mouse\n\t0232  Mouse\n\t0234  Optical Mouse\n\t0235  Optical Mouse\n\t02f4  2.4G Cordless Mouse\n\t0381  Touchscreen\n\t04a0  Dream Cheeky Stress/Panic Button\n\t0c03  WBF Fingerprint Sensor\n\t0c28  fingerprint sensor [FeinTech FPS00200]\n\t0c3d  Elan:Fingerprint\n\t2234  Touchscreen\n04f4  Harting Elektronik, Inc.\n04f5  Fujitsu-ICL Systems, Inc.\n04f6  Norand Corp.\n04f7  Newnex Technology Corp.\n04f8  FuturePlus Systems\n04f9  Brother Industries, Ltd\n\t0002  HL-1050 Laser Printer\n\t0005  Printer\n\t0006  HL-1240 Laser Printer\n\t0007  HL-1250 Laser Printer\n\t0008  HL-1270 Laser Printer\n\t0009  Printer\n\t000a  P2500 series\n\t000b  Printer\n\t000c  Printer\n\t000d  HL-1440 Laser Printer\n\t000e  HL-1450 series\n\t000f  HL-1470N series\n\t0010  Printer\n\t0011  Printer\n\t0012  Printer\n\t0013  Printer\n\t0014  Printer\n\t0015  Printer\n\t0016  Printer\n\t0017  Printer\n\t0018  Printer\n\t001a  HL-1430 Laser Printer\n\t001c  Printer\n\t001e  Printer\n\t0020  HL-5130 series\n\t0021  HL-5140 series\n\t0022  HL-5150D series\n\t0023  HL-5170DN series\n\t0024  Printer\n\t0025  Printer\n\t0027  HL-2030 Laser Printer\n\t0028  Printer\n\t0029  Printer\n\t002a  HL-52x0 series\n\t002b  HL-5250DN Printer\n\t002c  Printer\n\t002d  Printer\n\t0037  HL-3040CN series\n\t0038  HL-3070CW series\n\t0039  HL-5340 series\n\t0041  HL-2250DN Laser Printer\n\t0042  HL-2270DW Laser Printer\n\t004d  HL-6180DW series\n\t0080  HL-L6250DN series\n\t0100  MFC8600/9650 series\n\t0101  MFC9600/9870 series\n\t0102  MFC9750/1200 series\n\t0104  MFC-8300J\n\t0105  MFC-9600J\n\t0106  MFC-7300C\n\t0107  MFC-7400C\n\t0108  MFC-9200C\n\t0109  MFC-830\n\t010a  MFC-840\n\t010b  MFC-860\n\t010c  MFC-7400J\n\t010d  MFC-9200J\n\t010e  MFC-3100C Scanner\n\t010f  MFC-5100C\n\t0110  MFC-4800 Scanner\n\t0111  MFC-6800\n\t0112  DCP1000 Port(FaxModem)\n\t0113  MFC-8500\n\t0114  MFC9700 Port(FaxModem)\n\t0115  MFC-9800 Scanner\n\t0116  DCP1400 Scanner\n\t0119  MFC-9660\n\t011a  MFC-9860\n\t011b  MFC-9880\n\t011c  MFC-9760\n\t011d  MFC-9070\n\t011e  MFC-9180\n\t011f  MFC-9160\n\t0120  MFC580 Port(FaxModem)\n\t0121  MFC-590\n\t0122  MFC-5100J\n\t0124  MFC-4800J\n\t0125  MFC-6800J\n\t0127  MFC-9800J\n\t0128  MFC-8500J\n\t0129  Imagistics 2500 (MFC-8640D clone)\n\t012b  MFC-9030\n\t012e  FAX4100e IntelliFax 4100e\n\t012f  FAX-4750e\n\t0130  FAX-5750e\n\t0132  MFC-5200C RemovableDisk\n\t0135  MFC-100 Scanner\n\t0136  MFC-150CL Scanner\n\t013c  MFC-890 Port\n\t013d  MFC-5200J\n\t013e  MFC-4420C RemovableDisk\n\t013f  MFC-4820C RemovableDisk\n\t0140  DCP-8020\n\t0141  DCP-8025D\n\t0142  MFC-8420\n\t0143  MFC-8820D\n\t0144  DCP-4020C RemovableDisk\n\t0146  MFC-3220C\n\t0147  FAX-1820C Printer\n\t0148  MFC-3320CN\n\t0149  FAX-1920CN Printer\n\t014a  MFC-3420C\n\t014b  MFC-3820CN\n\t014c  DCP-3020C\n\t014d  FAX-1815C Printer\n\t014e  MFC-8820J\n\t014f  DCP-8025J\n\t0150  MFC-8220 Port(FaxModem)\n\t0151  MFC-8210J\n\t0153  DCP-1000J\n\t0157  MFC-3420J Printer\n\t0158  MFC-3820JN Port(FaxModem)\n\t015d  MFC Composite Device\n\t015e  DCP-8045D\n\t015f  MFC-8440\n\t0160  MFC-8840D\n\t0161  MFC-210C\n\t0162  MFC-420CN Remote Setup Port\n\t0163  MFC-410CN RemovableDisk\n\t0165  MFC-620CN\n\t0166  MFC-610CLN RemovableDisk\n\t0168  MFC-620CLN\n\t0169  DCP-110C RemovableDisk\n\t016b  DCP-310CN RemovableDisk\n\t016c  FAX-2440C Printer\n\t016d  MFC-5440CN\n\t016e  MFC-5840CN Remote Setup Port\n\t0170  FAX-1840C Printer\n\t0171  FAX-1835C Printer\n\t0172  FAX-1940CN Printer\n\t0173  MFC-3240C Remote Setup Port\n\t0174  MFC-3340CN RemovableDisk\n\t017b  Imagistics sx2100\n\t0180  MFC-7420\n\t0181  MFC-7820N Port(FaxModem)\n\t0182  DCP-7010\n\t0183  DCP-7020\n\t0184  DCP-7025 Printer\n\t0185  MFC-7220 Printer\n\t0186  Composite Device\n\t0187  FAX-2820 Printer\n\t0188  FAX-2920 Printer\n\t018a  MFC-9420CN\n\t018c  DCP-115C\n\t018d  DCP-116C\n\t018e  DCP-117C\n\t018f  DCP-118C\n\t0190  DCP-120C\n\t0191  DCP-315CN\n\t0192  DCP-340CW\n\t0193  MFC-215C\n\t0194  MFC-425CN\n\t0195  MFC-820CW Remote Setup Port\n\t0196  MFC-820CN Remote Setup Port\n\t0197  MFC-640CW\n\t019a  MFC-840CLN Remote Setup Port\n\t01a2  MFC-8640D\n\t01a3  Composite Device\n\t01a4  DCP-8065DN Printer\n\t01a5  MFC-8460N Port(FaxModem)\n\t01a6  MFC-8860DN Port(FaxModem)\n\t01a7  MFC-8870DW Printer\n\t01a8  DCP-130C\n\t01a9  DCP-330C\n\t01aa  DCP-540CN\n\t01ab  MFC-240C\n\t01ae  DCP-750CW RemovableDisk\n\t01af  MFC-440CN\n\t01b0  MFC-660CN\n\t01b1  MFC-665CW\n\t01b2  MFC-845CW\n\t01b4  MFC-460CN\n\t01b5  MFC-630CD\n\t01b6  MFC-850CDN\n\t01b7  MFC-5460CN\n\t01b8  MFC-5860CN\n\t01ba  MFC-3360C\n\t01bd  MFC-8660DN\n\t01be  DCP-750CN RemovableDisk\n\t01bf  MFC-860CDN\n\t01c0  DCP-128C\n\t01c1  DCP-129C\n\t01c2  DCP-131C\n\t01c3  DCP-329C\n\t01c4  DCP-331C\n\t01c5  MFC-239C\n\t01c9  DCP-9040CN\n\t01ca  MFC-9440CN\n\t01cb  DCP-9045CDN\n\t01cc  MFC-9840CDW\n\t01ce  DCP-135C\n\t01cf  DCP-150C\n\t01d0  DCP-350C\n\t01d1  DCP-560CN\n\t01d2  DCP-770CW\n\t01d3  DCP-770CN\n\t01d4  MFC-230C\n\t01d5  MFC-235C\n\t01d6  MFC-260C\n\t01d7  MFC-465CN\n\t01d8  MFC-680CN\n\t01d9  MFC-685CW\n\t01da  MFC-885CW\n\t01db  MFC-480CN\n\t01dc  MFC-650CD\n\t01dd  MFC-870CDN\n\t01de  MFC-880CDN\n\t01df  DCP-155C\n\t01e0  MFC-265C\n\t01e1  DCP-153C\n\t01e2  DCP-157C\n\t01e3  DCP-353C\n\t01e4  DCP-357C\n\t01e7  MFC-7340\n\t01e9  DCP-7040\n\t01ea  DCP-7030\n\t01eb  MFC-7320\n\t01ec  MFC-9640CW\n\t01f4  MFC-5890CN\n\t0204  DCP-165C\n\t020a  MFC-8670DN\n\t020c  DCP-9042CDN\n\t020d  MFC-9450CDN\n\t0216  MFC-8880DN\n\t0217  MFC-8480DN\n\t0219  MFC-8380DN\n\t021a  MFC-8370DN\n\t021b  DCP-8070D\n\t021c  MFC-9320CW\n\t021d  MFC-9120CN\n\t021e  DCP-9010CN\n\t021f  DCP-8085DN\n\t0220  MFC-9010CN\n\t0222  DCP-195C\n\t0223  DCP-365CN\n\t0224  DCP-375CW\n\t0225  DCP-395CN\n\t0227  DCP-595CN\n\t0228  MFC-255CW\n\t0229  MFC-295CN\n\t022a  MFC-495CW\n\t022b  MFC-495CN\n\t022c  MFC-795CW\n\t022d  MFC-675CD\n\t022e  MFC-695CDN\n\t022f  MFC-735CD\n\t0230  MFC-935CDN\n\t0234  DCP-373CW\n\t0235  DCP-377CW\n\t0236  DCP-390CN\n\t0239  MFC-253CW\n\t023a  MFC-257CW\n\t023e  DCP-197C\n\t023f  MFC-8680DN\n\t0240  MFC-J950DN\n\t0245  MFC-9560CDW\n\t0248  DCP-7055 scanner/printer\n\t024a  DCP-7065DN\n\t024e  MFC-7460DN\n\t0253  DCP-J125\n\t0254  DCP-J315W\n\t0255  DCP-J515W\n\t0256  DCP-J515N\n\t0257  DCP-J715W\n\t0258  DCP-J715N\n\t0259  MFC-J220\n\t025a  MFC-J410\n\t025b  MFC-J265W\n\t025c  MFC-J415W\n\t025d  MFC-J615W\n\t025e  MFC-J615N\n\t025f  MFC-J700D\n\t0260  MFC-J800D\n\t0261  MFC-J850DN\n\t026b  MFC-J630W\n\t026d  MFC-J805D\n\t026e  MFC-J855DN\n\t026f  MFC-J270W\n\t0270  MFC-7360N\n\t0273  DCP-7057 scanner/printer\n\t0276  MFC-5895CW\n\t0278  MFC-J410W\n\t0279  DCP-J525W\n\t027a  DCP-J525N\n\t027b  DCP-J725DW\n\t027c  DCP-J725N\n\t027d  DCP-J925DW\n\t027e  MFC-J955DN\n\t027f  MFC-J280W\n\t0280  MFC-J435W\n\t0281  MFC-J430W\n\t0282  MFC-J625DW\n\t0283  MFC-J825DW\n\t0284  MFC-J825N\n\t0285  MFC-J705D\n\t0287  MFC-J860DN\n\t0288  MFC-J5910DW\n\t0289  MFC-J5910CDW\n\t028a  DCP-J925N\n\t028d  MFC-J835DW\n\t028f  MFC-J425W\n\t0290  MFC-J432W\n\t0291  DCP-8110DN\n\t0292  DCP-8150DN\n\t0293  DCP-8155DN\n\t0294  DCP-8250DN\n\t0295  MFC-8510DN\n\t0296  MFC-8520DN\n\t0298  MFC-8910DW\n\t0299  MFC-8950DW\n\t029a  MFC-8690DW\n\t029c  MFC-8515DN\n\t029e  MFC-9125CN\n\t029f  MFC-9325CW\n\t02a0  DCP-J140W\n\t02a5  MFC-7240\n\t02a6  FAX-2940\n\t02a7  FAX-2950\n\t02a8  MFC-7290\n\t02ab  FAX-2990\n\t02ac  DCP-8110D\n\t02ad  MFC-9130CW\n\t02ae  MFC-9140CDN\n\t02af  MFC-9330CDW\n\t02b0  MFC-9340CDW\n\t02b1  DCP-9020CDN\n\t02b2  MFC-J810DN\n\t02b3  MFC-J4510DW\n\t02b4  MFC-J4710DW\n\t02b5  DCP-8112DN\n\t02b6  DCP-8152DN\n\t02b7  DCP-8157DN\n\t02b8  MFC-8512DN\n\t02ba  MFC-8912DW\n\t02bb  MFC-8952DW\n\t02bc  DCP-J540N\n\t02bd  DCP-J740N\n\t02be  MFC-J710D\n\t02bf  MFC-J840N\n\t02c0  DCP-J940N\n\t02c1  MFC-J960DN\n\t02c2  DCP-J4110DW\n\t02c3  MFC-J4310DW\n\t02c4  MFC-J4410DW\n\t02c5  MFC-J4610DW\n\t02c6  DCP-J4210N\n\t02c7  MFC-J4510N\n\t02c8  MFC-J4910CDW\n\t02c9  MFC-J4810DN\n\t02ca  MFC-8712DW\n\t02cb  MFC-8710DW\n\t02cc  MFC-J2310\n\t02cd  MFC-J2510\n\t02ce  DCP-7055W\n\t02cf  DCP-7057W\n\t02d0  DCP-1510\n\t02d1  MFC-1810\n\t02d3  DCP-9020CDW\n\t02d4  MFC-8810DW\n\t02dd  DCP-J4215N\n\t02de  DCP-J132W\n\t02df  DCP-J152W\n\t02e0  DCP-J152N\n\t02e1  DCP-J172W\n\t02e2  DCP-J552DW\n\t02e3  DCP-J552N\n\t02e4  DCP-J752DW\n\t02e5  DCP-J752N\n\t02e6  DCP-J952N\n\t02e7  MFC-J245\n\t02e8  MFC-J470DW\n\t02e9  MFC-J475DW\n\t02ea  MFC-J285DW\n\t02eb  MFC-J650DW\n\t02ec  MFC-J870DW\n\t02ed  MFC-J870N\n\t02ee  MFC-J720D\n\t02ef  MFC-J820DN\n\t02f0  MFC-J980DN\n\t02f1  MFC-J890DN\n\t02f2  MFC-J6520DW\n\t02f3  MFC-J6570CDW\n\t02f4  MFC-J6720DW\n\t02f5  MFC-J6920DW\n\t02f6  MFC-J6970CDW\n\t02f7  MFC-J6975CDW\n\t02f8  MFC-J6770CDW\n\t02f9  DCP-J132N\n\t02fa  MFC-J450DW\n\t02fb  MFC-J875DW\n\t02fc  DCP-J100\n\t02fd  DCP-J105\n\t02fe  MFC-J200\n\t02ff  MFC-J3520\n\t0300  MFC-J3720\n\t030f  DCP-L8400CDN\n\t0310  DCP-L8450CDW\n\t0311  MFC-L8600CDW\n\t0312  MFC-L8650CDW\n\t0313  MFC-L8850CDW\n\t0314  MFC-L9550CDW\n\t0318  MFC-7365DN\n\t0320  MFC-L2740DW\n\t0321  DCP-L2500D\n\t0322  DCP-L2520DW\n\t0324  DCP-L2520D\n\t0326  DCP-L2540DN\n\t0328  DCP-L2540DW\n\t0329  DCP-L2560DW\n\t0330  HL-L2380DW\n\t0331  MFC-L2700DW\n\t0335  FAX-L2700DN\n\t0337  MFC-L2720DW\n\t0338  MFC-L2720DN\n\t0339  DCP-J4120DW\n\t033a  MFC-J4320DW\n\t033c  MFC-J2320\n\t033d  MFC-J4420DW\n\t0340  MFC-J4620DW\n\t0341  MFC-J2720\n\t0342  MFC-J4625DW\n\t0343  MFC-J5320DW\n\t0346  MFC-J5620DW\n\t0347  MFC-J5720DW\n\t0349  DCP-J4220N\n\t034b  MFC-J4720N\n\t034e  MFC-J5720CDW\n\t034f  MFC-J5820DN\n\t0350  MFC-J5620CDW\n\t0351  DCP-J137N\n\t0353  DCP-J557N\n\t0354  DCP-J757N\n\t0355  DCP-J957N\n\t0356  MFC-J877N\n\t0357  MFC-J727D\n\t0358  MFC-J987DN\n\t0359  MFC-J827DN\n\t035a  MFC-J897DN\n\t035b  DCP-1610W\n\t035c  DCP-1610NW\n\t035d  MFC-1910W\n\t035e  MFC-1910NW\n\t0360  DCP-1618W\n\t0361  MFC-1919NW\n\t0364  MFC-J5625DW\n\t0365  MFC-J4520DW\n\t0366  MFC-J5520DW\n\t0367  DCP-7080D\n\t0368  DCP-7080\n\t0369  DCP-7180DN\n\t036a  DCP-7189DW\n\t036b  MFC-7380\n\t036c  MFC-7480D\n\t036d  MFC-7880DN\n\t036e  MFC-7889DW\n\t036f  DCP-9022CDW\n\t0370  MFC-9142CDN\n\t0371  MFC-9332CDW\n\t0372  MFC-9342CDW\n\t0373  MFC-L2700D\n\t0376  DCP-1600\n\t0377  MFC-1900\n\t0378  DCP-1608\n\t0379  DCP-1619\n\t037a  MFC-1906\n\t037b  MFC-1908\n\t037c  ADS-2000e\n\t037d  ADS-2100e\n\t037e  ADS-2500We\n\t037f  ADS-2600We\n\t0380  DCP-J562DW\n\t0381  DCP-J562N\n\t0383  DCP-J962N\n\t0384  MFC-J480DW\n\t0385  MFC-J485DW\n\t0386  MFC-J460DW\n\t0388  MFC-J680DW\n\t0389  MFC-J880DW\n\t038a  MFC-J885DW\n\t038b  MFC-J880N\n\t038c  MFC-J730DN\n\t038d  MFC-J990DN\n\t038e  MFC-J830DN\n\t038f  MFC-J900DN\n\t0390  MFC-J5920DW\n\t0392  MFC-L2705DW\n\t0393  DCP-T300\n\t0394  DCP-T500W\n\t0395  DCP-T700W\n\t0396  MFC-T800W\n\t0397  DCP-J963N\n\t03b3  MFC-J6925DW\n\t03b4  MFC-J6573CDW\n\t03b5  MFC-J6973CDW\n\t03b6  MFC-J6990CDW\n\t03bb  MFC-L2680W\n\t03bc  MFC-L2700DN\n\t03bd  DCP-J762N\n\t03fd  ADS-2700W\n\t043f  MFC-L3770CDW\n\t0440  MFC-9350CDW\n\t0441  MFC-L3750CDW\n\t0442  MFC-L3745CDW\n\t0443  MFC-L3735CDN\n\t0444  MFC-9150CDN\n\t0445  MFC-L3730CDN\n\t0446  MFC-L3710CW\n\t0447  DCP-9030CDN\n\t0448  DCP-L3550CDW\n\t044a  HL-L3290CDW\n\t044b  DCP-L3510CDW\n\t044c  DCP-L3551CDW\n\t1000  Printer\n\t1002  Printer\n\t2002  PTUSB Printing\n\t2004  PT-2300/2310 p-Touch Laber Printer\n\t2007  PT-2420PC P-touch Label Printer\n\t2015  QL-500 label printer\n\t2016  QL-550 printer\n\t201a  PT-18R P-touch label printer\n\t201b  QL-650TD Label Printer\n\t2020  QL-1050 Label Printer\n\t2027  QL-560 Label Printer\n\t2028  QL-570 Label Printer\n\t202a  QL-1060N Label Printer\n\t202b  PT-7600 P-touch Label Printer\n\t202c  PT-1230PC P-touch Label Printer E mode\n\t202d  PT-2430PC P-touch Label Printer\n\t2030  PT-1230PC P-touch Label Printer EL mode\n\t2041  PT-2730 P-touch Label Printer\n\t2042  QL-700 Label Printer\n\t2043  QL-710W Label Printer\n\t2044  QL-720NW Label Printer\n\t2049  QL-700 Label Printer (mass storage)\n\t204d  QL-720NW Label Printer (mass storage mode)\n\t2060  PT-E550W P-touch Label Printer\n\t2061  PT-P700 P-touch Label Printer\n\t2064  PT-P700 P-touch Label Printer RemovableDisk\n\t2065  PT-P750W P-Touch Label Writer\n\t2074  PT-D600 P-touch Label Printer\n\t209b  QL-800 Label Printer\n\t209c  QL-810W Label Printer\n\t209d  QL-820NWB Label Printer\n\t20a7  QL-1100 Label Printer\n\t20a8  QL-1110NWB Label Printer\n\t20a9  QL-1100 Label Printer (mass storage)\n\t20aa  QL-1110NWB Label Printer (mass storage)\n\t20ab  QL-1115NWB Label Printer\n\t20ac  QL-1115NWB Label Printer (mass storage)\n\t20c0  QL-600 Label Printer\n\t2100  Card Reader Writer\n\t2102  Sewing machine\n\t60a0  ADS-2000\n\t60a1  ADS-2100\n\t60a4  ADS-2500W\n\t60a5  ADS-2600W\n\t60a6  ADS-1000W\n\t60a7  ADS-1100W\n\t60a8  ADS-1500W\n\t60a9  ADS-1600W\n04fa  Dallas Semiconductor\n\t2490  DS1490F 2-in-1 Fob, 1-Wire adapter\n\t4201  DS4201 Audio DAC\n04fb  Biostar Microtech International Corp.\n04fc  Sunplus Technology Co., Ltd\n\t0003  CM1092 / Wintech CM-5098 Optical Mouse\n\t0005  USB OpticalWheel Mouse\n\t0013  ViewMate Desktop Mouse CC2201\n\t0015  ViewMate Desktop Mouse CC2201\n\t00d3  00052486 / Laser Mouse M1052 [hama]\n\t0171  SPCA1527A/SPCA1528 SD card camera (Mass Storage mode)\n\t0201  SPCP825 RS232C Adapter\n\t0232  Fingerprint\n\t0538  Wireless Optical Mouse 2.4G [Bright]\n\t0561  Flexcam 100\n\t05d8  Wireless keyboard/mouse\n\t05da  SPEEDLINK SNAPPY Wireless Mouse Nano\n\t0c15  SPIF215A SATA bridge\n\t0c25  SATALink SPIF225A\n\t1528  SPCA1527A/SPCA1528 SD card camera (webcam mode)\n\t1533  Mass Storage\n\t2080  ASUS Webcam\n\t500c  CA500C Digital Camera\n\t504a  Aiptek Mini PenCam 1.3\n\t504b  Aiptek Mega PockerCam 1.3/Maxell MaxPocket LE 1.3\n\t5330  Digitrex 2110\n\t5331  Vivitar Vivicam 10\n\t5360  Sunplus Generic Digital Camera\n\t5563  Digital Media Player MP3/WMA [The Sharper Image]\n\t5720  Card Reader Driver\n\t6333  Siri A9 UVC chipset\n\t7333  Finet Technology Palmpix DC-85\n\t757a  Aiptek, MP315 MP3 Player\n\tffff  PureDigital Ritz Disposable\n04fd  Soliton Systems, K.K.\n\t0003  Smart Card Reader II\n04fe  PFU, Ltd\n\t0006  Happy Hacking Keyboard Lite2\n\t0020  HHKB-Classic\n\t0021  Happy Hacking Keyboard Professional HYBRID Type-S\n04ff  E-CMOS Corp.\n0500  Siam United Hi-Tech\n\t0001  DART Keyboard Mouse\n\t0002  DART-2 Keyboard\n0501  Fujikura DDK, Ltd\n0502  Acer, Inc.\n\t0001  Handheld\n\t0736  Handheld\n\t15b1  PDA n311\n\t1631  c10 Series\n\t1632  c20 Series\n\t16e1  n10 Handheld Sync\n\t16e2  n20 Pocket PC Sync\n\t16e3  n30 Handheld Sync\n\t2008  Liquid Gallant Duo E350 (preloader)\n\t3202  Liquid\n\t3203  Liquid (Debug mode)\n\t3230  BeTouch E120\n\t3317  Liquid\n\t3325  Iconia tablet A500\n\t3341  Iconia tablet A500\n\t33c3  Liquid Gallant Duo E350\n\t33c4  Liquid Gallant Duo E350 (debug mode)\n\t33c7  Liquid Gallant Duo E350 (USB tethering)\n\t33c8  Liquid Gallant Duo E350 (debug mode, USB tethering)\n\td001  Divio NW801/DVC-V6+ Digital Camera\n0503  Hitachi America, Ltd\n0504  Hayes Microcomputer Products\n0506  3Com Corp.\n\t009d  HomeConnect Camera\n\t00a0  3CREB96 Bluetooth Adapter\n\t00a1  Bluetooth Device\n\t00a2  Bluetooth Device\n\t00df  3Com Home Connect lite\n\t0100  HomeConnect ADSL Modem Driver\n\t03e8  3C19250 Ethernet [klsi]\n\t0a01  3CRSHEW696 Wireless Adapter\n\t0a11  3CRWE254G72 802.11g Adapter\n\t11f8  HomeConnect 3C460\n\t2922  HomeConnect Cable Modem External with\n\t3021  U.S.Robotics 56000 Voice FaxModem Pro\n\t4601  3C460B 10/100 Ethernet Adapter\n\tf002  3CP4218 ADSL Modem (pre-init)\n\tf003  3CP4218 ADSL Modem\n\tf100  3CP4218 ADSL Modem (pre-init)\n0507  Hosiden Corp.\n\t0011  Konami ParaParaParadise Controller\n0508  Clarion Co., Ltd\n0509  Aztech Systems, Ltd\n\t0801  ADSL Modem\n\t0802  ADSL Modem (RFC1483)\n\t0806  DSL Modem\n\t080f  Binatone ADSL500 Modem Network Interface\n\t0812  Pirelli ADSL Modem Network Interface\n050a  Cinch Connectors\n050b  Cable System International\n050c  InnoMedia, Inc.\n050d  Belkin Components\n\t0004  Direct Connect\n\t0012  F8T012 Bluetooth Adapter\n\t0013  F8T013 Bluetooth Adapter\n\t0017  B8T017 Bluetooth+EDR 2.1 / F4U017 USB 2.0 7-port Hub\n\t003a  Universal Media Reader\n\t0050  F5D6050 802.11b Wireless Adapter v2000 [Atmel at76c503a]\n\t0081  F8T001v2 Bluetooth\n\t0083  Bluetooth Device\n\t0084  F8T003v2 Bluetooth\n\t008a  6-in-1 Multiport Adapter\n\t0102  Flip KVM\n\t0103  F5U103 Serial Adapter [etek]\n\t0106  VideoBus II Adapter, Video\n\t0108  F1DE108B KVM\n\t0109  F5U109/F5U409 PDA Adapter\n\t0115  SCSI Adapter\n\t0119  F5U120-PC Dual PS/2 Ports / F5U118-UNV ADB Adapter\n\t0121  F5D5050 100Mbps Ethernet\n\t0122  Ethernet Adapter\n\t0131  Bluetooth Device with trace filter\n\t016a  Bluetooth Mini Dongle\n\t0200  Nostromo SpeedPad n52te Gaming Keyboard\n\t0201  Peripheral Switch\n\t0208  USBView II Video Adapter [nt1004]\n\t0210  F5U228 Hi-Speed USB 2.0 DVD Creator\n\t0211  F5U211 USB 2.0 15-in-1 Media Reader & Writer\n\t0224  F5U224 USB 2.0 4-Port Hub\n\t0234  F5U234 USB 2.0 4-Port Hub\n\t0237  F5U237 USB 2.0 7-Port Hub\n\t0240  F5U240 USB 2.0 CF Card Reader\n\t0249  USB 2 Flash Media Device\n\t0257  F5U257 Serial\n\t0304  FSU304 USB 2.0 - 4 Ports Hub\n\t0307  USB 2.0 - 7 ports Hub [FSU307]\n\t038c  F2CU038 HDMI Adapter\n\t0409  F5U409 Serial\n\t0416  Staples 12416 7 port desktop hub\n\t0551  F6C550-AVR UPS\n\t065a  F8T065BF Mini Bluetooth 4.0 Adapter\n\t0706  2-N-1 7-Port Hub (Lower half)\n\t0802  Nostromo n40 Gamepad\n\t0803  Nostromo 1745 GamePad\n\t0805  Nostromo N50 GamePad\n\t0815  Nostromo n52 HID SpeedPad Mouse Wheel\n\t0826  ErgoFit Wireless Optical Mouse (HID)\n\t0980  HID UPS Battery\n\t1004  F9L1004 802.11n Surf N300 XR Wireless Adapter [Realtek RTL8192CU]\n\t1102  F7D1102 N150/Surf Micro Wireless Adapter v1000 [Realtek RTL8188CUS]\n\t1103  F9L1103 N750 DB 802.11abgn 2x3:3 [Ralink RT3573]\n\t1106  F9L1106v1 802.11a/b/g/n/ac Wireless Adapter [Broadcom BCM43526]\n\t1109  F9L1109v1 802.11a/b/g/n/ac Wireless Adapter [Realtek RTL8812AU]\n\t110a  F9L1101v2 802.11abgn Wireless Adapter [Realtek RTL8192DU]\n\t11f2  ISY Wireless Micro Adapter IWL 2000 [RTL8188CUS]\n\t1202  F5U120-PC Parallel Printer Port\n\t1203  F5U120-PC Serial Port\n\t2103  F7D2102 802.11n N300 Micro Wireless Adapter v3000 [Realtek RTL8192CU]\n\t21f1  N300 WLAN N Adapter [ISY]\n\t21f2  RTL8192CU 802.11n WLAN Adapter [ISY IWL 4000]\n\t258a  F5U258 Host to Host cable\n\t3101  F1DF102U/F1DG102U Flip Hub\n\t3201  F1DF102U/F1DG102U Flip KVM\n\t4050  ZD1211B\n\t5055  F5D5055 Gigabit Network Adapter [AX88xxx]\n\t6050  F6D6050 802.11abgn Wireless Adapter [Broadcom BCM4323]\n\t6051  F5D6051 802.11b Wireless Network Adapter [ZyDAS ZD1201]\n\t615a  F7D4101 / F9L1101v1 802.11abgn Wireless Adapter [Broadcom BCM4323]\n\t7050  F5D7050 Wireless G Adapter v1000/v2000 [Intersil ISL3887]\n\t7051  F5D7051 802.11g Adapter v1000 [Broadcom 4320 USB]\n\t705a  F5D7050 Wireless G Adapter v3000 [Ralink RT2571W]\n\t705b  Wireless G Adapter\n\t705c  F5D7050 Wireless G Adapter v4000 [Zydas ZD1211B]\n\t705e  F5D7050 Wireless G Adapter v5000 [Realtek RTL8187B]\n\t706a  2-N-1 7-Port Hub (Upper half)\n\t8053  F5D8053 N Wireless USB Adapter v1000/v4000 [Ralink RT2870]\n\t805c  F5D8053 N Wireless Adapter v3000 [Ralink RT2870]\n\t805e  F5D8053 N Wireless USB Adapter v5000 [Realtek RTL8192U]\n\t815c  F5D8053 N Wireless USB Adapter v3000 [Ralink RT2870]\n\t815f  F5D8053 N Wireless USB Adapter v6000 [Realtek RTL8192SU]\n\t825a  F5D8055 N+ Wireless Adapter v1000 [Ralink RT2870]\n\t825b  F5D8055 N+ Wireless Adapter v2000 [Ralink RT3072]\n\t845a  F7D2101 802.11n Surf & Share Wireless Adapter v1000 [Realtek RTL8192SU]\n\t905b  F5D9050 Wireless G+ MIMO Network Adapter v3000 [Ralink RT2573]\n\t905c  F5D9050 Wireless G+ MIMO Network Adapter v4000 [Ralink RT2573]\n\t935a  F6D4050 N150 Enhanced Wireless Network Adapter v1000 [Ralink RT3070]\n\t935b  F6D4050 N150 Enhanced Wireless Network Adapter v2000 [Ralink RT3070]\n\t945a  F7D1101 v1 Basic Wireless Adapter [Realtek RTL8188SU]\n\t945b  F7D1101 v2 Basic Wireless Adapter [Ralink RT3370]\n\td321  Dynex DX-NUSB 802.11bgn Wireless Adapter [Broadcom BCM43231]\n050e  Neon Technology, Inc.\n050f  KC Technology, Inc.\n\t0001  Hub\n\t0003  KC82C160S Hub\n\t0180  KC-180 IrDA Dongle\n\t0190  KC2190 USB Host-to-Host cable\n0510  Sejin Electron, Inc.\n\t0001  Keyboard\n\t1000  Keyboard with PS/2 Mouse Port\n\te001  Mouse\n0511  N'Able (DataBook) Technologies, Inc.\n\t002b  AOC DVB\n0512  Hualon Microelectronics Corp.\n0513  digital-X, Inc.\n0514  FCI Electronics\n0515  ACTC\n0516  Longwell Electronics\n0517  Butterfly Communications\n0518  EzKEY Corp.\n\t0001  USB to PS2 Adaptor v1.09\n\t0002  EZ-9900C Keyboard\n0519  Star Micronics Co., Ltd\n\t0003  TSP100ECO/TSP100II\n\tc002  Xlive Bluetooth XBM-100S MP3 Player\n051a  WYSE Technology\n\ta005  Smart Display Version 9973\n051b  Silicon Graphics\n051c  Shuttle, Inc.\n\t0005  VFD Module\n\tc001  eHome Infrared Receiver\n\tc002  eHome Infrared Receiver\n051d  American Power Conversion\n\t0001  UPS\n\t0002  Uninterruptible Power Supply\n\t0003  UPS\n051e  Scientific Atlanta, Inc.\n051f  IO Systems (Elite Electronics), Inc.\n0520  Taiwan Semiconductor Manufacturing Co.\n0521  Airborn Connectors\n0522  Advanced Connectek, Inc.\n0523  ATEN GmbH\n0524  Sola Electronics\n0525  Netchip Technology, Inc.\n\t100d  RFMD Bluetooth Device\n\t1080  NET1080 USB-USB Bridge\n\t1200  SSDC Adapter II\n\t1265  File-backed Storage Gadget\n\t3424  V30x/V4xx fingerprint sensor [Lumidigm]\n\ta0f0  Cambridge Electronic Devices Power1401 mk 2\n\ta140  USB Clik! 40\n\ta141  (OME) PocketZip 40 MP3 Player Driver\n\ta220  GVC Bluetooth Wireless Adapter\n\ta4a0  Linux-USB \"Gadget Zero\"\n\ta4a1  Linux-USB Ethernet Gadget\n\ta4a2  Linux-USB Ethernet/RNDIS Gadget\n\ta4a3  Linux-USB user-mode isochronous source/sink\n\ta4a4  Linux-USB user-mode bulk source/sink\n\ta4a5  Linux-USB File-backed Storage Gadget\n\ta4a6  Linux-USB Serial Gadget\n\ta4a7  Linux-USB Serial Gadget (CDC ACM mode)\n\ta4a8  Linux-USB Printer Gadget\n\ta4a9  Linux-USB OBEX Gadget\n\ta4aa  Linux-USB CDC Composite Gadge (Ethernet and ACM)\n\ta4ab  Linux-USB Multifunction Composite Gadget\n\ta4ac  Linux-USB HID Gadget\n0526  Temic MHS S.A.\n0527  ALTRA\n0528  ATI Technologies, Inc.\n\t7561  TV Wonder\n\t7562  TV Wonder, Edition (FN5)\n\t7563  TV Wonder, Edition (FI)\n\t7564  TV Wonder, Edition (FQ)\n\t7565  TV Wonder, Edition (NTSC+)\n\t7566  TV Wonder, Edition (FN5)\n\t7567  TV Wonder, Edition (FI)\n\t7568  TV Wonder, Edition (FQ)\n\t7569  Live! Pro (A)\n\t756a  Live! Pro Audio (O)\n0529  Aladdin Knowledge Systems\n\t0001  HASP copy protection dongle\n\t030b  eToken R1 v3.1.3.x\n\t0313  eToken R1 v3.2.3.x\n\t031b  eToken R1 v3.3.3.x\n\t0323  eToken R1 v3.4.3.x\n\t0412  eToken R2 v2.2.4.x\n\t041a  eToken R2 v2.2.4.x\n\t0422  eToken R2 v2.4.4.x\n\t042a  eToken R2 v2.5.4.x\n\t050c  eToken Pro v4.1.5.x\n\t0514  eToken Pro v4.2.5.4\n\t0600  eToken Pro 64k (4.2)\n\t0620  Token JC\n052a  Crescent Heart Software\n052b  Tekom Technologies, Inc.\n\t0102  Ca508A HP1020 Camera v.1.3.1.6\n\t0801  Yakumo MegaImage 37\n\t1512  Yakumo MegaImage IV\n\t1513  Aosta CX100 Webcam\n\t1514  Aosta CX100 Webcam Storage\n\t1905  Yakumo MegaImage 47\n\t1911  Yakumo MegaImage 47 SL\n\t2202  WDM Still Image Capture\n\t2203  Sound Vision Stream Driver\n\t3a06  DigiLife DDV-5120A\n\td001  P35U Camera Capture\n052c  Canon Information Systems, Inc.\n052d  Avid Electronics Corp.\n052e  Standard Microsystems Corp.\n052f  Unicore Software, Inc.\n0530  American Microsystems, Inc.\n0531  Wacom Technology Corp.\n\t0100  CTC4110WL [One (S)]\n\t0102  CTC6110WL [One (M)]\n\t0104  CTC4110WL [One (S)]\n\t0105  CTC6110WL [One (M)]\n0532  Systech Corp.\n0533  Alcatel Mobile Phones\n0534  Motorola, Inc.\n0535  LIH TZU Electric Co., Ltd\n0536  Hand Held Products (Welch Allyn, Inc.)\n\t01a0  PDT\n\t01ca  IT4800 Area Imager\n0537  Inventec Corp.\n0538  Caldera International, Inc. (SCO)\n0539  Shyh Shiun Terminals Co., Ltd\n053a  PrehKeyTec GmbH\n\t0b00  Hub\n\t0b01  Preh MCI 3100\n053b  Global Village Communication\n053c  Institut of Microelectronic & Mechatronic Systems\n053d  Silicon Architect\n053e  Mobility Electronics\n053f  Synopsys, Inc.\n0540  UniAccess AB\n\t0101  Panache Surf ISDN TA\n0541  Sirf Technology, Inc.\n0543  ViewSonic Corp.\n\t00fe  G773 Monitor Hub\n\t00ff  P815 Monitor Hub\n\t0bf2  airpanel V150 Wireless Smart Display\n\t0bf3  airpanel V110 Wireless Smart Display\n\t0ed9  Color Pocket PC V35\n\t0f01  airsync Wi-Fi Wireless Adapter\n\t1527  Color Pocket PC V36\n\t1529  Color Pocket PC V37\n\t152b  Color Pocket PC V38\n\t152e  Pocket PC\n\t1921  Communicator Pocket PC\n\t1922  Smartphone\n\t1923  Pocket PC V30\n\t1a11  Wireless 802.11g Adapter\n\t1e60  TA310 - ATSC/NTSC/PAL Driver(PCM4)\n\t4153  ViewSonic G773 Control (?)\n0544  Cristie Electronics, Ltd\n0545  Xirlink, Inc.\n\t7333  Trution Web Camera\n\t8002  IBM NetCamera\n\t8009  Veo PC Camera\n\t800c  Veo Stingray\n\t800d  Veo PC Camera\n\t8080  IBM C-It Webcam\n\t808a  Veo PC Camera\n\t808b  Veo Stingray\n\t808d  Veo PC Camera\n\t810a  Veo Advanced Connect Webcam\n\t810b  Veo PC Camera\n\t810c  Veo PC Camera\n\t8135  Veo Mobile/Advanced Web Camera\n\t813a  Veo PC Camera\n\t813b  Veo PC Camera\n\t813c  Veo Mobile/Advanced Web Camera\n\t8333  Veo Stingray/Connect Web Camera\n\t888c  eVision 123 digital camera\n\t888d  eVision 123 digital camera\n0546  Polaroid Corp.\n\t0daf  PDC 2300Z\n\t1bed  PDC 1320 Camera\n\t3097  PDC 310\n\t3155  PDC 3070 Camera\n\t3187  Digital Camera\n\t3191  Ion 80 Camera\n\t3273  PDC 2030 Camera\n\t3304  a500 Digital Camera\n\tdccf  Sound Vision Stream Driver\n0547  Anchor Chips, Inc.\n\t0001  ICSI Bluetooth Device\n\t0080  I3SYSTEM HYUNY\n\t1002  Python2 WDM Encoder\n\t1006  Hantek DSO-2100 UF\n\t2131  AN2131 EZUSB Microcontroller\n\t2235  AN2235 EZUSB-FX Microcontroller\n\t2710  EZ-Link Loader (EZLNKLDR.SYS)\n\t2720  AN2720 USB-USB Bridge\n\t2727  Xircom PGUNET USB-USB Bridge\n\t2750  EZ-Link (EZLNKUSB.SYS)\n\t2810  Cypress ATAPI Bridge\n\t4018  AmScope MU1803\n\t4d90  AmScope MD1900 camera\n\t6010  AmScope MU1000 camera\n\t6510  Touptek UCMOS05100KPA\n\t7000  PowerSpec MCE460 Front Panel LED Display\n\t7777  Bluetooth Device\n\t9999  AN2131 uninitialized (?)\n0548  Tyan Computer Corp.\n\t1005  EZ Cart II GameBoy Flash Programmer\n0549  Pixera Corp.\n054a  Fujitsu Microelectronics, Inc.\n054b  New Media Corp.\n054c  Sony Corp.\n\t0001  HUB\n\t0002  Standard HUB\n\t0010  Cyber-shot, Mavica (msc)\n\t0014  Nogatech USBVision (SY)\n\t0022  Storage Adapter V2 (TPP)\n\t0023  CD Writer\n\t0024  Mavica CD-1000 Camera\n\t0025  NW-MS7 Walkman MemoryStick Reader\n\t002b  Portable USB Harddrive V2\n\t002c  USB Floppy Disk Drive\n\t002d  MSAC-US1 MemoryStick Reader\n\t002e  HandyCam MemoryStick Reader\n\t0030  Storage Adapter V2 (TPP)\n\t0032  MemoryStick MSC-U01 Reader\n\t0035  Network Walkman (E)\n\t0036  Net MD\n\t0037  MG Memory Stick Reader/Writer\n\t0038  Clie PEG-S300/D PalmOS PDA\n\t0039  Network Walkman (MS)\n\t003c  VAIO-MX LCD Control\n\t0045  Digital Imaging Video\n\t0046  Network Walkman\n\t0049  UP-D895\n\t004a  Memory Stick Hi-Fi System\n\t004b  Memory Stick Reader/Writer\n\t004e  DSC-xxx (ptp)\n\t0056  MG Memory Stick Reader/Writer\n\t0058  Clie PEG-N7x0C PalmOS PDA Mass Storage\n\t0066  Clie PEG-N7x0C/PEG-T425 PalmOS PDA Serial\n\t0067  CMR-PC3 Webcam\n\t0069  Memorystick MSC-U03 Reader\n\t006c  FeliCa S310 [PaSoRi]\n\t006d  Clie PEG-T425 PDA Mass Storage\n\t006f  Network Walkman (EV)\n\t0073  Storage CRX1750U\n\t0075  Net MD\n\t0076  Storage Adapter ACR-U20\n\t007c  Net MD\n\t007f  IC Recorder (MS)\n\t0080  Net MD\n\t0081  Net MD\n\t0084  Net MD\n\t0085  Net MD\n\t0086  Net MD\n\t008b  Micro Vault 64M Mass Storage\n\t0095  Clie s360\n\t0099  Clie NR70 PDA Mass Storage\n\t009a  Clie NR70 PDA Serial\n\t00ab  Visual Communication Camera (PCGA-UVC10)\n\t00af  DPP-EX Series Digital Photo Printer\n\t00bf  IC Recorder (S)\n\t00c0  Handycam DCR-30\n\t00c6  Net MD\n\t00c7  Net MD\n\t00c8  MZ-N710 Minidisc Walkman\n\t00c9  Net MD\n\t00ca  MZ-DN430 Minidisc Walkman\n\t00cb  MSAC-US20 Memory Stick Reader\n\t00da  Clie nx60\n\t00e8  Network Walkman (MS)\n\t00e9  Handheld\n\t00eb  Net MD\n\t0101  Net MD\n\t0103  IC Recorder (ST)\n\t0105  Micro Vault Hub\n\t0107  VCC-U01 Visual Communication Camera\n\t0110  Digital Imaging Video\n\t0113  Net MD\n\t0116  IC Recorder (P)\n\t0144  Clie PEG-TH55 PDA\n\t0147  Visual Communication Camera (PCGA-UVC11)\n\t014c  Aiwa AM-NX9 Net MD Music Recorder MDLP\n\t014d  Memory Stick Reader/Writer\n\t0154  Eyetoy Audio Device\n\t0155  Eyetoy Video Device\n\t015f  IC Recorder (BM)\n\t0169  Clie PEG-TJ35 PDA Serial\n\t016a  Clie PEG-TJ35 PDA Mass Storage\n\t016b  Mobile HDD\n\t016d  IC Recorder (SX)\n\t016e  DPP-EX50 Digital Photo Printer\n\t0171  Fingerprint Sensor 3500\n\t017e  Net MD\n\t017f  Hi-MD WALKMAN\n\t0180  Net MD\n\t0181  Hi-MD WALKMAN\n\t0182  Net MD\n\t0183  Hi-MD WALKMAN\n\t0184  Net MD\n\t0185  Hi-MD WALKMAN\n\t0186  Net MD\n\t0187  Hi-MD MZ-NH600 WALKMAN\n\t0188  Net MD\n\t018a  Net MD\n\t018b  Hi-MD SOUND GATE\n\t019e  Micro Vault 1.0G Mass Storage\n\t01ad  ATRAC HDD PA\n\t01bb  FeliCa S320 [PaSoRi]\n\t01bd  MRW62E Multi-Card Reader/Writer\n\t01c3  NW-E55 Network Walkman\n\t01c6  MEMORY P-AUDIO\n\t01c7  Printing Support\n\t01c8  PSP Type A\n\t01c9  PSP Type B\n\t01d0  DVD+RW External Drive DRU-700A\n\t01d5  IC RECORDER\n\t01de  VRD-VC10 [Video Capture]\n\t01e7  UP-D897\n\t01e8  UP-DR150 Photo Printer\n\t01e9  Net MD\n\t01ea  Hi-MD WALKMAN\n\t01ee  IC RECORDER\n\t01fa  IC Recorder (P)\n\t01fb  NW-E405 Network Walkman\n\t020f  Device\n\t0210  ATRAC HDD PA\n\t0219  Net MD\n\t021a  Hi-MD WALKMAN\n\t021b  Net MD\n\t021c  Hi-MD WALKMAN\n\t021d  Net MD\n\t0226  UP-CR10L\n\t0227  Printing Support\n\t022c  Net MD\n\t022d  Hi-MD AUDIO\n\t0233  ATRAC HDD PA\n\t0236  Mobile HDD\n\t023b  DVD+RW External Drive DRU-800UL\n\t023c  Net MD\n\t023d  Hi-MD WALKMAN\n\t0243  MicroVault Flash Drive\n\t024b  Vaio VGX Mouse\n\t0257  IFU-WLM2 USB Wireless LAN Module (Wireless Mode)\n\t0258  IFU-WLM2 USB Wireless LAN Module (Memory Mode)\n\t0259  IC RECORDER\n\t0267  Tachikoma Device\n\t0268  Batoh Device / PlayStation 3 Controller\n\t0269  HDD WALKMAN\n\t026a  HDD WALKMAN\n\t0271  IC Recorder (P)\n\t027c  NETWORK WALKMAN\n\t027e  SONY Communicator\n\t027f  IC RECORDER\n\t0286  Net MD\n\t0287  Hi-MD WALKMAN\n\t0290  VGP-UVC100 Visual Communication Camera\n\t029b  PRS-500 eBook reader\n\t02a5  MicroVault Flash Drive\n\t02af  Handycam DCR-DVD306E\n\t02c4  Device\n\t02d1  DVD RW\n\t02d2  PSP Slim\n\t02d4  UP-CX1\n\t02d8  SBAC-US10 SxS PRO memory card reader/writer\n\t02e1  FeliCa S330 [PaSoRi]\n\t02ea  PlayStation 3 Memory Card Adaptor\n\t02f9  DSC-H9\n\t0317  WALKMAN\n\t031a  Walkman NWD-B103F\n\t031e  PRS-300/PRS-505 eBook reader\n\t0325  NWZ-A818\n\t033e  DSC-W120/W290\n\t0346  Handycam DCR-SR55E\n\t0348  HandyCam HDR-TG3E\n\t035b  Walkman NWZ-A828\n\t035c  NWZ-A726/A728/A729\n\t035f  UP-DR200 Photo Printer\n\t0360  M2 Card Reader\n\t0382  Memory Stick PRO-HG Duo Adaptor (MSAC-UAH1)\n\t0385  Walkman NWZ-E436F\n\t0387  IC Recorder (P)\n\t03bc  Webbie HD - MHS-CM1\n\t03c3  UP-DR80MD\n\t03c4  Stryker SDP1000\n\t03c5  UP-DR80\n\t03cc  SD Card Reader\n\t03d1  DPF-X95\n\t03d3  DR-BT100CX\n\t03d5  PlayStation Move motion controller\n\t03fc  WALKMAN [NWZ-E345]\n\t03fd  Walkman NWZ-E443\n\t042f  PlayStation Move navigation controller\n\t0440  DSC-H55\n\t0485  MHS-PM5 HD camcorder\n\t04cb  WALKMAN NWZ-E354\n\t0541  DSC-HX100V [Cybershot Digital Still Camera]\n\t0568  DSC-H100 in Mass Storage mode\n\t05c4  DualShock 4 [CUH-ZCT1x]\n\t0643  DSC-H100 in PTP/MTP mode\n\t0689  Walkman NWZ-B173F\n\t068c  UP-D711\n\t06bb  WALKMAN NWZ-F805\n\t06c3  RC-S380\n\t07c3  ILCE-6000 (aka Alpha-6000) in Mass Storage mode\n\t07c4  ILCE-6000 (aka Alpha-6000) in Mass Storage mode\n\t082f  Walkman NWZW Series\n\t0847  WG-C10 Portable Wireless Server\n\t0873  UP-971AD\n\t0877  UP-D898/X898 series\n\t0884  MDR-ZX770BN [Wireless Noise Canceling Stereo Headset]\n\t088c  Portable Headphone Amplifier\n\t08b7  ILCE-6000 (aka Alpha-6000) in MTP mode\n\t094e  ILCE-6000 (aka Alpha-6000) in PC Remote mode\n\t098d  Walkman NWZ-B183F\n\t0994  ILCE-6000 (aka Alpha-6000) in charging mode\n\t09c2  D33021 Storage\n\t09cc  DualShock 4 [CUH-ZCT2x]\n\t0ba0  Dualshock4 Wireless Adaptor\n\t0bb5  Headset MDR-1000X\n\t0c02  ILCE-7M3 [A7III] in Mass Storage mode\n\t0c03  ILCE-7M3 [A7III] in MTP mode\n\t0c34  ILCE-7M3 [A7III] in PC Remote mode\n\t0c7f  WH-CH700N [Wireless Noise-Canceling Headphones]\n\t0cd3  WH-1000XM3 [Wireless Noise-Canceling Headphones]\n\t0cda  PlayStation Classic controller\n\t0ce0  WF-1000XM3 [Wireless Noise-Canceling Headphones]\n\t0ce6  DualSense wireless controller (PS5)\n\t0cf0  MRW-G1\n\t0d58  WH-1000XM4 [Wireless Noise-Canceling Headphones]\n\t0df2  DualSense Edge wireless controller (PS5)\n\t1000  Wireless Buzz! Receiver\n054d  Try Corp.\n054e  Proside Corp.\n054f  WYSE Technology Taiwan\n0550  Fuji Xerox Co., Ltd\n\t0002  InkJet Color Printer\n\t0004  InkJet Color Printer\n\t0005  InkJet Color Printer\n\t000b  Workcentre 24\n\t014e  CM215b Printer\n\t0165  DocuPrint M215b\n0551  CompuTrend Systems, Inc.\n0552  Philips Monitors\n0553  STMicroelectronics Imaging Division (VLSI Vision)\n\t0001  TerraCAM\n\t0002  CPiA Webcam\n\t0100  STV0672 Camera\n\t0140  Video Camera\n\t0150  CDE CAM 100\n\t0151  Digital Blue QX5 Microscope\n\t0200  Dual-mode Camera0\n\t0201  Dual-mode Camera1\n\t0202  STV0680 Camera\n\t0674  Multi-mode Camera\n\t0679  NMS Video Camera (Webcam)\n\t1002  Che-ez! Splash\n0554  Dictaphone Corp.\n0555  ANAM S&T Co., Ltd\n0556  Asahi Kasei Microsystems Co., Ltd\n\t0001  AK5370 I/F A/D Converter\n0557  ATEN International Co., Ltd\n\t2001  UC-1284 Printer Port\n\t2002  10Mbps Ethernet [klsi]\n\t2004  UC-100KM PS/2 Mouse and Keyboard adapter\n\t2006  UC-1284B Printer Port\n\t2007  UC-110T 100Mbps Ethernet [pegasus]\n\t2008  UC-232A Serial Port [pl2303]\n\t2009  UC-210T Ethernet\n\t2011  UC-2324 4xSerial Ports [mos7840]\n\t2202  CS124U Miniview II KVM Switch\n\t2212  Keyboard/Mouse\n\t2213  CS682 2-Port USB 2.0 DVI KVM Switch\n\t2221  Winbond Hermon\n\t2404  4-port switch\n\t2419  Virtual mouse/keyboard device\n\t2600  IDE Bridge\n\t2701  CE700A KVM Extender\n\t4000  DSB-650 10Mbps Ethernet [klsi]\n\t7000  Hub\n\t7820  UC-2322 2xSerial Ports [mos7820]\n\t8021  Hub\n0558  Truevision, Inc.\n\t1009  GW Instek GDS-1000 Oscilloscope\n\t100a  GW Instek GDS-1000A Oscilloscope\n\t2009  GW Instek GDS-2000 Oscilloscope\n0559  Cadence Design Systems, Inc.\n055a  Kenwood USA\n055b  KnowledgeTek, Inc.\n055c  Proton Electronic Ind.\n055d  Samsung Electro-Mechanics Co.\n\t0001  Keyboard\n\t0bb1  Bluetooth Device\n\t1030  Optical Wheel Mouse (OMS3CB/OMGB30)\n\t1031  Optical Wheel Mouse (OMA3CB/OMGI30)\n\t1040  Mouse HID Device\n\t1050  E-Mail Optical Wheel Mouse (OMS3CE)\n\t1080  Optical Wheel Mouse (OMS3CH)\n\t2020  Floppy Disk Drive\n\t6780  Keyboard V1\n\t6781  Keyboard Mouse\n\t8001  E.M. Hub\n\t9000  AnyCam [pwc]\n\t9001  MPC-C30 AnyCam Premium for Notebooks [pwc]\n\ta000  SWL-2100U\n\ta010  WLAN Adapter(SWL-2300)\n\ta011  Boot Device\n\ta012  WLAN Adapter(SWL-2300)\n\ta013  WLAN Adapter(SWL-2350)\n\ta230  Boot Device\n\tb000  11Mbps WLAN Mini Adapter\n\tb230  Netopia 802.11b WLAN Adapter\n\tb231  LG Wireless LAN 11b Adapter\n055e  CTX Opto-Electronics Corp.\n055f  Mustek Systems, Inc.\n\t0001  ScanExpress 1200 CU\n\t0002  ScanExpress 600 CU\n\t0003  ScanExpress 1200 USB\n\t0006  ScanExpress 1200 UB\n\t0007  ScanExpress 1200 USB Plus\n\t0008  ScanExpress 1200 CU Plus\n\t0010  BearPaw 1200F\n\t0210  ScanExpress A3 USB\n\t0218  BearPaw 2400 TA\n\t0219  BearPaw 2400 TA Plus\n\t021a  BearPaw 2448 TA Plus\n\t021b  BearPaw 1200 CU Plus\n\t021c  BearPaw 1200 CU Plus\n\t021d  BearPaw 2400 CU Plus\n\t021e  BearPaw 1200 TA/CS\n\t021f  SNAPSCAN e22\n\t0400  BearPaw 2400 TA Pro\n\t0401  P 3600 A3 Pro\n\t0408  BearPaw 2448 CU Pro\n\t0409  BearPaw 2448 TA Pro\n\t040b  ScanExpress A3 USB 1200 PRO\n\t0501  ScanExpress A3 2400 Pro\n\t0873  ScanExpress 600 USB\n\t1000  BearPaw 4800 TA Pro\n\ta350  gSmart 350 Camera\n\ta800  MDC 800 Camera\n\tb500  MDC 3000 Camera\n\tc005  PC CAM 300A\n\tc200  gSmart 300\n\tc211  Kowa Bs888e Microcamera\n\tc220  gSmart mini\n\tc230  Digicam 330K\n\tc232  MDC3500 Camera\n\tc360  DV 4000 Camera\n\tc420  gSmart mini 2 Camera\n\tc430  gSmart LCD 2 Camera\n\tc440  DV 3000 Camera\n\tc520  gSmart mini 3 Camera\n\tc530  gSmart LCD 2 Camera\n\tc540  gSmart D30 Camera\n\tc630  MDC 4000 Camera\n\tc631  MDC 4000 Camera\n\tc650  MDC 5500Z Camera\n\td001  WCam 300\n\td003  WCam 300A\n\td004  WCam 300AN\n0560  Interface Corp.\n0561  Oasis Design, Inc.\n0562  Telex Communications, Inc.\n\t0001  Enhanced Microphone\n\t0002  Telex Microphone\n0563  Immersion Corp.\n0564  Kodak Digital Product Center, Japan Ltd. (formerly Chinon Industries Inc.)\n0565  Peracom Networks, Inc.\n\t0001  Serial Port [etek]\n\t0002  Enet Ethernet [klsi]\n\t0003  @Home Networks Ethernet [klsi]\n\t0005  Enet2 Ethernet [klsi]\n\t0041  Peracom Remote NDIS Ethernet Adapter\n0566  Monterey International Corp.\n\t0110  ViewMate Desktop Mouse CC2201\n\t1001  ViewMate Desktop Mouse CC2201\n\t1002  ViewMate Desktop Mouse CC2201\n\t1003  ViewMate Desktop Mouse CC2201\n\t1004  ViewMate Desktop Mouse CC2201\n\t1005  ViewMate Desktop Mouse CC2201\n\t1006  ViewMate Desktop Mouse CC2201\n\t1007  ViewMate Desktop Mouse CC2201\n\t2800  MIC K/B\n\t2801  MIC K/B Mouse\n\t2802  Kbd Hub\n\t3002  Keyboard\n\t3004  Genius KB-29E\n\t3013  BakkerElkhuizen Wired Keyboard S-board 840 Design\n\t3020  BakkerElkhuizen Wired Keyboard S-board 840 Design USB-Hub\n\t3027  Sun-Flex ProTouch\n\t3107  Keyboard\n\t3132  Optical mouse M-DY4DR / M-DY6DR\n\t4006  FID 638 Mouse (Sun Microsystems)\n0567  Xyratex International, Ltd\n0568  Quartz Ingenierie\n0569  SegaSoft\n056a  Wacom Co., Ltd\n\t0000  PenPartner\n\t0001  PenPartner 4x5\n\t0002  PenPartner 6x8\n\t0003  PTU-600 [Cintiq Partner]\n\t0010  ET-0405 [Graphire]\n\t0011  ET-0405A [Graphire2 (4x5)]\n\t0012  ET-0507A [Graphire2 (5x7)]\n\t0013  CTE-430 [Graphire3 (4x5)]\n\t0014  CTE-630 [Graphire3 (6x8)]\n\t0015  CTE-440 [Graphire4 (4x5)]\n\t0016  CTE-640 [Graphire4 (6x8)]\n\t0017  CTE-450 [Bamboo Fun (small)]\n\t0018  CTE-650 [Bamboo Fun (medium)]\n\t0019  CTE-631 [Bamboo One]\n\t0020  GD-0405 [Intuos (4x5)]\n\t0021  GD-0608 [Intuos (6x8)]\n\t0022  GD-0912 [Intuos (9x12)]\n\t0023  GD-1212 [Intuos (12x12)]\n\t0024  GD-1218 [Intuos (12x18)]\n\t0026  PTH-450 [Intuos5 touch (S)]\n\t0027  PTH-650 [Intuos5 touch (M)]\n\t0028  PTH-850 [Intuos5 touch (L)]\n\t0029  PTK-450 [Intuos5 (S)]\n\t002a  PTK-650 [Intuos5 (M)]\n\t0030  PL400\n\t0031  PL500\n\t0032  PL600\n\t0033  PL600SX\n\t0034  PL550\n\t0035  PL800\n\t0037  PL700\n\t0038  PL510\n\t0039  DTU-710\n\t003a  DTI-520\n\t003b  Integrated Hub\n\t003f  DTZ-2100 [Cintiq 21UX]\n\t0041  XD-0405-U [Intuos2 (4x5)]\n\t0042  XD-0608-U [Intuos2 (6x8)]\n\t0043  XD-0912-U [Intuos2 (9x12)]\n\t0044  XD-1212-U [Intuos2 (12x12)]\n\t0045  XD-1218-U [Intuos2 (12x18)]\n\t0047  Intuos2 6x8\n\t0057  DTK-2241\n\t0059  DTH-2242 tablet\n\t005b  DTH-2200 [Cintiq 22HD Touch] tablet\n\t005d  DTH-2242 touchscreen\n\t005e  DTH-2200 [Cintiq 22HD Touch] touchscreen\n\t0060  FT-0405 [Volito, PenPartner, PenStation (4x5)]\n\t0061  FT-0203 [Volito, PenPartner, PenStation (2x3)]\n\t0062  CTF-420 [Volito2]\n\t0063  CTF-220 [BizTablet]\n\t0064  CTF-221 [PenPartner2]\n\t0065  MTE-450 [Bamboo]\n\t0069  CTF-430 [Bamboo One]\n\t006a  CTE-460 [Bamboo One Pen (S)]\n\t006b  CTE-660 [Bamboo One Pen (M)]\n\t0081  CTE-630BT [Graphire Wireless (6x8)]\n\t0084  ACK-40401 [Wireless Accessory Kit]\n\t0090  TPC90\n\t0093  TPC93\n\t0097  TPC97\n\t009a  TPC9A\n\t00a2  STU-300B [LCD signature pad]\n\t00b0  PTZ-430 [Intuos3 (4x5)]\n\t00b1  PTZ-630 [Intuos3 (6x8)]\n\t00b2  PTZ-930 [Intuos3 (9x12)]\n\t00b3  PTZ-1230 [Intuos3 (12x12)]\n\t00b4  PTZ-1231W [Intuos3 (12x19)]\n\t00b5  PTZ-631W [Intuos3 (6x11)]\n\t00b7  PTZ-431W [Intuos3 (4x6)]\n\t00b8  PTK-440 [Intuos4 (4x6)]\n\t00b9  PTK-640 [Intuos4 (6x9)]\n\t00ba  PTK-840 [Intuos4 (8x13)]\n\t00bb  PTK-1240 [Intuos4 (12x19)]\n\t00c0  DTF-521\n\t00c4  DTF-720\n\t00c5  DTZ-2000W [Cintiq 20WSX]\n\t00c6  DTZ-1200W [Cintiq 12WX]\n\t00c7  DTU-1931\n\t00cc  DTK-2100 [Cintiq 21UX]\n\t00ce  DTU-2231\n\t00d0  CTT-460 [Bamboo Touch]\n\t00d1  CTH-460 [Bamboo Pen & Touch]\n\t00d2  CTH-461 [Bamboo Fun/Craft/Comic Pen & Touch (S)]\n\t00d3  CTH-661 [Bamboo Fun/Comic Pen & Touch (M)]\n\t00d4  CTL-460 [Bamboo Pen (S)]\n\t00d5  CTL-660 [Bamboo Pen (M)]\n\t00d6  CTH-460 [Bamboo Pen & Touch]\n\t00d7  CTH-461 [Bamboo Fun/Craft/Comic Pen & Touch (S)]\n\t00d8  CTH-661 [Bamboo Fun/Comic Pen & Touch (M)]\n\t00d9  CTT-460 [Bamboo Touch]\n\t00da  CTH-461SE [Bamboo Pen & Touch Special Edition (S)]\n\t00db  CTH-661SE [Bamboo Pen & Touch Special Edition (M)]\n\t00dc  CTT-470 [Bamboo Touch]\n\t00dd  CTL-470 [Bamboo Connect]\n\t00de  CTH-470 [Bamboo Fun Pen & Touch]\n\t00df  CTH-670 [Bamboo Create/Fun]\n\t00e2  TPCE2\n\t00e3  TPCE3\n\t00e5  TPCE5\n\t00e6  TPCE6\n\t00ec  TPCEC\n\t00ed  TPCED\n\t00ef  TPCEF\n\t00f0  DTU-1631\n\t00f4  DTK-2400 [Cintiq 24HD] tablet\n\t00f6  DTH-2400 [Cintiq 24HD touch] touchscreen\n\t00f8  DTH-2400 [Cintiq 24HD touch] tablet\n\t00f9  DTK-2200 [Cintiq 22HD] hub\n\t00fa  DTK-2200 [Cintiq 22HD] tablet\n\t00fb  DTU-1031\n\t0100  TPC100\n\t0101  TPC101\n\t010d  TPC10D\n\t010e  TPC10E\n\t010f  TPC10F\n\t0116  TPC116\n\t012c  TPC12C\n\t0221  MDP-123 [Inkling]\n\t0300  CTL-471 [Bamboo Splash, One by Wacom (S)]\n\t0301  CTL-671 [One by Wacom (M)]\n\t0302  CTH-480 [Intuos Pen & Touch (S)]\n\t0303  CTH-680 [Intuos Pen & Touch (M)]\n\t0304  DTK-1300 [Cintiq 13HD]\n\t0307  DTH-A1300 [Cintiq Companion Hybrid] tablet\n\t0309  DTH-A1300 [Cintiq Companion Hybrid] touchscreen\n\t030e  CTL-480 [Intuos Pen (S)]\n\t0314  PTH-451 [Intuos pro (S)]\n\t0315  PTH-651 [Intuos pro (M)]\n\t0317  PTH-851 [Intuos pro (L)]\n\t0318  CTH-301 [Bamboo]\n\t0319  CTH-300 [Bamboo Pad wireless]\n\t0323  CTL-680 [Intuos Pen (M)]\n\t032a  DTK-2700 [Cintiq 27QHD]\n\t032b  DTH-2700 [Cintiq 27QHD touch] tablet\n\t032c  DTH-2700 [Cintiq 27QHD touch] touchscreen\n\t032f  DTU-1031X\n\t0331  ACK-411050 [ExpressKey Remote]\n\t0333  DTH-1300 [Cintiq 13HD Touch] tablet\n\t0335  DTH-1300 [Cintiq 13HD Touch] touchscreen\n\t0336  DTU-1141\n\t033b  CTL-490 [Intuos Draw (S)]\n\t033c  CTH-490 [Intuos Art/Photo/Comic (S)]\n\t033d  CTL-690 [Intuos Draw (M)]\n\t033e  CTH-690 [Intuos Art (M)]\n\t0343  DTK-1651\n\t0347  DTH-W1620 [MobileStudio Pro 16] internal hub\n\t0348  DTH-W1620 [MobileStudio Pro 16] external hub\n\t034a  DTH-W1320 [MobileStudio Pro 13] touchscreen\n\t034b  DTH-W1620 [MobileStudio Pro 16] touchscreen\n\t034d  DTH-W1320 [MobileStudio Pro 13] tablet\n\t034e  DTH-W1620 [MobileStudio Pro 16] tablet\n\t034f  DTH-1320 [Cintiq Pro 13] tablet\n\t0350  DTH-1620 [Cintiq Pro 16] tablet\n\t0351  DTH-2420 [Cintiq Pro 24 PT] tablet\n\t0352  DTH-3220 [Cintiq Pro 32] tablet\n\t0353  DTH-1320 [Cintiq Pro 13] touchscreen\n\t0354  DTH-1620 [Cintiq Pro 16] touchscreen\n\t0355  DTH-2420 [Cintiq Pro 24 PT] touchscreen\n\t0356  DTH-3220 [Cintiq Pro 32] touchscreen\n\t0357  PTH-660 [Intuos Pro (M)]\n\t0358  PTH-860 [Intuos Pro (L)]\n\t0359  DTU-1141B\n\t035a  DTH-1152 tablet\n\t0368  DTH-1152 touchscreen\n\t0374  CTL-4100 [Intuos (S)]\n\t0375  CTL-6100 [Intuos (M)]\n\t0376  CTL-4100WL [Intuos BT (S)]\n\t0378  CTL-6100WL [Intuos BT (M)]\n\t037a  CTL-472 [One by Wacom (S)]\n\t037b  CTL-672 [One by Wacom (M)]\n\t037c  DTK-2420 [Cintiq Pro 24 P]\n\t037d  DTH-2452 tablet\n\t037e  DTH-2452 touchscreen\n\t0382  DTK-2451 tablet\n\t038a  DTH-3220 [Cintiq Pro 32] internal hub\n\t038d  DTH-3220 [Cintiq Pro 32] internal hub\n\t038e  DTH-3220 [Cintiq Pro 32] external hub\n\t038f  DTH-3220 [Cintiq Pro 32] internal hub\n\t0390  DTK-1660 [Cintiq 16]\n\t0392  PTH-460 [Intuos Pro (S)]\n\t0396  DTK-1660E\n\t0398  DTH-W1320 [MobileStudio Pro 13] tablet\n\t0399  DTH-W1620 [MobileStudio Pro 16] tablet\n\t039a  DTH-W1320 [MobileStudio Pro 13] touchscreen\n\t039b  DTH-W1620 [MobileStudio Pro 16] touchscreen\n\t039c  DTH-W1320 [MobileStudio Pro 16] external hub\n\t039d  DTH-W1320 [MobileStudio Pro 16] internal hub\n\t03aa  DTH-W1620 [MobileStudio Pro 16] tablet\n\t03ac  DTH-W1620 [MobileStudio Pro 16] touchscreen\n\t03b2  DTH167 [Cintiq Pro 16] tablet\n\t03b3  DTH167 [Cintiq Pro 16] touchscreen\n\t03c0  DTH271 [Cintiq Pro 27] touchscreen\n\t03c4  DTH172 [Cintiq Pro 17]\n\t03c5  CTL-4100WL [Intuos BT (S)]\n\t03c7  CTL-6100WL [Intuos BT (M)]\n\t03cb  DTH134 [Wacom One 13] touchscreen\n\t03ce  DTC121 [Wacom One 12] touchscreen\n\t03d0  DTH227 [Cintiq Pro 22]\n\t03dc  PTH-460 [Intuos Pro (S)] tablet\n\t03dd  PTH-460 [Intuos Pro BT (S)] tablet\n\t03ec  DTH134 [DTH134] touchscreen\n\t03ed  DTC121 [DTC121] touchscreen\n\t03f0  DTH135 [Movink 13]\n\t0400  PenPartner 4x5\n\t4001  TPC4001\n\t4004  TPC4004\n\t4850  PenPartner 6x8\n\t5000  TPC5000\n\t5002  TPC5002\n\t5010  TPC5010\n056b  Decicon, Inc.\n056c  eTEK Labs\n\t0006  KwikLink Host-Host Connector\n\t8007  Kwik232 Serial Port\n\t8100  KwikLink Host-Host Connector\n\t8101  KwikLink USB-USB Bridge\n056d  EIZO Corp.\n\t0000  Hub\n\t0001  Monitor\n\t0002  HID Monitor Controls\n\t0003  Device Bay Controller\n\t4000  FlexScan EV3237\n\t4001  FlexScan EV2450\n\t4002  FlexScan EV2455\n\t4014  FlexScan EV2750\n\t4026  FlexScan EV2451\n\t4027  FlexScan EV2456\n\t402b  FlexScan EV2780\n\t4036  FlexScan EV2785\n\t4037  FlexScan EV3285\n\t4044  FlexScan EV2457\n\t4059  FlexScan EV2760\n\t405a  FlexScan EV2360\n\t405b  FlexScan EV2460\n\t405e  FlexScan EV2495\n\t405f  FlexScan EV2795\n\t4065  FlexScan EV3895\n\t406a  FlexScan EV2480\n056e  Elecom Co., Ltd\n\t0002  29UO Mouse\n\t0057  Micro Grast Pop M-PGDL\n\t005c  Micro Grast Pop M-PG2DL\n\t005d  Micro Grast Fit M-FGDL\n\t005e  Micro Grast Fit M-FG2DL\n\t0062  Optical mouse M-D18DR\n\t0063  Laser mouse M-SODL\n\t0069  Laser mouse M-GE1UL\n\t0071  Laser mouse M-GE3DL\n\t0072  Laser mouse M-LS6UL\n\t0073  Laser mouse M-LS7UL\n\t0074  Optical mouse M-FW1UL\n\t0075  Laser mouse M-FW2DL\n\t0077  Laser mouse M-LY2UL\n\t0079  Laser mouse M-D21DL\n\t007b  Laser mouse M-D20DR\n\t007c  Laser Bluetooth mouse M-BT5BL\n\t007e  Option mouse M-M8UR\n\t007f  Option mouse M-M9UR\n\t0081  Option mouse M-DY6DR\n\t0082  Laser mouse M-D22DR\n\t0088  Micro Grast2 Bit M-BG3DL\n\t0089  Micro Grast2 Pop M-PG3DL\n\t008c  M-NE3DL Mouse\n\t008d  ORIME M-NE4DR\n\t008f  M-BT8BL Bluetooth Mouse\n\t0092  Wireless BlueLED Mouse (M-BL2DB)\n\t009c  IR Mouse M-IR02DR\n\t009d  IR Mouse M-IR03DR\n\t009f  BlueLED Mouse M-HS1DB\n\t00a1  IR Mouse M-IR05DR\n\t00a4  Blue LED Mouse M-BL06DB\n\t00a5  M-NV1BR Bluetooth Mouse\n\t00a7  Blue LED Mouse M-BL08DB\n\t00a8  M-BL09DB Mouse\n\t00a9  M-BL10UB Mouse\n\t00aa  M-BL11DB Mouse\n\t00ac  M-A-BL01UL / M-BL15DB Mouse\n\t00b4  Track on Glass Mouse M-TG02DL\n\t00b5  Track on Glass Mouse M-TG03UL\n\t00b6  Track on Glass Mouse M-TG04DL\n\t00b8  M-A-BL01UL or M-ASKL2 Mouse\n\t00b9  M-A-BL02DB or M-ASKL Mouse\n\t00cb  M-BL21DB Mouse\n\t00cd  M-XG1UB Mouse\n\t00ce  M-XG1DB Mouse\n\t00cf  M-XG1BB Bluetooth Mouse\n\t00d0  M-XG2UB Mouse\n\t00d1  M-XG2DB Mouse\n\t00d2  M-XG2BB Bluetooth Mouse\n\t00d3  M-XG3DL Mouse\n\t00d4  M-LS11DL Mouse\n\t00da  M-XG4UB Mouse\n\t00db  M-XG4DB Mouse\n\t00dc  M-XG4BB Bluetooth Mouse\n\t00dd  M-LS12UL Mouse\n\t00de  M-LS13UL Mouse\n\t00df  M-BL22DB Mouse\n\t00e1  M-WK01DB or M-A-BL04DB\n\t00e2  M-A-BL03DB\n\t00e3  M-XGx10UB\n\t00e4  M-XGx10DB\n\t00e5  M-XGx10BB\n\t00e6  M-XGx20DL or M-XGx20DB UltimateLaser Mouse\n\t00f1  M-XT1DRBK USB EX-G Wireless Optical TrackBall\n\t00f2  M-XT1URBK EX-G Optical Trackball\n\t00f3  M-BL23DB\n\t00f4  M-BT13BL LBT-UAN05C2\n\t00f7  M-KN1DB\n\t00f8  M-BL22DB Mouse (other version)\n\t00f9  M-XT2URBK EX-G Optical TrackBall\n\t00fa  M-XT2DRBK EX-G Wireless Optical TrackBall\n\t00fb  M-XT3URBK EX-G Optical TrackBall\n\t00fc  M-XT3DRBK EX-G Wireless Optical TrackBall\n\t00fd  M-XT4DRBK EX-G Wireless Optical TrackBall\n\t00fe  M-DT1URBK or M-DT2URBK DEFT Optical TrackBall\n\t00ff  M-DT1DRBK or M-DT2DRBK DEFT Wireless Optical Mouse\n\t0101  M-BL25UBS\n\t0103  M-BT16BBS\n\t0104  M-BL26UBC\n\t0105  M-BL26DBC\n\t0107  M-LS15UL\n\t0108  M-LS15DL\n\t0109  M-LS16UL Mouse\n\t010a  M-LS16DL / M-KN2DLS\n\t010b  M-BL21DB Mouse\n\t010c  M-HT1URBK HUGE Optical TrackBall\n\t010d  M-HT1DRBK HUGE Wireless Optical TrackBall\n\t010e  M-KS1DBS / M-FPG3DBS\n\t010f  M-FBG3DB\n\t0115  M-BT13BL\n\t0121  M-ED01DB\n\t0122  M-NK01DB\n\t0124  Dual connect Mouse M-DC01MB Bluetooth\n\t0128  TrackBall Mouse M-XPT1MR Wired\n\t0129  TrackBall Mouse M-XPT1MR Wireless\n\t0130  TrackBall Mouse M-XPT1MR Bluetooth\n\t0131  TrackBall Mouse M-DPT1MR Wired\n\t0132  TrackBall Mouse M-DPT1MR Wireless\n\t0133  TrackBall Mouse M-DPT1MR Bluetooth\n\t0136  M-BT20BB\n\t0137  BlueTooth 4.0 Mouse M-BT21BB\n\t0138  M-A-BL07DB\n\t0140  M-G01UR\n\t0141  M-Y9UB\n\t0142  M-DY13DB\n\t0144  M-FBL01DB\n\t1055  TK-DCP03 WIRED\n\t1057  TK-DCP03 BT\n\t2003  JC-U3613M\n\t2004  JC-U3613M\n\t200c  LD-USB/TX\n\t200f  JC-U4013S Gamepad\n\t2012  JC-U4013S Gamepad\n\t4002  Laneed 100Mbps Ethernet LD-USB/TX [pegasus]\n\t4005  LD-USBL/TX\n\t400b  LD-USB/TX\n\t4010  LD-USB20\n\t5003  UC-SGT\n\t5004  UC-SGT\n\t6008  Flash Disk\n\tabc1  LD-USB/TX\n056f  Korea Data Systems Co., Ltd\n\tcd00  CDM-751 CD organizer\n0570  Epson America\n0571  Interex, Inc.\n\t0002  echoFX InterView Lite\n0572  Conexant Systems (Rockwell), Inc.\n\t0001  Ezcam II Webcam\n\t0002  Ezcam II Webcam\n\t0040  Wondereye CP-115 Webcam\n\t0041  Webcam Notebook\n\t0042  Webcam Notebook\n\t0320  DVBSky T330 DVB-T2/C tuner\n\t1232  V.90 modem\n\t1234  Typhoon Redfun Modem V90 56k\n\t1252  HCF V90 Data Fax Voice Modem\n\t1253  Zoom V.92 Faxmodem\n\t1300  SoftK56 Data Fax Voice CARP\n\t1301  Modem Enumerator\n\t1328  TrendNet TFM-561 modem\n\t1340  CX93010 ACF Modem\n\t1804  HP Dock Audio\n\t2000  SoftGate 802.11 Adapter\n\t2002  SoftGate 802.11 Adapter\n\t262a  tm5600 Video & Audio Grabber Capture\n\t680c  DVBSky T680C DVB-T2/C tuner\n\t6831  DVBSky S960 DVB-S2 tuner\n\t8390  WinFast PalmTop/Novo TV Video\n\t8392  WinFast PalmTop/Novo TV Video\n\t960c  DVBSky S960C DVB-S2 tuner\n\tc686  Geniatech T220A DVB-T2 TV Stick\n\tc688  Geniatech T230 DVB-T2 TV Stick\n\tcafc  CX861xx ROM Boot Loader\n\tcafd  CX82310 ROM Boot Loader\n\tcafe  AccessRunner ADSL Modem\n\tcb00  ADSL Modem\n\tcb01  ADSL Modem\n\tcb06  StarModem Network Interface\n0573  Zoran Co. Personal Media Division (Nogatech)\n\t0003  USBGear USBG-V1\n\t0400  D-Link V100\n\t0600  Dazzle USBVision (1006)\n\t1300  leadtek USBVision (1006)\n\t2000  X10 va10a Wireless Camera\n\t2001  Dazzle EmMe (2001)\n\t2101  Zoran Co. PMD (Nogatech) AV-grabber Manhattan\n\t2d00  Osprey 50\n\t2d01  Hauppauge USB-Live Model 600\n\t3000  Dazzle MicroCam (NTSC)\n\t3001  Dazzle MicroCam (PAL)\n\t4000  Nogatech TV! (NTSC)\n\t4001  Nogatech TV! (PAL)\n\t4002  Nogatech TV! (PAL-I-)\n\t4003  Nogatech TV! (MF-)\n\t4008  Nogatech TV! (NTSC) (T)\n\t4009  Nogatech TV! (PAL) (T)\n\t4010  Nogatech TV! (NTSC) (A)\n\t4100  USB-TV FM (NTSC)\n\t4110  PNY USB-TV (NTSC) FM\n\t4400  Nogatech TV! Pro (NTSC)\n\t4401  Nogatech TV! Pro (PAL)\n\t4450  PixelView PlayTv-USB PRO (PAL) FM\n\t4451  Nogatech TV! Pro (PAL+)\n\t4452  Nogatech TV! Pro (PAL-I+)\n\t4500  Nogatech TV! Pro (NTSC)\n\t4501  Nogatech TV! Pro (PAL)\n\t4550  ZTV ZT-721 2.4GHz A/V Receiver\n\t4551  Dazzle TV! Pro Audio (P+)\n\t4d00  Hauppauge WinTV-USB USA\n\t4d01  Hauppauge WinTV-USB\n\t4d02  Hauppauge WinTV-USB UK\n\t4d03  Hauppauge WinTV-USB France\n\t4d04  Hauppauge WinTV (PAL D/K)\n\t4d10  Hauppauge WinTV-USB with FM USA radio\n\t4d11  Hauppauge WinTV-USB (PAL) with FM radio\n\t4d12  Hauppauge WinTV-USB UK with FM Radio\n\t4d14  Hauppauge WinTV (PAL D/K FM)\n\t4d20  Hauppauge WinTV-USB II (PAL) with FM radio\n\t4d21  Hauppauge WinTV-USB II (PAL)\n\t4d22  Hauppauge WinTV-USB II (PAL) Model 566\n\t4d23  Hauppauge WinTV-USB France 4D23\n\t4d24  Hauppauge WinTV Pro (PAL D/K)\n\t4d25  Hauppauge WinTV-USB Model 40209 rev B234\n\t4d26  Hauppauge WinTV-USB Model 40209 rev B243\n\t4d27  Hauppauge WinTV-USB Model 40204 Rev B281\n\t4d28  Hauppauge WinTV-USB Model 40204 rev B283\n\t4d29  Hauppauge WinTV-USB Model 40205 rev B298\n\t4d2a  Hauppague WinTV-USB Model 602 Rev B285\n\t4d2b  Hauppague WinTV-USB Model 602 Rev B282\n\t4d2c  Hauppauge WinTV Pro (PAL/SECAM)\n\t4d30  Hauppauge WinTV-USB FM Model 40211 Rev B123\n\t4d31  Hauppauge WinTV-USB III (PAL) with FM radio Model 568\n\t4d32  Hauppauge WinTV-USB III (PAL) FM Model 573\n\t4d34  Hauppauge WinTV Pro (PAL D/K FM)\n\t4d35  Hauppauge WinTV-USB III (PAL) FM Model 597\n\t4d36  Hauppauge WinTV Pro (PAL B/G FM)\n\t4d37  Hauppauge WinTV-USB Model 40219 rev E189\n\t4d38  Hauppauge WinTV Pro (NTSC FM)\n0574  City University of Hong Kong\n0575  Philips Creative Display Solutions\n0576  BAFO/Quality Computer Accessories\n0577  ELSA\n0578  Intrinsix Corp.\n0579  GVC Corp.\n057a  Samsung Electronics America\n057b  Y-E Data, Inc.\n\t0000  FlashBuster-U Floppy\n\t0001  Tri-Media Reader Floppy\n\t0006  Tri-Media Reader Card Reader\n\t0010  Memory Stick Reader Writer\n\t0020  HEXA Media Drive 6-in-1 Card Reader Writer\n\t0030  Memory Card Viewer (TV)\n057c  AVM GmbH\n\t0b00  ISDN-Controller B1 Family\n\t0c00  ISDN-Controller FRITZ!Card\n\t1000  ISDN-Controller FRITZ!Card v2.0\n\t1900  ISDN-Controller FRITZ!Card v2.1\n\t2000  ISDN-Connector FRITZ!X\n\t2200  BlueFRITZ!\n\t2300  Teledat X130 DSL\n\t2800  Teledat 2a/b / X120 / NetXXL ISDN Terminal Adapter\n\t3200  Teledat X130 DSL\n\t3500  FRITZ!Card DSL SL\n\t3701  FRITZ!Box SL\n\t3702  FRITZ!Box\n\t3800  BlueFRITZ! Bluetooth Stick\n\t3a00  FRITZ!Box Fon\n\t3c00  FRITZ!Box WLAN\n\t3d00  FRITZ!Box Fon WLAN 7050/7140/7170/IAD3331\n\t3e01  FRITZ!Box (Annex A)\n\t4001  FRITZ!Box Fon (Annex A)\n\t4101  FRITZ!Box WLAN (Annex A)\n\t4201  FRITZ!Box Fon WLAN (Annex A)\n\t4601  Eumex 5520PC (WinXP/2000)\n\t4602  Eumex 400 (WinXP/2000)\n\t4701  AVM FRITZ!Box Fon ata\n\t5401  Eumex 300 IP\n\t5601  AVM Fritz!WLAN [Texas Instruments TNETW1450]\n\t6201  AVM Fritz!WLAN v1.1 [Texas Instruments TNETW1450]\n\t62ff  AVM Fritz!WLAN USB (in CD-ROM-mode)\n\t8401  Fritz!WLAN N [Atheros AR9001U]\n\t8402  Fritz!WLAN N 2.4 [Atheros AR9001U]\n\t8403  Fritz!WLAN N v2 [Atheros AR9271]\n\t84ff  AVM Fritz!WLAN USB N (in CD-ROM-mode)\n\t8501  FRITZ WLAN N v2 [RT5572/rt2870.bin]\n057d  Shark Multimedia, Inc.\n057e  Nintendo Co., Ltd\n\t0300  USB-EXI Adapter (GCP-2000)\n\t0304  RVT-H Reader\n\t0305  Broadcom BCM2045A Bluetooth Radio [Nintendo Wii/Wii U]\n\t0306  Wii Remote Controller RVL-003\n\t0337  Wii U GameCube Controller Adapter\n\t0341  DRH GamePad Host [Nintendo Wii U]\n\t2000  Switch\n\t2006  Joy-Con L\n\t2007  Joy-Con R\n\t2009  Switch Pro Controller\n\t200e  Joy-Con Charging Grip\n\t3000  SDK Debugger\n057f  QuickShot, Ltd\n\t6238  USB StrikePad\n0580  Denron, Inc.\n0581  Racal Data Group\n\t0107  Tera Barcode Scanner 2.4 GHz Receiver\n\t0115  Tera 5100\n\t011c  Tera 5100 dongle\n\t020c  Tera 2D Barcode Scanner EVHK0012\n0582  Roland Corp.\n\t0000  UA-100(G)\n\t0002  UM-4/MPU-64 MIDI Interface\n\t0003  SoundCanvas SC-8850\n\t0004  U-8\n\t0005  UM-2(C/EX)\n\t0007  SoundCanvas SC-8820\n\t0008  PC-300\n\t0009  UM-1(E/S/X)\n\t000b  SK-500\n\t000c  SC-D70\n\t0010  EDIROL UA-5\n\t0011  Edirol UA-5 Sound Capture\n\t0012  XV-5050\n\t0013  XV-5050\n\t0014  EDIROL UM-880 MIDI I/F (native)\n\t0015  EDIROL UM-880 MIDI I/F (generic)\n\t0016  EDIROL SD-90\n\t0017  EDIROL SD-90\n\t0018  UA-1A\n\t001b  MMP-2\n\t001c  MMP-2\n\t001d  V-SYNTH\n\t001e  V-SYNTH\n\t0023  EDIROL UM-550\n\t0024  EDIROL UM-550\n\t0025  EDIROL UA-20\n\t0026  EDIROL UA-20\n\t0027  EDIROL SD-20\n\t0028  EDIROL SD-20\n\t0029  EDIROL SD-80\n\t002a  EDIROL SD-80\n\t002b  EDIROL UA-700\n\t002c  EDIROL UA-700\n\t002d  XV-2020 Synthesizer\n\t002e  XV-2020 Synthesizer\n\t002f  VariOS\n\t0030  VariOS\n\t0033  EDIROL PCR\n\t0034  EDIROL PCR\n\t0035  M-1000\n\t0037  Digital Piano\n\t0038  Digital Piano\n\t003b  BOSS GS-10\n\t003c  BOSS GS-10\n\t0040  GI-20\n\t0041  GI-20\n\t0042  RS-70\n\t0043  RS-70\n\t0044  EDIROL UA-1000\n\t0047  EDIROL UR-80 WAVE\n\t0048  EDIROL UR-80 MIDI\n\t0049  EDIROL UR-80 WAVE\n\t004a  EDIROL UR-80 MIDI\n\t004b  EDIROL M-100FX\n\t004c  EDIROL PCR-A WAVE\n\t004d  EDIROL PCR-A MIDI\n\t004e  EDIROL PCR-A WAVE\n\t004f  EDIROL PCR-A MIDI\n\t0050  EDIROL UA-3FX\n\t0052  EDIROL UM-1SX\n\t0054  Digital Piano\n\t0060  EXR Series\n\t0064  EDIROL PCR-1 WAVE\n\t0065  EDIROL PCR-1 MIDI\n\t0066  EDIROL PCR-1 WAVE\n\t0067  EDIROL PCR-1 MIDI\n\t006a  SP-606\n\t006b  SP-606\n\t006d  FANTOM-X\n\t006e  FANTOM-X\n\t0073  EDIROL UA-25\n\t0074  EDIROL UA-25\n\t0075  BOSS DR-880\n\t0076  BOSS DR-880\n\t007a  RD\n\t007b  RD\n\t007d  EDIROL UA-101\n\t0080  G-70\n\t0081  G-70\n\t0084  V-SYNTH XT\n\t0089  BOSS GT-PRO\n\t008b  EDIROL PC-50\n\t008c  EDIROL PC-50\n\t008d  EDIROL UA-101 USB1\n\t0092  EDIROL PC-80 WAVE\n\t0093  EDIROL PC-80 MIDI\n\t0096  EDIROL UA-1EX\n\t009a  EDIROL UM-3EX\n\t009d  EDIROL UM-1\n\t00a0  MD-P1\n\t00a2  Digital Piano\n\t00a3  EDIROL UA-4FX\n\t00a6  Juno-G\n\t00a9  MC-808\n\t00ad  SH-201\n\t00b2  VG-99\n\t00b3  VG-99\n\t00b7  BK-7m/VIMA JM-5/8\n\t00c2  SonicCell\n\t00c4  EDIROL M-16DX\n\t00c5  SP-555\n\t00c7  V-Synth GT\n\t00d1  Music Atelier\n\t00d3  M-380/400\n\t00da  BOSS GT-10\n\t00db  BOSS GT-10 Guitar Effects Processor\n\t00dc  BOSS GT-10B\n\t00de  Fantom G\n\t00e6  EDIROL UA-25EX (Advanced mode)\n\t00e7  EDIROL UA-25EX\n\t00e9  UA-1G\n\t00eb  VS-100\n\t00f6  GW-8/AX-Synth\n\t00f8  JUNO Series\n\t00fc  VS-700C\n\t00fd  VS-700\n\t00fe  VS-700 M1\n\t00ff  VS-700 M2\n\t0100  VS-700\n\t0101  VS-700 M2\n\t0102  VB-99\n\t0104  UM-1G\n\t0106  UM-2G\n\t0108  UM-3G\n\t0109  eBand JS-8\n\t010d  A-500S\n\t010f  A-PRO\n\t0110  A-PRO\n\t0111  GAIA SH-01\n\t0113  ME-25\n\t0114  SD-50\n\t0116  WAVE/MP3 RECORDER R-05\n\t0117  VS-20\n\t0119  OCTAPAD SPD-30\n\t011c  Lucina AX-09\n\t011e  BR-800\n\t0120  OCTA-CAPTURE\n\t0121  OCTA-CAPTURE\n\t0123  JUNO-Gi\n\t0124  M-300\n\t0127  GR-55\n\t012a  UM-ONE\n\t012b  DUO-CAPTURE\n\t012f  QUAD-CAPTURE\n\t0130  MICRO BR BR-80\n\t0132  TRI-CAPTURE\n\t0134  V-Mixer\n\t0138  Boss RC-300 (Audio mode)\n\t0139  Boss RC-300 (Storage mode)\n\t013a  JUPITER-80\n\t013e  R-26\n\t0145  SPD-SX\n\t014b  eBand JS-10\n\t014d  GT-100\n\t0150  TD-15\n\t0151  TD-11\n\t0154  JUPITER-50\n\t0156  A-Series\n\t0158  TD-30\n\t0159  DUO-CAPTURE EX\n\t015b  INTEGRA-7\n\t015d  R-88\n\t01b5  Boutique Series Synthesizer (Normal mode)\n\t01b6  Boutique Series Synthesizer (Storage mode)\n\t01cd  Boutique TB-03\n\t01cf  Boutique TR-09\n\t01df  Rubix22\n\t01e0  Rubix24\n\t01e1  Rubix44\n\t01ef  Go:KEYS MIDI\n\t01fd  Boutique SH-01A\n\t01ff  Roland Corp. Boutique D-05\n\t020a  TR-8S\n\t025c  Boutique TR-06\n\t028c  Roland Corp. Boutique JD-08\n\t028e  Roland Corp. Boutique JX-08\n\t0505  EDIROL UA-101\n0583  Padix Co., Ltd (Rockfire)\n\t0001  4 Axis 12 button +POV\n\t0002  4 Axis 12 button +POV\n\t2030  RM-203 USB Nest [mode 1]\n\t2031  RM-203 USB Nest [mode 2]\n\t2032  RM-203 USB Nest [mode 3]\n\t2033  RM-203 USB Nest [mode 4]\n\t2050  PX-205 PSX Bridge\n\t205f  PSX/USB converter\n\t2060  2-axis 8-button gamepad\n\t206f  USB, 2-axis 8-button gamepad\n\t3050  QF-305u Gamepad\n\t3379  Rockfire X-Force\n\t337f  Rockfire USB RacingStar Vibra\n\t509f  USB,4-Axis,12-Button with POV\n\t5259  Rockfire USB SkyShuttle Vibra\n\t525f  USB Vibration Pad\n\t5308  USB Wireless VibrationPad\n\t5359  Rockfire USB SkyShuttle Pro\n\t535f  USB,real VibrationPad\n\t5659  Rockfire USB SkyShuttle Vibra\n\t565f  USB VibrationPad\n\t6009  Revenger\n\t600f  USB,GameBoard II\n\t6258  USB, 4-axis, 6-button joystick w/view finder\n\t6889  Windstorm Pro\n\t688f  QF-688uv Windstorm Pro Joystick\n\t7070  QF-707u Bazooka Joystick\n\ta000  MaxFire G-08XU Gamepad\n\ta015  4-Axis,16-Button with POV\n\ta019  USB, Vibration ,4-axis, 8-button joystick w/view finder\n\ta020  USB,4-Axis,10-Button with POV\n\ta021  USB,4-Axis,12-Button with POV\n\ta022  USB,4-Axis,14-Button with POV\n\ta023  USB,4-Axis,16-Button with POV\n\ta024  4axis,12button vibrition audio gamepad\n\ta025  4axis,12button vibrition audio gamepad\n\ta130  USB Wireless 2.4GHz Gamepad\n\ta131  USB Wireless 2.4GHz Joystick\n\ta132  USB Wireless 2.4GHz Wheelpad\n\ta133  USB Wireless 2.4GHz Wheel&Gamepad\n\ta202  ForceFeedbackWheel\n\ta209  MetalStrike FF\n\tb000  USB,4-Axis,12-Button with POV\n\tb001  USB,4-Axis,12-Button with POV\n\tb002  Vibration,12-Button USB Wheel\n\tb005  USB,12-Button Wheel\n\tb008  USB Wireless 2.4GHz Wheel\n\tb009  USB,12-Button  Wheel\n\tb00a  PSX/USB converter\n\tb00b  PSX/USB converter\n\tb00c  PSX/USB converter\n\tb00d  PSX/USB converter\n\tb00e  4-Axis,12-Button with POV\n\tb00f  USB,5-Axis,10-Button with POV\n\tb010  MetalStrike Pro\n\tb012  Wireless MetalStrike\n\tb013  USB,Wiress  2.4GHZ Joystick\n\tb016  USB,5-Axis,10-Button with POV\n\tb018  TW6 Wheel\n\tff60  USB Wireless VibrationPad\n0584  RATOC System, Inc.\n\t0008  Fujifilm MemoryCard ReaderWriter\n\t0220  U2SCX SCSI Converter\n\t0304  U2SCX-LVD (SCSI Converter)\n\tb000  REX-USB60\n\tb020  REX-USB60F\n\tb022  RTX-USB60F\n0585  FlashPoint Technology, Inc.\n\t0001  Digital Camera\n\t0002  Digital Camera\n\t0003  Digital Camera\n\t0004  Digital Camera\n\t0005  Digital Camera\n\t0006  Digital Camera\n\t0007  Digital Camera\n\t0008  Digital Camera\n\t0009  Digital Camera\n\t000a  Digital Camera\n\t000b  Digital Camera\n\t000c  Digital Camera\n\t000d  Digital Camera\n\t000e  Digital Camera\n\t000f  Digital Camera\n0586  ZyXEL Communications Corp.\n\t0025  802.11b/g/n USB Wireless Network Adapter\n\t0100  omni.net\n\t0102  omni.net II ISDN TA [HFC-S]\n\t0110  omni.net Plus\n\t1000  omni.net LCD Plus - ISDN TA\n\t1500  Omni 56K Plus\n\t2011  Scorpion-980N keyboard\n\t3304  LAN Modem\n\t3309  ADSL Modem Prestige 600 series\n\t330a  ADSL Modem Interface\n\t330e  USB Broadband ADSL Modem Rev 1.10\n\t3400  ZyAIR B-220 IEEE 802.11b Adapter\n\t3401  ZyAIR G-220 802.11bg\n\t3402  ZyAIR G-220F 802.11bg\n\t3403  AG-200 802.11abg Wireless Adapter [Atheros AR5523]\n\t3407  G-200 v2 802.11bg\n\t3408  G-260 802.11bg\n\t3409  AG-225H 802.11bg\n\t340a  M-202 802.11bg\n\t340c  G-270S 802.11bg Wireless Adapter [Atheros AR5523]\n\t340f  G-220 v2 802.11bg\n\t3410  ZyAIR G-202 802.11bg\n\t3412  802.11bg\n\t3413  ZyAIR AG-225H v2 802.11bg\n\t3415  G-210H 802.11g Wireless Adapter\n\t3416  NWD-210N 802.11b/g/n-draft wireless adapter\n\t3417  NWD271N 802.11n Wireless Adapter [Atheros AR9001U-(2)NG]\n\t3418  NWD211AN 802.11abgn Wireless Adapter [Ralink RT2870]\n\t3419  G-220 v3 802.11bg Wireless Adapter [ZyDAS ZD1211B]\n\t341a  NWD-270N Wireless N-lite USB Adapter\n\t341e  NWD2105 802.11bgn Wireless Adapter [Ralink RT3070]\n\t341f  NWD2205 802.11n Wireless N Adapter [Realtek RTL8192CU]\n\t3425  NWD6505 802.11a/b/g/n/ac Wireless Adapter [MediaTek MT7610U]\n\t343e  N220 802.11bgn Wireless Adapter\n0587  America Kotobuki Electronics Industries, Inc.\n0588  Sapien Design\n0589  Victron\n058a  Nohau Corp.\n058b  Infineon Technologies\n\t0015  Flash Loader utility\n\t001c  Flash Drive\n\t0041  Flash Loader utility\n058c  In Focus Systems\n\t0007  Flash\n\t0008  LP130\n\t000a  LP530\n\t0010  Projector\n\t0011  Projector\n\t0012  Projector\n\t0013  Projector\n\t0014  Projector\n\t0015  Projector\n\t0016  Projector\n\t0017  Projector\n\t0018  Projector\n\t0019  Projector\n\t001a  Projector\n\t001b  Projector\n\t001c  Projector\n\t001d  Projector\n\t001e  Projector\n\t001f  Projector\n\tffe5  IN34 Projector\n\tffeb  Projector IN76\n058d  Micrel Semiconductor\n058e  Tripath Technology, Inc.\n058f  Alcor Micro Corp.\n\t1234  Flash Drive\n\t198b  Webcam (Gigatech P-09)\n\t2412  SCard R/W CSR-145\n\t2802  Monterey Keyboard\n\t5492  Hub\n\t6232  Hi-Speed 16-in-1 Flash Card Reader/Writer\n\t6254  USB Hub\n\t6331  SD/MMC/MS Card Reader\n\t6332  Multi-Function Card Reader\n\t6335  SD/MMC Card Reader\n\t6360  Multimedia Card Reader\n\t6361  Multimedia Card Reader\n\t6362  Flash Card Reader/Writer\n\t6364  AU6477 Card Reader Controller\n\t6366  Multi Flash Reader\n\t6377  AU6375 4-LUN card reader\n\t6386  Memory Card\n\t6387  Flash Drive\n\t6390  USB 2.0-IDE bridge\n\t6391  IDE Bridge\n\t6998  AU6998 Flash Disk Controller\n\t9213  MacAlly Kbd Hub\n\t9215  AU9814 Hub\n\t9254  Hub\n\t9310  Mass Storage (UID4/5A & UID7A)\n\t9320  Micro Storage Driver for Win98\n\t9321  Micro Storage Driver for Win98\n\t9330  SD Reader\n\t9331  Micro Storage Driver for Win98\n\t9340  Delkin eFilm Reader-32\n\t9350  Delkin eFilm Reader-32\n\t9360  8-in-1 Media Card Reader\n\t9361  Multimedia Card Reader\n\t9368  Multimedia Card Reader\n\t9380  Flash Drive\n\t9381  Flash Drive\n\t9382  Acer/Sweex Flash drive\n\t9384  qdi U2Disk T209M\n\t9410  Keyboard\n\t9472  Keyboard Hub\n\t9510  ChunghwaTL USB02 Smartcard Reader\n\t9520  Watchdata W 1981\n\t9540  AU9540 Smartcard Reader\n\t9720  USB-Serial Adapter\n\ta014  Asus Integrated Webcam\n\tb002  Acer Integrated Webcam\n0590  Omron Corp.\n\t0004  Cable Modem\n\t000b  MR56SVS\n\t0028  HJ-720IT / HEM-7080IT-E / HEM-790IT\n\t0051  FT232BM [E58CIFQ1 with FTDI USB2Serial Converter]\n0591  Questra Consulting\n0592  Powerware Corp.\n\t0002  UPS (X-Slot)\n0593  Incite\n0594  Princeton Graphic Systems\n0595  Zoran Microelectronics, Ltd\n\t1001  Digitrex DSC-1300/DSC-2100 (mass storage mode)\n\t2002  DIGITAL STILL CAMERA 6M 4X\n\t4343  Digital Camera EX-20 DSC\n0596  MicroTouch Systems, Inc.\n\t0001  Touchscreen\n\t0002  Touch Screen Controller\n\t0500  PCT Multitouch HID Controller\n\t0543  DELL XPS touchscreen\n0597  Trisignal Communications\n0598  Niigata Canotec Co., Inc.\n0599  Brilliance Semiconductor, Inc.\n059a  Spectrum Signal Processing, Inc.\n059b  Iomega Corp.\n\t0001  Zip 100 (Type 1)\n\t000b  Zip 100 (Type 2)\n\t0021  Win98 Disk Controller\n\t0030  Zip 250 (Ver 1)\n\t0031  Zip 100 (Type 3)\n\t0032  Zip 250 (Ver 2)\n\t0034  Zip 100 Driver\n\t0037  Zip 750 MB\n\t0040  SCSI Bridge\n\t0042  Rev 70 GB\n\t0050  Zip CD 650 Writer\n\t0053  CDRW55292EXT CD-RW External Drive\n\t0056  External CD-RW Drive Enclosure\n\t0057  Mass Storage Device\n\t005d  Mass Storage Device\n\t005f  CDRW64892EXT3-C CD-RW 52x24x52x External Drive\n\t0060  PCMCIA PocketZip Dock\n\t0061  Varo PocketZip 40 MP3 Player\n\t006d  HipZip MP3 Player\n\t0070  eGo Portable Hard Drive\n\t007c  Ultra Max USB/1394\n\t007d  HTC42606 0G9AT00 [Iomega HDD]\n\t007e  Mini 256MB/512MB Flash Drive [IOM2D5]\n\t00db  FotoShow Zip 250 Driver\n\t0150  Mass Storage Device\n\t015d  Super DVD Writer\n\t0173  Hi-Speed USB-to-IDE Bridge Controller\n\t0174  Hi-Speed USB-to-IDE Bridge Controller\n\t0176  Hi-Speed USB-to-IDE Bridge Controller\n\t0177  Hi-Speed USB-to-IDE Bridge Controller\n\t0178  Hi-Speed USB-to-IDE Bridge Controller\n\t0179  Hi-Speed USB-to-IDE Bridge Controller\n\t017a  HDD\n\t017b  HDD/1394A\n\t017c  HDD/1394B\n\t0251  Optical\n\t0252  Optical\n\t0275  ST332082 0A\n\t0278  LDHD-UPS [Professional Desktop Hard Drive eSATA / USB2.0]\n\t027a  LPHD250-U [Portable Hard Drive Silver Series 250 Go]\n\t0470  Prestige Portable Hard Drive\n\t047a  Select Portable Hard Drive\n\t0571  Prestige Portable Hard Drive\n\t0579  eGo Portable Hard Drive\n\t1052  DVD+RW External Drive\n059c  A-Trend Technology Co., Ltd\n059d  Advanced Input Devices\n059e  Intelligent Instrumentation\n059f  LaCie, Ltd\n\t0201  StudioDrive USB2\n\t0202  StudioDrive USB2\n\t0203  StudioDrive USB2\n\t0211  PocketDrive\n\t0212  PocketDrive\n\t0213  PocketDrive USB2\n\t0323  LaCie d2 Drive USB2\n\t0421  Big Disk G465\n\t0525  BigDisk Extreme 500\n\t0641  Mobile Hard Drive\n\t0828  d2 Quadra\n\t0829  BigDisk Extreme+\n\t1004  Little Disk 20 GB\n\t100c  Rugged Triple Interface Mobile Hard Drive\n\t1010  Desktop Hard Drive\n\t1016  Desktop Hard Drive\n\t1018  Desktop Hard Drive\n\t1019  Desktop Hard Drive\n\t1021  Little Disk\n\t1027  iamaKey V2\n\t102a  Rikiki Hard Drive\n\t103d  D2\n\t1049  rikiki Harddrive\n\t1052  P'9220 Mobile Drive\n\t1053  P'9230 2TB [Porsche Design Desktop Drive 2TB]\n\t1061  Rugged USB3-FW\n\t1064  Rugged 16 and 32 GB\n\t106b  Rugged Mini HDD\n\t106d  Porsche Design Mobile Drive\n\t106e  Porsche Design Desktop Drive\n\t107f  Rugged Triple (RUFWU3B)\n\t1093  Rugged\n\t1094  Rugged THB\n\t1095  Rugged\n\t1105  Mobile Drive (RLSD: 2022)\n\ta601  HardDrive\n\ta602  CD R/W\n05a0  Vetronix Corp.\n05a1  USC Corp.\n05a2  Fuji Film Microdevices Co., Ltd\n05a3  ARC International\n\t8388  Marvell 88W8388 802.11a/b/g WLAN\n\t9230  Camera\n\t9320  Camera\n\t9331  Camera\n\t9332  Camera - 1080p\n\t9422  Camera\n\t9520  Camera\n05a4  Ortek Technology, Inc.\n\t1000  WKB-1000S Wireless Ergo Keyboard with Touchpad\n\t2000  WKB-2000 Wireless Keyboard with Touchpad\n\t9720  Keyboard Mouse\n\t9722  Keyboard\n\t9731  MCK-600W/MCK-800USB Keyboard\n\t9783  Wireless Keypad\n\t9837  Targus Number Keypad\n\t9862  Targus Number Keypad (Composite Device)\n\t9881  IR receiver [VRC-1100 Vista MCE Remote Control]\n05a5  Sampo Technology Corp.\n05a6  Cisco Systems, Inc.\n\t0001  CVA124 Cable Voice Adapter (WDM)\n\t0002  CVA122 Cable Voice Adapter (WDM)\n\t0003  CVA124E Cable Voice Adapter (WDM)\n\t0004  CVA122E Cable Voice Adapter (WDM)\n\t0008  STA1520 Tuning Adapter\n\t0009  Console\n\t0a00  Integrated Management Controller Hub\n\t0a01  Virtual Keyboard/Mouse\n\t0a02  Virtual Mass Storage\n\t0a03  Virtual Ethernet/RNDIS\n05a7  Bose Corp.\n\t1020  Companion Speaker\n\t4000  Bluetooth Headset\n\t4001  Bluetooth Headset in DFU mode\n\t4002  Bluetooth Headset Series 2\n\t4003  Bluetooth Headset Series 2 in DFU mode\n\t400d  SoundLink Color II speaker in DFU mode\n\t40fe  SoundLink Color II / Flex\n\tbc50  SoundLink Wireless Mobile speaker\n\tbc51  SoundLink Wireless Mobile speaker in DFU mode\n05a8  Spacetec IMC Corp.\n05a9  OmniVision Technologies, Inc.\n\t0511  OV511 Webcam\n\t0518  OV518 Webcam\n\t0519  OV519 Microphone\n\t1550  VEHO Filmscanner\n\t2640  OV2640 Webcam\n\t2642  Integrated Webcam for Dell XPS 2010\n\t2643  Monitor Webcam\n\t264b  Monitor Webcam\n\t2800  SuperCAM\n\t4519  Webcam Classic\n\t7670  OV7670 Webcam\n\t8065  GAIA Sensor FPGA Demo Board\n\t8519  OV519 Webcam\n\ta511  OV511+ Webcam\n\ta518  D-Link DSB-C310 Webcam\n05aa  Utilux South China, Ltd\n05ab  In-System Design\n\t0002  Parallel Port\n\t0030  Storage Adapter V2 (TPP)\n\t0031  ATA Bridge\n\t0060  USB 2.0 ATA Bridge\n\t0061  Storage Adapter V3 (TPP-I)\n\t0101  Storage Adapter (TPP)\n\t0130  Compact Flash and Microdrive Reader (TPP)\n\t0200  USS725 ATA Bridge\n\t0201  Storage Adapter (TPP)\n\t0202  ATA Bridge\n\t0300  Portable Hard Drive (TPP)\n\t0301  Portable Hard Drive V2\n\t0350  Portable Hard Drive (TPP)\n\t0351  Portable Hard Drive V2\n\t081a  ATA Bridge\n\t0cda  ATA Bridge for CD-R/RW\n\t1001  BAYI Printer Class Support\n\t5700  Storage Adapter V2 (TPP)\n\t5701  USB Storage Adapter V2\n\t5901  Smart Board (TPP)\n\t5a01  ATI Storage Adapter (TPP)\n\t5d01  DataBook Adapter (TPP)\n05ac  Apple, Inc.\n\t0201  USB Keyboard [Alps or Logitech, M2452]\n\t0202  Keyboard [ALPS]\n\t0205  Extended Keyboard [Mitsumi]\n\t0206  Extended Keyboard [Mitsumi]\n\t020b  Pro Keyboard [Mitsumi, A1048/US layout]\n\t020c  Extended Keyboard [Mitsumi]\n\t020d  Pro Keyboard [Mitsumi, A1048/JIS layout]\n\t020e  Internal Keyboard/Trackpad (ANSI)\n\t020f  Internal Keyboard/Trackpad (ISO)\n\t0214  Internal Keyboard/Trackpad (ANSI)\n\t0215  Internal Keyboard/Trackpad (ISO)\n\t0216  Internal Keyboard/Trackpad (JIS)\n\t0217  Internal Keyboard/Trackpad (ANSI)\n\t0218  Internal Keyboard/Trackpad (ISO)\n\t0219  Internal Keyboard/Trackpad (JIS)\n\t021a  Internal Keyboard/Trackpad (ANSI)\n\t021b  Internal Keyboard/Trackpad (ISO)\n\t021c  Internal Keyboard/Trackpad (JIS)\n\t021d  Aluminum Mini Keyboard (ANSI)\n\t021e  Aluminum Mini Keyboard (ISO)\n\t021f  Aluminum Mini Keyboard (JIS)\n\t0220  Aluminum Keyboard (ANSI)\n\t0221  Aluminum Keyboard (ISO)\n\t0222  Aluminum Keyboard (JIS)\n\t0223  Internal Keyboard/Trackpad (ANSI)\n\t0224  Internal Keyboard/Trackpad (ISO)\n\t0225  Internal Keyboard/Trackpad (JIS)\n\t0229  Internal Keyboard/Trackpad (ANSI)\n\t022a  Internal Keyboard/Trackpad (MacBook Pro) (ISO)\n\t022b  Internal Keyboard/Trackpad (MacBook Pro) (JIS)\n\t0230  Internal Keyboard/Trackpad (MacBook Pro 4,1) (ANSI)\n\t0231  Internal Keyboard/Trackpad (MacBook Pro 4,1) (ISO)\n\t0232  Internal Keyboard/Trackpad (MacBook Pro 4,1) (JIS)\n\t0236  Internal Keyboard/Trackpad (ANSI)\n\t0237  Internal Keyboard/Trackpad (ISO)\n\t0238  Internal Keyboard/Trackpad (JIS)\n\t023f  Internal Keyboard/Trackpad (ANSI)\n\t0240  Internal Keyboard/Trackpad (ISO)\n\t0241  Internal Keyboard/Trackpad (JIS)\n\t0242  Internal Keyboard/Trackpad (ANSI)\n\t0243  Internal Keyboard/Trackpad (ISO)\n\t0244  Internal Keyboard/Trackpad (JIS)\n\t0245  Internal Keyboard/Trackpad (ANSI)\n\t0246  Internal Keyboard/Trackpad (ISO)\n\t0247  Internal Keyboard/Trackpad (JIS)\n\t024a  Internal Keyboard/Trackpad (MacBook Air) (ISO)\n\t024d  Internal Keyboard/Trackpad (MacBook Air) (ISO)\n\t024f  Aluminium Keyboard (ANSI)\n\t0250  Aluminium Keyboard (ISO)\n\t0252  Internal Keyboard/Trackpad (ANSI)\n\t0253  Internal Keyboard/Trackpad (ISO)\n\t0254  Internal Keyboard/Trackpad (JIS)\n\t0259  Internal Keyboard/Trackpad\n\t025a  Internal Keyboard/Trackpad\n\t0263  Apple Internal Keyboard / Trackpad (MacBook Retina)\n\t0267  Magic Keyboard A1644\n\t0269  Magic Mouse 2 (Lightning connector)\n\t0273  Internal Keyboard/Trackpad (ISO)\n\t0301  USB Mouse [Mitsumi, M4848]\n\t0302  Optical Mouse [Fujitsu]\n\t0304  Mighty Mouse [Mitsumi, M1152]\n\t0306  Optical USB Mouse [Fujitsu]\n\t030a  Internal Trackpad\n\t030b  Internal Trackpad\n\t030d  Magic Mouse\n\t030e  MC380Z/A [Magic Trackpad]\n\t1000  Bluetooth HCI MacBookPro (HID mode)\n\t1001  Keyboard Hub [ALPS]\n\t1002  Extended Keyboard Hub [Mitsumi]\n\t1003  Hub in Pro Keyboard [Mitsumi, A1048]\n\t1006  Hub in Aluminum Keyboard\n\t1008  Mini DisplayPort to Dual-Link DVI Adapter\n\t1009  iBus Hub\n\t100c  Nova Hub\n\t1101  Speakers\n\t1105  Audio in LED Cinema Display\n\t1107  Thunderbolt Display Audio\n\t1112  FaceTime HD Camera (Display)\n\t1201  3G iPod\n\t1202  iPod 2G\n\t1203  iPod 4.Gen Grayscale 40G\n\t1204  iPod [Photo]\n\t1205  iPod Mini 1.Gen/2.Gen\n\t1206  iPod '06'\n\t1207  iPod '07'\n\t1208  iPod '08'\n\t1209  iPod Video\n\t120a  iPod Nano\n\t1223  iPod Classic/Nano 3.Gen (DFU mode)\n\t1224  iPod Nano 3.Gen (DFU mode)\n\t1225  iPod Nano 4.Gen (DFU mode)\n\t1227  Mobile Device (DFU Mode)\n\t1231  iPod Nano 5.Gen (DFU mode)\n\t1240  iPod Nano 2.Gen (DFU mode)\n\t1242  iPod Nano 3.Gen (WTF mode)\n\t1243  iPod Nano 4.Gen (WTF mode)\n\t1245  iPod Classic 3.Gen (WTF mode)\n\t1246  iPod Nano 5.Gen (WTF mode)\n\t1255  iPod Nano 4.Gen (DFU mode)\n\t1260  iPod Nano 2.Gen\n\t1261  iPod Classic\n\t1262  iPod Nano 3.Gen\n\t1263  iPod Nano 4.Gen\n\t1265  iPod Nano 5.Gen\n\t1266  iPod Nano 6.Gen\n\t1267  iPod Nano 7.Gen\n\t1281  Apple Mobile Device [Recovery Mode]\n\t1290  iPhone\n\t1291  iPod Touch 1.Gen\n\t1292  iPhone 3G\n\t1293  iPod Touch 2.Gen\n\t1294  iPhone 3GS\n\t1296  iPod Touch 3.Gen (8GB)\n\t1297  iPhone 4\n\t1299  iPod Touch 3.Gen\n\t129a  iPad\n\t129c  iPhone 4(CDMA)\n\t129d  iPhone\n\t129e  iPod Touch 4.Gen\n\t129f  iPad 2\n\t12a0  iPhone 4S\n\t12a1  iPhone\n\t12a2  iPad 2 (3G; 64GB)\n\t12a3  iPad 2 (CDMA)\n\t12a4  iPad 3 (wifi)\n\t12a5  iPad 3 (CDMA)\n\t12a6  iPad 3 (3G, 16 GB)\n\t12a7  TV Device\n\t12a8  iPhone 5/5C/5S/6/SE/7/8/X/XR\n\t12a9  iPad 2\n\t12aa  iPod Touch 5.Gen [A1421]\n\t12ab  iPad\n\t12ac  iPhone\n\t12af  Watch\n\t12b0  HomePod\n\t1300  iPod Shuffle\n\t1301  iPod Shuffle 2.Gen\n\t1302  iPod Shuffle 3.Gen\n\t1303  iPod Shuffle 4.Gen\n\t1392  Apple Watch charger\n\t1393  AirPods case\n\t1395  Smart Battery Case [iPhone 6]\n\t1398  Smart Battery Case\n\t1401  Modem\n\t1402  Ethernet Adapter [A1277]\n\t1460  Digital AV Multiport Adapter\n\t1461  VGA Multiport Adapter\n\t1463  HDMI Adapter\n\t1500  SuperDrive [A1379]\n\t1624  Nova\n\t1625  iBus\n\t8005  OHCI Root Hub Simulation\n\t8006  EHCI Root Hub Simulation\n\t8007  XHCI Root Hub USB 2.0 Simulation\n\t8202  HCF V.90 Data/Fax Modem\n\t8203  Bluetooth HCI\n\t8204  Built-in Bluetooth 2.0+EDR HCI\n\t8205  Bluetooth HCI\n\t8206  Bluetooth HCI\n\t8207  Built-in Bluetooth\n\t820a  Bluetooth HID Keyboard\n\t820b  Bluetooth HID Mouse\n\t820f  Bluetooth HCI\n\t8213  Bluetooth Host Controller\n\t8215  Built-in Bluetooth 2.0+EDR HCI\n\t8216  Bluetooth USB Host Controller\n\t8217  Bluetooth USB Host Controller\n\t8218  Bluetooth Host Controller\n\t821a  Bluetooth Host Controller\n\t821f  Built-in Bluetooth 2.0+EDR HCI\n\t8233  iBridge\n\t8240  Built-in IR Receiver\n\t8241  Built-in IR Receiver\n\t8242  Built-in IR Receiver\n\t8281  Bluetooth Host Controller\n\t8286  Bluetooth Host Controller\n\t8289  Bluetooth Host Controller\n\t828c  Bluetooth Host Controller\n\t828d  Bluetooth Host Controller\n\t8290  Bluetooth Host Controller\n\t8300  Built-in iSight (no firmware loaded)\n\t8403  Internal Memory Card Reader\n\t8404  Internal Memory Card Reader\n\t8406  Internal Memory Card Reader\n\t8501  Built-in iSight [Micron]\n\t8502  Built-in iSight\n\t8505  Built-in iSight\n\t8507  Built-in iSight\n\t8508  iSight in LED Cinema Display\n\t8509  FaceTime HD Camera\n\t850a  FaceTime Camera\n\t8510  FaceTime HD Camera (Built-in)\n\t8511  FaceTime HD Camera (Built-in)\n\t8600  iBridge\n\t911c  Hub in A1082 [Cinema HD Display 23\"]\n\t9127  Hub in Thunderbolt Display\n\t912f  Hub in 30\" Cinema Display\n\t9210  Studio Display 21\"\n\t9215  Studio Display 15\"\n\t9217  Studio Display 17\"\n\t9218  Cinema Display 23\"\n\t9219  Cinema Display 20\"\n\t921c  A1082 [Cinema HD Display 23\"]\n\t921e  Cinema Display 24\"\n\t9221  30\" Cinema Display\n\t9226  LED Cinema Display\n\t9227  Thunderbolt Display\n\t9232  Cinema HD Display 30\"\n\tffff  Bluetooth in DFU mode - Driver\n05ad  Y.C. Cable U.S.A., Inc.\n05ae  Synopsys, Inc.\n05af  Jing-Mold Enterprise Co., Ltd\n\t0806  HP SK806A Keyboard\n\t0809  Wireless Keyboard and Mouse\n\t0821  IDE to\n\t3062  Cordless Keyboard\n\t9167  KB 9151B - 678\n\t9267  KB 9251B - 678 Mouse\n05b0  Fountain Technologies, Inc.\n05b1  First International Computer, Inc.\n\t1389  Bluetooth Wireless Adapter\n05b4  LG Semicon Co., Ltd\n\t4857  M-Any DAH-210\n\t6001  HYUNDAI GDS30C6001 SSFDC / MMC I/F Controller\n05b5  Dialogic Corp.\n05b6  Proxima Corp.\n05b7  Medianix Semiconductor, Inc.\n05b8  SYSGRATION\n\t3002  Scroll Mouse\n\t3126  APT-905 Wireless presenter\n\t3223  ISY Wireless Presenter\n05b9  Philips Research Laboratories\n05ba  DigitalPersona, Inc.\n\t0007  Fingerprint Reader\n\t0008  Fingerprint Reader\n\t000a  Fingerprint Reader\n05bb  Grey Cell Systems\n05bc  3G Green Green Globe Co., Ltd\n\t0004  Trackball\n05bd  RAFI GmbH & Co. KG\n05be  Tyco Electronics (Raychem)\n05bf  S & S Research\n05c0  Keil Software\n05c1  Kawasaki Microelectronics, Inc.\n05c2  Media Phonics (Suisse) S.A.\n05c5  Digi International, Inc.\n\t0002  AccelePort USB 2\n\t0004  AccelePort USB 4\n\t0008  AccelePort USB 8\n05c6  Qualcomm, Inc.\n\t0114  Select RW-200 CDMA Wireless Modem\n\t0a02  Jolla Device Developer Mode\n\t0a07  Jolla Device MTP\n\t0afe  Jolla Device Charging Only\n\t1000  Mass Storage Device\n\t3100  CDMA Wireless Modem/Phone\n\t3196  CDMA Wireless Modem\n\t3197  CDMA Wireless Modem/Phone\n\t6000  Siemens SG75\n\t6503  AnyData APE-540H\n\t6613  Onda H600/N501HS ZTE MF330\n\t6764  A0001 Phone [OnePlus One]\n\t9000  SIMCom SIM5218 modem\n\t9001  Gobi Wireless Modem\n\t9002  Gobi Wireless Modem\n\t9003  Quectel UC20\n\t9008  Gobi Wireless Modem (QDL mode)\n\t9018  Qualcomm HSUSB Device\n\t9025  HSUSB Device\n\t9090  Quectel UC15\n\t9091  Intex Aqua Fish & Jolla C Diagnostic Mode\n\t9092  Nokia 8110 4G\n\t90ba  Audio 1.0 device\n\t90bb  Snapdragon interface (MIDI + ADB)\n\t90dc  Fairphone 2 (Charging & ADB)\n\t9201  Gobi Wireless Modem (QDL mode)\n\t9202  Gobi Wireless Modem\n\t9203  Gobi Wireless Modem\n\t9205  Gobi 2000\n\t9211  Acer Gobi Wireless Modem (QDL mode)\n\t9212  Acer Gobi Wireless Modem\n\t9214  Acer Gobi 2000 Wireless Modem (QDL mode)\n\t9215  Quectel EC20 LTE modem / Acer Gobi 2000 Wireless Modem\n\t9221  Gobi Wireless Modem (QDL mode)\n\t9222  Gobi Wireless Modem\n\t9224  Sony Gobi 2000 Wireless Modem (QDL mode)\n\t9225  Sony Gobi 2000 Wireless Modem\n\t9231  Gobi Wireless Modem (QDL mode)\n\t9234  Top Global Gobi 2000 Wireless Modem (QDL mode)\n\t9235  Top Global Gobi 2000 Wireless Modem\n\t9244  Samsung Gobi 2000 Wireless Modem (QDL mode)\n\t9245  Samsung Gobi 2000 Wireless Modem\n\t9264  Asus Gobi 2000 Wireless Modem (QDL mode)\n\t9265  Asus Gobi 2000 Wireless Modem\n\t9274  iRex Technologies Gobi 2000 Wireless Modem (QDL mode)\n\t9275  iRex Technologies Gobi 2000 Wireless Modem\n\tf000  TA-1004 [Nokia 8]\n\tf003  Nokia 8110 4G\n\tf00e  FP3\n05c7  Qtronix Corp.\n\t0113  PC Line Mouse\n\t1001  Lynx Mouse\n\t2001  Keyboard\n\t2011  SCorpius Keyboard\n\t6001  Ten-Keypad\n05c8  Cheng Uei Precision Industry Co., Ltd (Foxlink)\n\t0103  FO13FF-65 PC-CAM\n\t010b  Webcam (UVC)\n\t021a  HP Webcam\n\t0233  HP Webcam\n\t0318  Webcam\n\t0361  SunplusIT INC. HP Truevision HD Webcam\n\t036e  Webcam\n\t0374  HP EliteBook integrated HD Webcam\n\t038e  HP Wide Vision HD integrated webcam\n\t03a1  XiaoMi Webcam\n\t03b1  Webcam\n\t03bc  HP Wide Vision HD Integrated Webcam\n\t03cb  HP Wide Vision HD Integrated Webcam\n\t03d2  HP TrueVision HD Camera\n\t0403  Webcam\n\t041b  HP 2.0MP High Definition Webcam\n05c9  Semtech Corp.\n05ca  Ricoh Co., Ltd\n\t0101  RDC-5300 Camera\n\t0325  Caplio GX (ptp)\n\t032d  Caplio GX 8 (ptp)\n\t032f  Caplio R3 (ptp)\n\t03a1  IS200e\n\t0403  Printing Support\n\t0405  Type 101\n\t0406  Type 102\n\t0437  Aficio SP 3510SF\n\t044e  SP C250SF (multifunction device: printer, scanner, fax)\n\t1803  V5 camera [R5U870]\n\t1810  Pavilion Webcam [R5U870]\n\t1812  Pavilion Webcam\n\t1814  HD Webcam\n\t1815  Dell Laptop Integrated Webcam\n\t1820  Integrated Webcam\n\t1830  Visual Communication Camera VGP-VCC2 [R5U870]\n\t1832  Visual Communication Camera VGP-VCC3 [R5U870]\n\t1833  Visual Communication Camera VGP-VCC2 [R5U870]\n\t1834  Visual Communication Camera VGP-VCC2 [R5U870]\n\t1835  Visual Communication Camera VGP-VCC5 [R5U870]\n\t1836  Visual Communication Camera VGP-VCC4 [R5U870]\n\t1837  Visual Communication Camera VGP-VCC4 [R5U870]\n\t1839  Visual Communication Camera VGP-VCC6 [R5U870]\n\t183a  Visual Communication Camera VGP-VCC7 [R5U870]\n\t183b  Visual Communication Camera VGP-VCC8 [R5U870]\n\t183d  Sony Vaio Integrated Webcam\n\t183e  Visual Communication Camera VGP-VCC9 [R5U870]\n\t183f  Sony Visual Communication Camera Integrated Webcam\n\t1841  Fujitsu F01/ Lifebook U810 [R5U870]\n\t1870  Webcam 1000\n\t1880  R5U880\n\t18b0  Sony Vaio Integrated Webcam\n\t18b1  Sony Vaio Integrated Webcam\n\t18b3  Sony Vaio Integrated Webcam\n\t18b5  Sony Vaio Integrated Webcam\n\t2201  RDC-7 Camera\n\t2202  Caplio RR30\n\t2203  Caplio 300G\n\t2204  Caplio G3\n\t2205  Caplio RR30 / Medion MD 6126 Camera\n\t2206  Konica DG-3Z\n\t2207  Caplio Pro G3\n\t2208  Caplio G4\n\t2209  Caplio 400G wide\n\t220a  KONICA MINOLTA DG-4Wide\n\t220b  Caplio RX\n\t220c  Caplio GX\n\t220d  Caplio R1/RZ1\n\t220e  Sea & Sea 5000G\n\t220f  Rollei dr5 / Rollei dr5 (PTP mode)\n\t2211  Caplio R1S\n\t2212  Caplio R1v Camera\n\t2213  Caplio R2\n\t2214  Caplio GX 8\n\t2215  DSC 725\n\t2216  Caplio R3\n\t2222  RDC-i500\n05cb  PowerVision Technologies, Inc.\n\t1483  PV8630 interface (scanners, webcams)\n05cc  ELSA AG\n\t2100  MicroLink ISDN Office\n\t2219  MicroLink ISDN\n\t2265  MicroLink 56k\n\t2267  MicroLink 56k (V.250)\n\t2280  MicroLink 56k Fun\n\t3000  Micolink USB2Ethernet [pegasus]\n\t3100  AirLancer USB-11\n\t3363  MicroLink ADSL Fun\n05cd  Silicom, Ltd\n05ce  sci-worx GmbH\n05cf  Sung Forn Co., Ltd\n05d0  GE Medical Systems Lunar\n05d1  Brainboxes, Ltd\n\t0003  Bluetooth Adapter BL-554\n05d2  Wave Systems Corp.\n05d3  Tohoku Ricoh Co., Ltd\n05d5  Super Gate Technology Co., Ltd\n05d6  Philips Semiconductors, CICT\n05d7  Thomas & Betts Corp.\n\t0099  10Mbps Ethernet [klsi]\n05d8  Ultima Electronics Corp.\n\t4001  Artec Ultima 2000\n\t4002  Artec Ultima 2000 (GT6801 based)/Lifetec LT9385/ScanMagic 1200 UB Plus Scanner\n\t4003  Artec E+ 48U\n\t4004  Artec E+ Pro\n\t4005  MEM48U\n\t4006  TRUST EASY WEBSCAN 19200\n\t4007  TRUST 240H EASY WEBSCAN GOLD\n\t4008  Trust Easy Webscan 19200\n\t4009  Umax Astraslim\n\t4013  IT Scan 1200\n\t8105  Artec T1 USB TVBOX (cold)\n\t8106  Artec T1 USB TVBOX (warm)\n\t8107  Artec T1 USB TVBOX with AN2235 (cold)\n\t8108  Artec T1 USB TVBOX with AN2235 (warm)\n\t8109  Artec T1 USB2.0 TVBOX (cold\n05d9  Axiohm Transaction Solutions\n\ta225  A225 Printer\n\ta758  A758 Printer\n\ta794  A794 Printer\n05da  Microtek International, Inc.\n\t0091  ScanMaker X6u\n\t0093  ScanMaker V6USL\n\t0094  Phantom 336CX/C3\n\t0099  ScanMaker X6/X6U\n\t009a  Phantom C6\n\t00a0  Phantom 336CX/C3 (#2)\n\t00a3  ScanMaker V6USL\n\t00ac  ScanMaker V6UL\n\t00b6  ScanMaker V6UPL\n\t00ef  ScanMaker V6UPL\n\t1006  Jenoptik JD350 entrance\n\t1011  NHJ Che-ez! Kiss Digital Camera\n\t1018  Digital Dream Enigma 1.3\n\t1020  Digital Dream l'espion xtra\n\t1025  Take-it Still Camera Device\n\t1026  Take-it\n\t1043  Take-It 1300 DSC Bulk Driver\n\t1045  Take-it D1\n\t1047  Take-it Camera Composite Device\n\t1048  Take-it Q3\n\t1049  3M Still Camera Device\n\t1051  Camcorder Series\n\t1052  Mass Storage Device\n\t1053  Take-it DV Composite Device\n\t1054  Mass Storage Device\n\t1055  Digital Camera Series(536)\n\t1056  Mass Storage Device\n\t1057  Take-it DSC Camera Device(536)\n\t1058  Mass Storage Device\n\t1059  Camcorder DSC Series\n\t1060  Microtek Take-it MV500\n\t2007  ArtixScan DI 1210\n\t200c  1394_USB2 Scanner\n\t200e  ArtixScan DI 810\n\t2017  UF ICE Scanner\n\t201c  4800 Scanner\n\t201d  ArtixScan DI 1610\n\t201f  4800 Scanner-ICE\n\t202e  ArtixScan DI 2020\n\t208b  ScanMaker 6800\n\t208f  ArtixScan DI 2010\n\t209e  ScanMaker 4700LP\n\t20a7  ScanMaker 5600\n\t20b0  ScanMaker X12USL\n\t20b1  ScanMaker 8700\n\t20b4  ScanMaker 4700\n\t20bd  ScanMaker 5700\n\t20c9  ScanMaker 6700\n\t20d2  Microtek ArtixScan 1800f\n\t20d6  PS4000\n\t20de  ScanMaker 9800XL\n\t20e0  ScanMaker 9700XL\n\t20ed  ScanMaker 4700\n\t20ee  Micortek ScanMaker X12USL\n\t2838  RT2832U\n\t3008  Scanner\n\t300a  4800 ICE Scanner\n\t300b  4800 Scanner\n\t300f  MiniScan C5\n\t3020  4800dpi Scanner\n\t3021  1200dpi Scanner\n\t3022  Scanner 4800dpi\n\t3023  USB1200II Scanner\n\t3025  ScanMaker S460\n\t30c1  USB600 Scanner\n\t30ce  ScanMaker 3800\n\t30cf  ScanMaker 4800\n\t30d4  USB1200 Scanner\n\t30d8  Scanner\n\t30d9  USB2400 Scanner\n\t30e4  ScanMaker 4100\n\t30e5  USB3200 Scanner\n\t30e6  ScanMaker i320\n\t40b3  ScanMaker 3600\n\t40b8  ScanMaker 3700\n\t40c7  ScanMaker 4600\n\t40ca  ScanMaker 3600\n\t40cb  ScanMaker 3700\n\t40dd  ScanMaker 3750i\n\t40ff  ScanMaker 3600\n\t5003  Goya\n\t5013  3200 Scanner\n\t6072  XT-3500 A4 HD Scanner\n\t80a3  ScanMaker V6USL (#2)\n\t80ac  ScanMaker V6UL/SpicyU\n05db  Sun Corp. (Suntac?)\n\t0003  SUNTAC U-Cable type D2\n\t0005  SUNTAC U-Cable type P1\n\t0009  SUNTAC Slipper U\n\t000a  SUNTAC Ir-Trinity\n\t000b  SUNTAC U-Cable type A3\n\t0011  SUNTAC U-Cable type A4\n05dc  Lexar Media, Inc.\n\t0001  jumpSHOT CompactFlash Reader\n\t0002  JumpShot\n\t0003  JumpShot\n\t0080  Jumpdrive Secure 64MB\n\t0081  RBC Compact Flash Drive\n\t00a7  JumpDrive Impact\n\t0100  JumpDrive PRO\n\t0200  JumpDrive 2.0 Pro\n\t0300  Jumpdrive Geysr\n\t0301  JumpDrive Classic\n\t0302  JD Micro\n\t0303  JD Micro Pro\n\t0304  JD Secure II\n\t0310  JumpDrive\n\t0311  JumpDrive Classic\n\t0312  JD Micro\n\t0313  JD Micro Pro\n\t0320  JumpDrive\n\t0321  JD Micro\n\t0322  JD Micro Pro\n\t0323  UFC\n\t0330  JumpDrive Expression\n\t0340  JumpDrive TAD\n\t0350  Express Card\n\t0400  UFDC\n\t0401  UFDC\n\t0403  Locked B Device\n\t0405  Locked C Device\n\t0407  Locked D Device\n\t0409  Locked E Device\n\t040b  Locked F Device\n\t040d  Locked G Device\n\t040f  Locked H Device\n\t0410  JumpDrive\n\t0411  JumpDrive\n\t0413  Locked J Device\n\t0415  Locked K Device\n\t0417  Locked L Device\n\t0419  Locked M Device\n\t041b  Locked N Device\n\t041d  Locked O Device\n\t041f  Locked P Device\n\t0420  JumpDrive\n\t0421  JumpDrive\n\t0423  Locked R Device\n\t0425  Locked S Device\n\t0427  Locked T Device\n\t0429  Locked U Device\n\t042b  Locked V Device\n\t042d  Locked W Device\n\t042f  Locked X Device\n\t0431  Locked Y Device\n\t0433  Locked Z Device\n\t4d02  MP3 Player\n\t4d12  MP3 Player\n\t4d30  MP3 Player\n\ta201  JumpDrive S70 4GB\n\ta209  JumpDrive S70\n\ta300  JumpDrive2\n\ta400  JumpDrive trade; Pro 40-501\n\ta410  JumpDrive 128MB/256MB\n\ta411  JumpDrive Traveler\n\ta420  JumpDrive Pro\n\ta421  JumpDrive Pro II\n\ta422  JumpDrive Micro Pro\n\ta430  JumpDrive Secure\n\ta431  JumpDrive Secure II\n\ta432  JumpDrive Classic\n\ta440  JumpDrive Lightning\n\ta450  JumpDrive TouchGuard\n\ta460  JD Mercury\n\ta501  JumpDrive Classic\n\ta510  JumpDrive Sport\n\ta530  JumpDrive Expression\n\ta531  JumpDrive Secure II\n\ta560  JumpDrive FireFly\n\ta701  JumpDrive FireFly\n\ta731  JumpDrive FireFly\n\ta762  JumpDrive FireFly\n\ta768  JumpDrive Retrax\n\ta790  JumpDrive 2GB\n\ta811  16GB Gizmo!\n\ta813  16gB flash thumb drive\n\ta815  JumpDrive V10\n\ta81d  LJDTT16G [JumpDrive 16GB]\n\ta833  JumpDrive S23 64GB\n\ta838  JumpDrive Tough\n\tb002  USB CF Reader\n\tb018  Multi-Card Reader\n\tb047  SDHC Reader [RW047-7000]\n\tb051  microSD RDR UHS-I Card Reader [LRWM03U-7000]\n\tb054  Dual-Slot Reader [LRW400U]\n\tba02  Workflow CFR1\n\tba0a  Workflow DD512\n\tc753  JumpDrive TwistTurn\n\tc75c  JumpDrive V10\n05dd  Delta Electronics, Inc.\n\ta011  HID UPS Battery\n\ta0a0  Minuteman Entrust-LCD Series UPS\n\tff31  AWU-120\n\tff32  FriendlyNET AeroLAN AL2011\n\tff35  PCW 100 - Wireless 802.11b Adapter\n\tff91  2Wire PC Port Phoneline 10Mbps Adapter\n05df  Silicon Vision, Inc.\n05e0  Symbol Technologies\n\t0700  Bar Code Scanner (CS1504)\n\t0800  Spectrum24 Wireless LAN Adapter\n\t1200  Bar Code Scanner\n\t1701  Bar Code Scanner (CDC)\n\t1900  SNAPI Imaging Device\n\t1a00  CS4070 Barcode Scanner\n\t2000  MC3090 Rugged Mobile Computer\n\t200d  MC70 Rugged Mobile Computer\n05e1  Syntek Semiconductor Co., Ltd\n\t0100  802.11g + Bluetooth Wireless Adapter\n\t0408  STK1160 Video Capture Device\n\t0500  DC-112X Webcam\n\t0501  DC-1125 Webcam\n\t0890  STK011 Camera\n\t0892  STK013 Camera\n\t0895  STK016 Camera\n\t0896  STK017 Camera\n\t2010  ARCTIC Sound P261 Headphones\n05e2  ElecVision, Inc.\n05e3  Genesys Logic, Inc.\n\t000a  Keyboard with PS/2 Port\n\t000b  Mouse\n\t0100  Nintendo Game Boy Advance SP\n\t0120  Pacific Image Electronics PrimeFilm 1800u slide/negative scanner\n\t0131  CF/SM Reader/Writer\n\t0142  Multiple Slides Scanner-3600\n\t0143  Multiple Frames Film Scanner-36series\n\t0145  Reflecta CrystalScan 7200 Photo-Scanner\n\t0180  Plustek Scanner\n\t0182  Wize Media 1000\n\t0189  ScanJet 4600 series\n\t018a  Xerox 6400\n\t0300  GLUSB98PT Parallel Port\n\t0301  USB2LPT Cable Release2\n\t0406  Hub\n\t0501  GL620USB Host-Host interface\n\t0502  GL620USB-A GeneLink USB-USB Bridge\n\t0503  Webcam\n\t0504  HID Keyboard Filter\n\t0510  Camera\n\t0604  USB 1.1 Hub\n\t0605  Hub\n\t0606  USB 2.0 Hub / D-Link DUB-H4 USB 2.0 Hub\n\t0607  Logitech G110 Hub\n\t0608  Hub\n\t0610  Hub\n\t0612  Hub\n\t0616  hub\n\t0618  Hub\n\t0620  GL3523 Hub\n\t0626  Hub\n\t0660  USB 2.0 Hub\n\t0700  SIIG US2256 CompactFlash Card Reader\n\t0701  USB 2.0 IDE Adapter\n\t0702  USB 2.0 IDE Adapter [GL811E]\n\t0703  Card Reader\n\t0704  Card Reader\n\t0705  Card Reader\n\t0706  Card Reader\n\t0707  Card Reader\n\t0708  Card Reader\n\t0709  Card Reader\n\t070a  Pen Flash\n\t070b  DMHS1B Rev 3 DFU Adapter\n\t070e  USB 2.0 Card Reader\n\t070f  Pen Flash\n\t0710  USB 2.0 33-in-1 Card Reader\n\t0711  Card Reader\n\t0712  Delkin Mass Storage Device\n\t0715  USB 2.0 microSD Reader\n\t0716  Multislot Card Reader/Writer\n\t0717  All-in-1 Card Reader\n\t0718  IDE/SATA Adapter\n\t0719  SATA adapter\n\t0722  SD/MMC card reader\n\t0723  GL827L SD/MMC/MS Flash Card Reader\n\t0726  SD Card Reader\n\t0727  microSD Reader/Writer\n\t0731  GL3310 SATA 3Gb/s Bridge Controller\n\t0732  All-in-One Cardreader\n\t0736  Colour arc SD Card Reader [PISEN]\n\t0738  Card reader\n\t0741  microSD Card Reader\n\t0743  SDXC and microSDXC CardReader\n\t0745  Logilink CR0012\n\t0748  All-in-One Cardreader\n\t0749  SD Card Reader and Writer\n\t0751  microSD Card Reader\n\t0752  micros Reader\n\t0760  USB 2.0 Card Reader/Writer\n\t0761  Genesys Mass Storage Device\n\t0769  SPR2801S [Lightspeeur 2801]\n\t0780  USBFS DFU Adapter\n\t07a0  Pen Flash\n\t0880  Wasp (SL-6612)\n\t0927  Card Reader\n\t1205  Afilias Optical Mouse H3003 / Trust Optical USB MultiColour Mouse MI-2330\n\ta700  Pen Flash\n\tf102  VX7012 TV Box\n\tf103  VX7012 TV Box\n\tf104  VX7012 TV Box\n\tf12a  Digital Microscope\n\tfd21  3M TL20 Temperature Logger\n\tfe00  Razer Mouse\n05e4  Red Wing Corp.\n05e5  Fuji Electric Co., Ltd\n05e6  Keithley Instruments\n\t3390  3390 Arbitrary Waveform Generator\n05e8  ICC, Inc.\n05e9  Kawasaki LSI\n\t0008  KL5KUSB101B Ethernet [klsi]\n\t0009  Sony 10Mbps Ethernet [pegasus]\n\t000c  USB-to-RS-232\n\t000d  USB-to-RS-232\n\t0014  RS-232 J104\n\t0040  Ethernet Adapter\n\t2008  Ethernet Adapter\n05eb  FFC, Ltd\n05ec  COM21, Inc.\n05ee  Cytechinfo Inc.\n05ef  AVB, Inc. [anko?]\n\t020a  Top Shot Pegasus Joystick\n\t8884  Mag Turbo Force Wheel\n\t8888  Top Shot Force Feedback Racing Wheel\n05f0  Canopus Co., Ltd\n\t0101  DA-Port DAC\n05f1  Compass Communications\n05f2  Dexin Corp., Ltd\n\t0010  AQ Mouse\n05f3  PI Engineering, Inc.\n\t0007  Kinesis Advantage PRO MPC/USB Keyboard\n\t0081  Kinesis Integrated Hub\n\t00ff  VEC Footpedal\n\t0203  Y-mouse Keyboard & Mouse Adapter\n\t020b  PS2 Adapter\n\t0232  X-Keys Switch Interface, Programming Mode\n\t0261  X-Keys Switch Interface, SPLAT Mode\n\t0264  X-Keys Switch Interface, Composite Mode\n05f5  Unixtar Technology, Inc.\n05f6  AOC International\n05f7  RFC Distribution(s) PTE, Ltd\n05f9  PSC Scanning, Inc.\n\t1104  Magellan 2200VS\n\t1206  Gryphon series (OEM mode)\n\t120c  Gryphon GD4430-BK\n\t2202  Point of Sale Handheld Scanner\n\t2206  Gryphon series (keyboard emulation mode)\n\t220c  Datalogic Gryphon GD4430\n\t2601  Datalogic Magellan 1000i Barcode Scanner\n\t2602  Datalogic Magellan 1100i Barcode Scanner\n\t4204  Gryphon series (RS-232 emulation mode)\n\t5204  Datalogic Gryphon GFS4170 (config mode)\n05fa  Siemens Telecommunications Systems, Ltd\n\t3301  Keyboard with PS/2 Mouse Port\n\t3302  Keyboard\n\t3303  Keyboard with PS/2 Mouse Port\n05fc  Harman\n\t0001  Soundcraft Si Multi Digital Card\n\t0010  Soundcraft Si MADI combo card\n\t0021  Soundcraft Signature 12 MTK\n\t7849  Harman/Kardon SoundSticks\n05fd  InterAct, Inc.\n\t0239  SV-239 HammerHead Digital\n\t0251  Raider Pro\n\t0253  ProPad 8 Digital\n\t0286  SV-286 Cyclone Digital\n\t1007  Mad Catz Controller\n\t107a  PowerPad Pro X-Box pad\n\t262a  3dfx HammerHead FX\n\t262f  HammerHead Fx\n\tdaae  Game Shark\n\tdbae  Datel XBoxMC\n05fe  Chic Technology Corp.\n\t0001  Mouse\n\t0003  Cypress USB Mouse\n\t0005  Viewmaster 4D Browser Mouse\n\t0007  Twinhead Mouse\n\t0009  Inland Pro 4500/5000 Mouse\n\t0011  Browser Mouse\n\t0014  Gamepad\n\t1010  Optical Wireless\n\t2001  Microsoft Wireless Receiver 700\n\t3030  Controller\n\t3031  Controller\n05ff  LeCroy Corp.\n0600  Barco Display Systems\n0601  Jazz Hipster Corp.\n\t0003  Internet Security Co., Ltd. SecureKey\n0602  Vista Imaging, Inc.\n\t1001  ViCam Webcam\n0603  Novatek Microelectronics Corp.\n\t0002  Sino Wealth keyboard/mouse 2.4 GHz receiver\n\t00f1  Keyboard (Labtec Ultra Flat Keyboard)\n\t00f2  Keyboard (Labtec Ultra Flat Keyboard)\n\t1002  Mobius actioncam (webcam mode)\n\t6871  Mouse\n\t8611  NTK96550-based camera (mass storage mode)\n\t8612  NTK96550-based camera (webcam mode)\n0604  Jean Co., Ltd\n0605  Anchor C&C Co., Ltd\n0606  Royal Information Electronics Co., Ltd\n0607  Bridge Information Co., Ltd\n0608  Genrad Ads\n0609  SMK Manufacturing, Inc.\n\t031d  eHome Infrared Receiver\n\t0322  eHome Infrared Receiver\n\t0334  eHome Infrared Receiver\n\tff12  SMK Bluetooth Device\n060a  Worthington Data Solutions, Inc.\n060b  Solid Year\n\t0001  MacAlly Keyboard\n\t0230  KSK-8003 UX Keyboard\n\t0540  DeltaCo TB-106U Keyboard\n\t1006  Japanese Keyboard - 260U\n\t2101  Keyboard\n\t2231  KSK-6001 UELX Keyboard\n\t2270  Gigabyte K8100 Aivia Gaming Keyboard\n\t500a  Cougar 500k Gaming Keyboard\n\t5253  Thermaltake MEKA G-Unit Gaming Keyboard\n\t5811  ACK-571U Wireless Keyboard\n\t5903  Japanese Keyboard - 595U\n\t6001  SolidTek USB 2p HUB\n\t6002  SolidTek USB Keyboard\n\t6003  Japanese Keyboard - 600HM\n\t6231  Thermaltake eSPORTS Meka Keyboard\n\t8007  P-W1G1F12 VER:1 [Macally MegaCam]\n\ta001  Maxwell Compact Pc PM3\n060c  EEH Datalink GmbH\n060d  Auctor Corp.\n060e  Transmonde Technologies, Inc.\n060f  Joinsoon Electronics Mfg. Co., Ltd\n0610  Costar Electronics, Inc.\n0611  Totoku Electric Co., Ltd\n0613  TransAct Technologies, Inc.\n0614  Bio-Rad Laboratories\n0615  Quabbin Wire & Cable Co., Inc.\n0616  Future Techno Designs PVT, Ltd\n0617  Swiss Federal Insitute of Technology\n\t000a  Thymio-II\n\t000c  Thymio-II Wireless\n0618  MacAlly\n\t0101  Mouse\n0619  Seiko Instruments, Inc.\n\t0101  SLP-100 Driver\n\t0102  SLP-200 Driver\n\t0103  SLP-100N Driver\n\t0104  SLP-200N Driver\n\t0105  SLP-240 Driver\n\t0501  SLP-440 Driver\n\t0502  SLP-450 Driver\n061a  Veridicom International, Inc.\n\t0110  5thSense Fingerprint Sensor\n\t0200  FPS200 Fingerprint Sensor\n\t8200  VKI-A Fingerprint Sensor/Flash Storage (dumb)\n\t9200  VKI-B Fingerprint Sensor/Flash Storage (smart)\n061b  Promptus Communications, Inc.\n061c  Act Labs, Ltd\n061d  Quatech, Inc.\n\tc020  SSU-100\n061e  Nissei Electric Co.\n\t0001  nissei 128DE-USB -\n\t0010  nissei 128DE-PNA -\n0620  Alaris, Inc.\n\t0004  QuickVideo weeCam\n\t0007  QuickVideo weeCam\n\t000a  QuickVideo weeCam\n\t000b  QuickVideo weeCam\n0621  ODU-Steckverbindungssysteme GmbH & Co. KG\n0622  Iotech, Inc.\n0623  Littelfuse, Inc.\n0624  Avocent Corp.\n\t0013  SC Secure KVM\n\t0248  Virtual Hub\n\t0249  Virtual Keyboard/Mouse\n\t0251  Virtual Mass Storage\n\t0252  Virtual SD card reader\n\t0294  Dell 03R874 KVM dongle\n\t0402  Cisco Virtual Keyboard and Mouse\n\t0403  Cisco Virtual Mass Storage\n\t1774  Cybex SC985\n0625  TiMedia Technology Co., Ltd\n0626  Nippon Systems Development Co., Ltd\n0627  Adomax Technology Co., Ltd\n\t0001  QEMU Tablet\n0628  Tasking Software, Inc.\n0629  Zida Technologies, Ltd\n062a  MosArt Semiconductor Corp.\n\t0000  Optical mouse\n\t0001  Notebook Optical Mouse\n\t0020  Logic3 Gamepad\n\t0033  Competition Pro Steering Wheel\n\t0102  Wireless Keyboard/Mouse Combo [MK1152WC]\n\t0201  Defender Office Keyboard (K7310) S Zodiak KM-9010\n\t0252  Emerge Uni-retractable Laser Mouse\n\t2410  Wireless PS3 gamepad\n\t3286  Nano Receiver [Sandstrom Laser Mouse SMWLL11]\n\t4101  Wireless Keyboard/Mouse\n\t4102  Wireless Mouse\n\t4106  Wireless Mouse 2.4G\n\t4108  Wireless Mouse 2.4G\n\t4c01  2,4Ghz Wireless Transceiver [for Delux M618 Plus Wireless Vertical Mouse]\n\t6301  Trust Wireless Optical Mouse MI-4150K\n\t9003  VoIP Conference Hub (A16GH)\n\t9004  USR9602 USB Internet Mini Phone\n062b  Greatlink Electronics Taiwan, Ltd\n062c  Institute for Information Industry\n062d  Taiwan Tai-Hao Enterprises Co., Ltd\n062e  Mainsuper Enterprises Co., Ltd\n062f  Sin Sheng Terminal & Machine, Inc.\n0631  JUJO Electronics Corp.\n0633  Cyrix Corp.\n0634  Micron Technology, Inc.\n\t0655  Embedded Mass Storage Drive [RealSSD]\n0635  Methode Electronics, Inc.\n0636  Sierra Imaging, Inc.\n\t0003  Vivicam 35Xx\n0638  Avision, Inc.\n\t0268  iVina 1200U Scanner\n\t026a  Minolta Dimage Scan Dual II AF-2820U (2886)\n\t0a10  iVina FB1600/UMAX Astra 4500\n\t0a13  AV600U\n\t0a15  Konica Minolta SC-110\n\t0a16  Konica Minolta SC-215\n\t0a2a  AV220 C2\n\t0a30  UMAX Astra 6700 Scanner\n\t0a41  Avision AM3000/MF3000 Series\n\t0f01  fi-4010CU\n# typo?\n\t4004  Minolta Dimage Scan Elite II AF-2920 (2888)\n0639  Chrontel, Inc.\n\t7213  CH7213\n\t7231  CH7213\n063a  Techwin Corp.\n063b  Taugagreining HF\n063c  Yamaichi Electronics Co., Ltd (Sakura)\n063d  Fong Kai Industrial Co., Ltd\n063e  RealMedia Technology, Inc.\n063f  New Technology Cable, Ltd\n0640  Hitex Development Tools\n\t0026  LPC-Stick\n0641  Woods Industries, Inc.\n0642  VIA Medical Corp.\n0644  TEAC Corp.\n\t0000  Floppy\n\t0200  All-In-One Multi-Card Reader CA200/B/S\n\t1000  CD-ROM Drive\n\t800d  TASCAM Portastudio DP-01FX\n\t800e  TASCAM US-122L\n\t801d  TASCAM DR-100\n\t8021  TASCAM US-122mkII\n\t8047  TASCAM US-16x08\n\td001  CD-R/RW Unit\n\td002  CD-R/RW Unit\n\td010  CD-RW/DVD Unit\n0645  Who? Vision Systems, Inc.\n0646  UMAX\n0647  Acton Research Corp.\n\t0100  ARC SpectraPro UV/VIS/IR Monochromator/Spectrograph\n\t0101  ARC AM-VM Mono Airpath/Vacuum Monochromator/Spectrograph\n\t0102  ARC Inspectrum Mono\n\t0103  ARC Filterwheel\n\t03e9  Inspectrum 128x1024 F VIS Spectrograph\n\t03ea  Inspectrum 256x1024 F VIS Spectrograph\n\t03eb  Inspectrum 128x1024 B VIS Spectrograph\n\t03ec  Inspectrum 256x1024 B VIS Spectrograph\n0648  Inside Out Networks\n0649  Weli Science Co., Ltd\n064b  Analog Devices, Inc. (White Mountain DSP)\n\t0165  Blackfin 535 [ADZS HPUSB ICE]\n064c  Ji-Haw Industrial Co., Ltd\n064d  TriTech Microelectronics, Ltd\n064e  Suyin Corp.\n\t2100  Sony Visual Communication Camera\n\t3410  RGBIR Camera\n\t9700  Asus Integrated Webcam\n\ta100  Acer OrbiCam\n\ta101  Acer CrystalEye Webcam\n\ta102  Acer/Lenovo Webcam [CN0316]\n\ta103  Acer/HP Integrated Webcam [CN0314]\n\ta110  HP Webcam\n\ta114  Lemote Webcam\n\ta116  UVC 1.3MPixel WebCam\n\ta127  HP Integrated Webcam\n\ta136  Asus Integrated Webcam [CN031B]\n\ta219  1.3M WebCam (notebook emachines E730, Acer sub-brand)\n\tc107  HP webcam [dv6-1190en]\n\tc335  HP TrueVision HD\n\td101  Acer CrystalEye Webcam\n\td213  UVC HD Webcam\n\td217  HP TrueVision HD\n\te201  Lenovo Integrated Webcam\n\te203  Lenovo Integrated Webcam\n\te258  HP TrueVision HD Integrated Webcam\n\te263  HP TrueVision HD Integrated Webcam\n\tf102  Lenovo Integrated Webcam [R5U877]\n\tf103  Lenovo Integrated Webcam [R5U877]\n\tf207  Lenovo EasyCamera Integrated Webcam\n\tf209  HP Webcam\n\tf300  UVC 0.3M Webcam\n064f  WIBU-Systems AG\n\t03e9  CmStick (MSD, article no. 1001-xx-xxx)\n\t03f2  CmStick/M (MSD, article no. 1010-xx-xxx)\n\t03f3  CmStick/M (MSD, article no. 1011-xx-xxx)\n\t0bd7  Wibu-Box/U (article no. 3031-xx-xxx)\n\t0bd8  Wibu-Box/RU (article no. 3032-xx-xxx)\n\t2af9  CmStick (HID, article no. 1001-xx-xxx)\n\t2b03  CmStick/M (HID, article no. 1011-xx-xxx)\n\t5213  CmStick/M (COMPOSITE, article no. 1011-xx-xxx)\n0650  Dynapro Systems\n0651  Likom Technology Sdn. Bhd.\n0652  Stargate Solutions, Inc.\n0653  CNF, Inc.\n0654  Granite Microsystems, Inc.\n\t0005  Device Bay Controller\n\t0006  Hub\n\t0007  Device Bay Controller\n\t0016  Hub\n0655  Space Shuttle Hi-Tech Co., Ltd\n0656  Glory Mark Electronic, Ltd\n0657  Tekcon Electronics Corp.\n0658  Sigma Designs, Inc.\n\t0200  Aeotec Z-Stick Gen5 (ZW090) - UZB\n\t0280  ZWave programming interface\n0659  Aethra\n065a  Optoelectronics Co., Ltd\n\t0001  Opticon OPR-2001 / NLV-1001 (keyboard mode)\n\t0009  NLV-1001 (serial mode) / OPN-2001 [Opticon]\n065b  Tracewell Systems\n065e  Silicon Graphics\n065f  Good Way Technology Co., Ltd & GWC technology Inc.\n0660  TSAY-E (BVI) International, Inc.\n0661  Hamamatsu Photonics K.K.\n0662  Kansai Electric Co., Ltd\n0663  Topmax Electronic Co., Ltd\n\t0103  CobraPad\n0664  ET&T Technology Co., Ltd.\n\t0301  Groovy Technology Corp. GTouch Touch Screen\n\t0302  Groovy Technology Corp. GTouch Touch Screen\n\t0303  Groovy Technology Corp. GTouch Touch Screen\n\t0304  Groovy Technology Corp. GTouch Touch Screen\n\t0305  Groovy Technology Corp. GTouch Touch Screen\n\t0306  Groovy Technology Corp. GTouch Touch Screen\n\t0307  Groovy Technology Corp. GTouch Touch Screen\n\t0309  Groovy Technology Corp. GTouch Touch Screen\n0665  Cypress Semiconductor\n\t5161  USB to Serial\n0667  Aiwa Co., Ltd\n\t0fa1  TD-U8000 Tape Drive\n0668  WordWand\n0669  Oce' Printing Systems GmbH\n066a  Total Technologies, Ltd\n066b  Linksys, Inc.\n\t0105  SCM eUSB SmartMedia Card Reader\n\t010a  Melco MCR-U2 SmartMedia / CompactFlash Reader\n\t200c  USB10TX\n\t2202  USB10TX Ethernet [pegasus]\n\t2203  USB100TX Ethernet [pegasus]\n\t2204  USB100TX HomePNA Ethernet [pegasus]\n\t2206  USB Ethernet [pegasus]\n\t2207  HomeLink Phoneline 10M Network Adapter\n\t2211  WUSB11 802.11b Adapter\n\t2212  WUSB11v2.5 802.11b Adapter\n\t2213  WUSB12v1.1 802.11b Adapter\n\t2219  Instant Wireless Network Adapter\n\t400b  USB10TX\n066d  Entrega, Inc.\n066e  Acer Semiconductor America, Inc.\n066f  SigmaTel, Inc.\n\t003b  MP3 Player\n\t003e  MP3 Player\n\t003f  MP3 Player\n\t0040  MP3 Player\n\t0041  MP3 Player\n\t0042  MP3 Player\n\t0043  MP3 Player\n\t004b  A-Max PA11 MP3 Player\n\t3400  STMP3400 D-Major MP3 Player\n\t3410  STMP3410 D-Major MP3 Player\n\t3500  Player Recovery Device\n\t3780  STMP3780/i.MX23 SystemOnChip in RecoveryMode\n\t4200  STIr4200 IrDA Bridge\n\t4210  STIr4210 IrDA Bridge\n\t8000  MSCN MP3 Player\n\t8001  SigmaTel MSCN Audio Player\n\t8004  MSCNMMC MP3 Player\n\t8008  i-Bead 100 MP3 Player\n\t8020  MP3 Player\n\t8034  MP3 Player\n\t8036  MP3 Player\n\t8038  MP3 Player\n\t8056  MP3 Player\n\t8060  MP3 Player\n\t8066  MP3 Player\n\t807e  MP3 Player\n\t8092  MP3 Player\n\t8096  MP3 Player\n\t809a  MP3 Player\n\t80aa  MP3 Player\n\t80ac  MP3 Player\n\t80b8  MP3 Player\n\t80ba  MP3 Player\n\t80bc  MP3 Player\n\t80bf  MP3 Player\n\t80c5  MP3 Player\n\t80c8  MP3 Player\n\t80ca  MP3 Player\n\t80cc  MP3 Player\n\t8104  MP3 Player\n\t8106  MP3 Player\n\t8108  MP3 Player\n\t810a  MP3 Player\n\t810c  MP3 Player\n\t8122  MP3 Player\n\t8124  MP3 Player\n\t8126  MP3 Player\n\t8128  MP3 Player\n\t8134  MP3 Player\n\t8136  MP3 Player\n\t8138  MP3 Player\n\t813a  MP3 Player\n\t813e  MP3 Player\n\t8140  MP3 Player\n\t8142  MP3 Player\n\t8144  MP3 Player\n\t8146  MP3 Player\n\t8148  MP3 Player\n\t814c  MP3 Player\n\t8201  MP3 Player\n\t8202  Jens of Sweden / I-BEAD 150M/150H MP3 player\n\t8203  MP3 Player\n\t8204  MP3 Player\n\t8205  MP3 Player\n\t8206  Digital MP3 Music Player\n\t8207  MP3 Player\n\t8208  MP3 Player\n\t8209  MP3 Player\n\t820a  MP3 Player\n\t820b  MP3 Player\n\t820c  MP3 Player\n\t820d  MP3 Player\n\t820e  MP3 Player\n\t820f  MP3 Player\n\t8210  MP3 Player\n\t8211  MP3 Player\n\t8212  MP3 Player\n\t8213  MP3 Player\n\t8214  MP3 Player\n\t8215  MP3 Player\n\t8216  MP3 Player\n\t8217  MP3 Player\n\t8218  MP3 Player\n\t8219  MP3 Player\n\t821a  MP3 Player\n\t821b  MP3 Player\n\t821c  MP3 Player\n\t821d  MP3 Player\n\t821e  MP3 Player\n\t821f  MP3 Player\n\t8220  MP3 Player\n\t8221  MP3 Player\n\t8222  MP3 Player\n\t8223  MP3 Player\n\t8224  MP3 Player\n\t8225  MP3 Player\n\t8226  MP3 Player\n\t8227  MP3 Player\n\t8228  MP3 Player\n\t8229  MP3 Player\n\t8230  MP3 Player\n\t829c  MP3 Player\n\t82e0  MP3 Player\n\t8320  TrekStor i.Beat fun\n\t835d  MP3 Player\n\t83b5  Transcend T.sonic 530 MP3 Player\n\t9000  MP3 Player\n\t9001  MP3 Player\n\t9002  MP3 Player\n0670  Sequel Imaging\n\t0001  Calibrator\n\t0005  Enable Cable\n0672  Labtec, Inc.\n\t1041  LCS1040 Speaker System\n\t5000  SpaceBall 4000 FLX\n0673  HCL\n\t5000  Keyboard\n0674  Key Mouse Electronic Enterprise Co., Ltd\n0675  DrayTek Corp.\n\t0110  Vigor 128 ISDN TA\n\t0530  Vigor530 IEEE 802.11G Adapter (ISL3880+NET2280)\n\t0550  Vigor550\n\t1688  miniVigor 128 ISDN TA [HFC-S]\n\t6694  miniVigor 128 ISDN TA\n0676  Teles AG\n0677  Aiwa Co., Ltd\n\t07d5  TM-ED1285(USB)\n\t0fa1  TD-U8000 Tape Drive\n0678  ACard Technology Corp.\n067b  Prolific Technology, Inc.\n\t0000  PL2301 USB-USB Bridge\n\t0001  PL2302 USB-USB Bridge\n\t0307  Motorola Serial Adapter\n\t04bb  PL2303 Serial (IODATA USB-RSAQ2)\n\t0600  IDE Bridge\n\t0610  Onext EG210U MODEM\n\t0611  AlDiga AL-11U Quad-band GSM/GPRS/EDGE modem\n\t1231  Orico SATA External Hard Disk Drive Lay-Flat Docking Station with USB 3.0 & eSATA interfaces.\n\t2303  PL2303 Serial Port / Mobile Phone Data Cable\n\t2305  PL2305 Parallel Port\n\t2306  Raylink Bridge Controller\n\t2307  PL2307 USB-ATAPI4 Bridge\n\t2313  FITEL PHS U Cable Adaptor\n\t2315  Flash Disk Embedded Hub\n\t2316  Flash Disk Security Device\n\t2317  Mass Storage Device\n\t23a3  ATEN Serial Bridge\n\t2501  PL2501 USB-USB Bridge (USB 2.0)\n\t2506  Kaser 8gB micro hard drive\n\t2507  PL2507 Hi-speed USB to IDE bridge controller\n\t2515  Flash Disk Embedded Hub\n\t2517  Flash Disk Mass Storage Device\n\t2528  Storage device (8gB thumb drive)\n\t2571  LG Electronics GE24LU21\n\t25a1  PL25A1 Host-Host Bridge\n\t2773  PL2773 SATAII bridge controller\n\t3400  Hi-Speed Flash Disk with TruePrint AES3400\n\t3500  Hi-Speed Flash Disk with TruePrint AES3500\n\t3507  PL3507 ATAPI6 Bridge\n\taaa0  Prolific Pharos\n\taaa2  PL2303 Serial Adapter (IODATA USB-RSAQ3)\n\taaa3  PL2303x Serial Adapter\n067c  Efficient Networks, Inc.\n\t1001  Siemens SpeedStream 100MBps Ethernet\n\t1022  Siemens SpeedStream 1022 802.11b Adapter\n\t1023  SpeedStream Wireless\n\t4020  SpeedStream 4020 ATM/ADSL Installer\n\t4031  Efficient ADSL Modem\n\t4032  SpeedStream 4031 ATM/ADSL Installer\n\t4033  SpeedStream 4031 ATM/ADSL Installer\n\t4060  Alcatel Speedstream 4060 ADSL Modem\n\t4062  Efficient Networks 4060 Loader\n\t5667  Efficient Networks Virtual Bus for ADSL Modem\n\tc031  SpeedStream 4031 ATM/ADSL Installer\n\tc032  SpeedStream 4031 ATM/ADSL Installer\n\tc033  SpeedStream 4031 ATM/ADSL Installer\n\tc060  SpeedStream 4060 Miniport ATM/ADSL Adapter\n\td667  Efficient Networks Virtual Bus for ADSL Modem\n\te240  Speedstream Ethernet Adapter E240\n\te540  Speedstream Ethernet Adapter E240\n067d  Hohner Corp.\n067e  Intermec Technologies Corp.\n\t0801  HID Keyboard, Barcode scanner\n\t0803  VCP, Barcode scanner\n\t0805  VCP + UVC, Barcode scanner\n\t1001  Mobile Computer\n067f  Virata, Ltd\n\t4552  DSL-200 ADSL Modem\n\t6542  DSL Modem\n\t6549  DSL Modem\n\t7541  DSL Modem\n0680  Realtek Semiconductor Corp., CPP Div. (Avance Logic)\n\t0002  Arowana Optical Wheel Mouse MSOP-01\n0681  Siemens Information and Communication Products\n\t0001  Dect Base\n\t0002  Gigaset 3075 Passive ISDN\n\t0005  ID-Mouse with Fingerprint Reader\n\t0012  I-Gate 802.11b Adapter\n\t0014  KNX/LPB Bus Interface\n\t001b  WLL013\n\t001d  Hipath 1000\n\t0022  Gigaset SX353 ISDN\n\t0026  DECT Data - Gigaset M34\n\t002b  A-100-I ADSL Modem\n\t002e  ADSL Router_S-141\n\t0034  GSM module MC35/ES75 USB Modem\n\t3c06  54g USB Network Adapter\n0682  Victor Company of Japan, Ltd\n0684  Actiontec Electronics, Inc.\n0685  ZD Incorporated\n\t7000  HSDPA Modem\n0686  Minolta Co., Ltd\n\t2001  PagePro 4110W\n\t2004  PagePro 1200W\n\t2005  Magicolor 2300 DL\n\t3001  PagePro 4100\n\t3005  PagePro 1250E\n\t3006  PagePro 1250W\n\t3009  Magicolor 2300W\n\t300b  PagePro 1350W\n\t300c  PagePro 1300W\n\t301b  Develop D 1650iD\n\t3023  Develop D 2050iD\n\t302e  Develop D 1650iD PCL\n\t3034  Develop D 2050iD PCL\n\t4001  Dimage 2300\n\t4003  Dimage 2330 Zoom Camera\n\t4004  Dimage Scan Elite II AF-2920 (2888)\n\t4005  Minolta DiMAGE E201 Mass Storage Device\n\t4006  Dimage 7 Camera\n\t4007  Dimage S304 Camera\n\t4008  Dimage 5 Camera\n\t4009  Dimage X Camera\n\t400a  Dimage S404 Camera\n\t400b  Dimage 7i Camera\n\t400c  Dimage F100 Camera\n\t400d  Dimage Scan Dual III AF-2840 (2889)\n\t400e  Dimage Scan Elite 5400 (2890)\n\t400f  Dimage 7Hi Camera\n\t4010  Dimage Xi Camera\n\t4011  Dimage F300 Camera\n\t4012  Dimage F200 Camera\n\t4014  Dimage S414 Camera\n\t4015  Dimage XT Camera [storage]\n\t4016  Dimage XT Camera [remote mode]\n\t4017  Dimage E223\n\t4018  Dimage Z1  Camera\n\t4019  Dimage A1 Camera [remote mode]\n\t401a  Dimage A1 Camera [storage]\n\t401c  Dimage X20 Camera\n\t401e  Dimage E323 Camera\n068a  Pertech, Inc.\n068b  Potrans International, Inc.\n068e  CH Products, Inc.\n\t00d3  OEM 3 axis 5 button joystick\n\t00e2  HFX OEM Joystick\n\t00f0  Multi-Function Panel\n\t00f1  Pro Throttle\n\t00f2  Flight Sim Pedals\n\t00f3  Fighterstick\n\t00f4  Combatstick\n\t00fa  Ch Throttle Quadrant\n\t00ff  Flight Sim Yoke\n\t0500  GameStick 3D\n\t0501  CH Pro Pedals\n\t0504  F-16 Combat Stick\n068f  Nihon KOHDEN\n\tc00d  MEK-6500\n0690  Golden Bridge Electech, Inc.\n0693  Hagiwara Sys-Com Co., Ltd\n\t0002  FlashGate SmartMedia Card Reader\n\t0003  FlashGate CompactFlash Card Reader\n\t0005  FlashGate\n\t0006  SM PCCard R/W and SPD\n\t0007  FlashGate ME (Authenticated)\n\t000a  SDCard/MMC Reader/Writer\n0694  Lego Group\n\t0001  Mindstorms Tower\n\t0002  Mindstorms NXT\n\t0005  Mindstorms EV3\n\t0006  Mindstorms EV3 Firmware Update\n0698  Chuntex (CTX)\n\t1786  1300ex Monitor\n\t2003  CTX M730V built in Camera\n\t9999  VLxxxx Monitor+Hub\n0699  Tektronix, Inc.\n\t0347  AFG 3022B\n\t0365  TDS 2004B\n\t036a  TDS 2024B\n069a  Askey Computer Corp.\n\t0001  VC010 Webcam [pwc]\n\t0303  Cable Modem\n\t0311  ADSL Router Remote NDIS Device\n\t0318  Remote NDIS Device\n\t0319  220V Remote NDIS Device\n\t0320  IEEE 802.11b Wireless LAN Card\n\t0321  Dynalink WLL013 / Compex WLU11A 802.11b Adapter\n\t0402  Scientific Atlanta WebSTAR 100 & 200 series Cable Modem\n\t0811  BT Virtual Bus for Helium\n\t0821  BT Voyager 1010 802.11b Adapter\n\t4402  Scientific Atlanta WebSTAR 2000 series Cable Modem\n\t4403  Scientific Atlanta WebSTAR 300 series Cable Modem\n\t4501  Scientific-Atlanta WebSTAR 2000 series Cable Modem\n069b  Thomson, Inc.\n\t0704  DCM245 Cable Modem\n\t0705  THG540K Cable Modem\n\t0709  Lyra PDP2424\n\t070c  MP3 Player\n\t070d  MP3 Player\n\t070e  MP3 Player\n\t070f  RCA Lyra RD1071 MP3 Player\n\t0731  Lyra M200E256\n\t0761  RCA H100A\n\t0778  PEARL USB Device\n\t2220  RCA Kazoo RD1000 MP3 Player\n\t300a  RCA Lyra MP3 Player\n\t3012  MP3 Player\n\t3013  MP3 Player\n\t5557  RCA CDS6300\n069d  Hughes Network Systems (HNS)\n\t0001  Satellite Receiver Device\n\t0002  Satellite Device\n069e  Welcat Inc.\n\t0005  Marx CryptoBox v1.2\n069f  Allied Data Technologies BV\n\t0010  Tornado Speakerphone FaxModem 56.0\n\t0011  Tornado Speakerphone FaxModem 56.0\n\t1000  ADT VvBus for CopperJet\n\t1004  CopperJet 821 RouterPlus\n06a2  Topro Technology, Inc.\n\t0033  USB Mouse\n06a3  Saitek PLC\n\t0006  Cyborg Gold Joystick\n\t0109  P880 Pad\n\t0160  ST290 Pro\n\t0200  Racing Wheel\n\t0201  Adrenalin Gamepad\n\t0241  Xbox Adrenalin Gamepad\n\t0255  X52 Flight Controller\n\t040b  P990 Dual Analog Pad\n\t040c  P2900 Wireless Pad\n\t0422  ST90 Joystick\n\t0460  ST290 Pro Flight Stick\n\t0463  ST290\n\t0464  Cyborg Evo\n\t0471  Cyborg Graphite Stick\n\t0501  R100 Sports Wheel\n\t0502  ST200 Stick\n\t0506  R220 Digital Wheel\n\t051e  Cyborg Digital II Stick\n\t052d  P750 Gamepad\n\t053c  X45 Flight Controller\n\t053f  X36F Flightstick\n\t056c  P2000 Tilt Pad\n\t056f  P2000 Tilt Pad\n\t05d2  PC Dash 2\n\t075c  X52 Flight Controller\n\t0762  Saitek X52 Pro Flight Control System\n\t0763  Pro Flight Rudder Pedals\n\t0764  Flight Pro Combat Rudder\n\t0805  R440 Force Wheel\n\t0b4e  Pro Flight Backlit Information Panel\n\t0bac  Pro Flight Yoke\n\t0c2d  Pro Flight Quadrant\n\t0d05  Pro Flight Radio Panel\n\t0d06  Flight Pro Multi Panel\n\t0d67  Pro Flight Switch Panel\n\t1003  GM2 Action Pad\n\t1009  Action Pad\n\t100a  SP550 Pad and Joystick Combo\n\t100b  SP550 Pad\n\t1509  P3000 Wireless Pad\n\t1589  P3000 Wireless Pad\n\t2541  X45 Flight Controller\n\t3509  P3000 RF GamePad\n\t353e  Cyborg Evo Wireless\n\t3589  P3000 Wireless Pad\n\t35be  Cyborg Evo\n\t5509  P3000 Wireless Pad\n\t712c  Pro Flight Yoke integrated hub\n\t8000  Gamers' Keyboard\n\t801e  Cyborg 3D Digital Stick II\n\t8020  Eclipse Keyboard\n\t8021  Eclipse II Keyboard\n\t802d  P750 Pad\n\t803f  X36 Flight Controller\n\t806f  P2000 Tilt Pad\n\t80c0  Pro Gamer Command Unit\n\t80c1  Cyborg Command Pad Unit\n\ta2ae  Pro Flight Instrument Panel\n\ta502  Gaming Mouse\n\tf518  P3200 Rumble Force Game Pad\n\tf51a  P3600\n\tff04  R440 Force Wheel\n\tff0c  Cyborg Force Rumble Pad\n\tff0d  P2600 Rumble Force Pad\n\tff12  Cyborg 3D Force Stick\n\tff17  ST 330 Rumble Force Stick\n\tff52  Cyborg 3D Rumble Force Joystick\n\tffb5  Cyborg Evo Force Joystick\n06a4  Xiamen Doowell Electron Co., Ltd\n06a5  Divio\n\t0000  Typhoon Webcam 100k [nw8000]\n\td001  ProLink DS3303u Webcam\n\td800  Chicony TwinkleCam\n\td820  Wize Media 1000\n06a7  MicroStore, Inc.\n06a8  Topaz Systems, Inc.\n\t0042  SignatureGem 1X5 Pad\n\t0043  SignatureGem 1X5-HID Pad\n06a9  Westell\n\t0005  WireSpeed Dual Connect Modem\n\t0006  WireSpeed Dual Connect Modem\n\t000a  WireSpeed Dual Connect Modem\n\t000b  WireSpeed Dual Connect Modem\n\t000e  A90-211WG-01 802.11g Adapter [Intersil ISL3887]\n06aa  Sysgration, Ltd\n06ac  Fujitsu Laboratories of America, Inc.\n06ad  Greatland Electronics Taiwan, Ltd\n06ae  Professional Multimedia Testing Centre\n06af  Harting, Inc. of North America\n06b8  Pixela Corp.\n06b9  Alcatel Telecom\n\t0120  SpeedTouch 120g 802.11g Wireless Adapter [Intersil ISL3886]\n\t0121  SpeedTouch 121g Wireless Dongle\n\t2001  SPEED TOUCH Card\n\t4061  SpeedTouch ISDN or ADSL Modem\n\t4062  SpeedTouch ISDN or ADSL router\n\ta5a5  DynaMiTe Modem\n06ba  Smooth Cord & Connector Co., Ltd\n06bb  EDA, Inc.\n06bc  Oki Data Corp.\n\t000b  Okipage 14ex Printer\n\t0027  Okipage 14e\n\t00f7  OKI B4600 Mono Printer\n\t015e  OKIPOS 411/412 POS Printer\n\t01c9  OKI B430 Mono Printer\n\t01db  MC860 Multifunction Printer\n\t01dc  MC860 Multifunction Printer\n\t01dd  MC860 Multifunction Printer\n\t01de  MC860 Multifunction Printer\n\t01df  CX2633 Multifunction Printer\n\t01e0  ES8460 Multifunction Printer\n\t020b  OKI ES4140 Mono Printer\n\t021f  ES8460 Multifunction Printer\n\t026f  MC351 Multifunction Printer\n\t0270  MC351 Multifunction Printer\n\t0271  MC351 Multifunction Printer\n\t0272  MC351 Multifunction Printer\n\t0273  MC351 Multifunction Printer\n\t0274  ES3451 Multifunction Printer\n\t0275  MC351 Multifunction Printer\n\t0276  MC351 Multifunction Printer\n\t0277  MC351 Multifunction Printer\n\t0278  MC351 Multifunction Printer\n\t0279  MC361 Multifunction Printer\n\t027a  MC361 Multifunction Printer\n\t027b  MC361 Multifunction Printer\n\t027c  MC361 Multifunction Printer\n\t027d  MC361 Multifunction Printer\n\t027e  ES3461 Multifunction Printer\n\t027f  MC361 Multifunction Printer\n\t0280  MC361 Multifunction Printer\n\t0281  MC361 Multifunction Printer\n\t0282  MC361 Multifunction Printer\n\t0283  MC561 Multifunction Printer\n\t0284  MC561 Multifunction Printer\n\t0285  MC561 Multifunction Printer\n\t0286  MC561 Multifunction Printer\n\t0287  CX2731 Multifunction Printer\n\t0288  ES5461 Multifunction Printer\n\t0289  ES5461 Multifunction Printer\n\t028a  MC561 Multifunction Printer\n\t028b  MC561 Multifunction Printer\n\t028c  MC561 Multifunction Printer\n\t02b4  MC861 Multifunction Printer\n\t02b5  ES8461 Multifunction Printer\n\t02b6  MC851 Multifunction Printer\n\t02b7  ES8451 Multifunction Printer\n\t02bb  OKI PT390 POS Printer\n\t02bd  MB461 Multifunction Printer\n\t02be  MB471 Multifunction Printer\n\t02bf  MB491 Multifunction Printer\n\t02ca  ES4161 Multifunction Printer\n\t02cb  ES4191 Multifunction Printer\n\t02d4  MPS4200mb Multifunction Printer\n\t02e7  MC352 Multifunction Printer\n\t02e8  MC362 Multifunction Printer\n\t02e9  MC562 Multifunction Printer\n\t02ea  ES3452 Multifunction Printer\n\t02eb  ES5462 Multifunction Printer\n\t02ee  MB451 Multifunction Printer\n\t02ef  MB441 Multifunction Printer\n\t02f7  MC862 Multifunction Printer\n\t02f8  MC852 Multifunction Printer\n\t02f9  ES8462 Multifunction Printer\n\t02fe  MB491+LP Multifunction Printer\n\t02ff  MB461+LP Multifunction Printer\n\t0300  MPS4700mb Multifunction Printer\n\t0323  MC332 Multifunction Printer\n\t0324  MC342 Multifunction Printer\n\t0325  MPS2731mc Multifunction Printer\n\t034d  MB472 Multifunction Printer\n\t034e  MB492 Multifunction Printer\n\t034f  MB562 Multifunction Printer\n\t0350  ES4192 Multifunction Printer\n\t0351  ES5162 Multifunction Printer\n\t035b  MC853 Multifunction Printer\n\t035c  MC863 Multifunction Printer\n\t035d  MC873 Multifunction Printer\n\t035e  MC883 Multifunction Printer\n\t035f  ES8453 Multifunction Printer\n\t0360  ES8463 Multifunction Printer\n\t0361  ES8473 Multifunction Printer\n\t0362  ES8483 Multifunction Printer\n\t0377  ES4172LP Multifunction Printer\n\t0378  ES5162LP Multifunction Printer\n\t0382  MC363 Multifunction Printer\n\t0383  MC563 Multifunction Printer\n\t0384  ES5463 Multifunction Printer\n\t0394  MC573 Multifunction Printer\n\t0395  ES5473 Multifunction Printer\n\t0a91  B2500MFP (printer+scanner)\n\t3801  B6100 Laser Printer\n06bd  AGFA-Gevaert NV\n\t0001  SnapScan 1212U\n\t0002  SnapScan 1236U\n\t0100  SnapScan Touch\n\t0101  SNAPSCAN ELITE\n\t0200  ScanMaker 8700\n\t02bf  DUOSCAN f40\n\t0400  CL30\n\t0401  Mass Storage\n\t0403  ePhoto CL18 Camera\n\t0404  ePhoto CL20 Camera\n\t2061  SnapScan 1212U (?)\n\t208d  Snapscan e40\n\t208f  SnapScan e50\n\t2091  SnapScan e20\n\t2093  SnapScan e10\n\t2095  SnapScan e25\n\t2097  SnapScan e26\n\t20fd  SnapScan e52\n\t20ff  SnapScan e42\n06be  AME Optimedia Technology Co., Ltd\n\t0800  Optimedia Camera\n\t1005  Dazzle DPVM! (1005)\n\td001  P35U Camera Capture\n06bf  Leoco Corp.\n06c2  Phidgets Inc. (formerly GLAB)\n\t0030  PhidgetRFID\n\t0031  RFID reader\n\t0038  4-Motor PhidgetServo v3.0\n\t0039  1-Motor PhidgetServo v3.0\n\t003a  8-Motor PhidgetAvancedServo\n\t0040  PhidgetInterface Kit 0-0-4\n\t0044  PhidgetInterface Kit 0-16-16\n\t0045  PhidgetInterface Kit 8-8-8\n\t0048  PhidgetStepper (Under Development)\n\t0049  PhidgetTextLED Ver 1.0\n\t004a  PhidgetLED Ver 1.0\n\t004b  PhidgetEncoder Ver 1.0\n\t0051  PhidgetInterface Kit 0-5-7 (Custom)\n\t0052  PhidgetTextLCD\n\t0053  PhidgetInterfaceKit 0-8-8\n\t0058  PhidgetMotorControl Ver 1.0\n\t0070  PhidgetTemperatureSensor Ver 1.0\n\t0071  PhidgetAccelerometer Ver 1.0\n\t0072  PhidgetWeightSensor Ver 1.0\n\t0073  PhidgetHumiditySensor\n\t0074  PhidgetPHSensor\n\t0075  PhidgetGyroscope\n06c4  Bizlink International Corp.\n06c5  Hagenuk, GmbH\n06c6  Infowave Software, Inc.\n06c8  SIIG, Inc.\n06c9  Taxan (Europe), Ltd\n\t0005  Monitor Control\n\t0007  Monitor Control\n\t0009  Monitor Control\n06ca  Newer Technology, Inc.\n\t2003  uSCSI\n06cb  Synaptics, Inc.\n\t0001  TouchPad\n\t0002  Integrated TouchPad\n\t0003  cPad\n\t0005  Touchpad/FPS\n\t0006  TouchScreen\n\t0007  USB Styk\n\t0008  WheelPad\n\t0009  Composite TouchPad and TrackPoint\n\t000e  HID Device\n\t0010  Wireless TouchPad\n\t0013  DisplayPad\n\t009a  Metallica MIS Touch Fingerprint Reader\n\t00a2  Metallica MOH Touch Fingerprint Reader\n\t00b7  Fingerprint reader [HP G6]\n\t00bd  Prometheus MIS Touch Fingerprint Reader\n\t00c7  TouchPad\n\t00cb  Fingerprint scanner\n\t00fc  Prometheus Fingerprint Reader\n\t0ac3  Large Touch Screen\n\t2970  touchpad\n06cc  Terayon Communication Systems\n\t0101  Cable Modem\n\t0102  Cable Modem\n\t0103  Cable Modem\n\t0104  Cable Modem\n\t0304  Cable Modem\n06cd  Keyspan\n\t0101  USA-28 PDA [no firmware]\n\t0102  USA-28X PDA [no firmware]\n\t0103  USA-19 PDA [no firmware]\n\t0104  PDA [prerenum]\n\t0105  USA-18X PDA [no firmware]\n\t0106  USA-19W PDA [no firmware]\n\t0107  USA-19 PDA\n\t0108  USA-19W PDA\n\t0109  USA-49W serial adapter [no firmware]\n\t010a  USA-49W serial adapter\n\t010b  USA-19Qi serial adapter [no firmware]\n\t010c  USA-19Qi serial adapter\n\t010d  USA-19Q serial Adapter (no firmware)\n\t010e  USA-19Q serial Adapter\n\t010f  USA-28 PDA\n\t0110  USA-28Xb PDA\n\t0111  USA-18 serial Adapter\n\t0112  USA-18X PDA\n\t0113  USA-28Xb PDA [no firmware]\n\t0114  USA-28Xa PDA [no firmware]\n\t0115  USA-28Xa PDA\n\t0116  USA-18XA serial Adapter (no firmware)\n\t0117  USA-18XA serial Adapter\n\t0118  USA-19QW PDA [no firmware]\n\t0119  USA-19QW PDA\n\t011a  USA-49Wlc serial adapter [no firmware]\n\t011b  MPR Serial Preloader (MPRQI)\n\t011c  MPR Serial (MPRQI)\n\t011d  MPR Serial Preloader (MPRQ)\n\t011e  MPR Serial (MPRQ)\n\t0121  USA-19hs serial adapter\n\t012a  USA-49Wlc serial adapter\n\t0201  UIA-10 Digital Media Remote [Cypress AN2131SC]\n\t0202  UIA-11 Digital Media Remote\n06ce  Contec\n\t8311  COM-1(USB)H\n06cf  SpheronVR AG\n\t1010  PanoCam 10\n\t1012  PanoCam 12/12X\n06d0  LapLink, Inc.\n\t0622  LapLink Gold USB-USB Bridge [net1080]\n06d1  Daewoo Electronics Co., Ltd\n06d3  Mitsubishi Electric Corp.\n\t0284  FX-USB-AW/-BD RS482 Converters\n\t0380  CP8000D Port\n\t0381  CP770D Port\n\t0385  CP900D Port\n\t0387  CP980D Port\n\t038b  CP3020D Port\n\t038c  CP900DW(ID) Port\n\t0393  CP9500D/DW Port\n\t0394  CP9000D/DW Port\n\t0395  CP9000DW\n\t0398  P93D\n\t039e  CP9500DW-S\n\t03a1  CP9550D/DW Port\n\t03a5  CP9550DW-S\n\t03a9  CP-9600DW\n\t03aa  CP3020DA\n\t03ab  CP30D/DW\n\t03ad  CP-9800D/DW\n\t03ae  CP-9800DW-S\n\t0f10  Hori/Namco FlightStick 2\n\t3b10  P95D\n\t3b20  CP9820DW Series\n\t3b21  CP-9810D/DW\n\t3b2f  LS9820A\n\t3b30  CP-D70DW / CP-D707DW\n\t3b31  CP-K60DW-S\n\t3b36  CP-D80DW\n\t3b50  CP-W5000DW\n\t3b60  CP-D90DW\n\t3b80  CP-M1\n06d4  Cisco Systems\n06d5  Toshiba\n\t4000  Japanese Keyboard\n06d6  Aashima Technology B.V.\n\t0025  Gamepad\n\t0026  Predator TH 400 Gamepad\n\t002d  Trust PowerC@m 350FT\n\t002e  Trust PowerC@m 350FS\n\t0030  Trust 710 LCD POWERC@M ZOOM - MSD\n\t0031  Trust 610/710 LCD POWERC@M ZOOM\n\t003a  Trust PowerC@m 770Z (mass storage mode)\n\t003b  Trust PowerC@m 770Z (webcam mode)\n\t003c  Trust 910z PowerC@m\n\t003f  Trust 735S POWERC@M ZOOM, WDM DSC Bulk Driver\n\t0050  Trust 738AV LCD PV Digital Camera\n\t0062  TRUST 782AV LCD P. V. Video Capture\n\t0066  TRUST Digital PCTV and Movie Editor\n\t0067  Trust 350FS POWERC@M FLASH\n\t006b  TRUST AUDIO VIDEO EDITOR\n06d7  Network Computing Devices (NCD)\n06d8  Technical Marketing Research, Inc.\n06da  Phoenixtec Power Co., Ltd\n\t0002  UPS\n\t0003  1300VA UPS\n06db  Paradyne\n06dc  Foxlink Image Technology Co., Ltd\n\t0012  Scan 1200c Scanner\n\t0014  Prolink Winscan Pro 2448U\n06de  Heisei Electronics Co., Ltd\n06e0  Multi-Tech Systems, Inc.\n\t0319  MT9234ZBA-USB MultiModem ZBA\n\tf101  MT5634ZBA-USB MultiModemUSB (old firmware)\n\tf103  MT5634MU MultiMobileUSB\n\tf104  MT5634ZBA-USB MultiModemUSB (new firmware)\n\tf107  MT5634ZBA-USB-V92 MultiModemUSB\n\tf120  MT9234ZBA-USB-CDC-ACM-XR MultiModem ZBA CDC-ACM-XR\n06e1  ADS Technologies, Inc.\n\t0008  UBS-10BT Ethernet [klsi]\n\t0009  UBS-10BT Ethernet\n\t0709  go7007 MPEG Capture Device [DVD Xpress DX2]\n\t0833  Mass Storage Device\n\ta155  FM Radio Receiver/Instant FM Music (RDX-155-EF)\n\ta160  Instant Video-To-Go RDX-160 (no firmware)\n\ta161  Instant Video-To-Go RDX-160\n\ta190  Instand VCD Capture\n\ta191  Instant VideoXpress\n\ta337  Mini DigitalTV\n\ta701  DVD Xpress\n\ta708  saa7114H video input card (Instant VideoMPX)\n\tb337  Mini DigitalTV\n\tb701  DVD Xpress B\n06e4  Alcatel Microelectronics\n06e6  Tiger Jet Network, Inc.\n\t0200  Internet Phone\n\t0201  Internet Phone\n\t0202  Composite Device\n\t0203  Internet Phone\n\t0210  Composite Device\n\t0211  Internet Phone\n\t0212  Internet Phone\n\t031c  Internet Phone\n\t031d  Internet Phone\n\t031e  Internet Phone\n\t3200  Composite Device\n\t3201  Internet Phone\n\t3202  Composite Device\n\t3203  Composite Device\n\t7200  Composite Device\n\t7210  Composite Device\n\t7250  Composite Device\n\t825c  Internet Phone\n\t831c  Internet Phone\n\t831d  Composite Device\n\t831e  Composite Device\n\tb200  Composite Device\n\tb201  Composite Device\n\tb202  Internet Phone\n\tb210  Internet Phone\n\tb211  Composite Device\n\tb212  Composite Device\n\tb250  Composite Device\n\tb251  Internet Phone\n\tb252  Internet Phone\n\tc200  Internet Phone\n\tc201  Internet Phone\n\tc202  Composite Device\n\tc203  Internet Phone\n\tc210  Personal PhoneGateway\n\tc211  Personal PhoneGateway\n\tc212  Personal PhoneGateway\n\tc213  PPG Device\n\tc25c  Composite Device\n\tc290  PPG Device\n\tc291  PPG Device\n\tc292  PPG Device\n\tc293  Personal PhoneGateway\n\tc31c  Composite Device\n\tc39c  Personal PhoneGateway\n\tc39d  PPG Device\n\tc39e  PPG Device\n\tc39f  PPG Device\n\tc700  Internet Phone\n\tc701  Internet Phone\n\tc702  Composite Device\n\tc703  Internet Phone\n\tc710  VoIP Combo Device\n\tc711  VoIP Combo\n\tc712  VoIP Combo Device\n\tc713  VoIP Combo Device\n\tcf00  Composite Device\n\tcf01  Internet Phone\n\tcf02  Internet Phone\n\tcf03  Composite Device\n\td210  Personal PhoneGateway\n\td211  PPG Device\n\td212  PPG Device\n\td213  Personal PhoneGateway\n\td700  Composite Device\n\td701  Composite Device\n\td702  Internet Phone\n\td703  Composite Device\n\td710  VoIP Combo\n\td711  VoIP Combo Device\n\td712  VoIP Combo\n\td713  VoIP Combo\n\tdf00  Composite Device\n\tdf01  Composite Device\n\tdf02  Internet Phone\n\tdf03  Internet Phone\n\tf200  Internet Phone\n\tf201  Internet Phone\n\tf202  Composite Device\n\tf203  Composite Device\n\tf210  Internet Phone\n\tf250  Composite Device\n\tf252  Internet Phone\n\tf310  Internet Phone\n\tf350  Composite Device\n06ea  Sirius Technologies\n\t0001  NetCom Roadster II 56k\n\t0002  Roadster II 56k\n06eb  PC Expert Tech. Co., Ltd\n06ef  I.A.C. Geometrische Ingenieurs B.V.\n06f0  T.N.C Industrial Co., Ltd\n\tde01  DualCam Video Camera\n\tde02  DualCam Still Camera\n06f1  Opcode Systems, Inc.\n\ta011  SonicPort\n\ta021  SonicPort Optical\n06f2  Emine Technology Co.\n\t0011  KVM Switch Keyboard\n06f6  Wintrend Technology Co., Ltd\n06f7  Wailly Technology Ltd\n\t0003  USB->Din 4 Adaptor\n06f8  Guillemot Corp.\n\t3002  Hercules Blog Webcam\n\t3004  Hercules Classic Silver\n\t3005  Hercules Dualpix Exchange\n\t3007  Hercules Dualpix Chat and Show\n\t3020  Hercules Webcam EC300\n\ta300  Dual Analog Leader GamePad\n\tb000  Hercules DJ Console\n\tb105  DJ Control MP3 e2 [Hercules DJ Control MP3 e2]\n\tb121  Hercules P32 DJ\n\tc000  Hercules Muse Pocket\n\td002  Hercules DJ Console\n\te000  HWGUSB2-54 WLAN\n\te010  HWGUSB2-54-LB\n\te020  HWGUSB2-54V2-AP\n\te031  Hercules HWNUm-300 Wireless N mini [Realtek RTL8191SU]\n\te032  HWGUm-54 [Hercules Wireless G Ultra Mini Key]\n\te033  Hercules HWNUp-150 802.11n Wireless N Pico [Realtek RTL8188CUS]\n06f9  ASYST electronic d.o.o.\n06fa  HSD S.r.L\n06fc  Motorola Semiconductor Products Sector\n06fd  Boston Acoustics\n\t0101  Audio Device\n\t0102  Audio Device\n\t0201  2-piece Audio Device\n06fe  Gallant Computer, Inc.\n0701  Supercomal Wire & Cable SDN. BHD.\n0703  Bvtech Industry, Inc.\n0705  NKK Corp.\n0706  Ariel Corp.\n0707  Standard Microsystems Corp.\n\t0100  2202 Ethernet [klsi]\n\t0200  2202 Ethernet [pegasus]\n\t0201  EZ Connect USB Ethernet\n\tee04  SMCWUSB32 802.11b Wireless LAN Card\n\tee06  SMC2862W-G v1 EZ Connect 802.11g Adapter [Intersil ISL3886]\n\tee13  SMC2862W-G v2 EZ Connect 802.11g Adapter [Intersil ISL3887]\n0708  Putercom Co., Ltd\n\t047e  USB-1284 BRIDGE\n0709  Silicon Systems, Ltd (SSL)\n070a  Oki Electric Industry Co., Ltd\n\t4002  Bluetooth Device\n\t4003  Bluetooth Device\n070d  Comoss Electronic Co., Ltd\n070e  Excel Cell Electronic Co., Ltd\n0710  Connect Tech, Inc.\n\t0001  WhiteHeat (fake ID)\n\t8001  WhiteHeat\n0711  Magic Control Technology Corp.\n\t0100  Hub\n\t0180  IRXpress Infrared Device\n\t0181  IRXpress Infrared Device\n\t0200  BAY-3U1S1P Serial Port\n\t0210  MCT1S Serial Port\n\t0230  MCT-232 Serial Port\n\t0231  PS/2 Mouse Port\n\t0232  Serial On Port\n\t0240  PS/2 to USB Converter\n\t0260  PS/2 Keyboard and Mouse\n\t0300  BAY-3U1S1P Parallel Port\n\t0302  Parallel Port\n\t0900  SVGA Adapter\n\t5001  Trigger UV-002BD[Startech USBVGAE]\n\t5100  Magic Control Technology Corp. (USB2VGA dongle)\n0713  Interval Research Corp.\n0714  NewMotion, Inc.\n\t0003  ADB converter\n0717  ZNK Corp.\n0718  Imation Corp.\n\t0002  SuperDisk 120MB\n\t0003  SuperDisk 120MB (Authenticated)\n\t0060  Flash Drive\n\t0061  Flash Drive\n\t0062  Flash Drive\n\t0063  Swivel Flash Drive\n\t0064  Flash Drive\n\t0065  Flash Drive\n\t0066  Flash Drive\n\t0067  Flash Drive\n\t0068  Flash Drive\n\t0084  Flash Drive Mini\n\t043c  Flash drive 16GB [Nano Pro]\n\t0582  Revo Flash Drive\n\t0622  TDK Trans-It 4GB\n\t0624  TDK Trans-It 16GB\n\t1120  RDX External dock (redbud)\n\t4006  8x Slim DVD Multi-Format Recorder External\n\td000  Disc Stakka CD/DVD Manager\n0719  Tremon Enterprises Co., Ltd\n071b  Domain Technologies, Inc.\n\t0002  DTI-56362-USB Digital Interface Unit\n\t0101  Audio4-USB DSP Data Acquisition Unit\n\t0184  Archos 2 8GB EM184RB\n\t0201  Audio4-5410 DSP Data Acquisition Unit\n\t0301  SB-USB JTAG Emulator\n\t3203  Rockchip Media Player\n\t32bb  Music Mediatouch\n071c  Xionics Document Technologies, Inc.\n071d  Eicon Networks Corp.\n\t1000  Diva 2.01 S/T [PSB2115F]\n\t1003  Diva ISDN 2.0\n\t1005  Diva ISDN 4.0 [HFC-S]\n\t2000  Teledat Surf\n071e  Ariston Technologies\n0720  Keyence Corp.\n\t8001  LJ-V7001\n0723  Centillium Communications Corp.\n\t0002  Palladia 300/400 Adsl Modem\n0726  Vanguard International Semiconductor-America\n0729  Amitm\n\t1000  USC-1000 Serial Port\n072e  Sunix Co., Ltd\n072f  Advanced Card Systems, Ltd\n\t0001  AC1030-based SmartCard Reader\n\t0008  ACR 80 Smart Card Reader\n\t0100  AET65\n\t0101  AET65\n\t0102  AET62\n\t0103  AET62\n\t0901  ACR1281U-C4 (BSI)\n\t1000  PLDT Drive\n\t1001  PLDT Drive\n\t2011  ACR88U\n\t2100  ACR128U\n\t2200  ACR122U\n\t220a  ACR1281U-C5 (BSI)\n\t220c  ACR1283 Bootloader\n\t220f  ACR1281U-C2 (qPBOC)\n\t2211  ACR1261 1S Dual Reader\n\t2214  ACR1222 1SAM PICC Reader\n\t2215  ACR1281 2S CL Reader\n\t221a  ACR1251U-A1\n\t221b  ACR1251U-C\n\t2224  ACR1281 1S Dual Reader\n\t222b  ACR1222U-C8\n\t222c  ACR1283L-D2\n\t222d  [OEM Reader]\n\t222e  ACR123U\n\t223f  ACR1255U-J1\n\t2242  ACR1251 1S Dual Reader\n\t8002  AET63 BioTRUSTKey\n\t8003  ACR120\n\t8103  ACR120\n\t8201  APG8201\n\t8900  ACR89U-A1\n\t8901  ACR89U-A2\n\t8902  ACR89U-A3\n\t9000  ACR38 AC1038-based Smart Card Reader\n\t9006  CryptoMate\n\t90cc  ACR38 SmartCard Reader\n\t90ce  [OEM Reader]\n\t90cf  ACR38 SAM Smart Card Reader\n\t90d0  PertoSmart EMV - Card Reader\n\t90d2  ACR83U\n\t90d8  ACR3801\n\t90db  CryptoMate64\n\tb000  ACR3901U\n\tb100  ACR39U\n\tb101  ACR39K\n\tb102  ACR39T\n\tb103  ACR39F\n\tb104  ACR39U-SAM\n\tb106  ACOS5T2\n\tb200  ACOS5T1\n\tb301  ACR32-A1\n0731  Susteen, Inc.\n\t0528  SonyEricsson DCU-11 Cable\n0732  Goldfull Electronics & Telecommunications Corp.\n0733  ViewQuest Technologies, Inc.\n\t0101  Digital Video Camera\n\t0110  VQ110 Video Camera\n\t0401  CS330 Webcam\n\t0402  M-318B Webcam\n\t0430  Intel Pro Share Webcam\n\t0630  VQ630 Dual Mode Digital Camera(Bulk)\n\t0631  Hercules Dualpix\n\t0780  Smart Cam Deluxe(composite)\n\t1310  Epsilon 1.3/Jenoptik JD C1.3/UMAX AstraPix 470 (mass storage mode)\n\t1311  Epsilon 1.3/Jenoptik JD C1.3/UMAX AstraPix 470 (PC Cam mode)\n\t1314  Mercury 2.1MEG Deluxe Classic Cam\n\t2211  Jenoptik jdc 21 LCD Camera\n\t2220  Mercury Digital Pro 3.1p VQ2220 (mass storage mode)\n\t2221  Mercury Digital Pro 3.1p VQ2220 (webcam mode)\n\t3261  Concord 3045 spca536a Camera\n\t3281  Cyberpix S550V\n0734  Lasat Communications A/S\n\t0001  560V Modem\n\t0002  Lasat 560V Modem\n\t043a  DVS Audio\n\t043b  3DeMon USB Capture\n0735  Asuscom Network\n\t2100  ISDN Adapter\n\t2101  ISDN Adapter\n\t6694  ISDNlink 128K\n\tc541  ISDN TA 280\n0736  Lorom Industrial Co., Ltd\n0738  Mad Catz, Inc.\n\t1302  F.L.Y. 5 Flight Stick\n\t2215  X-55 Rhino Stick\n\t2218  Saitek Side Panel Control Deck\n\t2237  V.1 Stick\n\t4506  Wireless Controller\n\t4507  XBox Device\n\t4516  Control Pad\n\t4520  Control Pad Pro\n\t4522  LumiCON\n\t4526  Control Pad Pro\n\t4530  Universal MC2 Racing Wheel and Pedals\n\t4536  MicroCON\n\t4540  Beat Pad\n\t4556  Lynx Wireless Controller\n\t4566  XBox Device\n\t4576  XBox Device\n\t4586  MicroCON Wireless Controller\n\t4588  Blaster\n\t45ff  Beat Pad\n\t4716  Wired Xbox 360 Controller\n\t4718  Street Fighter IV FightStick SE for Xbox 360\n\t4726  Xbox 360 Controller\n\t4728  Street Fighter IV FightPad for Xbox 360\n\t4730  MC2 Racing Wheel for Xbox 360\n\t4736  MicroCON for Xbox 360\n\t4738  Street Fighter IV Wired Controller for Xbox 360\n\t4740  Beat Pad for Xbox 360\n\t4743  Beat Pad Pro\n\t4758  Arcade Game Stick\n\t4a01  FightStick TE 2 for Xbox One\n\t6040  Beat Pad Pro\n\t8818  Street Fighter IV Arcade FightStick (PS3)\n\t9871  Portable Drum Kit\n\ta109  S.T.R.I.K.E.7 Keyboard\n\ta215  X-55 Rhino Throttle\n\tb726  Modern Warfare 2 Controller for Xbox 360\n\tb738  Marvel VS Capcom 2 TE FightStick for Xbox 360\n\tbeef  Joytech Neo SE Advanced Gamepad\n\tcb02  Saitek Cyborg Rumble Pad\n\tcb03  Saitek P3200 Rumble Pad\n\tcb29  Saitek Aviator Stick AV8R02\n\tf738  Super Street Fighter IV FightStick TE S for Xbox 360\n073a  Chaplet Systems, Inc.\n\t2230  infrared dongle for remote\n073b  Suncom Technologies\n073c  Industrial Electronic Engineers, Inc.\n\t0305  Pole Display (PC305-3415  2 x 20 Line Display)\n\t0322  Pole Display (PC322-3415  2 x 20 Line Display)\n\t0324  Pole Display (LB324-USB   4 x 20 Line Display)\n\t0330  Pole Display (P330-3415   2 x 20 Line Display)\n\t0424  Pole Display (SP324-4415  4 x 20 Line Display)\n\t0450  Pole Display (L450-USB   Graphic Line Display)\n\t0505  Pole Display (SPC505-3415 2 x 20 Line Display)\n\t0522  Pole Display (SPC522-3415 2 x 20 Line Display)\n\t0624  Pole Display (SP324-3415  4 x 20 Line Display)\n073d  Eutron S.p.a.\n\t0000  SmartKey\n\t0005  Crypto Token\n\t0007  CryptoIdentity CCID\n\t0025  SmartKey 3\n\t0c00  Pocket Reader\n\t0d00  StarSign Bio Token 3.0 EU\n073e  NEC, Inc.\n\t0301  Game Pad\n0742  Stollmann\n\t2008  ISDN TA [HFC-S]\n\t2009  ISDN TA [HFC-S]\n\t200a  ISDN TA [HFC-S]\n0745  Syntech Information Co., Ltd\n0746  Onkyo Corp.\n\t4700  Integra MZA-4.7\n\t5500  SE-U55 Audio Device\n0747  Labway Corp.\n0748  Strong Man Enterprise Co., Ltd\n0749  EVer Electronics Corp.\n074a  Ming Fortune Industry Co., Ltd\n074b  Polestar Tech. Corp.\n074c  C-C-C Group PLC\n074d  Micronas GmbH\n\t3553  Composite USB-Device\n\t3554  Composite USB-Device\n\t3556  Composite USB-Device\n074e  Digital Stream Corp.\n\t0001  PS/2 Adapter\n\t0002  PS/2 Adapter\n0755  Aureal Semiconductor\n0757  Network Technologies, Inc.\n\t0a00  SUN Adapter\n0758  Carl Zeiss Microscopy GmbH\n075b  Sophisticated Circuits, Inc.\n\t0001  Kick-off! Watchdog\n0763  M-Audio\n\t0115  O2 / KeyRig 25\n\t0117  Trigger Finger\n\t0119  MidAir\n\t0150  M-Audio Uno\n\t0160  M-Audio 1x1\n\t0192  M-Audio Keystation 88es\n\t0193  ProKeys 88\n\t0194  ProKeys 88sx\n\t0195  Oxygen 8 v2\n\t0196  Oxygen 49\n\t0197  Oxygen 61\n\t0198  Axiom 25\n\t0199  Axiom 49\n\t019a  Axiom 61\n\t019b  KeyRig 49\n\t019c  KeyStudio\n\t1001  MidiSport 2x2\n\t1002  MidiSport 2x2\n\t1003  MidiSport 2x2\n\t1010  MidiSport 1x1\n\t1011  MidiSport 1x1\n\t1014  M-Audio Keystation Loader\n\t1015  M-Audio Keystation\n\t1020  Midisport 4x4\n\t1021  MidiSport 4x4\n\t1030  M-Audio MIDISPORT 8x8\n\t1031  MidiSport 8x8/s Loader\n\t1033  MidiSport 8x8/s\n\t1040  M-Audio MidiSport 2x4 Loader\n\t1041  M-Audio MidiSport 2x4\n\t1110  MidiSport 1x1\n\t2001  M Audio Quattro\n\t2002  M Audio Duo\n\t2003  M Audio AudioPhile\n\t2004  M-Audio MobilePre\n\t2006  M-Audio Transit\n\t2007  M-Audio Sonica Theater\n\t2008  M-Audio Ozone\n\t200d  M-Audio OmniStudio\n\t200f  M-Audio MobilePre\n\t2010  M-Audio Fast Track\n\t2012  M-Audio Fast Track Pro\n\t2013  M-Audio JamLab\n\t2015  M-Audio RunTime DFU\n\t2016  M-Audio RunTime DFU\n\t2019  M-Audio Ozone Academic\n\t201a  M-Audio Micro\n\t201b  M-Audio RunTime DFU\n\t201d  M-Audio Producer\n\t2024  M-Audio Fast Track MKII\n\t202e  Axiom 61\n\t2080  M-Audio Fast Track Ultra\n\t2081  M-Audio RunTime DFU / Fast Track Ultra 8R\n\t2803  M-Audio Audiophile DFU\n\t2804  M-Audio MobilePre DFU\n\t2806  M-Audio Transit DFU\n\t2815  M-Audio DFU\n\t2816  M-Audio DFU\n\t281b  M-Audio DFU\n\t2880  M-Audio DFU\n\t2881  M-Audio DFU\n0764  Cyber Power System, Inc.\n\t0005  Cyber Power UPS\n\t0501  CP1500 AVR UPS\n\t0601  PR1500LCDRT2U UPS\n0765  X-Rite, Inc.\n\t5001  Huey PRO Colorimeter\n\t5010  X-Rite Pantone Color Sensor\n\t5020  i1 Display Pro\n\t6003  ColorMunki Smile\n\t6008  i1Studio\n\td094  X-Rite DTP94 [Quato Silver Haze Pro]\n0766  Jess-Link Products Co., Ltd\n\t0017  Packard Bell Carbon\n\t001b  Packard Bell Go\n\t0204  TopSpeed Cyberlink Remote Control\n0767  Tokheim Corp.\n0768  Camtel Technology Corp.\n\t0006  Camtel Technology USB TV Genie Pro FM Model TVB330\n\t0023  eHome Infrared Receiver\n0769  Surecom Technology Corp.\n\t11f2  EP-9001-g 802.11g 54M WLAN Adapter\n\t11f3  RT2570\n\t11f7  802.11g 54M WLAN Adapter\n\t31f3  RT2573\n076a  Smart Technology Enablers, Inc.\n076b  OmniKey AG\n\t0596  CardMan 2020\n\t1021  CardMan 1021\n\t1221  CardMan 1221\n\t1784  CardMan 6020\n\t3021  CardMan 3021 / 3121\n\t3022  CardMan 3121 (HID Technologies)\n\t3031  3x21 Smart Card Reader\n\t3610  CardMan 3620\n\t3621  CardMan 3621\n\t3821  CardMan 3821\n\t4321  CardMan 4321\n\t5022  CardMan 5022\n\t5121  CardMan 5121\n\t5125  CardMan 5125\n\t5321  CardMan 5321\n\t5340  CardMan 5021 CL\n\t6622  CardMan 6121\n\ta011  CCID Smart Card Reader Keyboard\n\ta021  CCID Smart Card Reader\n\ta022  CardMan Smart@Link\n\tc000  CardMan 3x21 CS\n\tc001  CardMan 5121 CS\n076c  Partner Tech\n\t0204  CD7220 Communications Port\n\t0302  RP-600\n076d  Denso Corp.\n076e  Kuan Tech Enterprise Co., Ltd\n076f  Jhen Vei Electronic Co., Ltd\n0770  Welch Allyn, Inc - Medical Division\n0771  Observator Instruments BV\n\t4455  OMC45III\n\tae0f  OMC45III\n0772  Your data Our Care\n0774  AmTRAN Technology Co., Ltd\n0775  Longshine Electronics Corp.\n0776  Inalways Corp.\n0777  Comda Enterprise Corp.\n0778  Volex, Inc.\n0779  ON Semiconductor (formerly Fairchild)\n\t0133  FUSB307B\n\t0134  FUSB308B\n077a  Sankyo Seiki Mfg. Co., Ltd\n077b  Linksys\n\t08be  BEFCMU10 v4 Cable Modem\n\t2219  WUSB11 V2.6 802.11b Adapter\n\t2226  USB200M 100baseTX Adapter\n\t2227  Network Everywhere NWU11B\n077c  Forward Electronics Co., Ltd\n\t0005  NEC Keyboard\n077d  Griffin Technology\n\t0223  IMic Audio In/Out\n\t0405  iMate, ADB Adapter\n\t0410  PowerMate\n\t041a  PowerWave\n\t04aa  SoundKnob\n\t07af  iMic\n\t1016  AirClick\n\t627a  Radio SHARK\n077e  Softing AG\n\t008a  NetLink Compact MPI/Profibus adapter\n\t0160  EDICblue\n\t0220  VAS5054A\n077f  Well Excellent & Most Corp.\n0780  Sagem Monetel GmbH\n\t1202  ORGA 900 Smart Card Terminal Virtual Com Port\n\t1302  ORGA 6000 Smart Card Terminal Virtual Com Port\n\t1303  ORGA 6000 Smart Card Terminal USB RNDIS\n\tdf55  ORGA 900/6000 Smart Card Terminal DFU\n0781  SanDisk Corp.\n\t0001  SDDR-05a ImageMate CompactFlash Reader\n\t0002  SDDR-31 ImageMate II CompactFlash Reader\n\t0005  SDDR-05b (CF II) ImageMate CompactFlash Reader\n\t0100  ImageMate SDDR-12\n\t0200  SDDR-09 (SSFDC) ImageMate SmartMedia Reader [eusb]\n\t0400  SecureMate SD/MMC Reader\n\t0621  SDDR-86 Imagemate 6-in-1 Reader\n\t0720  Sansa C200 series in recovery mode\n\t0729  Sansa E200 series in recovery mode\n\t0810  SDDR-75 ImageMate CF-SM Reader\n\t0830  ImageMate CF/MMC/SD Reader\n\t1234  Cruzer Mini Flash Drive\n\t5150  SDCZ2 Cruzer Mini Flash Drive (thin)\n\t5151  Cruzer Micro Flash Drive\n\t5153  Cruzer Flash Drive\n\t5204  Cruzer Crossfire\n\t5402  U3 Cruzer Micro\n\t5406  Cruzer Micro U3\n\t5408  Cruzer Titanium U3\n\t540e  Cruzer Contour Flash Drive\n\t5530  Cruzer\n\t5566  Cruzer Slice\n\t5567  Cruzer Blade\n\t556b  Cruzer Edge\n\t556c  Ultra\n\t556d  Memory Vault\n\t5571  Cruzer Fit\n\t5572  Cruzer Switch\n\t5575  Cruzer Glide\n\t5576  Cruzer Facet\n\t5577  Cruzer Pop (8GB)\n\t557d  Cruzer Force\n\t5580  SDCZ80 Flash Drive\n\t5581  Ultra\n\t5583  Ultra Fit\n\t5588  Extreme Pro\n\t5589  SD8SB8U512G[Extreme 500]\n\t558c  Extreme Portable SSD\n\t5590  Ultra Dual\n\t5591  Ultra Flair\n\t5e10  Encrypted\n\t6100  Ultra II SD Plus 2GB\n\t6500  uSSD 5000\n\t7100  Cruzer Mini\n\t7101  Pen Flash\n\t7102  Cruzer Mini\n\t7103  Cruzer Mini\n\t7104  Cruzer Micro Mini 256MB Flash Drive\n\t7105  Cruzer Mini\n\t7106  Cruzer Mini\n\t7112  Cruzer Micro 128MB Flash Drive\n\t7113  Cruzer Micro 256MB Flash Drive\n\t7114  Cruzer Mini\n\t7115  Cruzer Mini\n\t7301  Sansa e100 series (mtp)\n\t7302  Sansa e100 series (msc)\n\t7400  Sansa M200 series (mtp)\n\t7401  Sansa M200 series (msc)\n\t7420  Sansa E200 series (mtp)\n\t7421  Sansa E200 Series (msc)\n\t7422  Sansa E200 series v2 (mtp)\n\t7423  Sansa E200 series v2 (msc)\n\t7430  Sansa M200 series\n\t7431  Sansa M200 series V4 (msc)\n\t7432  Sansa Clip (mtp)\n\t7433  Sansa Clip (msc)\n\t7434  Sansa Clip V2 (mtp)\n\t7435  Sansa Clip V2 (msc)\n\t7450  Sansa C250\n\t7451  Sansa C240\n\t7460  Sansa Express\n\t7480  Sansa Connect\n\t7481  Sansa Connect (in recovery mode)\n\t74b0  Sansa View (msc)\n\t74b1  Sansa View (mtp)\n\t74c0  Sansa Fuze (mtp)\n\t74c1  Sansa Fuze (msc)\n\t74c2  Sansa Fuze V2 (mtp)\n\t74c3  Sansa Fuze V2 (msc)\n\t74d0  Sansa Clip+ (mtp)\n\t74d1  Sansa Clip+ (msc)\n\t74e5  Sansa Clip Zip\n\t8181  Pen Flash\n\t8183  Hi-Speed Mass Storage Device\n\t8185  SDCZ2 Cruzer Mini Flash Drive (older, thick)\n\t8888  Card Reader\n\t8889  SDDR-88 Imagemate 8-in-1 Reader\n\t8919  Card Reader\n\t8989  ImageMate 12-in-1 Reader\n\t9191  ImageMate CF\n\t9219  Card Reader\n\t9292  ImageMate CF Reader/Writer\n\t9393  ImageMate SD-MMC\n\t9595  ImageMate xD-SM\n\t9797  ImageMate MS-PRO\n\t9919  Card Reader\n\t9999  SDDR-99 5-in-1 Reader\n\ta7c1  Storage device (SD card reader)\n\ta7e8  SDDR-113 MicroMate SDHC Reader\n\tb2b3  SDDR-103 MobileMate SD+ Reader\n\tb2b5  SDDR-104 MobileMate SD+ Reader\n\tb4b5  SDDR-89 V4 ImageMate 12-in-1 Reader\n\tb6b7  SDDR-99 V4 ImageMate 5-in-1 Reader\n\tb6ba  CF SDDR-289\n\tc7cf  SDDR-299 [Extreme PRO CFast 2.0 Reader]\n\tcfc9  SDDR-489 ImageMate Pro Reader\n0782  Trackerball\n0783  C3PO\n\t0003  LTC31 SmartCard Reader\n\t0006  LTC31v2\n\t0009  KBR36\n\t0010  LTC32\n0784  Vivitar, Inc.\n\t0100  Vivicam 2655\n\t1310  Vivicam 3305\n\t1688  Vivicam 3665\n\t1689  Gateway DC-M42/Labtec DC-505/Vivitar Vivicam 3705\n\t2620  AOL Photocam Plus\n\t2888  Polaroid DC700\n\t3330  Nytec ND-3200 Camera\n\t4300  Traveler D1\n\t5260  Werlisa Sport PX 100 / JVC GC-A33 Camera\n\t5300  Pretec dc530\n0785  NTT-ME\n\t0001  MN128mini-V ISDN TA\n\t0003  MN128mini-J ISDN TA\n0789  Logitec Corp.\n\t0026  LHD Device\n\t0033  DVD Multi-plus unit LDR-H443SU2\n\t0063  LDR Device\n\t0064  LDR-R Device\n\t00b3  DVD Multi-plus unit LDR-H443U2\n\t00cc  LHD Device\n\t0105  LAN-TX/U1H2 10/100 Ethernet Adapter [pegasus II]\n\t010c  Realtek RTL8187 Wireless 802.11g 54Mbps Network Adapter\n\t0160  LAN-GTJ/U2A\n\t0162  LAN-WN22/U2 Wireless LAN Adapter\n\t0163  LAN-WN12/U2 Wireless LAN Adapter\n\t0164  LAN-W150/U2M Wireless LAN Adapter\n\t0166  LAN-W300N/U2 Wireless LAN Adapter\n\t0168  LAN-W150N/U2 Wireless LAN Adapter\n\t0170  LAN-W300AN/U2 Wireless LAN Adapter\n\t0296  LGB-4BNHUC HDD Bay\n\t0578  JMS583 Gen 2 - PCIe Gen3x2 Bridge\n078b  Happ Controls, Inc.\n\t0010  Driving UGCI\n\t0020  Flying UGCI\n\t0030  Fighting UGCI\n078c  GTCO/CalComp\n\t0090  Tablet Adapter\n\t0100  Tablet Adapter\n\t0200  Tablet Adapter\n\t0300  Tablet Adapter\n\t0400  Digitizer (Whiteboard)\n078e  Brincom, Inc.\n0790  Pro-Image Manufacturing Co., Ltd\n0791  Copartner Wire and Cable Mfg. Corp.\n0792  Axis Communications AB\n0793  Wha Yu Industrial Co., Ltd\n0794  ABL Electronics Corp.\n0795  RealChip, Inc.\n0796  Certicom Corp.\n0797  Grandtech Semiconductor Corp.\n\t6801  Flatbed Scanner\n\t6802  InkJet Color Printer\n\t8001  SmartCam\n\t801a  Typhoon StyloCam\n\t801c  Meade Binoculars/Camera\n\t8901  ScanHex SX-35a\n\t8909  ScanHex SX-35b\n\t8911  ScanHex SX-35c\n0798  Optelec\n\t0001  Braille Voyager\n\t0640  BC640\n\t0680  BC680\n0799  Altera\n\t7651  Programming Unit\n079b  Sagem\n\t0024  MSO300/MSO301 Fingerprint Sensor\n\t0026  MSO350/MSO351 Fingerprint Sensor & SmartCard Reader\n\t0027  USB-Serial Controller\n\t002f  Mobile\n\t0030  Mobile Communication Device\n\t0042  Mobile\n\t0047  CBM/MSO1300 Fingerprint Sensor\n\t004a  XG-760A 802.11bg\n\t004b  Wi-Fi 11g adapter\n\t0052  MSO1350 Fingerprint Sensor & SmartCard Reader\n\t0056  Agfa AP1100 Photo Printer\n\t005d  Mobile Mass Storage\n\t005f  Laser Pro LL [MFPrinter]\n\t0062  XG-76NA / XG-760N 802.11b/g Wireless adapter\n\t0078  Laser Pro Monochrome MFP\n079d  Alfadata Computer Corp.\n\t0201  GamePort Adapter\n07a1  Digicom S.p.A.\n\td952  Palladio USB V.92 Modem\n07a2  National Technical Systems\n07a3  Onnto Corp.\n07a4  Be, Inc.\n07a6  ADMtek, Inc.\n\t07c2  AN986A Ethernet\n\t0986  AN986 Pegasus Ethernet\n\t8266  Infineon WildCard-USB Wireless LAN Adapter\n\t8511  ADM8511 Pegasus II Ethernet\n\t8513  ADM8513 Pegasus II Ethernet\n\t8515  ADM8515 Pegasus II Ethernet\n07aa  Corega K.K.\n\t0001  Ether USB-T Ethernet [klsi]\n\t0004  FEther USB-TX Ethernet [pegasus]\n\t000c  WirelessLAN USB-11\n\t000d  FEther USB-TXS\n\t0011  Wireless LAN USB-11 mini\n\t0012  Stick-11 802.11b Adapter\n\t0017  FEther USB2-TX\n\t0018  Wireless LAN USB-11 mini 2\n\t001a  ULUSB-11 Key\n\t001c  CG-WLUSB2GT 802.11g Wireless Adapter [Intersil ISL3880]\n\t0020  CG-WLUSB2GTST 802.11g Wireless Adapter [Intersil ISL3887]\n\t002e  CG-WLUSB2GPX [Ralink RT2571W]\n\t002f  CG-WLUSB2GNL\n\t0031  CG-WLUSB2GS 802.11bg [Atheros AR5523]\n\t003c  CG-WLUSB2GNL\n\t003f  CG-WLUSB300AGN\n\t0041  CG-WLUSB300GNS\n\t0042  CG-WLUSB300GNM\n\t0043  CG-WLUSB300N rev A2 [Realtek RTL8192U]\n\t0047  CG-WLUSBNM\n\t0051  CG-WLUSB300NM\n\t7613  Stick-11 V2 802.11b Adapter\n\t9601  FEther USB-TXC\n07ab  Freecom Technologies\n\tfc01  IDE bridge\n\tfc02  Cable II USB-2\n\tfc03  USB2-IDE IDE bridge\n\tfc77  Quattro 3.0\n\tfcd6  Freecom HD Classic\n\tfcf6  DataBar\n\tfcf8  Freecom Classic SL Network Drive\n\tfcfe  Hard Drive 80GB\n07af  Microtech\n\t0004  SCSI-DB25 SCSI Bridge [shuttle]\n\t0005  SCSI-HD50 SCSI Bridge [shuttle]\n\t0006  CameraMate SmartMedia and CompactFlash Card Reader [eusb/shuttle]\n\tfc01  Freecom USB-IDE\n07b0  Trust Technologies\n\t0001  ISDN TA\n\t0002  ISDN TA128 Plus\n\t0003  ISDN TA128 Deluxe\n\t0005  ISDN TA128 SE\n\t0006  ISDN TA 128 [HFC-S]\n\t0007  ISDN TA [HFC-S]\n\t0008  ISDN TA\n07b1  IMP, Inc.\n07b2  Motorola BCS, Inc.\n\t0100  SURFboard Voice over IP Cable Modem\n\t0900  SURFboard Gateway\n\t0950  SURFboard SBG950 Gateway\n\t1000  SURFboard SBG1000 Gateway\n\t4100  SurfBoard SB4100 Cable Modem\n\t4200  SurfBoard SB4200 Cable Modem\n\t4210  SurfBoard 4210 Cable Modem\n\t4220  SURFboard SB4220 Cable Modem\n\t4500  CG4500 Communications Gateway\n\t450b  CG4501 Communications Gateway\n\t450e  CG4500E Communications Gateway\n\t5100  SurfBoard SB5100 Cable Modem\n\t5101  SurfBoard SB5101 Cable Modem\n\t5120  SurfBoard SB5120 Cable Modem (RNDIS)\n\t5121  Surfboard 5121 Cable Modem\n\t6002  MTR7000 Cable Tuning Adapter\n\t7030  WU830G 802.11bg Wireless Adapter [Envara WiND512]\n07b3  Plustek, Inc.\n\t0001  OpticPro 1212U Scanner\n\t0003  Scanner\n\t0010  OpticPro U12 Scanner\n\t0011  OpticPro U24 Scanner\n\t0013  OpticPro UT12 Scanner\n\t0014  Scanner\n\t0015  OpticPro U24 Scanner\n\t0017  OpticPro UT12/16/24 Scanner\n\t0204  Scanner\n\t0400  OpticPro 1248U Scanner\n\t0401  OpticPro 1248U Scanner #2\n\t0403  OpticPro U16B Scanner\n\t0404  Scanner\n\t0405  A8 Namecard-s Controller\n\t0406  A8 Namecard-D Controller\n\t0410  Scanner\n\t0412  Scanner\n\t0413  OpticSlim 1200 Scanner\n\t0601  OpticPro ST24 Scanner\n\t0800  OpticPro ST48 Scanner\n\t0807  OpticFilm 7200 scanner\n\t0900  OpticBook 3600 Scanner\n\t090c  OpticBook 3600 Plus Scanner\n\t0a06  TVcam VD100\n\t0b00  SmartPhoto F50\n\t0c00  OpticPro ST64 Scanner\n\t0c03  OpticPro ST64+ Scanner\n\t0c04  Optic Film 7200i scanner\n\t0c07  OpticFilm 7200 scanner\n\t0c0c  PL806 Scanner\n\t0c26  OpticBook 4600 Scanner\n\t0c2b  Mobile Office D428 Scanner\n\t0e08  OpticBook A300 Scanner\n\t1300  OpticBook 3800 Scanner\n\t1301  OpticBook 4800 Scanner\n\t130f  Bookreader v200\n07b4  Olympus Optical Co., Ltd\n\t0100  Camedia C-2100/C-3000 Ultra Zoom Camera\n\t0102  Camedia E-10/C-220/C-50 Camera\n\t0104  Camedia Digital Color Printer P-400\n\t0105  Camedia C-310Z/C-700/C-750UZ/C-755/C-765UZ/C-3040/C-4000/C-5050Z/D-560/C-3020Z Zoom Camera\n\t0109  C-370Z/C-500Z/D-535Z/X-450\n\t010a  MAUSB-10 xD and SmartMedia Card Reader\n\t0112  MAUSB-100 xD Card Reader\n\t0113  Mju 500 / Stylus Digital Camera (PTP)\n\t0114  C-350Z Camera\n\t0118  Mju Mini Digital/Mju Digital 500 Camera / Stylus 850 SW\n\t0125  Tough TG-1 Camera\n\t0126  VR340/D750 Digital Camera\n\t0184  P-S100 port\n\t0202  Foot Switch RS-26\n\t0203  Digital Voice Recorder DW-90\n\t0206  Digital Voice Recorder DS-330\n\t0207  Digital Voice Recorder & Camera W-10\n\t0209  Digital Voice Recorder DM-20\n\t020b  Digital Voice Recorder DS-4000\n\t020d  Digital Voice Recorder VN-240PC\n\t0211  Digital Voice Recorder DS-2300\n\t0218  Foot Switch RS-28\n\t0244  Digital Voice Recorder VN-8500PC\n\t024f  Digital Voice Recorder DS-7000\n\t0280  m:robe 100\n\t0295  Digital Voice Recorder VN-541PC\n07b5  Mega World International, Ltd\n\t0017  Joystick\n\t0213  Thrustmaster Firestorm Digital 3 Gamepad\n\t0312  Gamepad\n\t9902  GamePad\n07b6  Marubun Corp.\n07b7  TIME Interconnect, Ltd\n07b8  AboCom Systems Inc\n\t110c  XX1\n\t1201  IEEE 802.11b Adapter\n\t200c  XX2\n\t2573  Wireless LAN Card\n\t2770  802.11n/b/g Mini Wireless LAN USB2.0 Adapter\n\t2870  802.11n/b/g Wireless LAN USB2.0 Adapter\n\t3070  802.11n/b/g Mini Wireless LAN USB2.0 Adapter\n\t3071  802.11n/b/g Mini Wireless LAN USB2.0 Adapter\n\t3072  802.11n/b/g Mini Wireless LAN USB2.0 Adapter\n\t4000  DU-E10 Ethernet [klsi]\n\t4002  DU-E100 Ethernet [pegasus]\n\t4003  1/10/100 Ethernet Adapter\n\t4004  XX4\n\t4007  XX5\n\t400b  XX6\n\t400c  XX7\n\t401a  RTL8151\n\t4102  USB 1.1 10/100M Fast Ethernet Adapter\n\t4104  XX9\n\t420a  UF200 Ethernet\n\t5301  GW-US54ZGL 802.11bg\n\t6001  WUG2690 802.11bg Wireless Module [ZyDAS ZD1211+AL2230]\n\t8188  AboCom Systems Inc [WN2001 Prolink Wireless-N Nano Adapter]\n\ta001  WUG2200 802.11g Wireless Adapter [Envara WiND512]\n\tabc1  DU-E10 Ethernet [pegasus]\n\tb000  BWU613\n\tb02a  AboCom Bluetooth Device\n\tb02b  Bluetooth dongle\n\tb02c  BCM92045DG-Flash with trace filter\n\tb02d  BCM92045DG-Flash with trace filter\n\tb02e  BCM92045DG-Flash with trace filter\n\tb030  BCM92045DG-Flash with trace filter\n\tb031  BCM92045DG-Flash with trace filter\n\tb032  BCM92045DG-Flash with trace filter\n\tb033  BCM92045DG-Flash with trace filter\n\tb21a  WUG2400 802.11g Wireless Adapter [Texas Instruments TNETW1450]\n\tb21b  HWU54DM\n\tb21c  RT2573\n\tb21d  RT2573\n\tb21e  RT2573\n\tb21f  WUG2700\n\td011  MP3 Player\n\te001  Mass Storage Device\n\te002  Mass Storage Device\n\te003  Mass Storage Device\n\te004  Mass Storage Device\n\te005  Mass Storage Device\n\te006  Mass Storage Device\n\te007  Mass Storage Device\n\te008  Mass Storage Device\n\te009  Mass Storage Device\n\te00a  Mass Storage Device\n\te4f0  Card Reader Driver\n\tf101  DSB-560 Modem [atlas]\n07bc  Canon Computer Systems, Inc.\n07bd  Webgear, Inc.\n07be  Veridicom\n\t1935  Elektron Music Machines\n07c0  Code Mercenaries Hard- und Software GmbH\n\t1113  JoyWarrior24F8\n\t1116  JoyWarrior24F14\n\t1121  The Claw\n\t1500  IO-Warrior 40\n\t1501  IO-Warrior 24\n\t1502  IO-Warrior 48\n\t1503  IO-Warrior 28\n\t1511  IO-Warrior 24 Power Vampire\n\t1512  IO-Warrior 24 Power Vampire\n07c1  Keisokugiken\n\t0068  HKS-0200 USBDAQ\n07c4  Datafab Systems, Inc.\n\t0102  USB to LS120\n\t0103  USB to IDE\n\t1234  USB to ATAPI\n\ta000  CompactFlash Card Reader\n\ta001  CompactFlash & SmartMedia Card Reader [eusb]\n\ta002  Disk Drive\n\ta003  Datafab-based Reader\n\ta004  USB to MMC Class Drive\n\ta005  CompactFlash & SmartMedia Card Reader\n\ta006  SmartMedia Card Reader\n\ta007  Memory Stick Class Drive\n\ta103  MDSM-B reader\n\ta107  USB to Memory Stick (LC1) Drive\n\ta109  LC1 CompactFlash & SmartMedia Card Reader\n\ta10b  USB to CF+MS(LC1)\n\ta200  DF-UT-06 Hama MMC/SD Reader\n\ta400  CompactFlash & Microdrive Reader\n\ta600  Card Reader\n\ta604  12-in-1 Card Reader\n\tad01  Mass Storage Device\n\tae01  Mass Storage Device\n\taf01  Mass Storage Device\n\tb000  USB to CF(LC1)\n\tb001  USB to CF+PCMCIA\n\tb004  MMC/SD Reader\n\tb006  USB to PCMCIA\n\tb00a  USB to CF+SD Drive(LC1)\n\tb00b  USB to Memory Stick(LC1)\n\tc010  Kingston FCR-HS2/ATA Card Reader\n07c5  APG Cash Drawer\n\t0500  Cash Drawer\n07c6  ShareWave, Inc.\n\t0002  Bodega Wireless Access Point\n\t0003  Bodega Wireless Network Adapter\n07c7  Powertech Industrial Co., Ltd\n07c8  B.U.G., Inc.\n\t0202  MN128-SOHO PAL\n07c9  Allied Telesyn International\n\tb100  AT-USB100\n07ca  AVerMedia Technologies, Inc.\n\t0002  AVerTV PVR USB/EZMaker Pro Device\n\t0026  AVerTV\n\t0337  A867 DVB-T dongle\n\t0837  H837 Hybrid ATSC/QAM\n\t1228  MPEG-2 Capture Device (M038)\n\t1830  AVerTV Volar Video Capture (H830)\n\t1871  TD310 DVB-T/T2/C dongle\n\t2553  Live Gamer Ultra 2.1\n\t3835  AVerTV Volar Green HD (A835B)\n\t850a  AverTV Volar Black HD (A850)\n\t850b  AverTV Red HD+ (A850T)\n\ta309  AVerTV DVB-T (A309)\n\ta801  AVerTV DVB-T (A800)\n\ta815  AVerTV DVB-T Volar X (A815)\n\ta827  AVerTV Hybrid Volar HX (A827)\n\ta867  AVerTV DVB-T (A867)\n\tb300  A300 DVB-T TV receiver\n\tb800  MR800 FM Radio\n\tc039  DVD EZMaker 7\n\td553  Live Gamer Ultra Pro-RGB\n\te880  MPEG-2 Capture Device (E880)\n\te882  MPEG-2 Capture Device (E882)\n07cb  Kingmax Technology, Inc.\n07cc  Carry Computer Eng., Co., Ltd\n\t0000  CF Card Reader\n\t0001  Reader (UICSE)\n\t0002  Reader (UIS)\n\t0003  SM Card Reader\n\t0004  SM/CF/PCMCIA Card Reader\n\t0005  Reader (UISA2SE)\n\t0006  SM/CF/PCMCIA Card Reader\n\t0007  Reader (UISA6SE)\n\t000c  SM/CF Card Reader\n\t000d  SM/CF Card Reader\n\t000e  Reader (UISDA)\n\t000f  Reader (UICLIK)\n\t0010  Reader (UISMA)\n\t0012  Reader (UISC6SE-FLASH)\n\t0014  Litronic Fortezza Reader\n\t0030  Mass Storage (UISDMC12S)\n\t0040  Mass Storage (UISDMC13S)\n\t0100  Reader (UID)\n\t0101  Reader (UIM)\n\t0102  Reader (UISDMA)\n\t0103  Reader (UISDMC)\n\t0104  Reader (UISDM)\n\t0200  6-in-1 Card Reader\n\t0201  Mass Storage (UISDMC1S & UISDMC3S)\n\t0202  Mass Storage (UISDMC5S)\n\t0203  Mass Storage (UISMC5S)\n\t0204  Mass Storage (UIM4/5S & UIM7S)\n\t0205  Mass Storage (UIS4/5S & UIS7S)\n\t0206  Mass Storage (UISDMC10S & UISDMC11S)\n\t0207  Mass Storage (UPIDMA)\n\t0208  Mass Storage (UCFC II)\n\t0210  Mass Storage (UPIXXA)\n\t0213  Mass Storage (UPIDA)\n\t0214  Mass Storage (UPIMA)\n\t0215  Mass Storage (UPISA)\n\t0217  Mass Storage (UPISDMA)\n\t0223  Mass Storage (UCIDA)\n\t0224  Mass Storage (UCIMA)\n\t0225  Mass Storage (UIS7S)\n\t0227  Mass Storage (UCIDMA)\n\t0234  Mass Storage (UIM7S)\n\t0235  Mass Storage (UIS4S-S)\n\t0237  Velper (UISDMC4S)\n\t0300  6-in-1 Card Reader\n\t0301  6-in-1 Card Reader\n\t0303  Mass Storage (UID10W)\n\t0304  Mass Storage (UIM10W)\n\t0305  Mass Storage (UIS10W)\n\t0308  Mass Storage (UIC10W)\n\t0309  Mass Storage (UISC3W)\n\t0310  Mass Storage (UISDMA2W)\n\t0311  Mass Storage (UISDMC14W)\n\t0320  Mass Storage (UISDMC4W)\n\t0321  Mass Storage (UISDMC37W)\n\t0330  WINTERREADER Reader\n\t0350  9-in-1 Card Reader\n\t0500  Mass Storage\n\t0501  Mass Storage\n07cd  Elektor\n\t0001  USBuart Serial Port\n07ce  Nidec Copal\n\tc007  DPB-4000\n\tc009  DPB-6000\n\tc010  CPB-7000\n\tc011  ASK-2500\n07cf  Casio Computer Co., Ltd\n\t1001  QV-8000SX/5700/3000EX Digicam; Exilim EX-M20\n\t1003  Exilim EX-S500\n\t1004  Exilim EX-Z120\n\t1011  USB-CASIO PC CAMERA\n\t1116  EXILIM EX-Z19\n\t1125  Exilim EX-H10 Digital Camera (mass storage mode)\n\t1133  Exilim EX-Z350 Digital Camera (mass storage mode)\n\t1225  Exilim EX-H10 Digital Camera (PictBridge mode)\n\t1233  Exilim EX-Z350 Digital Camera (PictBridge mode)\n\t2002  E-125 Cassiopeia Pocket PC\n\t3801  WMP-1 MP3-Watch\n\t4001  Label Printer KL-P1000\n\t4007  CW50 Device\n\t4104  Cw75 Device\n\t4107  CW-L300 Device\n\t4500  LV-20 Digital Camera\n\t6101  fx-9750gII\n\t6102  fx-CP400\n\t6801  PL-40R\n\t6802  MIDI Keyboard\n\t6803  CTK-3500 (MIDI keyboard)\n07d0  Dazzle\n\t0001  Digital Video Creator I\n\t0002  Global Village VideoFX Grabber\n\t0003  Fusion Model DVC-50 Rev 1 (NTSC)\n\t0004  DVC-800 (PAL) Grabber\n\t0005  Fusion Video and Audio Ports\n\t0006  DVC 150 Loader Device\n\t0007  DVC 150\n\t0327  Fusion Digital Media Reader\n\t1001  DM-FLEX DFU Adapter\n\t1002  DMHS2 DFU Adapter\n\t1102  CF Reader/Writer\n\t1103  SD Reader/Writer\n\t1104  SM Reader/Writer\n\t1105  MS Reader/Writer\n\t1106  xD/SM Reader/Writer\n\t1202  MultiSlot Reader/Writer\n\t2000  FX2 DFU Adapter\n\t2001  eUSB CompactFlash Reader\n\t4100  Kingsun SF-620 Infrared Adapter\n\t4101  Connectivity Cable (CA-42 clone)\n\t4959  Kingsun KS-959 Infrared Adapter\n07d1  D-Link System\n\t13ec  VvBus for Helium 2xx\n\t13ed  VvBus for Helium 2xx\n\t13f1  DSL-302G Modem\n\t13f2  DSL-502G Router\n\t3300  DWA-130 802.11n Wireless N Adapter(rev.E) [Realtek RTL8191SU]\n\t3302  DWA-130 802.11n Wireless N Adapter(rev.C2) [Realtek RTL8191SU]\n\t3303  DWA-131 802.11n Wireless N Nano Adapter(rev.A1) [Realtek RTL8192SU]\n\t3304  FR-300USB 802.11bgn Wireless Adapter\n\t3a07  WUA-2340 RangeBooster G Adapter(rev.A) [Atheros AR5523]\n\t3a08  WUA-2340 RangeBooster G Adapter(rev.A) (no firmware) [Atheros AR5523]\n\t3a09  DWA-160 802.11abgn Xtreme N Dual Band Adapter(rev.A2) [Atheros AR9170+AR9104]\n\t3a0d  DWA-120 802.11g Wireless 108G Adapter [Atheros AR5523]\n\t3a0f  DWA-130 802.11n Wireless N Adapter(rev.D) [Atheros AR9170+AR9102]\n\t3a10  DWA-126 802.11n Wireless Adapter [Atheros AR9271]\n\t3b01  AirPlus G DWL-G122 Wireless Adapter(rev.D) [Marvell 88W8338+88W8010]\n\t3b10  DWA-142 RangeBooster N Adapter [Marvell 88W8362+88W8060]\n\t3b11  DWA-130 802.11n Wireless N Adapter(rev.A1) [Marvell 88W8362+88W8060]\n\t3c03  AirPlus G DWL-G122 Wireless Adapter(rev.C1) [Ralink RT2571W]\n\t3c04  WUA-1340\n\t3c05  EH103 Wireless G Adapter\n\t3c06  DWA-111 802.11bg Wireless Adapter [Ralink RT2571W]\n\t3c07  DWA-110 Wireless G Adapter(rev.A1) [Ralink RT2571W]\n\t3c09  DWA-140 RangeBooster N Adapter(rev.B1) [Ralink RT2870]\n\t3c0a  DWA-140 RangeBooster N Adapter(rev.B2) [Ralink RT3072]\n\t3c0b  DWA-110 Wireless G Adapter(rev.B) [Ralink RT2870]\n\t3c0d  DWA-125 Wireless N 150 Adapter(rev.A1) [Ralink RT3070]\n\t3c0e  WUA-2340 RangeBooster G Adapter(rev.B) [Ralink RT2070]\n\t3c0f  AirPlus G DWL-G122 Wireless Adapter(rev.E1) [Ralink RT2070]\n\t3c10  DWA-160 802.11abgn Xtreme N Dual Band Adapter(rev.A1) [Atheros AR9170+AR9104]\n\t3c11  DWA-160 Xtreme N Dual Band USB Adapter(rev.B) [Ralink RT2870]\n\t3c13  DWA-130 802.11n Wireless N Adapter(rev.B) [Ralink RT2870]\n\t3c15  DWA-140 RangeBooster N Adapter(rev.B3) [Ralink RT2870]\n\t3c16  DWA-125 Wireless N 150 Adapter(rev.A2) [Ralink RT3070]\n\t3e02  DWM-156 3.75G HSUPA Adapter\n\t5100  Remote NDIS Device\n\ta800  DWM-152 3.75G HSUPA Adapter\n\tf101  DBT-122 Bluetooth\n\tfc01  DBT-120 Bluetooth Adapter\n07d2  Aptio Products, Inc.\n07d3  Cyberdata Corp.\n07d5  Radiant Systems\n07d7  GCC Technologies, Inc.\n07da  Arasan Chip Systems\n07de  Diamond Multimedia\n\t2820  VC500 Video Capture Dongle\n07df  David Electronics Co., Ltd\n07e0  NCP engineering GmbH\n\t4742  VPN GovNet Box\n07e1  Ambient Technologies, Inc.\n\t5201  V.90 Modem\n07e2  Elmeg GmbH & Co., Ltd\n07e3  Planex Communications, Inc.\n07e4  Movado Enterprise Co., Ltd\n\t0967  SCard R/W CSR-145\n\t0968  SCard R/W CSR-145\n07e5  QPS, Inc.\n\t05c2  IDE-to-USB2.0 PCA\n\t5c01  Que! CDRW\n07e6  Allied Cable Corp.\n07e7  Mirvo Toys, Inc.\n07e8  Labsystems\n07ea  Iwatsu Electric Co., Ltd\n07eb  Double-H Technology Co., Ltd\n07ec  Taiyo Electric Wire & Cable Co., Ltd\n07ee  Torex Retail (formerly Logware)\n\t0002  Cash Drawer I/F\n07ef  STSN\n\t0001  Internet Access Device\n07f2  Microcomputer Applications, Inc.\n\t0001  KEYLOK II\n\t0003  KEYLOK3\n07f6  Circuit Assembly Corp.\n07f7  Century Corp.\n\t0005  ScanLogic/Century Corporation uATA\n\t011e  Century USB Disk Enclosure\n07f9  Dotop Technology, Inc.\n07fa  DrayTek Corp.\n\t0778  miniVigor 128 ISDN TA\n\t0846  ISDN TA [HFC-S]\n\t0847  ISDN TA [HFC-S]\n\t1012  BeWAN ADSL USB ST (grey)\n\t1196  BWIFI-USB54AR 802.11bg\n\ta904  BeWAN ADSL\n\ta905  BeWAN ADSL ST\n07fc  Thomann\n\t1113  SWISSONIC EasyKeys61 Midikeyboard\n07fd  Mark of the Unicorn\n\t0000  FastLane MIDI Interface\n\t0001  MIDI Interface\n\t0002  MOTU Audio for 64 bit\n\t0004  Microbook I/II/IIc\n\t0008  M Series\n\t0009  M Series (firmware update mode)\n\t000b  M Series\n\t000d  M Series (firmware update mode)\n07ff  Unknown\n\t00ff  Portable Hard Drive\n\tffff  Mad Catz Gamepad\n0801  MagTek\n\t0001  Mini Swipe Reader (Keyboard Emulation)\n\t0002  Mini Swipe Reader\n\t0003  Magstripe Insert Reader\n\t0011  MagTek - Mini Swipe Reader\n0802  Mako Technologies, LLC\n0803  Zoom Telephonics, Inc.\n\t1300  V92 Faxmodem\n\t3095  V.92 56K Mini External Modem Model 3095\n\t4310  4410a Wireless-G Adapter [Intersil ISL3887]\n\t4410  4410b Wireless-G Adapter [ZyDAS ZD1211B]\n\t5241  Cable Modem\n\t5551  DSL Modem\n\t9700  2986L FaxModem\n\t9800  Cable Modem\n\ta312  Wireless-G\n0809  Genicom Technology, Inc.\n080a  Evermuch Technology Co., Ltd\n080b  Cross Match Technologies\n\t0002  Fingerprint Scanner (After ReNumeration)\n\t0010  300LC Series Fingerprint Scanner (Before ReNumeration)\n080c  Datalogic S.p.A.\n\t0300  Gryphon D120 Barcode Scanner\n\t0400  Gryphon D120 Barcode Scanner\n\t0500  Gryphon D120 Barcode Scanner\n\t0600  Gryphon M100 Barcode Scanner\n080d  Teco Image Systems Co., Ltd\n\t0102  Hercules Scan@home 48\n\t0104  3.2Slim\n\t0110  UMAX AstraSlim 1200 Scanner\n0810  Personal Communication Systems, Inc.\n\t0001  Dual PSX Adaptor\n\t0002  Dual PCS Adaptor\n\t0003  PlayStation Gamepad\n\te001  Twin controller\n\te501  SNES Gamepad\n0813  Mattel, Inc.\n\t0001  Intel Play QX3 Microscope\n\t0002  Dual Mode Camera Plus\n0819  eLicenser\n\t0101  License Management and Copy Protection\n081a  MG Logic\n\t1000  Duo Pen Tablet\n081b  Indigita Corp.\n\t0600  Storage Adapter\n\t0601  Storage Adapter\n081c  Mipsys\n081e  AlphaSmart, Inc.\n\tdf00  Handheld\n081f  Manta\n\te401  gamepad\n0822  Reudo Corp.\n\t2001  IRXpress Infrared Device\n0825  GC Protronics\n0826  Data Transit\n0827  BroadLogic, Inc.\n0828  Sato Corp.\n\ta003  WS408 Label Printer\n0829  DirecTV Broadband, Inc. (Telocity)\n082d  Handspring\n\t0100  Visor\n\t0200  Treo\n\t0300  Treo 600\n\t0400  Handheld\n\t0500  Handheld\n\t0600  Handheld\n0830  Palm, Inc.\n\t0001  m500\n\t0002  m505\n\t0003  m515\n\t0004  Handheld\n\t0005  Handheld\n\t0006  Handheld\n\t0010  Handheld\n\t0011  Handheld\n\t0012  Handheld\n\t0013  Handheld\n\t0014  Handheld\n\t0020  i705\n\t0021  Handheld\n\t0022  Handheld\n\t0023  Handheld\n\t0024  Handheld\n\t0030  Handheld\n\t0031  Tungsten W\n\t0032  Handheld\n\t0033  Handheld\n\t0034  Handheld\n\t0040  m125\n\t0041  Handheld\n\t0042  Handheld\n\t0043  Handheld\n\t0044  Handheld\n\t0050  m130\n\t0051  Handheld\n\t0052  Handheld\n\t0053  Handheld\n\t0054  Handheld\n\t0060  Tungsten C/E/T/T2/T3 / Zire 71\n\t0061  Lifedrive / Treo 650/680 / Tunsten E2/T5/TX / Centro / Zire 21/31/72 / Z22\n\t0062  Handheld\n\t0063  Handheld\n\t0064  Handheld\n\t0070  Zire\n\t0071  Handheld\n\t0072  Handheld\n\t0080  Serial Adapter [for Palm III]\n\t0081  Handheld\n\t0082  Handheld\n\t00a0  Treo 800w\n\t0101  Pre\n0832  Kouwell Electronics Corp.\n\t5850  Cable\n0833  Sourcenext Corp.\n\t012e  KeikaiDenwa 8 with charger\n\t039f  KeikaiDenwa 8\n0835  Action Star Enterprise Co., Ltd\n0836  TrekStor\n\t2836  i.Beat mood\n0839  Samsung Techwin Co., Ltd\n\t0005  Digimax Camera\n\t0008  Digimax 230 Camera\n\t0009  Digimax 340\n\t000a  Digimax 410\n\t000e  Digimax 360\n\t0010  Digimax 300\n\t1003  Digimax 210SE\n\t1005  Digimax 220\n\t1009  Digimax V4\n\t1012  6500 Document Camera\n\t103f  Digimax S500\n\t1058  S730 Camera\n\t1064  Digimax D830 Camera\n\t1542  Digimax 50 Duo\n\t3000  Digimax 35 MP3\n083a  Accton Technology Corp.\n\t1046  10/100 Ethernet [pegasus]\n\t1060  HomeLine Adapter\n\t1f4d  SMC8013WG Broadband Remote NDIS Device\n\t3046  10/100 Series Adapter\n\t3060  1/10/100 Adapter\n\t3501  2664W\n\t3502  WN3501D Wireless Adapter\n\t3503  T-Sinus 111 Wireless Adapter\n\t4501  T-Sinus 154data\n\t4502  Siemens S30853-S1016-R107 802.11g Wireless Adapter [Intersil ISL3886]\n\t4505  SMCWUSB-G 802.11bg\n\t4507  SMCWUSBT-G2 802.11g Wireless Adapter [Atheros AR5523]\n\t4521  Siemens S30863-S1016-R107-2 802.11g Wireless Adapter [Intersil ISL3887]\n\t4531  T-Com Sinus 154 data II [Intersil ISL3887]\n\t5046  SpeedStream 10/100 Ethernet [pegasus]\n\t5501  Wireless Adapter 11g\n\t6500  Cable Modem\n\t6618  802.11n Wireless Adapter\n\t7511  Arcadyan 802.11N Wireless Adapter\n\t7512  Arcadyan 802.11N Wireless Adapter\n\t7522  Arcadyan 802.11N Wireless Adapter\n\t8522  Arcadyan 802.11N Wireless Adapter\n\t8541  WN4501F 802.11g Wireless Adapter [Intersil ISL3887]\n\ta512  Arcadyan 802.11N Wireless Adapter\n\ta618  SMCWUSBS-N EZ Connect N Draft 11n Wireless Adapter [Ralink RT2870]\n\ta701  SMCWUSBS-N3 EZ Connect N Wireless Adapter [Ralink RT3070]\n\tb004  CPWUE001 USB/Ethernet Adapter\n\tb522  SMCWUSBS-N2 EZ Connect N Wireless Adapter [Ralink RT2870]\n\tbb01  BlueExpert Bluetooth Device\n\tc003  802.11b Wireless Adapter\n\tc501  Zoom 4410 Wireless-G [Intersil ISL3887]\n\tc561  802.11a/g Wireless Adapter\n\td522  Speedport W 102 Stick IEEE 802.11n USB 2.0 Adapter\n\te501  ZD1211B\n\te503  Arcadyan WN4501 802.11b/g\n\te506  WUS-201 802.11bg\n\tf501  802.11g Wireless Adapter\n\tf502  802.11g Wireless Adapter\n\tf522  Arcadyan WN7512 802.11n\n083f  Global Village\n\tb100  TelePort V.90 Fax/Modem\n0840  Argosy Research, Inc.\n\t0060  Storage Adapter Bridge Module\n0841  Rioport.com, Inc.\n\t0001  Rio 500\n0844  Welland Industrial Co., Ltd\n0846  NetGear, Inc.\n\t1001  EA101 10 Mbps 10BASE-T Ethernet [Kawasaki LSI KL5KLUSB101B]\n\t1002  Ethernet\n\t1020  FA101 Fast Ethernet USB 1.1\n\t1040  FA120 Fast Ethernet USB 2.0 [Asix AX88172 / AX8817x]\n\t1100  Managed Switch M4100 series, M5300 series, M7100 series\n\t4110  MA111(v1) 802.11b Wireless [Intersil Prism 3.0]\n\t4200  WG121(v1) 54 Mbps Wireless [Intersil ISL3886]\n\t4210  WG121(v2) 54 Mbps Wireless [Intersil ISL3886]\n\t4220  WG111(v1) 54 Mbps Wireless [Intersil ISL3886]\n\t4230  MA111(v2) 802.11b Wireless [SIS SIS 162]\n\t4240  WG111(v1) rev 2 54 Mbps Wireless [Intersil ISL3887]\n\t4260  WG111v3 54 Mbps Wireless [realtek RTL8187B]\n\t4300  WG111U Double 108 Mbps Wireless [Atheros AR5004X / AR5005UX]\n\t4301  WG111U (no firmware) Double 108 Mbps Wireless [Atheros AR5004X / AR5005UX]\n\t5f00  WPN111 802.11g Wireless Adapter [Atheros AR5523]\n\t68e1  LB1120-100NAS\n\t6a00  WG111v2 54 Mbps Wireless [RealTek RTL8187L]\n\t7100  WN121T RangeMax Next Wireless-N [Marvell TopDog]\n\t9000  WN111(v1) RangeMax Next Wireless [Marvell 88W8362+88W8060]\n\t9001  WN111(v2) RangeMax Next Wireless [Atheros AR9170+AR9101]\n\t9010  WNDA3100v1 802.11abgn [Atheros AR9170+AR9104]\n\t9011  WNDA3100v2 802.11abgn [Broadcom BCM4323]\n\t9012  WNDA4100 802.11abgn 3x3:3 [Ralink RT3573]\n\t9014  WNDA3100v3 802.11abgn 2x2:2 [MediaTek MT7632U]\n\t9018  WNDA3200 802.11abgn Wireless Adapter [Atheros AR7010+AR9280]\n\t9020  WNA3100(v1) Wireless-N 300 [Broadcom BCM43231]\n\t9021  WNA3100M(v1) Wireless-N 300 [Realtek RTL8192CU]\n\t9030  WNA1100 Wireless-N 150 [Atheros AR9271]\n\t9040  WNA1000 Wireless-N 150 [Atheros AR9170+AR9101]\n\t9041  WNA1000M 802.11bgn [Realtek RTL8188CUS]\n\t9042  On Networks N150MA 802.11bgn [Realtek RTL8188CUS]\n\t9043  WNA1000Mv2 802.11bgn [Realtek RTL8188CUS?]\n\t9050  A6200 802.11a/b/g/n/ac Wireless Adapter [Broadcom BCM43526]\n\t9051  A6200v2 802.11a/b/g/n/ac (2x2) Wireless Adapter [Realtek RTL8812AU]\n\t9052  A6100 AC600 DB Wireless Adapter [Realtek RTL8811AU]\n\t9054  Nighthawk A7000 802.11ac Wireless Adapter AC1900 [Realtek 8814AU]\n\t9055  A6150 Dual Band AC1200 Wireless Adapter [Realtek RTL8812BU]\n\ta001  PA101 10 Mbps HPNA Home Phoneline RJ-1\n\tf001  On Networks N300MA 802.11bgn [Realtek RTL8192CU]\n084d  Minton Optic Industry Co., Inc.\n\t0001  Jenoptik JD800i\n\t0003  S-Cam F5/D-Link DSC-350 Digital Camera\n\t0011  Argus DC3500 Digital Camera\n\t0014  Praktica DC 32\n\t0019  Praktica DPix3000\n\t0025  Praktica DC 60\n\t002b  Technika SH-Z625 6MP Digital Camera\n\t1001  ScanHex SX-35d\n084e  KB Gear\n\t0001  JamCam Camera\n\t1001  Jam Studio Tablet\n\t1002  Pablo Tablet\n084f  Empeg\n\t0001  Empeg-Car Mark I/II Player\n0850  Fast Point Technologies, Inc.\n0851  Macronix International Co., Ltd\n\t1542  SiPix Blink\n\t1543  Maxell WS30 Slim Digital Camera, or Pandigital PI8004W01 digital photo frame\n\ta168  MXIC\n0852  CSEM\n0853  Topre Corporation\n\t0100  HHKB Professional\n\t0119  RealForce 105UB\n\t0200  RealForce Compact Keyboard\n0854  ActiveWire, Inc.\n\t0100  I/O Board\n\t0101  I/O Board, rev1\n0856  B&B Electronics\n\tac01  uLinks USOTL4 RS422/485 Adapter\n0858  Hitachi Maxell, Ltd\n\t3102  Bluetooth Device\n\tffff  Maxell module with BlueCore in DFU mode\n0859  Minolta Systems Laboratory, Inc.\n085a  Xircom\n\t0001  Portstation Dual Serial Port\n\t0003  Portstation Paraller Port\n\t0008  Ethernet\n\t0009  Ethernet\n\t000b  Portstation Dual PS/2 Port\n\t0021  1 port to Serial Converter\n\t0022  Parallel Port\n\t0023  2 port to Serial Converter\n\t0024  Parallel Port\n\t0026  PortGear SCSI\n\t0027  1 port to Serial Converter\n\t0028  PortGear to SCSI Converter\n\t0032  PortStation SCSI Module\n\t003c  Bluetooth Adapter\n\t0299  Colorvision, Inc. Monitor Spyder\n\t8021  1 port to Serial\n\t8023  2 port to Serial\n\t8027  PGSDB9 Serial Port\n085c  ColorVision, Inc.\n\t0100  Spyder 1\n\t0200  Spyder 2\n\t0300  Spyder 3\n\t0400  Spyder 4\n0862  Teletrol Systems, Inc.\n0863  Filanet Corp.\n0864  NetGear, Inc.\n\t4100  MA101 802.11b Adapter\n\t4102  MA101 802.11b Adapter\n0867  Data Translation, Inc.\n\t9812  ECON Data acquisition unit\n\t9816  DT9816 ECON data acquisition module\n\t9836  DT9836 data acquisition card\n086a  Emagic Soft- und Hardware GmbH\n\t0001  Unitor8\n\t0002  AMT8\n\t0003  MT4\n086c  DeTeWe - Deutsche Telephonwerke AG & Co.\n\t1001  Eumex 504PC ISDN TA\n\t1002  Eumex 504PC (FlashLoad)\n\t1003  TA33 ISDN TA\n\t1004  TA33 (FlashLoad)\n\t1005  Eumex 604PC HomeNet\n\t1006  Eumex 604PC HomeNet (FlashLoad)\n\t1007  Eumex 704PC DSL\n\t1008  Eumex 704PC DSL (FlashLoad)\n\t1009  Eumex 724PC DSL\n\t100a  Eumex 724PC DSL (FlashLoad)\n\t100b  OpenCom 30\n\t100c  OpenCom 30 (FlashLoad)\n\t100d  BeeTel Home 100\n\t100e  BeeTel Home 100 (FlashLoad)\n\t1011  USB2DECT\n\t1012  USB2DECT (FlashLoad)\n\t1013  Eumex 704PC LAN\n\t1014  Eumex 704PC LAN (FlashLoad)\n\t1019  Eumex 504 SE\n\t101a  Eumex 504 SE (Flash-Mode)\n\t1021  OpenCom 40\n\t1022  OpenCom 40 (FlashLoad)\n\t1023  OpenCom 45\n\t1024  OpenCom 45 (FlashLoad)\n\t1025  Sinus 61 data\n\t1029  dect BOX\n\t102c  Eumex 604PC HomeNet [FlashLoad]\n\t1030  Eumex 704PC DSL [FlashLoad]\n\t1032  OpenCom 40 [FlashLoad]\n\t1033  OpenCom 30 plus\n\t1034  OpenCom 30 plus (FlashLoad)\n\t1041  Eumex 220PC\n\t1042  Eumex 220PC (FlashMode)\n\t1055  Eumex 220 Version 2 ISDN TA\n\t1056  Eumex 220 Version 2 ISDN TA (Flash-Mode)\n\t2000  OpenCom 1000\n086e  System TALKS, Inc.\n\t1920  SGC-X2UL\n086f  MEC IMEX, Inc.\n0870  Metricom\n\t0001  Ricochet GS\n0871  SanDisk, Inc.\n\t0001  SDDR-01 Compact Flash Reader\n\t0002  SDDR-31 Compact Flash Reader\n\t0005  SDDR-05 Compact Flash Reader\n0873  Xpeed, Inc.\n0874  A-Tec Subsystem, Inc.\n0879  Comtrol Corp.\n087c  Adesso/Kbtek America, Inc.\n087d  Jaton Corp.\n\t5704  Ethernet\n087e  Fujitsu Computer Products of America\n087f  QualCore Logic Inc.\n0880  APT Technologies, Inc.\n0883  Recording Industry Association of America (RIAA)\n0885  Boca Research, Inc.\n0886  XAC Automation Corp.\n\t0630  Intel PC Camera CS630\n0887  Hannstar Electronics Corp.\n088a  TechTools\n\t1002  DigiView DV3100\n088b  MassWorks, Inc.\n\t4944  MassWorks ID-75 TouchScreen\n088c  Swecoin AB\n\t2030  Ticket Printer TTP 2030\n088e  iLok\n\t5036  Portable secure storage for software licenses\n0892  DioGraphy, Inc.\n\t0101  Smartdio Reader/Writer\n0894  TSI Incorporated\n\t0010  Remote NDIS Network Device\n0897  Lauterbach\n\t0001  ICE In-Circuit Emulator\n\t0002  Power Debug/Power Debug II\n\t0004  PowerDebug\n\t0005  PowerDebug PRO\n089c  United Technologies Research Cntr.\n089d  Icron Technologies Corp.\n089e  NST Co., Ltd\n089f  Primex Aerospace Co.\n08a5  e9, Inc.\n08a6  Toshiba TEC\n\t0051  B-SV4\n08a8  Andrea Electronics\n08a9  CWAV Inc.\n\t0005  USBee ZX\n\t0009  USBee SX\n\t0012  USBee AX-Standard\n\t0013  USBee AX-Plus\n\t0014  USBee AX-Pro\n\t0015  USBee DX\n08ac  Macraigor Systems LLC\n\t2024  usbWiggler\n08ae  Macally (Mace Group, Inc.)\n08b0  Metrohm\n\t0006  814 Sample Processor\n\t0015  857 Titrando\n\t001a  852 Titrando\n08b4  Sorenson Vision, Inc.\n08b7  NATSU\n\t0001  Playstation adapter\n08b8  J. Gordon Electronic Design, Inc.\n\t01f4  USBSIMM1\n08b9  RadioShack Corp. (Tandy)\n08bb  Texas Instruments\n\t2702  PCM2702 16-bit stereo audio DAC\n\t2704  PCM2704 16-bit stereo audio DAC\n\t2705  PCM2705 stereo audio DAC\n\t2706  PCM2706 stereo audio DAC\n\t2707  PCM2707 stereo audio DAC\n\t27c4  PCM2704C stereo audio DAC\n\t27c5  PCM2705C stereo audio DAC\n\t27c6  PCM2706C stereo audio DAC\n\t27c7  PCM2707C stereo audio DAC\n\t2900  PCM2900 Audio Codec\n\t2901  PCM2901 Audio Codec\n\t2902  PCM2902 Audio Codec\n\t2904  PCM2904 Audio Codec\n\t2910  PCM2912 Audio Codec\n\t2912  PCM2912A Audio Codec\n\t29b0  PCM2900B Audio CODEC\n\t29b2  PCM2902 Audio CODEC\n\t29b3  PCM2903B Audio CODEC\n\t29b6  PCM2906B Audio CODEC\n\t29c0  PCM2900C Audio CODEC\n\t29c2  PCM2902C Audio CODEC\n\t29c3  PCM2903C Audio CODEC\n\t29c6  PCM2906C Audio CODEC\n08bd  Citizen Watch Co., Ltd\n\t0208  CLP-521 Label Printer\n\t1100  X1-USB Floppy\n08c3  Precise Biometrics\n\t0001  100 SC\n\t0002  100 A\n\t0003  100 SC BioKeyboard\n\t0006  100 A BioKeyboard\n\t0100  100 MC ISP\n\t0101  100 MC FingerPrint and SmartCard Reader\n\t0300  100 AX\n\t0400  100 SC\n\t0401  150 MC\n\t0402  200 MC FingerPrint and SmartCard Reader\n\t0404  100 SC Upgrade\n\t0405  150 MC Upgrade\n\t0406  100 MC Upgrade\n08c4  Proxim, Inc.\n\t0100  Skyline 802.11b Wireless Adapter\n\t02f2  Farallon Home Phoneline Adapter\n08c7  Key Nice Enterprise Co., Ltd\n08c8  2Wire, Inc.\n08c9  Nippon Telegraph and Telephone Corp.\n08ca  Aiptek International, Inc.\n\t0001  Tablet\n\t0010  Tablet\n\t0020  APT-6000U Tablet\n\t0021  APT-2 Tablet\n\t0022  Tablet\n\t0023  Tablet\n\t0024  Tablet\n\t0100  Pen Drive\n\t0102  DualCam\n\t0103  Pocket DV Digital Camera\n\t0104  Pocket DVII\n\t0105  Mega DV(Disk)\n\t0106  Pocket DV3100+\n\t0107  Pocket DV3100\n\t0109  Nisis DV4 Digital Camera\n\t010a  Trust 738AV LCD PV Mass Storage\n\t0111  PenCam VGA Plus\n\t2008  Mini PenCam 2\n\t2010  Pocket CAM 3 Mega (webcam)\n\t2011  Pocket CAM 3 Mega (storage)\n\t2016  PocketCam 2 Mega\n\t2018  Pencam SD 2M\n\t2019  Pencam SD 2M (mass storage mode)\n\t2020  Slim 3000F\n\t2022  Slim 3200\n\t2024  Pocket DV3500\n\t2028  Pocket Cam4M\n\t2040  Pocket DV4100M\n\t2042  Pocket DV5100M Composite Device\n\t2043  Pocket DV5100M (Disk)\n\t2060  Pocket DV5300\n08cd  Jue Hsun Ind. Corp.\n08ce  Long Well Electronics Corp.\n08cf  Productivity Enhancement Products\n08d1  smartBridges, Inc.\n\t0001  smartNIC Ethernet [catc]\n\t0003  smartNIC 2 PnP Ethernet\n08d3  Virtual Ink\n08d4  Fujitsu Siemens Computers\n\t0009  SCR SmartCard Reader\n08d8  IXXAT Automation GmbH\n\t0002  USB-to-CAN compact\n\t0003  USB-to-CAN II\n\t0100  USB-to-CAN\n08d9  Increment P Corp.\n08dd  Billionton Systems, Inc.\n\t0112  Wireless LAN Adapter\n\t0113  Wireless LAN Adapter\n\t0986  USB-100N Ethernet [pegasus]\n\t0987  USBLP-100 HomePNA Ethernet [pegasus]\n\t0988  USBEL-100 Ethernet [pegasus]\n\t1986  10/100 LAN Adapter\n\t2103  DVB-T TV-Tuner Card-R\n\t8511  USBE-100 Ethernet [pegasus2]\n\t90ff  USB2AR Ethernet\n08de  ???\n\t7a01  802.11b Adapter\n08df  Spyrus, Inc.\n\t0001  Rosetta Token V1\n\t0002  Rosetta Token V2\n\t0003  Rosetta Token V3\n\t0a00  Lynks Interface\n08e3  Olitec, Inc.\n\t0002  USB-RS232 Bridge\n\t0100  Interface ADSL\n\t0101  Interface ADSL\n\t0102  ADSL\n\t0301  RNIS ISDN TA [HFC-S]\n08e4  Pioneer Corp.\n\t017a  BD-XD07 BD/DVD/CD Writer\n\t0184  DDJ-WeGO\n\t0185  DDJ-WeGO2\n08e5  Litronic\n08e6  Gemalto (was Gemplus)\n\t0001  GemPC-Touch 430\n\t0430  GemPC430 SmartCard Reader\n\t0432  GemPC432 SmartCard Reader\n\t0435  GemPC435 SmartCard Reader\n\t0437  GemPC433 SL SmartCard Reader\n\t1359  UA SECURE STORAGE TOKEN\n\t2202  Gem e-Seal Pro Token\n\t3437  GemPC Twin SmartCard Reader\n\t3438  GemPC Key SmartCard Reader\n\t3478  PinPad Smart Card Reader\n\t34ec  Compact Smart Card Reader Writer\n\t4433  GemPC433-Swap\n\t5501  GemProx-PU Contactless Smart Card Reader\n\t5503  Prox-DU Contactless Interface\n\tace0  UA HYBRID TOKEN\n08e7  Pan-International Wire & Cable\n08e8  Integrated Memory Logic\n08e9  Extended Systems, Inc.\n\t0100  XTNDAccess IrDA Dongle\n08ea  Ericsson, Inc., Blue Ridge Labs\n\t00c9  ADSL Modem HM120dp Loader\n\t00ca  ADSL WAN Modem HM120dp\n\t00ce  HM230d Virtual Bus for Helium\n\tabba  USB Driver for Bluetooth Wireless Technology\n\tabbb  Bluetooth Device in DFU State\n08ec  M-Systems Flash Disk Pioneers\n\t0001  TravelDrive 2C\n\t0002  TravelDrive 2C\n\t0005  TravelDrive 2C\n\t0008  TravelDrive 2C\n\t0010  DiskOnKey\n\t0011  DiskOnKey\n\t0012  TravelDrive 2C\n\t0014  TravelDrive 2C\n\t0015  Kingston DataTraveler ELITE\n\t0016  Kingston DataTraveler U3\n\t0020  TravelDrive Intuix U3 2GB\n\t0021  TravelDrive\n\t0022  TravelDrive\n\t0023  TravelDrive\n\t0024  TravelDrive\n\t0025  TravelDrive\n\t0026  TravelDrive\n\t0027  TravelDrive\n\t0028  TravelDrive\n\t0029  TravelDrive\n\t0030  TravelDrive\n\t0822  TravelDrive 2C\n\t0832  Hi-Speed Mass Storage Device\n\t0834  M-Disk 220\n\t0998  Kingston Data Traveler2.0 Disk Driver\n\t0999  Kingston Data Traveler2.0 Disk Driver\n\t1000  TravelDrive 2C\n\t2000  TravelDrive 2C\n\t2038  TravelDrive\n\t2039  TravelDrive\n\t204a  TravelDrive\n\t204b  TravelDrive\n08ed  MediaTek Inc.\n\t0002  CECT M800 memory card\n08ee  CCSI/Hesso\n08f0  Corex Technologies\n\t0005  CardScan 800c\n08f1  CTI Electronics Corp.\n08f2  Gotop Information Inc.\n\t007f  Super Q2 Tablet\n08f5  SysTec Co., Ltd\n08f6  Logic 3 International, Ltd\n08f7  Vernier\n\t0001  LabPro\n\t0002  EasyTemp/Go!Temp\n\t0003  Go!Link\n\t0004  Go!Motion\n08f8  Keen Top International Enterprise Co., Ltd\n08f9  Wipro Technologies\n08fa  Caere\n08fb  Socket Communications\n08fc  Sicon Cable Technology Co., Ltd\n08fd  Digianswer A/S\n\t0001  Bluetooth Device\n08ff  AuthenTec, Inc.\n\t1600  AES1600\n\t1610  AES1600\n\t1660  AES1660 Fingerprint Sensor\n\t1680  AES1660 Fingerprint Sensor\n\t168f  AES1660 Fingerprint Sensor\n\t2500  AES2501\n\t2501  AES2501\n\t2502  AES2501\n\t2503  AES2501\n\t2504  AES2501\n\t2505  AES2501\n\t2506  AES2501\n\t2507  AES2501\n\t2508  AES2501\n\t2509  AES2501\n\t250a  AES2501\n\t250b  AES2501\n\t250c  AES2501\n\t250d  AES2501\n\t250e  AES2501\n\t250f  AES2501\n\t2510  AES2510\n\t2550  AES2550 Fingerprint Sensor\n\t2580  AES2501 Fingerprint Sensor\n\t2588  AES2501\n\t2589  AES2501\n\t258a  AES2501\n\t258b  AES2501\n\t258c  AES2501\n\t258d  AES2501\n\t258e  AES2501\n\t258f  AES2501\n\t2660  AES2660 Fingerprint Sensor\n\t2680  AES2660 Fingerprint Sensor\n\t268f  AES2660 Fingerprint Sensor\n\t2810  AES2810\n\t3400  AES3400 TruePrint Sensor\n\t3401  AES3400 Sensor\n\t3402  AES3400 Sensor\n\t3403  AES3400 Sensor\n\t3404  AES3400 TruePrint Sensor\n\t3405  AES3400 TruePrint Sensor\n\t3406  AES3400 TruePrint Sensor\n\t3407  AES3400 TruePrint Sensor\n\t4902  BioMV with TruePrint AES3500\n\t4903  BioMV with TruePrint AES3400\n\t5500  AES4000\n\t5501  AES4000 TruePrint Sensor\n\t5503  AES4000 TruePrint Sensor\n\t5505  AES4000 TruePrint Sensor\n\t5507  AES4000 TruePrint Sensor\n\t55ff  AES4000 TruePrint Sensor.\n\t5700  AES3500 Fingerprint Reader\n\t5701  AES3500 TruePrint Sensor\n\t5702  AES3500 TruePrint Sensor\n\t5703  AES3500 TruePrint Sensor\n\t5704  AES3500-BZ TruePrint Sensor\n\t5705  AES3500-BZ TruePrint Sensor\n\t5706  AES3500-BZ TruePrint Sensor\n\t5707  AES3500-BZ TruePrint Sensor\n\t5710  AES3500 TruePrint Sensor\n\t5711  AES3500 TruePrint Sensor\n\t5712  AES3500 TruePrint Sensor\n\t5713  AES3500 TruePrint Sensor\n\t5714  AES3500-BZ TruePrint Sensor\n\t5715  AES3500-BZ TruePrint Sensor\n\t5716  AES3500-BZ TruePrint Sensor\n\t5717  AES3500-BZ TruePrint Sensor\n\t5730  AES3500 TruePrint Sensor\n\t5731  AES3500 TruePrint Sensor\n\t5732  AES3500 TruePrint Sensor\n\t5733  AES3500 TruePrint Sensor\n\t5734  AES3500-BZ TruePrint Sensor\n\t5735  AES3500-BZ TruePrint Sensor\n\t5736  AES3500-BZ TruePrint Sensor\n\t5737  AES3500-BZ TruePrint Sensor\n\tafe3  FingerLoc Sensor Module (Anchor)\n\tafe4  FingerLoc Sensor Module (Anchor)\n\tafe5  FingerLoc Sensor Module (Anchor)\n\tafe6  FingerLoc Sensor Module (Anchor)\n\tfffd  AES2510 Sensor (USB Emulator)\n\tffff  Sensor (Emulator)\n0900  Pinnacle Systems, Inc.\n0901  VST Technologies\n\t0001  Hard Drive Adapter (TPP)\n\t0002  SigmaDrive Adapter (TPP)\n0906  Faraday Technology Corp.\n0908  Siemens AG\n\t01f4  SIMATIC NET CP 5711\n\t01fe  SIMATIC NET PC Adapter A2\n\t02e7  RNDIS for OZW/OCI\n\t04b1  MediSET\n\t04b2  NC interface\n\t04b3  keyboard front panel Cockpit\n\t04b4  SCR_CCID\n\t04b5  Camera\n\t04b6  Cockpit Touchkeypad\n\t04b7  Cockpit Touchkeypad Bootloader\n\t04b8  MediSET USB4-W\n\t04b9  MediSET USB4-R\n\t04ba  MediSET USB4-G\n\t2701  ShenZhen SANZHAI Technology Co.,Ltd Spy Pen VGA\n0909  Audio-Technica Corp.\n\t001b  ATR2100-USB\n\t001c  AT2020USB+\n090a  Trumpion Microelectronics, Inc.\n\t1001  T33520 Flash Card Controller\n\t1100  Comotron C3310 MP3 player\n\t1200  MP3 player\n\t1540  Digitex Container Flash Disk\n090b  Neurosmith\n090c  Silicon Motion, Inc. - Taiwan (formerly Feiya Technology Corp.)\n\t0371  Silicon Motion SM371 Camera\n\t0373  Silicon Motion Camera\n\t037a  Silicon Motion Camera\n\t037b  Silicon Motion Camera\n\t037c  300k Pixel Camera\n\t1000  Flash Drive\n\t1132  5-in-1 Card Reader\n\t2000  Disk\n\t337b  Silicon Motion Camera\n\t3710  Silicon Motion Camera\n\t3720  Silicon Motion Camera\n\t37bc  HP Webcam-101 Integrated Camera\n\t37c0  Silicon Motion Camera\n\t6000  SD/SDHC Card Reader (SG365 / FlexiDrive XC+)\n\t6200  microSD card reader\n\t71b3  SM731 Camera\n\t837b  Silicon Motion Camera\n\t937b  Silicon Motion Camera\n\tb370  Silicon Motion SM370 Camera\n\tb371  Silicon Motion SM371 Camera\n\tf37d  Endoscope camera\n090d  Multiport Computer Vertriebs GmbH\n090e  Shining Technology, Inc.\n090f  Fujitsu Devices, Inc.\n0910  Alation Systems, Inc.\n0911  Philips Speech Processing\n\t0c1c  SpeechMike III\n\t149a  SpeechMike II Pro Plus LFH5276\n\t2512  SpeechMike Pro\n0912  Voquette, Inc.\n0915  GlobeSpan, Inc.\n\t0001  DSL Modem\n\t0002  ADSL ATM Modem\n\t0005  LAN Modem\n\t2000  802.11 Adapter\n\t2002  802.11 Adapter\n\t8000  ADSL LAN Modem\n\t8005  DSL-302G Modem\n\t8101  ADSL WAN Modem\n\t8102  DSL-200 ADSL Modem\n\t8103  DSL-200 ADSL Modem\n\t8104  DSL-200 Modem\n\t8400  DSL Modem\n\t8401  DSL Modem\n\t8402  DSL Modem\n\t8500  DSL Modem\n\t8501  DSL Modem\n0917  SmartDisk Corp.\n\t0001  eFilm Reader-11 SM/CF\n\t0002  eFilm Reader-11 SM\n\t0003  eFilm Reader-11 CF\n\t0200  FireFly\n\t0201  FireLite\n\t0202  STORAGE ADAPTER (FirePower)\n\t0204  FlashTrax Storage\n\t0205  STORAGE ADAPTER (CrossFire)\n\t0206  FireFly 20G HDD\n\t0207  FireLite\n\t020f  STORAGE ADAPTER (FireLite)\n\tda01  eFilm Reader-11 Test\n\tffff  eFilm Reader-11 (Class/PDR)\n0919  Tiger Electronics\n\t0100  Fast Flicks Digital Camera\n091e  Garmin International\n\t0003  GPS (various models)\n\t0004  iQue 3600\n\t0200  Data Card Programmer (install)\n\t086e  Forerunner 735XT\n\t097f  Forerunner 235\n\t1200  Data Card Programmer\n\t21a5  etrex Cx (msc)\n\t2236  nuvi 360\n\t2271  Edge 605/705\n\t2295  Colorado 300\n\t22b6  eTrex Vista HCx (Mass Storage mode)\n\t231b  Oregon 400t\n\t2353  Nüvi 205T\n\t2380  Oregon series\n\t23cc  nüvi 1350\n\t2459  GPSmap 62/78 series\n\t2491  Edge 800\n\t2518  eTrex 10\n\t2519  eTrex 30\n\t2535  Edge 800\n\t253c  GPSmap 62sc\n\t255b  Nuvi 2505LM\n\t2613  Edge 200 TWN\n\t26a1  Nuvi 55\n\t2802  fenix 3\n\t28db  Drive 5\n\t2bf5  Drive 52M\n\t47fb  nuviCam\n\t4c05  Forerunner 245 Music\n\t4cda  Fenix 6 Sapphire\n\t4cdb  Fenix 6\n0920  Echelon Co.\n\t5550  U60 FT Network Interface\n\t7500  Network Interface\n0921  GoHubs, Inc.\n\t1001  GoCOM232 Serial\n0922  Dymo-CoStar Corp.\n\t0007  LabelWriter 330\n\t0009  LabelWriter 310\n\t0013  LabelManager 400\n\t0019  LabelWriter 400\n\t001a  LabelWriter 400 Turbo\n\t0020  LabelWriter 450\n\t0400  LabelWriter SE450\n\t1001  LabelManager PnP\n\t8003  M10 Digital Postal Scale\n\t8004  M25 Digital Postal Scale\n\t8009  S250 Digital Postal Scale\n0923  IC Media Corp.\n\t010f  SIIG MobileCam\n0924  Xerox\n\t23dd  DocuPrint M760 (X760_USB)\n\t3ce8  Phaser 3428 Printer\n\t3cea  Phaser 3125\n\t3cec  Phaser 3250\n\t3d5b  Phaser 6115MFP TWAIN Scanner\n\t3d6d  WorkCentre 6015N/NI\n\t420f  WorkCentre PE220 Series\n\t421f  M20 Scanner\n\t423b  Printing Support\n\t4274  Xerox Phaser 3635MFPX\n\tffef  WorkCenter M15\n\tfffb  DocuPrint M750 (X750_USB)\n0925  Lakeview Research\n\t0005  Gamtec.,Ltd SmartJoy PLUS Adapter\n\t03e8  Wii Classic Controller Adapter\n\t1031  WiseGroup Ltd, Gameport Controller\n\t1700  PS/SS/N64 Joypad\n\t3881  Saleae Logic\n\t8101  Phidgets, Inc., 1-Motor PhidgetServo v2.0\n\t8104  Phidgets, Inc., 4-Motor PhidgetServo v2.0\n\t8800  WiseGroup Ltd, MP-8800 Quad Joypad\n\t8866  WiseGroup Ltd, MP-8866 Dual Joypad\n0927  Summus, Ltd\n0928  PLX Technology, Inc. (formerly Oxford Semiconductor, Ltd)\n\t8000  Firmware uploader\n\tffff  Blank Oxford Device\n0929  American Biometric Co.\n092a  Toshiba Information & Industrial Sys. And Services\n092b  Sena Technologies, Inc.\n\t4210  20S - Bluetooth Motorcycle headset & universal intercom\n092f  Northern Embedded Science/CAVNEX\n\t0004  JTAG-4\n\t0005  JTAG-5\n0930  Toshiba Corp.\n\t0009  Gigabeat F/X (HDD audio player)\n\t000c  Gigabeat F (mtp)\n\t0010  Gigabeat S (mtp)\n\t01bf  2.5\"External Hard Disk\n\t0200  Integrated Bluetooth (Taiyo Yuden)\n\t021c  Atheros AR3012 Bluetooth\n\t0301  PCX1100U Cable Modem (WDM)\n\t0302  PCX2000 Cable Modem (WDM)\n\t0305  Cable Modem PCX3000\n\t0307  Cable Modem PCX2500\n\t0308  PCX2200 Cable Modem (WDM)\n\t0309  PCX5000 Cable Modem (WDM)\n\t030b  Cable Modem PCX2600\n\t0501  Bluetooth Controller\n\t0502  Integrated Bluetooth\n\t0503  Bluetooth Controller\n\t0505  Integrated Bluetooth\n\t0506  Integrated Bluetooth\n\t0507  Bluetooth Adapter\n\t0508  Integrated Bluetooth HCI\n\t0509  BT EDR Dongle\n\t0706  PocketPC e740\n\t0707  Pocket PC e330 Series\n\t0708  Pocket PC e350 Series\n\t0709  Pocket PC e750 Series\n\t070a  Pocket PC e400 Series\n\t070b  Pocket PC e800 Series\n\t0a07  WLM-10U1 802.11abgn Wireless Adapter [Ralink RT3572]\n\t0a08  WLM-20U2/GN-1080 802.11abgn Wireless Adapter [Atheros AR7010+AR9280]\n\t0a0b  WLU5053 802.11abgn Wireless Module [Broadcom BCM43236B]\n\t0a13  AX88179 Gigabit Ethernet [Toshiba]\n\t0b05  PX1220E-1G25 External hard drive\n\t0b09  PX139xE 3.5 External HDD\n\t0b1a  STOR.E ALU 2S\n\t1300  Wireless Broadband (CDMA EV-DO) SM-Bus Minicard Status Port\n\t1301  Wireless Broadband (CDMA EV-DO) Minicard Status Port\n\t1302  Wireless Broadband (3G HSDPA) SM-Bus Minicard Status Port\n\t1303  Wireless Broadband (3G HSDPA) Minicard Status Port\n\t1308  Broadband (3G HSDPA) SM-Bus Minicard Diagnostics Port\n\t130b  F3507g Mobile Broadband Module\n\t130c  F3607gw Mobile Broadband Module\n\t1311  F3607gw v2 Mobile Broadband Module\n\t1400  Memory Stick 2GB\n\t140b  Memory Stick 64GB\n\t642f  TravelDrive\n\t6506  TravelDrive 2C\n\t6507  TravelDrive 2C\n\t6508  TravelDrive 2C\n\t6509  TravelDrive 2C\n\t6510  TravelDrive 2C\n\t6517  TravelDrive 2C\n\t6518  TravelDrive 2C\n\t6519  Kingston DataTraveler 2.0 USB Stick\n\t651a  TravelDrive 2C\n\t651b  TravelDrive 2C\n\t651c  TravelDrive 2C\n\t651d  TravelDrive 2C\n\t651e  TravelDrive 2C\n\t651f  TravelDrive 2C\n\t6520  TravelDrive 2C\n\t6521  TravelDrive 2C\n\t6522  TravelDrive 2C\n\t6523  TravelDrive\n\t6524  TravelDrive\n\t6525  TravelDrive\n\t6526  TravelDrive\n\t6527  TravelDrive\n\t6528  TravelDrive\n\t6529  TravelDrive\n\t652a  TravelDrive\n\t652b  TravelDrive\n\t652c  TravelDrive\n\t652d  TravelDrive\n\t652f  TravelDrive\n\t6530  TravelDrive\n\t6531  TravelDrive\n\t6532  256M Stick\n\t6533  512M Stick\n\t6534  TravelDrive\n\t653c  Kingston DataTraveler 2.0 Stick (512M)\n\t653d  Kingston DataTraveler 2.0 Stick (1GB)\n\t653e  Flash Memory\n\t6540  TransMemory Flash Memory\n\t6544  TransMemory-Mini / Kingston DataTraveler 2.0 Stick\n\t6545  Kingston DataTraveler 102/2.0 / HEMA Flash Drive 2 GB / PNY Attache 4GB Stick\n\ta002  SunplusIT SATA bridge\n0931  Harmonic Data Systems, Ltd\n0932  Crescentec Corp.\n\t0300  VideoAdvantage\n\t0302  Syntek DC-112X\n\t0320  VideoAdvantage\n\t0482  USB2.0 TVBOX\n\t1100  DC-1100 Video Enhamcement Device\n\t1112  Veo Web Camera\n\ta311  Video Enhancement Device\n0933  Quantum Corp.\n0934  Spirent Communications\n0936  NuTesla\n\t000a  Moebius\n\t000b  iMoebius\n\t000c  Rhythmedics 6 BioData Integrator\n\t000d  Hypurius\n\t000e  Millennius\n\t000f  Purius\n\t0030  Composite Device, Mass Storage Device (Flash Drive) amd HID\n\t003c  Rhythmedics HID Bootloader\n0939  Lumberg, Inc.\n\t0b15  Toshiba Stor.E Alu 2\n\t0b16  Toshiba StorE HDD\n093a  Pixart Imaging, Inc.\n\t0007  CMOS 100K-R Rev. 1.90\n\t010e  Digital camera, CD302N/Elta Medi@ digi-cam/HE-501A\n\t010f  Argus DC-1610/DC-1620/Emprex PCD3600/Philips P44417B keychain camera/Precision Mini,Model HA513A/Vivitar Vivicam 55\n\t020f  Bullet Line Photo Viewer\n\t050f  Mars-Semi Pc-Camera\n\t2460  Q-TEC WEBCAM 100\n\t2468  SoC PC-Camera\n\t2470  SoC PC-Camera\n\t2471  SoC PC-Camera\n\t2500  USB Optical Mouse\n\t2510  Optical Mouse\n\t2521  Optical Mouse\n\t2600  Typhoon Easycam USB 330K (newer)/Typhoon Easycam USB 2.0 VGA 1.3M/Sansun SN-508\n\t2601  SPC 610NC Laptop Camera\n\t2603  PAC7312 Camera\n\t2608  PAC7311 Trust WB-3300p\n\t260e  PAC7311 Gigaware VGA PC Camera:Trust WB-3350p:SIGMA cam 2350\n\t260f  PAC7311 SnakeCam\n\t2621  PAC731x Trust Webcam\n\t2622  Webcam Genius\n\t2624  Webcam\n\t2628  Webcam Genius iLook 300\n\t2700  GE 1.3 MP MiniCam Pro\n\t2811  Macally IceCam II\n093b  Plextor Corp.\n\t0010  Storage Adapter\n\t0011  PlexWriter 40/12/40U\n\t0012  PlexWriter 48/24/48U\n\t0023  PX-608CU DVD RW\n\t0041  PX-708A DVD RW\n\t0042  PX-712UF DVD RW\n\ta002  ConvertX M402U XLOADER\n\ta003  ConvertX AV100U A/V Capture Audio\n\ta004  ConvertX TV402U XLOADER\n\ta005  ConvertX TV100U A/V Capture\n\ta102  ConvertX M402U A/V Capture\n\ta104  ConvertX PX-TV402U/NA\n093c  Intrepid Control Systems, Inc.\n\t0601  ValueCAN\n\t0701  NeoVI Blue vehicle bus interface\n093d  InnoSync, Inc.\n093e  J.S.T. Mfg. Co., Ltd\n093f  Olympia Telecom Vertriebs GmbH\n0940  Japan Storage Battery Co., Ltd\n0941  Photobit Corp.\n0942  i2Go.com, LLC\n0943  HCL Technologies India Private, Ltd\n0944  KORG, Inc.\n\t0001  PXR4 4-Track Digital Recorder\n\t0020  KAOSS Pad KP3 Dynamic Effect/Sampler\n\t0023  KAOSSILATOR PRO Dynamic Phrase Synthesizer\n\t010d  nanoKEY MIDI keyboard\n\t010e  nanoPAD pad controller\n\t010f  nanoKONTROL studio controller\n\t0117  nanoKONTROL2 MIDI Controller\n\t012f  SQ-1\n\t0154  NTS-1 digital kit mkII\n\t0203  KRONOS\n\t0f03  K-Series K61P MIDI studio controller\n0945  Pasco Scientific\n0948  Kronauer music in digital\n\t0301  USB Pro (24/48)\n\t0302  USB Pro (24/96 playback)\n\t0303  USB Pro (24/96 record)\n\t0304  USB Pro (16/48)\n\t1105  USB One\n094b  Linkup Systems Corp.\n\t0001  neonode N2\n094d  Cable Television Laboratories\n094f  Yano\n\t0101  U640MO-03\n\t05fc  METALWEAR-HDD\n0951  Kingston Technology\n\t0008  Ethernet\n\t000a  KNU101TX 100baseTX Ethernet\n\t1539  Iron Key D300 (Virtual CD-ROM and USB Stick)\n\t1600  DataTraveler II Pen Drive\n\t1601  DataTraveler II+ Pen Drive\n\t1602  DataTraveler Mini\n\t1603  DataTraveler 1GB/2GB Pen Drive\n\t1606  Eee PC 701 SD Card Reader [ENE UB6225]\n\t1607  DataTraveler 100\n\t160b  DataTraveler 2.0 (2GB)\n\t160d  DataTraveler Vault Privacy\n\t160e  DT110P/1GB Capless\n\t1613  DataTraveler DT101C Flash Drive\n\t1616  DataTraveler Locker 4GB\n\t161a  Dell HyperVisor internal flash drive\n\t1621  DataTraveler 150 (32GB)\n\t1624  DataTraveler G2\n\t1625  DataTraveler 101 II\n\t162a  DataTraveler 112 4GB Pen Drive\n\t162b  DataTraveler HyperX 3.0\n\t162d  DataTraveler 102\n\t1630  DataTraveler 200 (32GB)\n\t1642  DT101 G2\n\t1643  DataTraveler G3\n\t1653  Data Traveler 100 G2 8 GiB\n\t1656  DataTraveler Ultimate G2\n\t1660  Data Traveller 108\n\t1665  Digital DataTraveler SE9\n\t1666  DataTraveler 100 G3/G4/SE9 G2/50 Kyson\n\t1689  DataTraveler SE9\n\t168a  DataTraveler Micro\n\t168c  DT Elite 3.0\n\t169d  DataTraveler Locker+ G3 Flash Drive\n\t16a3  DataTraveler (DT) microDuo 3.0\n\t16a4  HyperX 7.1 Audio\n\t16b3  HyperX Savage\n\t16c4  Hyperx Cloud Flight wireless headset\n\t16d2  HX-KB4BL1-US [HYPERX Alloy FPS Pro]\n\t16d4  HyperX SavageEXO [0382]\n\t16d5  DataTraveler Elite G2\n\t16df  HyperX QuadCast\n\t16e4  HyperX Pulsefire Raid\n\t173c  DataTraveler Duo\n\t177f  DataTraveler Max\n0954  RPM Systems Corp.\n0955  NVIDIA Corp.\n\t7005  Bootloader\n\t7018  T186 [Tegra Parker]\n\t701a  U-Boot running on Tegra\n\t7020  L4T (Linux for Tegra) running on Tegra\n\t7030  T30 [Tegra 3] recovery mode\n\t7035  Jetson device in initrd flashing mode\n\t7100  Tegra Device\n\t7140  T124 [Tegra K1/Logan 32-bit]\n\t7210  SHIELD Controller\n\t7321  Switch [Tegra Erista] recovery mode\n\t7323  T234 [Orin NX 16GB] recovery mode\n\t7423  T234 [Orin NX 8GB] recovery mode\n\t7721  T210 [TX1 Tegra Erista] recovery mode\n\t7820  T20 [Tegra 2] recovery mode\n\t7c18  T186 [TX2 Tegra Parker] recovery mode\n\tb400  SHIELD (debug)\n\tb401  SHIELD\n\tcf05  SHIELD Tablet (debug)\n\tcf06  SHIELD Tablet\n\tcf07  SHIELD Tablet\n\tcf08  SHIELD Tablet\n\tcf09  SHIELD Tablet\n0956  BSquare Corp.\n0957  Agilent Technologies, Inc.\n\t0007  82357A GPIB Interface Firmware loader\n\t0107  82357A GPIB Interface\n\t0200  E-Video DC-350 Camera\n\t0202  E-Video DC-350 Camera\n\t0407  33220A Waveform Generator\n\t0518  82357B GPIB Interface Firmware loader\n\t0607  34410A Multimeter\n\t0718  82357B GPIB Interface\n\t0a07  34411A Multimeter\n\t1507  33210A Waveform Generator\n\t1745  Test and Measurement Device (IVI)\n\t1907  53230A Frequency Counter\n\t1f01  N5181A MXG Analog Signal Generator\n\t2918  U2702A oscilloscope\n\tfb18  LC Device\n0958  CompuLink Research, Inc.\n0959  Cologne Chip AG\n\t2bd0  Intelligent ISDN (Ver. 3.60.04) [HFC-S]\n095a  Portsmith\n\t3003  Express Ethernet\n095b  Medialogic Corp.\n095c  K-Tec Electronics\n095d  Polycom, Inc.\n\t0001  Polycom ViaVideo\n0964  BITRAN\n0967  Acer NeWeb Corp.\n\t0204  WarpLink 802.11b Adapter\n0968  Catalyst Enterprises, Inc.\n096e  Feitian Technologies, Inc.\n\t0005  ePass2000\n\t0006  HID Dongle (for OEMs - manufacturer string is \"OEM\")\n\t0120  Microcosm Ltd Dinkey\n\t0305  ePass2000Auto\n\t0309  ePass3000GM\n\t0401  ePass3000\n\t0405  Zzkey Dongle\n\t0503  SCR301\n\t0608  SC Reader KP382\n\t0702  ePass3003\n\t0703  ePass3003Auto\n\t0801  Token\n\t0802  ePass2000 (G&D STARCOS SPK 2.4)\n\t0807  ePass2003\n\t085a  Multipass FIDO\n\t0891  Jubiter Wallet\n0971  Gretag-Macbeth AG\n\t2000  i1 Pro\n\t2001  i1 Monitor\n\t2003  Eye-One display\n\t2005  Huey\n\t2007  ColorMunki Photo\n0973  Schlumberger\n\t0001  e-gate Smart Card\n0974  Datagraphix, a business unit of Anacomp\n0975  OL'E Communications, Inc.\n0976  Adirondack Wire & Cable\n0977  Lightsurf Technologies\n0978  Beckhoff GmbH\n0979  Jeilin Technology Corp., Ltd\n\t0222  Keychain Display\n\t0224  JL2005A Toy Camera\n\t0226  JL2005A Toy Camera\n\t0227  JL2005B/C/D Toy Camera\n097a  Minds At Work LLC\n\t0001  Digital Wallet\n097b  Knudsen Engineering, Ltd\n097c  Marunix Co., Ltd\n097d  Rosun Technologies, Inc.\n097e  Biopac Systems Inc.\n\t0035  MP35 v1.0\n097f  Barun Electronics Co., Ltd\n0981  Oak Technology, Ltd\n0984  Apricorn\n\t0040  SATA Wire (2.5\")\n\t0200  Hard Drive Storage (TPP)\n\t1407  Secure Key 3.0\n0985  cab Produkttechnik GmbH & Co KG\n\t0045  Mach4/200 Label Printer\n\t00a3  A3/200 or A3/300 Label Printer\n0986  Matsushita Electric Works, Ltd.\n098c  Vitana Corp.\n098d  INDesign\n098e  Integrated Intellectual Property, Inc.\n098f  Kenwood TMI Corp.\n0993  Gemstar eBook Group, Ltd\n\t0001  REB1100 eBook Reader\n\t0002  eBook\n0996  Integrated Telecom Express, Inc.\n099a  Zippy Technology Corp.\n\t0638  Sanwa Supply Inc. Small Keyboard\n\t2620  Graphics tablet [Polostar PT1001, Zeniq PT1001, Leogics PT1001]\n\t610c  EL-610 Super Mini Electron luminescent Keyboard\n\t6330  SANWA Supply Inc. Slim Keyboard\n\t713a  WK-713 Multimedia Keyboard\n\t7160  Hyper Slim Keyboard\n\t7202  Enermax Aurora Micro Wireless Receiver\n099e  Trimble Navigation, Ltd\n09a3  PairGain Technologies\n09a4  Contech Research, Inc.\n09a5  VCON Telecommunications\n09a6  Poinchips\n\t8001  Mass Storage Device\n09a7  Data Transmission Network Corp.\n09a8  Lin Shiung Enterprise Co., Ltd\n09a9  Smart Card Technologies Co., Ltd\n09aa  Intersil Corp.\n\t1000  Prism GT 802.11b/g Adapter\n\t3642  Prism 2.x 802.11b Adapter\n09ab  Japan Cash Machine Co., Ltd.\n09ae  Tripp Lite\n\t0002  Any Device (see discussion)\n09b0  Fargo\n\t2400  HDP5000\n09b2  Franklin Electronic Publishers, Inc.\n\t0001  eBookman Palm Computer\n09b3  Altius Solutions, Inc.\n09b4  MDS Telephone Systems\n09b5  Celltrix Technology Co., Ltd\n09bc  Grundig\n\t0002  MPaxx MP150 MP3 Player\n09be  MySmart.Com\n\t0001  MySmartPad\n09bf  Auerswald GmbH & Co. KG\n\t00c0  COMpact 2104 ISDN PBX\n\t00db  COMpact 4410/2206 ISDN\n\t00dc  COMpact 4406 DSL (PBX)\n\t00dd  COMpact 2204 (PBX)\n\t00de  COMpact 2104 (Rev.2 PBX)\n\t00e0  COMmander Business (PBX)\n\t00e2  COMmander Basic.2 (PBX)\n\t00f1  COMfort 2000 (System telephone)\n\t00f2  COMfort 1200 (System telephone)\n\t00f5  COMfortel 2500 (System telephone)\n\t8000  COMpact 2104 DSL (DSL modem)\n\t8001  COMpact 4406 DSL (DSL modem)\n\t8002  Analog/ISDN Converter (Line converter)\n\t8005  WG-640 (Automatic event dialer)\n09c0  Genpix Electronics, LLC\n\t0136  Axon CNS, MultiClamp 700B\n\t0202  8PSK DVB-S tuner\n\t0203  Skywalker-1 DVB-S tuner\n\t0204  Skywalker-CW3K DVB-S tuner\n\t0205  Skywalker-CW3K DVB-S tuner\n\t0206  Skywalker-2 DVB-S tuner\n09c1  Arris Interactive LLC\n\t1337  TOUCHSTONE DEVICE\n09c2  Nisca Corp.\n09c3  HID Global\n\t0007  Reader V2\n\t0008  ZFG-9800-AC SmartCard Reader\n\t0014  ActivIdentity ActivKey SIM USB Token\n\t0028  Crescendo Key\n\t0029  Crescendo Key\n\t002a  Crescendo Key\n\t002b  Crescendo Key\n\t002c  Crescendo Key\n\t002e  Crescendo Key\n09c4  ACTiSYS Corp.\n\t0011  ACT-IR2000U IrDA Dongle\n09c5  Memory Corp.\n09ca  BMC Messsysteme GmbH\n\t5544  PIO\n09cb  FLIR Systems\n\t1001  Network Adapter\n\t1002  Ex-Series RNDIS interface\n\t1004  Ex-Series UVC interface\n\t1005  Ex-Series RNDIS and UVC interface\n\t1006  Ex-Series RNDIS and MSD interface\n\t1007  Ex-Series UVC and MSD interface\n\t1008  Serial Port\n\t1996  FLIR ONE Camera\n\t4007  Breach\n09cc  Workbit Corp.\n\t0404  BAFO USB-ATA/ATAPI Bridge Controller\n09cd  Psion Dacom Home Networks, Ltd\n\t2001  Psion WaveFinder DAB radio receiver\n09ce  City Electronics, Ltd\n09cf  Electronics Testing Center, Taiwan\n09d1  NeoMagic, Inc.\n09d2  Vreelin Engineering, Inc.\n09d3  Com One\n\t0001  ISDN TA / Light Rider 128K\n\t000b  Bluetooth Adapter class 2\n09d7  Hexagon NovAtel Inc.\n\t0100  GPS/GNSS/SPAN sensor\n09d8  ELATEC GmbH\n\t0320  TWN3 Multi125\n\t0406  TWN4 MIFARE NFC\n\t0410  TWN4 HID\n\t0420  TWN4 CDC\n09d9  KRF Tech, Ltd\n09da  A4Tech Co., Ltd.\n\t0006  Optical Mouse WOP-35 / Trust 450L Optical Mouse\n\t000a  Optical Mouse Opto 510D / OP-620D\n\t000e  X-F710F Optical Mouse 3xFire Gaming Mouse\n\t0018  Trust Human Interface Device\n\t001a  Wireless Mouse & RXM-15 Receiver\n\t002a  Wireless Optical Mouse NB-30\n\t0103  Oscar X-710BK Gaming Mouse\n\t022b  Wireless Mouse (Battery Free)\n\t024f  RF Receiver and G6-20D Wireless Optical Mouse\n\t0260  KV-300H Isolation Keyboard\n\t032b  Wireless Mouse (Battery Free)\n\t09da  Bloody V8 Mouse\n\t1068  Bloody A90 Mouse\n\t112c  Bloody V5 Mouse\n\t2268  Keyboard (FK11)\n\t2690  PK-635G\n\t3a60  Bloody V8M Core 2 Mouse\n\t8090  X-718BK Oscar Optical Gaming Mouse\n\t9033  X-718BK Optical Mouse\n\t9066  F3 V-Track Gaming Mouse\n\t9090  XL-730K / XL-747H / XL-750BK / XL-755BK Mice\n\tf613  Bloody V7M Mouse\n\tf6cc  B314 Light Strike Gaming Keyboard\n\tfa44  B930 Light Strike RGB Mechanical Gaming Keyboard\n09db  Measurement Computing Corp.\n\t0075  MiniLab 1008\n\t0076  PMD-1024\n\t007a  PMD-1208LS\n\t0081  USB-1616FS\n\t0082  USB-1208FS\n\t0088  USB-1616FS internal hub\n09dc  Aimex Corp.\n09dd  Fellowes, Inc.\n09df  Addonics Technologies Corp.\n09e1  Intellon Corp.\n\t5121  MicroLink dLAN\n09e5  Jo-Dan International, Inc.\n09e6  Silutia, Inc.\n09e7  Real 3D, Inc.\n09e8  AKAI  Professional M.I. Corp.\n\t0029  APC40 mkII\n\t0045  MPK Mini Mk II MIDI Controller\n\t0062  MPD16 MIDI Pad Controller Unit\n\t006d  EWI electronic wind instrument\n\t0071  MPK25 MIDI Keyboard\n\t0076  LPK25 MIDI Keyboard\n\t007c  MPK Mini MIDI Controller\n09e9  Chen-Source, Inc.\n09eb  IM Networks, Inc.\n\t4331  iRhythm Tuner Remote\n09ef  Xitel\n\t0101  MD-Port DG2 MiniDisc Interface\n09f3  GoFlight, Inc.\n\t0018  GF-46 Multi-Mode Display Module\n\t0028  RP-48 Combination Pushbutton-Rotary Module\n\t0048  LGTII - Landing Gear and Trim Control Module\n\t0064  MCPPro - Airliner Mode Control Panel (Autopilot)\n\t0300  EFIS - Electronic Flight Information System\n09f5  AresCom\n\t0168  Network Adapter\n\t0188  LAN Adapter\n\t0850  Adapter\n09f6  RocketChips, Inc.\n09f7  Edu-Science (H.K.), Ltd\n09f8  SoftConnex Technologies, Inc.\n09f9  Bay Associates\n09fa  Mtek Vision\n09fb  Altera\n\t6001  Blaster\n09ff  Gain Technology Corp.\n0a00  Liquid Audio\n0a01  ViA, Inc.\n0a05  Unknown Manufacturer\n\t0001  Hub\n\t7211  hub\n0a07  Ontrak Control Systems Inc.\n\t0064  ADU100 Data Acquisition Interface\n\t0078  ADU120 Data Acquisition Interface\n\t0082  ADU130 Data Acquisition Interface\n\t00c8  ADU200 Relay I/O Interface\n\t00d0  ADU208 Relay I/O Interface\n\t00da  ADU218 Solid-State Relay I/O Interface\n0a0b  Cybex Computer Products Co.\n0a0d  Servergy, Inc\n\t2514  CTS-1000 Internal Hub\n0a11  Xentec, Inc.\n0a12  Cambridge Silicon Radio, Ltd\n\t0001  Bluetooth Dongle (HCI mode)\n\t0002  Frontline Test Equipment Bluetooth Device\n\t0003  Nanosira\n\t0004  Nanosira WHQL Reference Radio\n\t0005  Nanosira-Multimedia\n\t0006  Nanosira-Multimedia WHQL Reference Radio\n\t0007  Nanosira3-ROM\n\t0008  Nanosira3-ROM\n\t0009  Nanosira4-EDR WHQL Reference Radio\n\t000a  Nanosira4-EDR-ROM\n\t000b  Nanosira5-ROM\n\t0042  SPI Converter\n\t0043  Bluetooth Device\n\t0100  Casira with BlueCore2-External Module\n\t0101  Casira with BlueCore2-Flash Module\n\t0102  Casira with BlueCore3-Multimedia Module\n\t0103  Casira with BlueCore3-Flash Module\n\t0104  Casira with BlueCore4-External Module\n\t0105  Casira with BlueCore4-Multimedia Module\n\t1000  Bluetooth Dongle (HID proxy mode)\n\t1010  Bluetooth Device\n\t1011  Bluetooth Device\n\t1012  Bluetooth Device\n\t1243  CSRA64210 [TaoTronics Headset BH-22 in charging mode]\n\t4007  Mpow HC5 Headset in charging mode - HID / Mass Storage\n\t4010  Mpow HC5 Headset in charging mode - USB Hub\n\tffff  USB Bluetooth Device in DFU State\n0a13  Telebyte, Inc.\n0a14  Spacelabs Medical, Inc.\n0a15  Scalar Corp.\n0a16  Trek Technology (S) PTE, Ltd\n\t1111  ThumbDrive\n\t8888  IBM USB Memory Key\n\t9988  Trek2000 TD-G2\n0a17  Pentax Corp.\n\t0004  Optio 330\n\t0006  Optio S / S4\n\t0007  Optio 550\n\t0009  Optio 33WR\n\t000a  Optio 555\n\t000c  Optio 43WR (mass storage mode)\n\t000d  Optio 43WR\n\t0015  Optio S40/S5i\n\t003b  Optio 50 (mass storage mode)\n\t003d  Optio S55\n\t0041  Optio S5z\n\t0043  *ist DL\n\t0047  Optio S60\n\t0052  Optio 60 Digital Camera\n\t006e  K10D\n\t0070  K100D\n\t0093  K200D\n\t00a7  Optio E50\n\t1001  EI2000 Camera powered by Digita!\n0a18  Heidelberger Druckmaschinen AG\n0a19  Hua Geng Technologies, Inc.\n0a21  Medtronic Physio Control Corp.\n\t8001  MMT-7305WW [Medtronic Minimed CareLink]\n0a22  Century Semiconductor USA, Inc.\n0a27  Datacard Group\n\t0102  SP35\n0a2c  AK-Modul-Bus Computer GmbH\n\t0008  GPIO Ports\n0a34  TG3 Electronics, Inc.\n\t0101  TG82tp\n\t0110  Deck 82-key backlit keyboard\n0a35  Radikal Technologies\n\t002a  SAC - Software Assigned Controller\n\t008a  SAC Hub\n0a38  IRIS sa\n0a39  Gilat Satellite Networks, Ltd\n0a3a  PentaMedia Co., Ltd\n\t0163  KN-W510U 1.0 Wireless LAN Adapter\n0a3c  NTT DoCoMo, Inc.\n0a3d  Varo Vision\n0a3f  Swissonic AG\n0a43  Boca Systems, Inc.\n0a46  Davicom Semiconductor, Inc.\n\t0268  ST268\n\t6688  ZT6688 Fast Ethernet Adapter\n\t8515  ADMtek ADM8515 NIC\n\t9000  DM9000E Fast Ethernet Adapter\n\t9601  DM9601 Fast Ethernet Adapter\n0a47  Hirose Electric\n0a48  I/O Interconnect\n\t3233  Multimedia Card Reader\n\t3239  Multimedia Card Reader\n\t3258  Dane Elec zMate SD Reader\n\t3259  Dane Elec zMate CF Reader\n\t5000  MediaGear xD-SM\n\t500a  Mass Storage Device\n\t500f  Mass Storage Device\n\t5010  Mass Storage Device\n\t5011  Mass Storage Device\n\t5014  Mass Storage Device\n\t5020  Mass Storage Device\n\t5021  Mass Storage Device\n\t5022  Mass Storage Device\n\t5023  Mass Storage Device\n\t5024  Mass Storage Device\n\t5025  Mass Storage Device\n0a4a  Ploytec GmbH\n\ta400  AUDIO JUNCTION 2.0\n0a4b  Fujitsu Media Devices, Ltd\n0a4c  Computex Co., Ltd\n\t15d9  OPTICAL MOUSE\n0a4d  Evolution Electronics, Ltd\n\t0064  MK-225 Driver\n\t0065  MK-225C Driver\n\t0066  MK-225C Driver\n\t0067  MK-425C Driver\n\t0078  MK-37 Driver\n\t0079  MK-37C Driver\n\t007a  MK-37C Driver\n\t008c  TerraTec MIDI MASTER\n\t008d  MK-249C Driver\n\t008e  MK-249C MIDI Keyboard\n\t008f  MK-449C Driver\n\t0090  Keystation 49e Driver\n\t0091  Keystation 61es Driver\n\t00a0  MK-361 Driver\n\t00a1  MK-361C Driver\n\t00a2  MK-361C Driver\n\t00a3  MK-461C MIDI Keyboard\n\t00b5  Keystation Pro 88 Driver\n\t00d2  E-Keys Driver\n\t00f0  UC-16 Driver\n\t00f1  X-Session Driver\n\t00f5  UC-33e MIDI Controller\n0a4e  Steinberg Soft-und Hardware GmbH\n0a4f  Litton Systems, Inc.\n0a50  Mimaki Engineering Co., Ltd\n0a51  Sony Electronics, Inc.\n0a52  Jebsee Electronics Co., Ltd\n0a53  Portable Peripheral Co., Ltd\n\t1000  Scanner\n\t2000  Q-Scan A6 Scanner\n\t2001  Q-Scan A6 Scanner\n\t2013  Media Drive A6 Scanner\n\t2014  Media Drive A6 Scanner\n\t2015  BizCardReader 600C\n\t2016  BizCardReader 600C\n\t202a  Scanshell-CSSN\n\t3000  Q-Scan A8 Scanner\n\t3002  Q-Scan A8 Reader\n\t3015  BizCardReader 300G\n\t302a  LM9832 - PA570 Mini Business Card Scanner [Targus]\n\t5001  BizCardReader 900C\n0a5a  Electronics For Imaging, Inc.\n0a5b  EAsics NV\n0a5c  Broadcom Corp.\n\t0201  iLine10(tm) Network Adapter\n\t0bdc  802.11a/b/g/n/ac Wireless Adapter\n\t2000  Bluetooth Device\n\t2001  Bluetooth Device\n\t2009  BCM2035 Bluetooth\n\t200a  BCM2035 Bluetooth dongle\n\t200f  Bluetooth Controller\n\t201d  Bluetooth Device\n\t201e  IBM Integrated Bluetooth IV\n\t2020  Bluetooth dongle\n\t2021  BCM2035B3 Bluetooth Adapter\n\t2033  BCM2033 Bluetooth\n\t2035  BCM2035 Bluetooth\n\t2038  Blutonium Device\n\t2039  BCM2045 Bluetooth\n\t2045  Bluetooth Controller\n\t2046  Bluetooth Device\n\t2047  Bluetooth Device\n\t205e  Bluetooth Device\n\t2100  Bluetooth 2.0+eDR dongle\n\t2101  BCM2045 Bluetooth\n\t2102  ANYCOM Blue USB-200/250\n\t2110  BCM2045B (BDC-2) [Bluetooth Controller]\n\t2111  ANYCOM Blue USB-UHE 200/250\n\t2120  2045 Bluetooth 2.0 USB-UHE Device with trace filter\n\t2121  BCM2210 Bluetooth\n\t2122  Bluetooth 2.0+EDR dongle\n\t2123  Bluetooth dongle\n\t2130  2045 Bluetooth 2.0 USB-UHE Device with trace filter\n\t2131  2045 Bluetooth 2.0 Device with trace filter\n\t2145  BCM2045B (BDC-2.1) [Bluetooth Controller]\n\t2148  BCM92046DG-CL1ROM Bluetooth 2.1 Adapter\n\t2150  BCM2046 Bluetooth Device\n\t2151  Bluetooth\n\t2154  BCM92046DG-CL1ROM Bluetooth 2.1 UHE Dongle\n\t216a  BCM43142A0 Bluetooth\n\t216c  BCM43142A0 Bluetooth Device\n\t216d  BCM43142A0 Bluetooth 4.0\n\t216f  BCM20702A0 Bluetooth\n\t217d  HP Bluethunder\n\t217f  BCM2045B (BDC-2.1)\n\t2198  Bluetooth 3.0 Device\n\t219b  Bluetooth 2.1 Device\n\t219c  BCM2070 Bluetooth\n\t21b1  HP Bluetooth Module\n\t21b4  BCM2070 Bluetooth 2.1 + EDR\n\t21b9  BCM2070 Bluetooth 2.1 + EDR\n\t21ba  BCM2070 Bluetooth 2.1 + EDR\n\t21bb  BCM2070 Bluetooth 2.1 + EDR\n\t21bc  BCM2070 Bluetooth 2.1 + EDR\n\t21bd  BCM2070 Bluetooth 2.1 + EDR\n\t21d7  BCM43142 Bluetooth 4.0\n\t21e1  HP Portable SoftSailing\n\t21e3  HP Portable Valentine\n\t21e6  BCM20702 Bluetooth 4.0 [ThinkPad]\n\t21e8  BCM20702A0 Bluetooth 4.0\n\t21ec  BCM20702A0 Bluetooth 4.0\n\t21f1  HP Portable Bumble Bee\n\t22be  BCM2070 Bluetooth 3.0 + HS\n\t4500  BCM2046B1 USB 2.0 Hub (part of BCM2046 Bluetooth)\n\t4502  Keyboard (Boot Interface Subclass)\n\t4503  Mouse (Boot Interface Subclass)\n\t5800  BCM5880 Secure Applications Processor\n\t5801  BCM5880 Secure Applications Processor with fingerprint swipe sensor\n\t5802  BCM5880 Secure Applications Processor with fingerprint touch sensor\n\t5803  BCM5880 Secure Applications Processor with secure keyboard\n\t5804  BCM5880 Secure Applications Processor with fingerprint swipe sensor\n\t5832  BCM5880 Secure Applications Processor Smartcard reader\n\t5843  BCM58200 ControlVault 3 (FingerPrint sensor + Contacted SmartCard)\n\t6300  Pirelli Remote NDIS Device\n\t6410  BCM20703A1 Bluetooth 4.1 + LE\n\tbd11  BCM4320 802.11bg Wireless Adapter\n\tbd12  BCM4326U 802.11bg Wireless Adapter\n\tbd13  BCM4323 802.11abgn Wireless Adapter\n\tbd16  BCM4319 802.11bgn Wireless Adapter\n\tbd17  BCM43236 802.11abgn Wireless Adapter\n\tbd1d  BCM43526 802.11a/b/g/n/ac (2x2) Wireless Adapter\n\tbd1e  BCM43143 802.11bgn (1x1) Wireless Adapter\n\tbd1f  BCM43242 802.11abgn Wireless Adapter\n\td11b  Eminent EM4045 [Broadcom 4320 USB]\n0a5d  Diatrend Corp.\n0a5f  Zebra Technologies\n\t0009  LP2844 Printer\n\t0027  ZTC LP2844-Z-200dpi\n\t0050  P120i / WM120i\n\t0062  GK420d Label Printer\n\t0065  ZM400 Label Printer\n\t0080  GK420d Label Printer\n\t0081  GK420t Label Printer\n\t0084  GX420d Desktop Label Printer\n\t008b  HC100 wristbands Printer\n\t008c  ZP 450 Printer\n\t00a1  TLP2824 Plus\n\t00d1  GC420d Label Printer\n\t0110  ZD500 Desktop Label Printer\n\t011c  ZD410 Direct Thermal Label Printer\n\t0141  ZD620\n\t0172  ZT411 Barcode Label Printer\n\t930a  Printer\n0a62  MPMan\n\t0010  MPMan MP-F40 MP3 Player\n0a66  ClearCube Technology\n0a67  Medeli Electronics Co., Ltd\n\tffff  LCS Audio\n0a68  Comaide Corp.\n0a69  Chroma ate, Inc.\n0a6b  Green House Co., Ltd\n\t0001  Compact Flash R/W with MP3 player\n\t000f  FlashDisk\n0a6c  Integrated Circuit Systems, Inc.\n0a6d  UPS Manufacturing\n0a6e  Benwin\n0a6f  Core Technology, Inc.\n\t0400  Xanboo\n0a70  International Game Technology\n0a71  VIPColor Technologies USA, Inc.\n\t0001  VP485 Printer\n0a72  Sanwa Denshi\n0a73  Mackie Designs\n\t0002  XD-2 [Spike]\n0a7d  NSTL, Inc.\n0a7e  Octagon Systems Corp.\n0a80  Rexon Technology Corp., Ltd\n0a81  Chesen Electronics Corp.\n\t0101  Keyboard\n\t0103  Keyboard\n\t0203  Mouse\n\t0205  PS/2 Keyboard+Mouse Adapter\n\t0701  USB Missile Launcher\n\tff01  Wireless Missile Launcher\n0a82  Syscan\n\t4600  TravelScan 460/464\n\t6605  ScanShell 800N\n0a83  NextComm, Inc.\n0a84  Maui Innovative Peripherals\n0a85  Idexx Labs\n0a86  NITGen Co., Ltd\n0a89  Aktiv\n\t0001  Guardant Stealth/Net\n\t0002  Guardant ID\n\t0003  Guardant Stealth 2\n\t0004  Rutoken\n\t0005  Guardant Fidus\n\t0006  Guardant Stealth 3\n\t0007  Guardant Stealth 2\n\t0008  Guardant Stealth 3 Sign/Time\n\t0009  Guardant Code\n\t000a  Guardant Sign Pro\n\t000b  Guardant Sign Pro HID\n\t000c  Guardant Stealth 3 Sign/Time\n\t000d  Guardant Code HID\n\t000f  Guardant System Firmware Update\n\t0020  Rutoken S\n\t0025  Rutoken lite\n\t0026  Rutoken lite HID\n\t002a  Rutoken Mass Storage\n\t002b  Guardant Mass Storage\n\t0030  Rutoken ECP\n\t0040  Rutoken ECP HID\n\t0060  Rutoken Magistra\n\t0061  Rutoken Magistra\n\t0069  Reader\n\t0080  Rutoken PinPad Ex\n\t0081  Rutoken PinPad In\n\t0082  Rutoken PinPad 2\n0a8d  Picturetel\n0a8e  Japan Aviation Electronics Industry, Ltd\n\t2011  Filter Driver For JAE XMC R/W\n0a90  Candy Technology Co., Ltd\n0a91  Globlink Technology, Inc.\n\t3801  Targus PAKP003 Mouse\n0a92  EGO SYStems, Inc.\n\t0011  SYS WaveTerminal U2A\n\t0021  GIGAPort\n\t0031  GIGAPortAG\n\t0053  AudioTrak Optoplay\n\t0061  Waveterminal U24\n\t0071  MAYA EX7\n\t0091  Maya 44\n\t00b1  MAYA EX5\n\t1000  MIDI Mate\n\t1010  RoMI/O\n\t1020  M4U\n\t1030  M8U\n\t1090  KeyControl49\n\t10a0  KeyControl25\n0a93  C Technologies AB\n\t0002  C-Pen 10\n\t0005  MyPen Light\n\t000d  Input Pen\n\t0010  C-Pen 20\n\t0a93  PayPen\n0a94  Intersense\n0aa3  Lava Computer Mfg., Inc.\n0aa4  Develco Elektronik\n0aa5  First International Digital\n\t0002  irock! 500 Series\n\t0801  MP3 Player\n0aa6  Perception Digital, Ltd\n\t0101  Hercules Jukebox\n\t1501  Store 'n' Go HD Drive\n0aa7  Wincor Nixdorf International GmbH\n\t0100  POS Keyboard, TA58P-USB\n\t0101  POS Keyboard, TA85P-USB\n\t0102  POS Keyboard, TA59-USB\n\t0103  POS Keyboard, TA60-USB\n\t0104  SNIkey Keyboard, SNIKey-KB-USB\n\t0200  Operator Display, BA63-USB\n\t0201  Operator Display, BA66-USB\n\t0202  Operator Display & Scanner, XiCheck-BA63\n\t0203  Operator Display & Scanner, XiCheck-BA66\n\t0204  Graphics Operator Display, BA63GV\n\t0300  POS Printer (printer class mode), TH210\n\t0301  POS Printer (native mode), TH210\n\t0302  POS Printer (printer class mode), TH220\n\t0303  POS Printer (native mode), TH220\n\t0304  POS Printer, TH230\n\t0305  Lottery Printer, XiPrintPlus\n\t0306  POS Printer (printer class mode), TH320\n\t0307  POS Printer (native mode), TH320\n\t0308  POS Printer (printer class mode), TH420\n\t0309  POS Printer (native mode), TH420\n\t030a  POS Printer, TH200B\n\t0400  Lottery Scanner, Xiscan S\n\t0401  Lottery Scanner, Xiscan 3\n\t0402  Programmable Magnetic Swipe Card Reader, MSRP-USB\n\t0500  IDE Adapter\n\t0501  Hub Printer Interface\n\t0502  Hub SNIKey Keyboard\n\t4304  Banking Printer TP07\n\t4305  Banking Printer TP07c\n\t4500  WN Central Special Electronics\n0aa8  TriGem Computer, Inc.\n\t0060  TG 11Mbps WLAN Mini Adapter\n\t1001  DreamComboM4100\n\t3002  InkJet Color Printer\n\t8001  TG_iMON\n\t8002  TG_KLOSS\n\ta001  TG_X2\n\ta002  TGVFD_KLOSS\n\tffda  iMON_VFD\n0aa9  Baromtec Co.\n\tf01b  Medion MD 6242 MP3 Player\n0aaa  Japan CBM Corp.\n0aab  Vision Shape Europe SA\n0aac  iCompression, Inc.\n0aad  Rohde & Schwarz GmbH & Co. KG\n\t0003  NRP-Z21\n\t000c  NRP-Z11\n\t0013  NRP-Z22\n\t0014  NRP-Z23\n\t0015  NRP-Z24\n\t0016  NRP-Z51\n\t0017  NRP-Z52\n\t0018  NRP-Z55\n\t0019  NRP-Z56\n\t0021  NRP-Z91\n\t0023  NRP-Z81\n\t002c  NRP-Z31\n\t002d  NRP-Z37\n\t002f  NRP-Z27\n\t0051  NRP-Z28\n\t0052  NRP-Z98\n\t0062  NRP-Z92\n\t0070  NRP-Z57\n\t0083  NRP-Z85\n\t0095  NRP-Z86\n\t0117  HMF / HMP / HMS-X / HMO series Oscilloscopes\n\t0118  HMF / HMP / HMS-X / HMO series Oscilloscopes\n\t0119  HMF / HMP / HMS-X / HMO series Oscilloscopes\n0aae  NEC infrontia Corp. (Nitsuko)\n0aaf  Digitalway Co., Ltd\n0ab0  Arrow Strong Electronics Co., Ltd\n0ab1  FEIG ELECTRONIC GmbH\n\t0002  OBID RFID-Reader\n\t0004  OBID classic-pro\n0aba  Ellisys\n\t8001  Tracker 110 Protocol Analyzer\n\t8002  Explorer 200 Protocol Analyzer\n0abe  Stereo-Link\n\t0101  SL1200 DAC\n0abf  Diolan\n\t3370  I2C/SPI Adapter - U2C-12\n0ac3  Sanyo Semiconductor Company Micro\n0ac4  Leco Corp.\n0ac5  I & C Corp.\n0ac6  Singing Electrons, Inc.\n0ac7  Panwest Corp.\n0ac8  Z-Star Microelectronics Corp.\n\t0301  Web Camera\n\t0302  ZC0302 Webcam\n\t0321  Vimicro generic vc0321 Camera\n\t0323  Luxya WC-1200 USB 2.0 Webcam\n\t0328  A4Tech PK-130MG\n\t0336  Elecom UCAM-DLQ30\n\t301b  ZC0301 Webcam\n\t303b  ZC0303 Webcam\n\t305b  ZC0305 Webcam\n\t307b  USB 1.1 Webcam\n\t332d  Vega USB 2.0 Camera\n\t3343  Sirius USB 2.0 Camera\n\t3370  Traveler TV 6500 SF Dia-scanner\n\t3420  Venus USB2.0 Camera\n\tc001  Sony embedded vimicro Camera\n\tc002  Visual Communication Camera VGP-VCC1\n\tc302  Vega USB 2.0 Camera\n\tc303  Saturn USB 2.0 Camera\n\tc326  Namuga 1.3M Webcam\n\tc33f  Webcam\n\tc412  Lenovo IdeaCentre Web Camera\n\tc429  Lenovo ThinkCentre Web Camera\n\tc42d  Lenovo IdeaCentre Web Camera\n0ac9  Micro Solutions, Inc.\n\t0000  Backpack CD-ReWriter\n\t0001  BACKPACK  2 Cable\n\t0010  BACKPACK CD Drive\n\t0011  Backpack 40GB Hard Drive\n\t0110  BACKPACK\n\t0111  BackPack\n\t10ff  BACKPACK\n\t1234  BACKPACK\n0aca  OPEN Networks Ltd\n\t1060  OPEN NT1 Plus II\n0acc  Koga Electronics Co.\n0acd  ID Tech\n\t0300  IDT1221U RS-232 Adapter\n\t0401  Spectrum III Hybrid Smartcard Reader\n\t0630  Spectrum III Mag-Only Insert Reader (SPT3-355 Series) USB-CDC\n\t0810  SecurePIN (IDPA-506100Y) PIN Pad\n\t2030  ValueMag Magnetic Stripe Reader\n\t3710  ViVOpay Kiosk III\n0ace  ZyDAS\n\t1201  ZD1201 802.11b\n\t1211  ZD1211 802.11g\n\t1215  ZD1211B 802.11g\n\t1221  ZD1221 802.11n\n\t1602  ZyXEL Omni FaxModem 56K\n\t1608  ZyXEL Omni FaxModem 56K UNO\n\t1611  ZyXEL Omni FaxModem 56K Plus\n\t2011  Virtual media for 802.11bg\n\t20ff  Virtual media for 802.11bg\n\ta211  ZD1211 802.11b/g Wireless Adapter\n\tb215  802.11bg\n0acf  Intoto, Inc.\n0ad0  Intellix Corp.\n0ad1  Remotec Technology, Ltd\n0ad2  Service & Quality Technology Co., Ltd\n0ada  Data Encryption Systems Ltd.\n\t0005  DK2\n0ae3  Allion Computer, Inc.\n0ae4  Taito Corp.\n0ae7  Neodym Systems, Inc.\n0ae8  System Support Co., Ltd\n0ae9  North Shore Circuit Design L.L.P.\n0aea  SciEssence, LLC\n0aeb  TTP Communications, Ltd\n0aec  Neodio Technologies Corp.\n\t2101  SmartMedia Card Reader\n\t2102  CompactFlash Card Reader\n\t2103  MMC/SD Card Reader\n\t2104  MemoryStick Card Reader\n\t2201  SmartMedia+CompactFlash Card Reader\n\t2202  SmartMedia+MMC/SD Card Reader\n\t2203  SmartMedia+MemoryStick Card Reader\n\t2204  CompactFlash+MMC/SD Card Reader\n\t2205  CompactFlash+MemoryStick Card Reader\n\t2206  MMC/SD+MemoryStick Card Reader\n\t2301  SmartMedia+CompactFlash+MMC/SD Card Reader\n\t2302  SmartMedia+CompactFlash+MemoryStick Card Reader\n\t2303  SmartMedia+MMC/SD+MemoryStick Card Reader\n\t2304  CompactFlash+MMC/SD+MemoryStick Card Reader\n\t3016  MMC/SD+Memory Stick Card Reader\n\t3050  ND3050 8-in-1 Card Reader\n\t3060  1.1 FS Card Reader\n\t3101  MMC/SD Card Reader\n\t3102  MemoryStick Card Reader\n\t3201  MMC/SD+MemoryStick Card Reader\n\t3216  HS Card Reader\n\t3260  ND3260 7-in-1 Card Reader\n\t5010  ND5010 Card Reader\n0af0  Option\n\t5000  UMTS Card\n\t6000  GlobeTrotter 3G datacard\n\t6300  GT 3G Quad UMTS/GPRS Card\n\t6600  GlobeTrotter 3G+ datacard\n\t6711  GlobeTrotter Express 7.2 v2\n\t6971  Globetrotter HSDPA Modem\n\t7251  Globetrotter HSUPA Modem (aka iCON HSUPA E)\n\t7501  Globetrotter HSUPA Modem (icon 411 aka \"Vodafone K3760\")\n\t7601  Globetrotter MO40x 3G Modem (GTM 382)\n\t7701  Globetrotter HSUPA Modem (aka icon 451)\n\td055  Globetrotter GI0505 [iCON 505]\n0af6  Silver I Co., Ltd\n0af7  B2C2, Inc.\n\t0101  Digital TV USB Receiver (DVB-S/T/C / ATSC)\n0af9  Hama, Inc.\n\t0010  USB SightCam 100\n\t0011  Micro Innovations IC50C Webcam\n0afa  DMC Co., Ltd.\n\t07d2  Controller Board for Projected Capacitive Touch Screen DUS3000\n0afc  Zaptronix Ltd\n0afd  Tateno Dennou, Inc.\n0afe  Cummins Engine Co.\n0aff  Jump Zone Network Products, Inc.\n0b00  INGENICO\n0b05  ASUSTek Computer, Inc.\n\t0001  MeMO Pad HD 7 (CD-ROM mode)\n\t0301  MyPal A696 GPS PDA\n\t1101  Mass Storage (UISDMC4S)\n\t1706  WL-167G v1 802.11g Adapter [Ralink RT2571]\n\t1707  WL-167G v1 802.11g Adapter [Ralink RT2571]\n\t1708  Mass Storage Device\n\t170b  Multi card reader\n\t170c  WL-159g 802.11bg [ZyDAS ZD1211B+AL2230]\n\t170d  802.11b/g Wireless Network Adapter\n\t1712  BT-183 Bluetooth 2.0+EDR adapter\n\t1715  2045 Bluetooth 2.0 Device with trace filter\n\t1716  Bluetooth Device\n\t1717  WL169gE 802.11g Adapter [Broadcom 4320 USB]\n\t171b  A9T wireless 802.11bg\n\t171c  802.11b/g Wireless Network Adapter\n\t171f  My Cinema U3000 Mini [DiBcom DiB7700P]\n\t1723  WL-167G v2 802.11g Adapter [Ralink RT2571W]\n\t1724  RT2573\n\t1726  Laptop OLED Display\n\t172a  802.11n Network Adapter\n\t172b  802.11n Network Adapter\n\t1731  802.11n Network Adapter\n\t1732  802.11n Network Adapter\n\t1734  AF-200\n\t173c  BT-183 Bluetooth 2.0\n\t173f  My Cinema U3100 Mini\n\t1742  802.11n Network Adapter\n\t1743  Xonar U1 Audio Station\n\t1751  BT-253 Bluetooth Adapter\n\t175b  Laptop OLED Display\n\t1760  802.11n Network Adapter\n\t1761  USB-N11 802.11n Network Adapter [Ralink RT2870]\n\t1774  Gobi Wireless Modem (QDL mode)\n\t1776  Gobi Wireless Modem\n\t1779  My Cinema U3100 Mini Plus [AF9035A]\n\t1784  USB-N13 802.11n Network Adapter (rev. A1) [Ralink RT3072]\n\t1786  USB-N10 802.11n Network Adapter [Realtek RTL8188SU]\n\t1788  BT-270 Bluetooth Adapter\n\t1791  WL-167G v3 802.11n Adapter [Realtek RTL8188SU]\n\t179c  Bluetooth Adapter\n\t179d  USB-N53 802.11abgn Network Adapter [Ralink RT3572]\n\t179e  Eee Note EA800 (network mode)\n\t179f  Eee Note EA800 (tablet mode)\n\t17a0  Xonar U3 sound card\n\t17a1  Eee Note EA800 (mass storage mode)\n\t17ab  USB-N13 802.11n Network Adapter (rev. B1) [Realtek RTL8192CU]\n\t17b5  Broadcom BCM20702A0 Bluetooth\n\t17ba  N10 Nano 802.11n Network Adapter [Realtek RTL8192CU]\n\t17c2  ROG Spitfire\n\t17c7  WL-330NUL\n\t17c9  USB-AC53 802.11a/b/g/n/ac Wireless Adapter [Broadcom BCM43526]\n\t17cb  Broadcom BCM20702A0 Bluetooth\n\t17d1  AC51 802.11a/b/g/n/ac Wireless Adapter [Mediatek MT7610U]\n\t17d2  USB-AC56 802.11a/b/g/n/ac Wireless Adapter [Realtek RTL8812AU]\n\t17d3  USB-N10 v2 802.11b/g/n Wireless Adapter [MediaTek MT7601U]\n\t17db  USB-AC50 802.11a/b/g/n/ac (1x1) Wireless Adapter [MediaTek MT7610U]\n\t17e8  USB-N14 802.11b/g/n (2x2) Wireless Adapter [Ralink RT5372]\n\t17eb  USB-AC55 802.11a/b/g/n/ac Wireless Adapter [MediaTek MT7612U]\n\t17f5  Xonar U5 sound card\n\t180a  Broadcom BCM20702 Single-Chip Bluetooth 4.0 + LE\n\t1817  USB-AC68 802.11a/b/g/n/ac (4x4) Wireless Adapter [Realtek RTL8814AU]\n\t1825  Qualcomm Bluetooth 4.1\n\t18f0  Realtek 8188EUS [USB-N10 Nano]\n\t4c80  Transformer Pad TF300TG\n\t4c90  Transformer Pad Infinity TF700\n\t4c91  Transformer Pad Infinity TF700 (Debug mode)\n\t4ca0  Transformer Pad TF701T\n\t4ca1  Transformer Pad TF701T (Debug mode)\n\t4d00  Transformer Prime TF201\n\t4d01  Transformer Prime TF201 (debug mode)\n\t4daf  Transformer Pad Infinity TF700 (Fastboot)\n\t5410  MeMO Pad HD 7 (MTP mode)\n\t5412  MeMO Pad HD 7 (PTP mode)\n\t550f  Fonepad 7\n\t6101  Cable Modem\n\t620a  Remote NDIS Device\n\t7772  Zenfone GO (ZB500KL) (MTP mode)\n\t7773  Zenfone GO (ZB500KL) (Debug, MTP mode)\n\t7774  Zenfone GO (ZB500KL) (RNDIS mode)\n\t7775  Zenfone GO (ZB500KL) (Debug, RNDIS mode)\n\t7776  Zenfone GO (ZB500KL) (PTP mode)\n\t7777  Zenfone GO (ZB500KL) (Debug, PTP mode)\n\tb700  Broadcom Bluetooth 2.1\n0b0b  Datamax-O'Neil\n\t106e  Datamax E-4304\n0b0c  Todos AB\n\t0009  Todos Argos Mini II Smart Card Reader\n\t001e  e.dentifier2 (ABN AMRO electronic banking card reader NL)\n\t002e  C200 smartcard controller (Nordea card reader)\n\t003f  Todos C400 smartcard controller (Handelsbanken card reader)\n\t0050  Argos Mini II Smart Card Reader (CCID)\n0b0d  ProjectLab\n\t0000  CenturyCD\n0b0e  GN Netcom\n\t0301  Jabra EVOLVE 20\n\t0305  Jabra EVOLVE Link MS\n\t030c  Jabra EVOLVE 65\n\t0311  Jabra EVOLVE 65\n\t0312  enc060:Buttons Volume up/down/mute + phone [Jabra]\n\t0343  Jabra UC VOICE 150a\n\t0348  Jabra UC VOICE 550a MS\n\t034c  Jabra UC Voice 750 MS\n\t034d  Jabra UC VOICE 750\n\t0410  Jabra SPEAK 410\n\t0420  Jabra SPEAK 510\n\t0422  Jabra SPEAK 510 USB\n\t0933  Jabra Freeway\n\t094d  GN Netcom / Jabra REVO Wireless\n\t1017  Jabra PRO 930\n\t1022  Jabra PRO 9450, Type 9400BS (DECT Headset)\n\t1041  Jabra PRO 9460\n\t1900  Jabra Biz 1900\n\t2007  GN 2000 Stereo Corded Headset\n\t2456  Jabra SPEAK 810\n\t245e  Jabra Link 370\n\t248a  Jabra Elite 85h\n\t24b8  Jabra Evolve2 65\n\t24bb  Jabra Evolve2 85\n\t24c9  Jabra Link 380\n\t24ca  Jabra Link 380\n\t620c  Jabra BT620s\n\t9330  Jabra GN9330 Headset\n\ta346  Jabra Engage 75 Stereo\n\ta50a  Alienware Wireless Gaming Headset AW988\n0b0f  AVID Technology\n\t0400  DNxID\n0b10  Pcally\n0b11  I Tech Solutions Co., Ltd\n0b1e  Electronic Warfare Assoc., Inc. (EWA)\n\t8007  Blackhawk USB560-BP JTAG Emulator\n0b1f  Insyde Software Corp.\n0b20  TransDimension, Inc.\n0b21  Yokogawa Electric Corp.\n0b22  Japan System Development Co., Ltd\n0b23  Pan-Asia Electronics Co., Ltd\n0b24  Link Evolution Corp.\n0b27  Ritek Corp.\n0b28  Kenwood Corp.\n0b2c  Village Center, Inc.\n0b30  PNY Technologies, Inc.\n\t0006  SM Media-Shuttle Card Reader\n0b33  Contour Design, Inc.\n\t0020  ShuttleXpress\n\t0030  ShuttlePro v2\n\t0401  RollerMouse Free 2\n\t0700  RollerMouse Pro\n\t08a0  Perfit Mouse\n\t1000  RollerMouse Red\n\t1010  Vidamic Technomouse IQ\n0b37  Hitachi ULSI Systems Co., Ltd\n0b38  Gear Head\n\t0003  Keyboard\n\t0010  107-Key Keyboard\n0b39  Omnidirectional Control Technology, Inc.\n\t0001  Composite USB PS2 Converter\n\t0109  USB TO Ethernet\n\t0421  Serial\n\t0801  USB-Parallel Bridge\n\t0901  OCT To Fast Ethernet Converter\n\t0c03  LAN DOCK Serial Converter\n0b3a  IPaxess\n0b3b  Tekram Technology Co., Ltd\n\t0163  TL-WN320G 1.0 WLAN Adapter\n\t1601  Allnet 0193 802.11b Adapter\n\t1602  ZyXEL ZyAIR B200 802.11b Adapter\n\t1612  AIR.Mate 2@net 802.11b Adapter\n\t1613  802.11b Wireless LAN Adapter\n\t1620  Allnet Wireless Network Adapter [Envara WiND512]\n\t1630  QuickWLAN 802.11bg\n\t5630  802.11bg\n\t6630  ZD1211\n0b3c  Olivetti Techcenter\n\ta010  Simple_Way Printer/Scanner/Copier\n\tc000  Olicard 100\n\tc700  Olicard 100 (Mass Storage mode)\n0b3e  Kikusui Electronics Corp.\n0b41  Hal Corp.\n\t0011  Crossam2+USB IR commander\n0b43  Play.com, Inc.\n\t0003  PS2 Controller Converter\n\t0005  GameCube Adaptor\n0b47  Sportbug.com, Inc.\n0b48  TechnoTrend AG\n\t1003  Technotrend/Hauppauge USB-Nova\n\t1004  TT-PCline\n\t1005  Technotrend/Hauppauge USB-Nova\n\t1006  Technotrend/Hauppauge DEC3000-s\n\t1007  TT-micro plus Device\n\t1008  Technotrend/Hauppauge DEC2000-t\n\t1009  Technotrend/Hauppauge DEC2540-t\n\t3001  DVB-S receiver\n\t3002  DVB-C receiver\n\t3003  DVB-T receiver\n\t3004  TT TV-Stick\n\t3005  TT TV-Stick (8kB EEPROM)\n\t3006  TT-connect S-2400 DVB-S receiver\n\t3007  TT-connect S2-3600\n\t3008  TT-connect\n\t3009  TT-connect S-2400 DVB-S receiver (8kB EEPROM)\n\t300a  TT-connect S2-3650 CI\n\t300b  TT-connect C-3650 CI\n\t300c  TT-connect T-3650 CI\n\t300d  TT-connect CT-3650 CI\n\t300e  TT-connect C-2400\n\t3011  TT-connect S2-4600\n\t3012  TT-connect CT2-4650 CI\n\t3014  TT-TVStick CT2-4400\n\t3015  TT-connect CT2-4650 CI\n\t3017  TT-connect S2-4650 CI\n0b49  ASCII Corp.\n\t064f  Trance Vibrator\n0b4b  Pine Corp. Ltd.\n\t0100  D'music MP3 Player\n0b4d  Graphtec America, Inc.\n\t110a  Graphtec CC200-20\n\t1123  Electronic Cutting Tool [Silhouette Portrait]\n0b4e  Musical Electronics, Ltd\n\t6500  MP3 Player\n\t8028  MP3 Player\n\t8920  MP3 Player\n0b50  Dumpries Co., Ltd\n0b51  Comfort Keyboard Co.\n\t0020  Comfort Keyboard\n0b52  Colorado MicroDisplay, Inc.\n0b54  Sinbon Electronics Co., Ltd\n0b56  TYI Systems, Ltd\n0b57  Beijing HanwangTechnology Co., Ltd\n0b59  Lake Communications, Ltd\n0b5a  Corel Corp.\n0b5f  Green Electronics Co., Ltd\n0b60  Nsine, Ltd\n0b61  NEC Viewtechnology, Ltd\n0b62  Orange Micro, Inc.\n\t000b  Bluetooth Device\n\t0059  iBOT2 Webcam\n0b63  ADLink Technology, Inc.\n0b64  Wonderful Wire Cable Co., Ltd\n0b65  Expert Magnetics Corp.\n0b66  Cybiko Inc.\n\t0041  Xtreme\n0b67  Fairbanks Scales\n\t555e  SCB-R9000\n0b69  CacheVision\n0b6a  Maxim Integrated Products\n\ta132  WUP-005 [Nintendo Wii U Pro Controller]\n0b6f  Nagano Japan Radio Co., Ltd\n0b70  PortalPlayer, Inc.\n\t00ba  iRiver H10 20GB\n0b71  SHIN-EI Sangyo Co., Ltd\n0b72  Embedded Wireless Technology Co., Ltd\n0b73  Computone Corp.\n0b75  Roland DG Corp.\n0b79  Sunrise Telecom, Inc.\n0b7a  Zeevo, Inc.\n\t07d0  Bluetooth Dongle\n0b7b  Taiko Denki Co., Ltd\n0b7c  ITRAN Communications, Ltd\n0b7d  Astrodesign, Inc.\n0b81  id3 Technologies\n\t0001  Biothentic II smartcard reader with fingerprint sensor\n\t0002  DFU-Enabled Devices (DFU)\n\t0012  BioPAD biometric module (DFU + CDC)\n\t0102  Certis V1 fingerprint reader\n\t0103  Certis V2 fingerprint reader\n\t0200  CL1356T / CL1356T5 / CL1356A smartcard readers (CCID)\n\t0201  CL1356T / CL1356T5 / CL1356A smartcard readers (DFU + CCID)\n\t0220  CL1356A FFPJP smartcard reader (CCID + HID)\n\t0221  CL1356A smartcard reader (DFU + CCID + HID)\n0b84  Rextron Technology, Inc.\n0b85  Elkat Electronics, Sdn., Bhd.\n0b86  Exputer Systems, Inc.\n\t5100  XMC5100 Zippy Drive\n\t5110  XMC5110 Flash Drive\n\t5200  XMC5200 Zippy Drive\n\t5201  XMC5200 Zippy Drive\n\t5202  XMC5200 Zippy Drive\n\t5280  XMC5280 Storage Drive\n\tfff0  ISP5200 Debugger\n0b87  Plus-One I & T, Inc.\n0b88  Sigma Koki Co., Ltd, Technology Center\n0b89  Advanced Digital Broadcast, Ltd\n0b8c  SMART Technologies Inc.\n\t0001  Interactive Whiteboard Controller (SB6) (HID)\n\t00c3  Sympodium ID350\n0b95  ASIX Electronics Corp.\n\t1720  10/100 Ethernet\n\t1780  AX88178\n\t1790  AX88179 Gigabit Ethernet\n\t6802  AX68002 KVM Switch SoC\n\t7720  AX88772\n\t772a  AX88772A Fast Ethernet\n\t772b  AX88772B\n\t7e2b  AX88772B Fast Ethernet Controller\n0b96  Sewon Telecom\n0b97  O2 Micro, Inc.\n\t7732  Smart Card Reader\n\t7761  Oz776 1.1 Hub\n\t7762  Oz776 SmartCard Reader\n\t7772  OZ776 CCID Smartcard Reader\n0b98  Playmates Toys, Inc.\n0b99  Audio International, Inc.\n0b9b  Dipl.-Ing. Stefan Kunde\n\t4012  Reflex RC-controller Interface\n0b9d  Softprotec Co.\n0b9f  Chippo Technologies\n0baf  U.S. Robotics\n\t00e5  USR6000\n\t00eb  USR1120 802.11b Adapter\n\t00ec  56K Faxmodem\n\t00f1  SureConnect ADSL ATM Adapter\n\t00f2  SureConnect ADSL Loader\n\t00f5  SureConnect ADSL ATM Adapter\n\t00f6  SureConnect ADSL Loader\n\t00f7  SureConnect ADSL ATM Adapter\n\t00f8  SureConnect ADSL Loader\n\t00f9  SureConnect ADSL ATM Adapter\n\t00fa  SureConnect ADSL Loader\n\t00fb  SureConnect ADSL Ethernet/USB Router\n\t0111  USR5420 802.11g Adapter [Broadcom 4320 USB]\n\t0118  U5 802.11g Adapter\n\t011b  Wireless MAXg Adapter [Broadcom 4320]\n\t0121  USR5423 802.11bg Wireless Adapter [ZyDAS ZD1211B]\n\t0303  USR5637 56K Faxmodem\n\t6112  FaxModem Model 5633\n0bb0  Concord Camera Corp.\n\t0100  Sound Vision Stream\n\t5007  3340z/Rollei DC3100\n0bb1  Infinilink Corp.\n0bb2  Ambit Microsystems Corp.\n\t0302  U10H010 802.11b Wireless Adapter [Intersil PRISM 3]\n\t6098  USB Cable Modem\n0bb3  Ofuji Technology\n0bb4  HTC (High Tech Computer Corp.)\n\t0001  Android Phone via mass storage [Wiko Cink Peax 2]\n\t00ce  mmO2 XDA GSM/GPRS Pocket PC\n\t00cf  SPV C500 Smart Phone\n\t0306  Vive Hub Bluetooth 4.1 (Broadcom BCM920703)\n\t0a01  PocketPC Sync\n\t0a02  Himalaya GSM/GPRS Pocket PC\n\t0a03  PocketPC Sync\n\t0a04  PocketPC Sync\n\t0a05  PocketPC Sync\n\t0a06  PocketPC Sync\n\t0a07  Magician PocketPC SmartPhone / O2 XDA\n\t0a08  PocketPC Sync\n\t0a09  PocketPC Sync\n\t0a0a  PocketPC Sync\n\t0a0b  PocketPC Sync\n\t0a0c  PocketPC Sync\n\t0a0d  PocketPC Sync\n\t0a0e  PocketPC Sync\n\t0a0f  PocketPC Sync\n\t0a10  PocketPC Sync\n\t0a11  PocketPC Sync\n\t0a12  PocketPC Sync\n\t0a13  PocketPC Sync\n\t0a14  PocketPC Sync\n\t0a15  PocketPC Sync\n\t0a16  PocketPC Sync\n\t0a17  PocketPC Sync\n\t0a18  PocketPC Sync\n\t0a19  PocketPC Sync\n\t0a1a  PocketPC Sync\n\t0a1b  PocketPC Sync\n\t0a1c  PocketPC Sync\n\t0a1d  PocketPC Sync\n\t0a1e  PocketPC Sync\n\t0a1f  PocketPC Sync\n\t0a20  PocketPC Sync\n\t0a21  PocketPC Sync\n\t0a22  PocketPC Sync\n\t0a23  PocketPC Sync\n\t0a24  PocketPC Sync\n\t0a25  PocketPC Sync\n\t0a26  PocketPC Sync\n\t0a27  PocketPC Sync\n\t0a28  PocketPC Sync\n\t0a29  PocketPC Sync\n\t0a2a  PocketPC Sync\n\t0a2b  PocketPC Sync\n\t0a2c  PocketPC Sync\n\t0a2d  PocketPC Sync\n\t0a2e  PocketPC Sync\n\t0a2f  PocketPC Sync\n\t0a30  PocketPC Sync\n\t0a31  PocketPC Sync\n\t0a32  PocketPC Sync\n\t0a33  PocketPC Sync\n\t0a34  PocketPC Sync\n\t0a35  PocketPC Sync\n\t0a36  PocketPC Sync\n\t0a37  PocketPC Sync\n\t0a38  PocketPC Sync\n\t0a39  PocketPC Sync\n\t0a3a  PocketPC Sync\n\t0a3b  PocketPC Sync\n\t0a3c  PocketPC Sync\n\t0a3d  PocketPC Sync\n\t0a3e  PocketPC Sync\n\t0a3f  PocketPC Sync\n\t0a40  PocketPC Sync\n\t0a41  PocketPC Sync\n\t0a42  PocketPC Sync\n\t0a43  PocketPC Sync\n\t0a44  PocketPC Sync\n\t0a45  PocketPC Sync\n\t0a46  PocketPC Sync\n\t0a47  PocketPC Sync\n\t0a48  PocketPC Sync\n\t0a49  PocketPC Sync\n\t0a4a  PocketPC Sync\n\t0a4b  PocketPC Sync\n\t0a4c  PocketPC Sync\n\t0a4d  PocketPC Sync\n\t0a4e  PocketPC Sync\n\t0a4f  PocketPC Sync\n\t0a50  SmartPhone (MTP)\n\t0a51  SPV C400 / T-Mobile SDA GSM/GPRS Pocket PC\n\t0a52  SmartPhone Sync\n\t0a53  SmartPhone Sync\n\t0a54  SmartPhone Sync\n\t0a55  SmartPhone Sync\n\t0a56  SmartPhone Sync\n\t0a57  SmartPhone Sync\n\t0a58  SmartPhone Sync\n\t0a59  SmartPhone Sync\n\t0a5a  SmartPhone Sync\n\t0a5b  SmartPhone Sync\n\t0a5c  SmartPhone Sync\n\t0a5d  SmartPhone Sync\n\t0a5e  SmartPhone Sync\n\t0a5f  SmartPhone Sync\n\t0a60  SmartPhone Sync\n\t0a61  SmartPhone Sync\n\t0a62  SmartPhone Sync\n\t0a63  SmartPhone Sync\n\t0a64  SmartPhone Sync\n\t0a65  SmartPhone Sync\n\t0a66  SmartPhone Sync\n\t0a67  SmartPhone Sync\n\t0a68  SmartPhone Sync\n\t0a69  SmartPhone Sync\n\t0a6a  SmartPhone Sync\n\t0a6b  SmartPhone Sync\n\t0a6c  SmartPhone Sync\n\t0a6d  SmartPhone Sync\n\t0a6e  SmartPhone Sync\n\t0a6f  SmartPhone Sync\n\t0a70  SmartPhone Sync\n\t0a71  SmartPhone Sync\n\t0a72  SmartPhone Sync\n\t0a73  SmartPhone Sync\n\t0a74  SmartPhone Sync\n\t0a75  SmartPhone Sync\n\t0a76  SmartPhone Sync\n\t0a77  SmartPhone Sync\n\t0a78  SmartPhone Sync\n\t0a79  SmartPhone Sync\n\t0a7a  SmartPhone Sync\n\t0a7b  SmartPhone Sync\n\t0a7c  SmartPhone Sync\n\t0a7d  SmartPhone Sync\n\t0a7e  SmartPhone Sync\n\t0a7f  SmartPhone Sync\n\t0a80  SmartPhone Sync\n\t0a81  SmartPhone Sync\n\t0a82  SmartPhone Sync\n\t0a83  SmartPhone Sync\n\t0a84  SmartPhone Sync\n\t0a85  SmartPhone Sync\n\t0a86  SmartPhone Sync\n\t0a87  SmartPhone Sync\n\t0a88  SmartPhone Sync\n\t0a89  SmartPhone Sync\n\t0a8a  SmartPhone Sync\n\t0a8b  SmartPhone Sync\n\t0a8c  SmartPhone Sync\n\t0a8d  SmartPhone Sync\n\t0a8e  SmartPhone Sync\n\t0a8f  SmartPhone Sync\n\t0a90  SmartPhone Sync\n\t0a91  SmartPhone Sync\n\t0a92  SmartPhone Sync\n\t0a93  SmartPhone Sync\n\t0a94  SmartPhone Sync\n\t0a95  SmartPhone Sync\n\t0a96  SmartPhone Sync\n\t0a97  SmartPhone Sync\n\t0a98  SmartPhone Sync\n\t0a99  SmartPhone Sync\n\t0a9a  SmartPhone Sync\n\t0a9b  SmartPhone Sync\n\t0a9c  SmartPhone Sync\n\t0a9d  SmartPhone Sync\n\t0a9e  SmartPhone Sync\n\t0a9f  SmartPhone Sync\n\t0b03  Ozone Mobile Broadband\n\t0b04  Hermes / TyTN / T-Mobile MDA Vario II / O2 Xda Trion\n\t0b05  P3600\n\t0b06  Athena / Advantage x7500 / Dopod U1000 / T-Mobile AMEO\n\t0b0c  Elf / Touch / P3450 / T-Mobile MDA Touch / O2 Xda Nova / Dopod S1\n\t0b1f  Sony Ericsson XPERIA X1\n\t0b2f  Rhodium\n\t0b51  Qtek 8310 mobile phone [Tornado Noble]\n\t0bce  Vario MDA\n\t0c01  Dream / ADP1 / G1 / Magic / Tattoo / FP1\n\t0c02  Dream / ADP1 / G1 / Magic / Tattoo (Debug)\n\t0c03  Android Phone [Fairphone First Edition (FP1)]\n\t0c13  Diamond\n\t0c1f  Sony Ericsson XPERIA X1\n\t0c5f  Snap\n\t0c86  Sensation\n\t0c87  Desire (debug)\n\t0c8d  EVO 4G (debug)\n\t0c91  Vision\n\t0c94  Vision\n\t0c97  Legend\n\t0c99  Desire (debug)\n\t0c9e  Incredible\n\t0ca2  Desire HD (debug mode)\n\t0ca5  Android Phone [Evo Shift 4G]\n\t0cab  Desire / Desire HD / Hero / Thunderbolt (HTC Sync Mode)\n\t0cae  T-Mobile MyTouch 4G Slide [Doubleshot]\n\t0de5  One (M7)\n\t0dea  M7_UL [HTC One]\n\t0f25  One M8\n\t0f63  Desire 610 Via MTP\n\t0f64  Desire 601\n\t0fb4  Remote NDIS based Device\n\t0ff0  One Mini (M4)\n\t0ff8  Desire HD (Tethering Mode)\n\t0ff9  Desire / Desire HD / Hero / Thunderbolt (Charge Mode)\n\t0ffe  Desire HD (modem mode)\n\t0fff  Android Fastboot Bootloader\n\t2008  Android Phone via MTP [MT65xx]\n\t200b  Android Phone via PTP [Wiko Cink Peax 2]\n\t2134  Vive Hub (SMSC USB2137B)\n\t2744  Vive Hub (HTC CB USB2)\n\t2c87  Vive\n0bb5  Murata Manufacturing Co., Ltd\n0bb6  Network Alchemy\n0bb7  Joytech Computer Co., Ltd\n0bb8  Hitachi Semiconductor and Devices Sales Co., Ltd\n0bb9  Eiger M&C Co., Ltd\n0bba  ZAccess Systems\n0bbb  General Meters Corp.\n0bbc  Assistive Technology, Inc.\n0bbd  System Connection, Inc.\n0bc0  Knilink Technology, Inc.\n0bc1  Fuw Yng Electronics Co., Ltd\n0bc2  Seagate RSS LLC\n\t0502  ST3300601CB-RK 300 GB External Hard Drive\n\t0503  ST3250824A [Barracuda 7200.9]\n\t2000  Storage Adapter V3 (TPP)\n\t2100  FreeAgent Go\n\t2200  FreeAgent Go FW\n\t2300  Expansion Portable\n\t231a  Expansion Portable\n\t231c  Expansion Portable\n\t2320  USB 3.0 bridge [Portable Expansion Drive]\n\t2321  Expansion Portable\n\t2322  SRD0NF1 Expansion Portable (STEA)\n\t2340  FreeAgent External Hard Drive\n\t3000  FreeAgent Desktop\n\t3008  FreeAgent Desk 1TB\n\t3101  FreeAgent XTreme 640GB\n\t3312  SRD00F2 Expansion Desktop Drive (STBV)\n\t331a  Desktop HDD 5TB (ST5000DM000)\n\t3320  SRD00F2 [Expansion Desktop Drive]\n\t3322  SRD0NF2 [Expansion Desktop Drive]\n\t3323  Seagate RSS LLC\n\t3332  Expansion\n\t3343  desktop drive stgy8000400\n\t5020  FreeAgent GoFlex\n\t5021  FreeAgent GoFlex USB 2.0\n\t5030  FreeAgent GoFlex Upgrade Cable STAE104\n\t5031  FreeAgent GoFlex USB 3.0\n\t5032  SATA cable\n\t5070  FreeAgent GoFlex Desk\n\t5071  FreeAgent GoFlex Desk\n\t50a1  FreeAgent GoFlex Desk\n\t50a5  FreeAgent GoFlex Desk USB 3.0\n\t5121  FreeAgent GoFlex\n\t5161  FreeAgent GoFlex dock\n\t6126  Maxtor D3 Station 5TB\n\t61b5  Maxtor HX-M201TCB [M3 Portable 2TB]\n\t61b6  Maxtor HX-M101TCB/GM [M3 Portable 1TB]\n\t61b7  Maxtor M3 Portable\n\ta003  Backup Plus\n\ta0a1  Backup Plus Desktop\n\ta0a4  Backup Plus Desktop Drive\n\taa14  STJ4000400 [Seagate Basic Portable Drive 4TB]\n\tab00  Slim Portable Drive\n\tab1e  Backup Plus Portable Drive\n\tab20  Backup Plus Portable Drive\n\tab21  Backup Plus Slim\n\tab24  Backup Plus Portable Drive\n\tab26  Backup Plus Slim Portable Drive 1 TB\n\tab28  Seagate Backup Plus Portable 5TB SRD00F1\n\tab2d  SRD00F1 [Backup Plus Ultra Slim]\n\tab31  Backup Plus Desktop Drive (5TB)\n\tab34  Backup Plus\n\tab38  Backup Plus Hub (Mass Storage)\n\tab44  Backup Plus Hub\n\tac20  Backup Plus Slim 2TB\n0bc3  IPWireless, Inc.\n\t0001  UMTS-TDD (TD-CDMA) modem\n0bc4  Microcube Corp.\n0bc5  JCN Co., Ltd\n0bc6  ExWAY, Inc.\n0bc7  X10 Wireless Technology, Inc.\n\t0001  ActiveHome (ACPI-compliant)\n\t0002  Firecracker Interface (ACPI-compliant)\n\t0003  VGA Video Sender (ACPI-compliant)\n\t0004  X10 Receiver\n\t0005  Wireless Transceiver (ACPI-compliant)\n\t0006  Wireless Transceiver (ACPI-compliant)\n\t0007  Wireless Transceiver (ACPI-compliant)\n\t0008  Wireless Transceiver (ACPI-compliant)\n\t0009  Wireless Transceiver (ACPI-compliant)\n\t000a  Wireless Transceiver (ACPI-compliant)\n\t000b  Transceiver (ACPI-compliant)\n\t000c  Transceiver (ACPI-compliant)\n\t000d  Transceiver (ACPI-compliant)\n\t000e  Transceiver (ACPI-compliant)\n\t000f  Transceiver (ACPI-compliant)\n0bc8  Telmax Communications\n0bc9  ECI Telecom, Ltd\n0bca  Startek Engineering, Inc.\n0bcb  Perfect Technic Enterprise Co., Ltd\n0bd7  Andrew Pargeter & Associates\n\ta021  Amptek DP4 multichannel signal analyzer\n0bda  Realtek Semiconductor Corp.\n\t0103  USB 2.0 Card Reader\n\t0104  Mass Storage Device\n\t0106  Mass Storage Device\n\t0107  Mass Storage Device\n\t0108  Mass Storage Device\n\t0109  microSDXC Card Reader [Hama 00091047]\n\t0111  RTS5111 Card Reader Controller\n\t0113  Mass Storage Device\n\t0115  Mass Storage Device (Multicard Reader)\n\t0116  RTS5116 Card Reader Controller\n\t0117  Mass Storage Device\n\t0118  Mass Storage Device\n\t0119  Storage Device (SD card reader)\n\t0129  RTS5129 Card Reader Controller\n\t0138  RTS5138 Card Reader Controller\n\t0139  RTS5139 Card Reader Controller\n\t0151  Mass Storage Device (Multicard Reader)\n\t0152  Mass Storage Device\n\t0153  3-in-1 (SD/SDHC/SDXC) Card Reader\n\t0156  Mass Storage Device\n\t0157  Mass Storage Device\n\t0158  USB 2.0 multicard reader\n\t0159  RTS5159 Card Reader Controller\n\t0161  Mass Storage Device\n\t0168  Mass Storage Device\n\t0169  Mass Storage Device\n\t0171  Mass Storage Device\n\t0176  Mass Storage Device\n\t0178  Mass Storage Device\n\t0179  RTL8188ETV Wireless LAN 802.11n Network Adapter\n\t0184  RTS5182 Card Reader\n\t0186  Card Reader\n\t0301  multicard reader\n\t0307  Card Reader\n\t0316  Card Reader\n\t0326  Card reader\n\t0411  Hub\n\t0811  Realtek 8812AU/8821AU 802.11ac WLAN Adapter [USB Wireless Dual-Band Adapter 2.4/5Ghz]\n\t0821  RTL8821A Bluetooth\n\t1724  RTL8723AU 802.11n WLAN Adapter\n\t1a2b  RTL8188GU 802.11n WLAN Adapter (Driver CDROM Mode)\n\t2831  RTL2831U DVB-T\n\t2832  RTL2832U DVB-T\n\t2838  RTL2838 DVB-T\n\t5401  RTL 8153 USB 3.0 hub with gigabit ethernet\n\t5411  RTS5411 Hub\n\t568c  Integrated Webcam HD\n\t570c  Asus laptop camera\n\t5730  HP 2.0MP High Definition Webcam\n\t5751  Integrated Webcam\n\t5775  HP \"Truevision HD\" laptop camera\n\t5776  HP Truevision HD integrated webcam\n\t57b3  Acer 640 × 480 laptop camera\n\t57cc  HD Webcam - Realtek Semiconductor\n\t57cf  HD WebCam\n\t57da  Built-In Video Camera\n\t58c2  Integrated Webcam HD\n\t58c8  Integrated Webcam HD\n\t8150  RTL8150 Fast Ethernet Adapter\n\t8151  RTL8151 Adapteon Business Mobile Networks BV\n\t8152  RTL8152 Fast Ethernet Adapter\n\t8153  RTL8153 Gigabit Ethernet Adapter\n\t8171  RTL8188SU 802.11n WLAN Adapter\n\t8172  RTL8191SU 802.11n WLAN Adapter\n\t8174  RTL8192SU 802.11n WLAN Adapter\n\t8176  RTL8188CUS 802.11n WLAN Adapter\n\t8178  RTL8192CU 802.11n WLAN Adapter\n\t8179  RTL8188EUS 802.11n Wireless Network Adapter\n\t817f  RTL8188RU 802.11n WLAN Adapter\n\t8187  RTL8187 Wireless Adapter\n\t8189  RTL8187B Wireless 802.11g 54Mbps Network Adapter\n\t818b  RTL8192EU 802.11b/g/n WLAN Adapter\n\t8192  RTL8191SU 802.11n Wireless Adapter\n\t8193  RTL8192DU 802.11an WLAN Adapter\n\t8197  RTL8187B Wireless Adapter\n\t8198  RTL8187B Wireless Adapter\n\t8199  RTL8187SU 802.11g WLAN Adapter\n\t8723  RTL8723A Bluetooth\n\t8812  RTL8812AU 802.11a/b/g/n/ac 2T2R DB WLAN Adapter\n\t8813  RTL8814AU 802.11a/b/g/n/ac Wireless Adapter\n\t881a  RTL8812AU-VS 802.11a/b/g/n/ac 2T2R DB WLAN Adapter\n\t8821  RTL8821A Bluetooth\n\t9210  RTL9210 M.2 NVME Adapter\n\ta811  RTL8811AU 802.11a/b/g/n/ac WLAN Adapter\n\tb009  Realtek Bluetooth 4.2 Adapter\n\tb00a  Realtek Bluetooth 4.2 Adapter\n\tb00b  Realtek Bluetooth 4.2 Adapter\n\tb023  RTL8822BE Bluetooth 4.2 Adapter\n\tb711  RTL8188GU 802.11n WLAN Adapter (After Modeswitch)\n\tb720  RTL8723BU 802.11b/g/n WLAN Adapter\n\tb723  RTL8723B Bluetooth\n\tb728  RTL8723B Bluetooth\n\tb72a  RTL8723B Bluetooth\n\tb812  RTL88x2bu [AC1200 Techkey]\n\tf179  RTL8188FTV 802.11b/g/n 1T1R 2.4G WLAN Adapter\n0bdb  Ericsson Business Mobile Networks BV\n\t1000  BV Bluetooth Device\n\t1002  Bluetooth Device 1.2\n\t1049  C3607w Mobile Broadband Module\n\t1900  F3507g Mobile Broadband Module\n\t1902  F3507g v2 Mobile Broadband Module\n\t1904  F3607gw Mobile Broadband Module\n\t1905  F3607gw v2 Mobile Broadband Module\n\t1906  F3607gw v3 Mobile Broadband Module\n\t1909  F3307 v2 Mobile Broadband Module\n\t190a  F3307 Mobile Broadband Module\n\t190b  C3607w v2 Mobile Broadband Module\n\t1926  H5321 gw Mobile Broadband Module\n0bdc  Y Media Corp.\n0bdd  Orange PCS\n0be2  Kanda Tsushin Kogyo Co., Ltd\n0be3  TOYO Corp.\n0be4  Elka International, Ltd\n0be5  DOME imaging systems, Inc.\n0be6  Dong Guan Humen Wonderful Wire Cable Factory\n0bed  MEI\n\t1100  CASHFLOW SC\n\t1101  Series 2000 Combo Acceptor\n0bee  LTK Industries, Ltd\n0bef  Way2Call Communications\n0bf0  Pace Micro Technology PLC\n\tc010  EHD100SD\n0bf1  Intracom S.A.\n\t0001  netMod Driver Ver 2.4.17 (CAPI)\n\t0002  netMod Driver Ver 2.4 (CAPI)\n\t0003  netMod Driver Ver 2.4 (CAPI)\n0bf2  Konexx\n0bf6  Addonics Technologies, Inc.\n\t0103  Storage Device\n\t1234  Storage Device\n\ta000  Cable 205 (TPP)\n\ta001  Cable 205\n\ta002  IDE Bridge\n0bf7  Sunny Giken, Inc.\n0bf8  Fujitsu Siemens Computers\n\t1001  Fujitsu Pocket Loox 600 PDA\n\t1006  SmartCard Reader 2A\n\t1007  Connect2Air E-5400 802.11g Wireless Adapter\n\t1009  Connect2Air E-5400 D1700 802.11g Wireless Adapter [Intersil ISL3887]\n\t100c  Keyboard FSC KBPC PX\n\t100f  miniCard D2301 802.11bg Wireless Module [SiS 163U]\n\t1017  Keyboard KB SCR\n\t101f  Fujitsu Full HD Pro Webcam\n0bfb  Grass Valley Group\n\t0200  TURBO iDDR Front Panel\n0bfd  Kvaser AB\n\t0004  USBcan II\n\t000b  Leaf Light HS\n\t000e  Leaf SemiPro HS\n0c00  FireFly Mouse Mat\n\t1607  Apex M500\n0c04  MOTO Development Group, Inc.\n0c05  Appian Graphics\n0c06  Hasbro Games, Inc.\n0c07  Infinite Data Storage, Ltd\n0c08  Agate\n\t0378  Q 16MB Storage Device\n0c09  Comjet Information System\n\ta5a5  Litto Version USB2.0\n0c0a  Highpoint Technologies, Inc.\n\t6124  RocketStor 6124V\n0c0b  Dura Micro, Inc. (Acomdata)\n\t27cb  6-in-1 Flash Reader and Writer\n\t27d7  Multi Memory reader/writer MD-005\n\t27da  Multi Memory reader/writer MD-005\n\t27dc  Multi Memory reader/writer MD-005\n\t27e7  3,5'' HDD case MD-231\n\t27ee  3,5'' HDD case MD-231\n\t2814  3,5'' HDD case MD-231\n\t2815  3,5'' HDD case MD-231\n\t281d  3,5'' HDD case MD-231\n\t5fab  Storage Adaptor\n\ta109  CF/SM Reader and Writer\n\ta10c  SD/MS Reader and Writer\n\tb001  USB 2.0 Mass Storage IDE adapter\n\tb004  MMC/SD Reader and Writer\n0c12  Zeroplus\n\t0005  PSX Vibration Feedback Converter / Intec Wireless Controller for Xbox\n\t0030  PSX Vibration Feedback Converter\n\t700e  Logic Analyzer (LAP-C-16032)\n\t8801  Nyko Xbox Controller\n\t8802  Xbox Controller\n\t8809  Red Octane Ignition Xbox DDR Pad\n\t880a  Pelican Eclipse PL-2023\n\t8810  Xbox Controller\n\t9902  VibraX\n0c15  Iris Graphics\n0c16  Gyration, Inc.\n\t0002  RF Technology Receiver\n\t0003  RF Technology Receiver\n\t0008  RF Technology Receiver\n\t0080  eHome Infrared Receiver\n\t0081  eHome Infrared Receiver\n0c17  Cyberboard A/S\n0c18  SynerTek Korea, Inc.\n0c19  cyberPIXIE, Inc.\n0c1a  Silicon Motion, Inc.\n0c1b  MIPS Technologies\n0c1c  Hang Zhou Silan Electronics Co., Ltd\n0c1f  Magicard\n\t1800  Tango 2E\n0c22  Tally Printer Corp.\n0c23  Lernout + Hauspie\n0c24  Taiyo Yuden\n\t0001  Bluetooth Adaptor\n\t0002  Bluetooth Device2\n\t0005  Bluetooth Device(BC04-External)\n\t000b  Bluetooth Device(BC04-External)\n\t000c  Bluetooth Adaptor\n\t000e  Bluetooth Device(BC04-External)\n\t000f  Bluetooth Device (V2.0+EDR)\n\t0010  Bluetooth Device(BC04-External)\n\t0012  Bluetooth Device(BC04-External)\n\t0018  Bluetooth Device(BC04-External)\n\t0019  Bluetooth Device\n\t0021  Bluetooth Device (V2.1+EDR)\n\t0c24  Bluetooth Device(SAMPLE)\n\tffff  Bluetooth module with BlueCore in DFU mode\n0c25  Sampo Corp.\n\t0310  Scream Cam\n0c26  Prolific Technology Inc.\n\t0018  USB-Serial Controller [Icom Inc. OPC-478UC]\n\t002b  Icom Inc. IC-R30\n0c27  RFIDeas, Inc\n\t232a  pcProx Plus RFID Reader (CDC serial)\n\t3bfa  pcProx Card Reader\n0c2e  Metrologic Instruments\n\t0007  Metrologic MS7120 Barcode Scanner (IBM SurePOS mode)\n\t0200  MS7120 Barcode Scanner\n\t0204  Metrologic MS7120 Barcode Scanner (keyboard mode)\n\t0206  Metrologic MS4980 Barcode Scanner\n\t0700  Metrologic MS7120 Barcode Scanner (uni-directional serial mode)\n\t0720  Metrologic MS7120 Barcode Scanner (bi-directional serial mode)\n\t0a64  [Stratos 2700]\n\t0b61  Vuquest 3310g\n\t0b6a  Vuquest 3310 Area-Imaging Scanner\n\t0b81  Barcode scanner Voyager 1400g Series\n0c30  Mutoh Industries Ltd\n\t6010  Kona 1400 Cutting Plotter\n0c35  Eagletron, Inc.\n0c36  E Ink Corp.\n0c37  e.Digital\n0c38  Der An Electric Wire & Cable Co., Ltd\n0c39  IFR\n0c3a  Furui Precise Component (Kunshan) Co., Ltd\n0c3b  Komatsu, Ltd\n0c3c  Radius Co., Ltd\n0c3d  Innocom, Inc.\n0c3e  Nextcell, Inc.\n0c40  ELMCU\n\t8000  2.4GHz receiver\n0c44  Motorola iDEN\n\t0021  iDEN P2k0 Device\n\t0022  iDEN P2k1 Device\n\t03a2  iDEN Smartphone\n\t41d9  i1 phone\n0c45  Microdia\n\t0011  EBUDDY\n\t0520  MaxTrack Wireless Mouse\n\t1018  Compact Flash storage memory card reader\n\t1020  Mass Storage Reader\n\t1028  Mass Storage Reader\n\t1030  Mass Storage Reader\n\t1031  Sonix Mass Storage Device\n\t1032  Mass Storage Reader\n\t1033  Sonix Mass Storage Device\n\t1034  Mass Storage Reader\n\t1035  Mass Storage Reader\n\t1036  Mass Storage Reader\n\t1037  Sonix Mass Storage Device\n\t1050  CF Card Reader\n\t1058  HDD Reader\n\t1060  iFlash SM-Direct Card Reader\n\t1061  Mass Storage Reader\n\t1062  Mass Storage Reader\n\t1063  Sonix Mass Storage Device\n\t1064  Mass Storage Reader\n\t1065  Mass Storage Reader\n\t1066  Mass Storage Reader\n\t1067  Mass Storage Reader\n\t1158  A56AK\n\t184c  VoIP Phone\n\t1a90  2M pixel Microscope Camera (with capture button) [Andonstar V160]\n\t5004  Redragon Mitra RGB Keyboard\n\t5101  2.4G Wireless Device [Rii MX3]\n\t6001  Genius VideoCAM NB\n\t6005  Sweex Mini Webcam\n\t6007  VideoCAM Eye\n\t6009  VideoCAM ExpressII\n\t600d  TwinkleCam USB camera\n\t6011  PC Camera (SN9C102)\n\t6019  PC Camera (SN9C102)\n\t6024  VideoCAM ExpressII\n\t6025  VideoCAM ExpressII\n\t6028  Typhoon Easycam USB 330K (older)\n\t6029  Triplex i-mini PC Camera\n\t602a  Meade ETX-105EC Camera\n\t602b  VideoCAM NB 300\n\t602c  Clas Ohlson TWC-30XOP Webcam\n\t602d  VideoCAM ExpressII\n\t602e  VideoCAM Messenger\n\t6030  VideoCAM ExpressII\n\t603f  VideoCAM ExpressII\n\t6040  CCD PC Camera (PC390A)\n\t606a  CCD PC Camera (PC390A)\n\t607a  CCD PC Camera (PC390A)\n\t607b  Win2 PC Camera\n\t607c  CCD PC Camera (PC390A)\n\t607e  CCD PC Camera (PC390A)\n\t6080  Audio (Microphone)\n\t6082  VideoCAM Look\n\t6083  VideoCAM Look\n\t608c  VideoCAM Look\n\t608e  VideoCAM Look\n\t608f  PC Camera (SN9C103 + OV7630)\n\t60a8  VideoCAM Look\n\t60aa  VideoCAM Look\n\t60ab  PC Camera\n\t60af  VideoCAM Look\n\t60b0  Genius VideoCam Look\n\t60c0  PC Camera with Mic (SN9C105)\n\t60c8  Win2 PC Camera\n\t60cc  PC Camera with Mic (SN9C105)\n\t60ec  PC Camera with Mic (SN9C105)\n\t60ef  Win2 PC Camera\n\t60fa  PC Camera with Mic (SN9C105)\n\t60fb  Composite Device\n\t60fc  PC Camera with Mic (SN9C105)\n\t60fe  Audio (Microphone)\n\t6108  Win2 PC Camera\n\t6122  PC Camera (SN9C110)\n\t6123  PC Camera (SN9C110)\n\t6128  PC Camera (SN9C325 + OM6802)\n\t612a  PC Camera (SN9C325)\n\t612c  PC Camera (SN9C110)\n\t612e  PC Camera (SN9C110)\n\t612f  PC Camera (SN9C110)\n\t6130  PC Camera (SN9C120)\n\t6138  Win2 PC Camera\n\t613a  PC Camera (SN9C120)\n\t613b  Win2 PC Camera\n\t613c  PC Camera (SN9C120)\n\t613e  PC Camera (SN9C120)\n\t6143  PC Camera (SN9C120 + SP80708)\n\t6240  PC Camera (SN9C201 + MI1300)\n\t6242  PC Camera (SN9C201 + MI1310)\n\t6243  PC Camera (SN9C201 + S5K4AAFX)\n\t6248  PC Camera (SN9C201 + OV9655)\n\t624b  PC Camera (SN9C201 + CX1332)\n\t624c  PC Camera (SN9C201 + MI1320)\n\t624e  PC Camera (SN9C201 + SOI968)\n\t624f  PC Camera (SN9C201 + OV9650)\n\t6251  PC Camera (SN9C201 + OV9650)\n\t6253  PC Camera (SN9C201 + OV9650)\n\t6260  PC Camera (SN9C201 + OV7670ISP)\n\t6262  PC Camera (SN9C201 + OM6802)\n\t6270  PC Camera (SN9C201 + MI0360/MT9V011 or MI0360SOC/MT9V111) U-CAM PC Camera NE878, Whitcom WHC017, ...\n\t627a  PC Camera (SN9C201 + S5K53BEB)\n\t627b  PC Camera (SN9C201 + OV7660)\n\t627c  PC Camera (SN9C201 + HV7131R)\n\t627f  PC Camera (SN9C201 + OV965x + EEPROM)\n\t6280  PC Camera with Microphone (SN9C202 + MI1300)\n\t6282  PC Camera with Microphone (SN9C202 + MI1310)\n\t6283  PC Camera with Microphone (SN9C202 + S5K4AAFX)\n\t6288  PC Camera with Microphone (SN9C202 + OV9655)\n\t628a  PC Camera with Microphone (SN9C202 + ICM107)\n\t628b  PC Camera with Microphone (SN9C202 + CX1332)\n\t628c  PC Camera with Microphone (SN9C202 + MI1320)\n\t628e  PC Camera with Microphone (SN9C202 + SOI968)\n\t628f  PC Camera with Microphone (SN9C202 + OV9650)\n\t62a0  PC Camera with Microphone (SN9C202 + OV7670ISP)\n\t62a2  PC Camera with Microphone (SN9C202 + OM6802)\n\t62b0  PC Camera with Microphone (SN9C202 + MI0360/MT9V011 or MI0360SOC/MT9V111)\n\t62b3  PC Camera with Microphone (SN9C202 + OV9655)\n\t62ba  PC Camera with Microphone (SN9C202 + S5K53BEB)\n\t62bb  PC Camera with Microphone (SN9C202 + OV7660)\n\t62bc  PC Camera with Microphone (SN9C202 + HV7131R)\n\t62be  PC Camera with Microphone (SN9C202 + OV7663)\n\t62c0  Sonix USB 2.0 Camera\n\t62e0  MSI Starcam Racer\n\t6300  PC Microscope camera\n\t6310  Sonix USB 2.0 Camera\n\t6321  HP Integrated Webcam\n\t6340  Camera\n\t6341  Defender G-Lens 2577 HD720p Camera\n\t6366  Webcam Vitade AF\n\t63e0  Sonix Integrated Webcam\n\t63f1  Integrated Webcam\n\t63f8  Sonix Integrated Webcam\n\t6409  Webcam\n\t6413  Integrated Webcam\n\t6417  Integrated Webcam\n\t6419  Integrated Webcam\n\t641d  1.3 MPixel Integrated Webcam\n\t6433  Laptop Integrated Webcam HD (Composite Device)\n\t643f  Dell Integrated HD Webcam\n\t644d  1.3 MPixel Integrated Webcam\n\t6480  Sonix 1.3 MP Laptop Integrated Webcam\n\t648b  Integrated Webcam\n\t64ad  Dell Laptop Integrated Webcam HD\n\t64bd  Sony Visual Communication Camera\n\t64d0  Integrated Webcam\n\t64d2  Integrated Webcam\n\t651b  HP Webcam\n\t652f  Backlit Gaming Keyboard\n\t6705  Integrated HD Webcam\n\t670c  Integrated Webcam HD\n\t6710  Integrated Webcam\n\t6712  Integrated Webcam HD\n\t671d  Integrated_Webcam_HD\n\t7401  TEMPer Temperature Sensor\n\t7402  TEMPerHUM Temperature & Humidity Sensor\n\t7403  Foot Switch\n\t7404  Foot switch FS1-P\n\t8000  DC31VC\n\t8006  Dual Mode Camera (8006 VGA)\n\t800a  Vivitar Vivicam3350B\n0c46  WaveRider Communications, Inc.\n0c4a  ALGE-TIMING GmbH\n\t0889  Timy\n\t088a  Timy 2\n0c4b  Reiner SCT Kartensysteme GmbH\n\t0100  cyberJack e-com/pinpad\n\t0300  cyberJack pinpad(a)\n\t0400  cyberJack e-com(a)\n\t0401  cyberJack pinpad(a2)\n\t0500  cyberJack RFID standard dual interface smartcard reader\n\t0501  cyberJack RFID comfort dual interface smartcard reader\n\t0502  cyberJack compact\n\t0504  cyberJack go / go plus\n\t0505  cyberJack wave\n\t9102  cyberJack RFID basis contactless smartcard reader\n0c4c  Needham's Electronics\n\t0021  EMP-21 Universal Programmer\n0c52  Sealevel Systems, Inc.\n\t2101  SeaLINK+232\n\t2102  SeaLINK+485\n\t2103  SeaLINK+232I\n\t2104  SeaLINK+485I\n\t2211  SeaPORT+2/232 (Port 1)\n\t2212  SeaPORT+2/485 (Port 1)\n\t2213  SeaPORT+2 (Port 1)\n\t2221  SeaPORT+2/232 (Port 2)\n\t2222  SeaPORT+2/485 (Port 2)\n\t2223  SeaPORT+2 (Port 2)\n\t2411  SeaPORT+4/232 (Port 1)\n\t2412  SeaPORT+4/485 (Port 1)\n\t2413  SeaPORT+4 (Port 1)\n\t2421  SeaPORT+4/232 (Port 2)\n\t2422  SeaPORT+4/485 (Port 2)\n\t2423  SeaPORT+4 (Port 2)\n\t2431  SeaPORT+4/232 (Port 3)\n\t2432  SeaPORT+4/485 (Port 3)\n\t2433  SeaPORT+4 (Port 3)\n\t2441  SeaPORT+4/232 (Port 4)\n\t2442  SeaPORT+4/485 (Port 4)\n\t2443  SeaPORT+4 (Port 4)\n\t2811  SeaLINK+8/232 (Port 1)\n\t2812  SeaLINK+8/485 (Port 1)\n\t2813  SeaLINK+8 (Port 1)\n\t2821  SeaLINK+8/232 (Port 2)\n\t2822  SeaLINK+8/485 (Port 2)\n\t2823  SeaLINK+8 (Port 2)\n\t2831  SeaLINK+8/232 (Port 3)\n\t2832  SeaLINK+8/485 (Port 3)\n\t2833  SeaLINK+8 (Port 3)\n\t2841  SeaLINK+8/232 (Port 4)\n\t2842  SeaLINK+8/485 (Port 4)\n\t2843  SeaLINK+8 (Port 4)\n\t2851  SeaLINK+8/232 (Port 5)\n\t2852  SeaLINK+8/485 (Port 5)\n\t2853  SeaLINK+8 (Port 5)\n\t2861  SeaLINK+8/232 (Port 6)\n\t2862  SeaLINK+8/485 (Port 6)\n\t2863  SeaLINK+8 (Port 6)\n\t2871  SeaLINK+8/232 (Port 7)\n\t2872  SeaLINK+8/485 (Port 7)\n\t2873  SeaLINK+8 (Port 7)\n\t2881  SeaLINK+8/232 (Port 8)\n\t2882  SeaLINK+8/485 (Port 8)\n\t2883  SeaLINK+8 (Port 8)\n\t9020  SeaLINK+422\n\ta02a  SeaLINK+8 (Port 1+2)\n\ta02b  SeaLINK+8 (Port 3+4)\n\ta02c  SeaLINK+8 (Port 5+6)\n\ta02d  SeaLINK+8 (Port 7+8)\n0c53  ViewPLUS, Inc.\n0c54  Glory, Ltd\n0c55  Spectrum Digital, Inc.\n\t0510  Spectrum Digital XDS510 JTAG Debugger\n\t0540  SPI540\n\t5416  TMS320C5416 DSK\n\t6416  TMS320C6416 DDB\n0c56  Billion Bright, Ltd\n0c57  Imaginative Design Operation Co., Ltd\n0c58  Vidar Systems Corp.\n0c59  Dong Guan Shinko Wire Co., Ltd\n0c5a  TRS International Mfg., Inc.\n0c5e  Xytronix Research & Design\n0c60  Apogee Electronics Corp.\n\t0001  MiniMe\n\t0002  MiniDAC\n\t0003  ONE\n\t0004  GiO\n\t0007  Duet\n\t0009  Jam\n\t000a  Jam Bootloader\n\t000b  MiC\n\t000c  MiC Bootloader\n\t8007  Duet DFU Mode\n0c62  Chant Sincere Co., Ltd\n0c63  Toko, Inc.\n0c64  Signality System Engineering Co., Ltd\n0c65  Eminence Enterprise Co., Ltd\n0c66  Rexon Electronics Corp.\n0c67  Concept Telecom, Ltd\n0c6a  ACS\n\t0005  Color 320 x 240 LCD Display Terminal with Touchscreen\n0c6c  JETI Technische Instrumente GmbH\n\t04b2  Specbos 1201\n0c70  MCT Elektronikladen\n\t0000  USB08 Development board\n\t0747  Eye Movement Recorder [Visagraph]/[ReadAlyzer]\n0c72  PEAK System\n\t000c  PCAN-USB\n\t000d  PCAN Pro\n0c74  Optronic Laboratories Inc.\n\t0002  OL 700-30 Goniometer\n0c76  JMTek, LLC.\n\t0001  Mass Storage Controller\n\t0002  Mass Storage Controller\n\t0003  USBdisk\n\t0004  Mass Storage Controller\n\t0005  Transcend Flash disk\n\t0006  Transcend JetFlash\n\t0007  Mass Storage Device\n\t1600  Ion Quick Play LP turntable\n\t1605  SSS Headphone Set\n\t1607  audio controller\n\t5663  Audio Device\n0c77  Sipix Group, Ltd\n\t1001  SiPix Web2\n\t1002  SiPix SC2100\n\t1010  SiPix Snap\n\t1011  SiPix Blink 2\n\t1015  SiPix CAMeleon\n0c78  Detto Corp.\n0c79  NuConnex Technologies Pte., Ltd\n0c7a  Wing-Span Enterprise Co., Ltd\n0c86  NDA Technologies, Inc.\n0c88  Kyocera Wireless Corp.\n\t0021  Handheld\n\t17da  Qualcomm Kyocera CDMA Technologies MSM\n0c89  Honda Tsushin Kogyo Co., Ltd\n0c8a  Pathway Connectivity, Inc.\n0c8b  Wavefly Corp.\n0c8c  Coactive Networks\n0c8d  Tempo\n0c8e  Cesscom Co., Ltd\n\t6000  Luxian Series\n0c8f  Applied Microsystems\n0c94  Cryptera\n\ta000  EPP 1217\n0c98  Berkshire Products, Inc.\n\t1140  USB PC Watchdog\n0c99  Innochips Co., Ltd\n0c9a  Hanwool Robotics Corp.\n0c9b  Jobin Yvon, Inc.\n0c9c  Brand Innovators BV\n\t1511  BI-1511 Laser Simulator\n\t1512  BI-1512 Syncbus Monitor\n\t1514  BI-1514 HPC\n\t1532  BI-1532 GPC\n0c9d  SemTek\n\t0170  3873 Manual Insert card reader\n0ca2  Zyfer\n0ca3  Sega Corp.\n0ca4  ST&T Instrument Corp.\n0ca5  BAE Systems Canada, Inc.\n0ca6  Castles Technology Co., Ltd\n\t0010  EZUSB PC/SC Smart Card Reader\n\t0050  EZ220PU Reader Controller\n\t1077  Bludrive Family Smart Card Reader\n\t107e  Reader Controller\n\t2010  myPad110 PC/SC Smart Card Reader\n\t3050  EZ710 Smart Card Reader\n0ca7  Information Systems Laboratories\n0caa  Allied Telesis KK.\n\t3001  AT-VT-Kit3 Serial Adapter\n0cad  Motorola CGISS\n\t1007  APX Series Consolette\n\t1020  MOTOTRBO Series Radio (Portable)\n\t1030  APX Series Radio (Portable)\n\t1031  APX Series Radio (Mobile)\n\t1602  IMPRES Battery Data Reader\n\t9001  PowerPad Pocket PC Device\n0cae  Ascom Business Systems, Ltd\n0caf  Buslink\n\t2507  Hi-Speed USB-to-IDE Bridge Controller\n\t2515  Flash Disk Embedded Hub\n\t2516  Flash Disk Security Device\n\t2517  Flash Disk Mass Storage Device\n\t25c7  Hi-Speed USB-to-IDE Bridge Controller\n\t3a00  Hard Drive\n\t3a20  Mass Storage Device\n\t3acd  Mass Storage Device\n0cb0  Flying Pig Systems\n0cb1  Innovonics, Inc.\n0cb6  Celestix Networks, Pte., Ltd\n0cb7  Singatron Enterprise Co., Ltd\n0cb8  Opticis Co., Ltd\n0cba  Trust Electronic (Shanghai) Co., Ltd\n0cbb  Shanghai Darong Electronics Co., Ltd\n0cbc  Palmax Technology Co., Ltd\n\t0101  Pocket PC P6C\n\t0201  Personal Digital Assistant\n\t0301  Personal Digital Assistant P6M+\n\t0401  Pocket PC\n0cbd  Pentel Co., Ltd (Electronics Equipment Div.)\n0cbe  Keryx Technologies, Inc.\n0cbf  Union Genius Computer Co., Ltd\n0cc0  Kuon Yi Industrial Corp.\n0cc1  Given Imaging, Ltd\n0cc2  Timex Corp.\n0cc3  Rimage Corp.\n0cc4  emsys GmbH\n0cc5  Sendo\n0cc6  Intermagic Corp.\n0cc8  Technotools Corp.\n0cc9  BroadMAX Technologies, Inc.\n0cca  Amphenol\n0ccb  SKNet Co., Ltd\n0ccc  Domex Technology Corp.\n0ccd  TerraTec Electronic GmbH\n\t0012  PHASE 26\n\t0013  PHASE 26\n\t0014  PHASE 26\n\t0015  Flash Update for TerraTec PHASE 26\n\t0021  Cameo Grabster 200\n\t0023  Mystify Claw\n\t0028  Aureon 5.1 MkII\n\t0032  MIDI HUBBLE\n\t0035  Miditech Play'n Roll\n\t0036  Cinergy 250 Audio\n\t0037  Cinergy 250 Audio\n\t0038  Cinergy T² DVB-T Receiver\n\t0039  Grabster AV 400\n\t003b  Cinergy 400\n\t003c  Grabster AV 250\n\t0042  Cinergy Hybrid T XS\n\t0043  Cinergy T XS\n\t004e  Cinergy T XS\n\t004f  Cinergy Analog XS\n\t0055  Cinergy T XE (Version 1, AF9005)\n\t005c  Cinergy T²\n\t0069  Cinergy T XE (Version 2, AF9015)\n\t006b  Cinergy HT PVR (EU)\n\t0072  Cinergy Hybrid T\n\t0077  Aureon Dual USB\n\t0078  Cinergy T XXS\n\t0086  Cinergy Hybrid XE\n\t008e  Cinergy HTC XS\n\t0096  Grabby\n\t0097  Cinergy T RC MKII\n\t0099  AfaTech 9015 [Cinergy T Stick Dual]\n\t00a5  Cinergy Hybrid Stick\n\t00a9  RTL2838 DVB-T COFDM Demodulator [TerraTec Cinergy T Stick Black]\n\t00b3  NOXON DAB/DAB+ Stick\n\t00b9  WDR DAB/DAB+ Stick\n\t00e0  NOXON DAB/DAB+ Stick V2\n\t0102  Cinergy S2 Stick\n\t0105  Cinergy S2 Box\n\t10a7  TerraTec G3\n\t10ad   Cinergy H5 Rev. 2\n0cd4  Bang Olufsen\n\t0101  BeolinkPC2\n0cd5  LabJack Corporation\n\t0003  U3\n\t0009  UE9\n0cd6  Scheidt & Bachmann\n\t000c  S&B TPU\n\t000e  S&B BKV\n\t0011  Money Coin Unit\n0cd7  NewChip S.r.l.\n0cd8  JS Digitech, Inc.\n\t2007  Smart Card Reader/JSTU-9700\n0cd9  Hitachi Shin Din Cable, Ltd\n0cde  Z-Com\n\t0001  XI-750 802.11b Wireless Adapter [Atmel AT76C503A]\n\t0002  XI-725/726 Prism2.5 802.11b Adapter\n\t0003  Sagem 802.11b Dongle\n\t0004  Sagem 802.11b Dongle\n\t0005  XI-735 Prism3 802.11b Adapter\n\t0006  XG-300 802.11b Adapter\n\t0008  XG-703A 802.11g Wireless Adapter [Intersil ISL3887]\n\t0009  (ZD1211)IEEE 802.11b+g Adapter\n\t0011  ZD1211\n\t0012  AR5523\n\t0013  AR5523 driver (no firmware)\n\t0014  NB 802.11g Wireless LAN Adapter(3887A)\n\t0015  XG-705A 802.11g Wireless Adapter [Intersil ISL3887]\n\t0016  NB 802.11g Wireless LAN Adapter(3887A)\n\t0018  NB 802.11a/b/g Wireless LAN Adapter(3887A)\n\t001a  802.11bg\n\t001c  802.11b/g Wireless Network Adapter\n\t0020  AG-760A 802.11abg Wireless Adapter [ZyDAS ZD1211B]\n\t0022  802.11b/g/n Wireless Network Adapter\n\t0023  UB81 802.11bgn\n\t0025  802.11b/g/n USB Wireless Network Adapter\n\t0026  UB82 802.11abgn\n\t0027  Sphairon Homelink 1202 802.11n Wireless Adapter [Atheros AR9170]\n0ce5  Validation Technologies International\n\t0003  Matrix\n0ce9  Pico Technology\n\t1001  PicoScope3000 series PC Oscilloscope\n\t1007  PicoScope 2000 series PC Oscilloscope\n\t1008  PicoScope 5000 series PC Oscilloscope\n\t1009  PicoScope 4000 series PC Oscilloscope\n\t100e  PicoScope 6000 series PC Oscilloscope\n\t1012  PicoScope 3000A series PC Oscilloscope\n\t1016  PicoScope 2000A series PC Oscilloscope\n\t1018  PicoScope 4000A series PC Oscilloscope\n\t1200  PicoScope 2000 series PC Oscilloscope\n\t1201  PicoScope 3000 series PC Oscilloscope\n\t1202  PicoScope 4000 series PC Oscilloscope\n\t1203  PicoScope 5000 series PC Oscilloscope\n\t1204  PicoScope 6000 series PC Oscilloscope\n\t1211  PicoScope 3000 series PC Oscilloscope\n\t1212  PicoScope 4000 series PC Oscilloscope\n0cf1  e-Conn Electronic Co., Ltd\n0cf2  ENE Technology, Inc.\n\t6220  SD Card Reader (SG361)\n\t6225  SD card reader (UB6225)\n\t6230  SD Card Reader (UB623X)\n\t6250  SD card reader (UB6250)\n0cf3  Qualcomm Atheros Communications\n\t0001  AR5523\n\t0002  AR5523 (no firmware)\n\t0003  AR5523\n\t0004  AR5523 (no firmware)\n\t0005  AR5523\n\t0006  AR5523 (no firmware)\n\t0036  AR9462 Bluetooth\n\t1001  Thomson TG121N [Atheros AR9001U-(2)NG]\n\t1002  TP-Link TL-WN821N v2 / TL-WN822N v1 802.11n [Atheros AR9170]\n\t1006  TP-Link TL-WN322G v3 / TL-WN422G v2 802.11g [Atheros AR9271]\n\t1010  3Com 3CRUSBN275 802.11abgn Wireless Adapter [Atheros AR9170]\n\t20ff  AR7010 (no firmware)\n\t3000  AR3011 Bluetooth (no firmware)\n\t3002  AR3011 Bluetooth\n\t3004  AR3012 Bluetooth 4.0\n\t3005  AR3011 Bluetooth\n\t3007  AR3012 Bluetooth 4.0 (no firmware)\n\t3008  Bluetooth (AR3011)\n\t311d  Bluetooth\n\t311f  AR3012 Bluetooth\n\t7015  TP-Link TL-WN821N v3 / TL-WN822N v2 802.11n [Atheros AR7010+AR9287]\n\t9170  AR9170 802.11n\n\t9271  AR9271 802.11n\n\t9378  QCA9377-7\n\tb002  Ubiquiti WiFiStation 802.11n [Atheros AR9271]\n\tb003  Ubiquiti WiFiStationEXT 802.11n [Atheros AR9271]\n\te006  Dell Wireless 1802 Bluetooth 4.0 LE\n\te300  QCA61x4 Bluetooth 4.0\n0cf4  Fomtex Corp.\n0cf5  Cellink Co., Ltd\n0cf6  Compucable Corp.\n0cf7  ishoni Networks\n0cf8  Clarisys, Inc.\n\t0750  Claritel-i750 - vp\n0cf9  Central System Research Co., Ltd\n0cfa  Inviso, Inc.\n0cfc  Minolta-QMS, Inc.\n\t2301  Magicolor 2300 DL\n\t2350  Magicolor 2350EN/3300\n\t3100  Magicolor 3100\n\t7300  Magicolor 5450/5550\n0cff  SAFA MEDIA Co., Ltd.\n\t0320  SR-380N\n0d06  telos EDV Systementwicklung GmbH\n0d08  UTStarcom\n\t0602  DV007 [serial]\n\t0603  DV007 [storage]\n0d0b  Contemporary Controls\n0d0c  Astron Electronics Co., Ltd\n0d0d  MKNet Corp.\n0d0e  Hybrid Networks, Inc.\n0d0f  Feng Shin Cable Co., Ltd\n0d10  Elastic Networks\n\t0001  StormPort (WDM)\n0d11  Maspro Denkoh Corp.\n0d12  Hansol Electronics, Inc.\n0d13  BMF Corp.\n0d14  Array Comm, Inc.\n0d15  OnStream b.v.\n0d16  Hi-Touch Imaging Technologies Co., Ltd\n\t0001  PhotoShuttle\n\t0002  Photo Printer 730 series\n\t0004  Photo Printer 63xPL/PS\n\t0007  P510K\n\t0009  P72x Series\n\t000a  P728L\n\t000b  P510L\n\t000d  P518A\n\t000e  P910L\n\t0010  M610\n\t0100  Photo Printer 63xPL/PS\n\t0102  Photo Printer 64xPS\n\t0103  Photo Printer 730 series\n\t0104  Photo Printer 63xPL/PS\n\t0105  Photo Printer 64xPS\n\t010e  P510S\n\t0110  P110S\n\t0111  P510Si\n\t0112  P518S\n\t0200  Photo Printer 64xDL\n\t0309  CS-200e\n\t030a  CS-220e\n\t0501  P75x Series\n\t0502  P52x Series\n\t0503  P310L\n\t050a  P310W\n\t050f  P530D\n\t0800  X610\n0d17  NALTEC, Inc.\n0d18  coaXmedia\n0d19  Hank Connection Industrial Co., Ltd\n0d28  NXP\n\t0204  ARM mbed\n0d2f  Andamiro\n\t0002  Pump It Up Pad\n0d32  Leo Hui Electric Wire & Cable Co., Ltd\n0d33  AirSpeak, Inc.\n0d34  Rearden Steel Technologies\n0d35  Dah Kun Co., Ltd\n0d3a  Posiflex Technologies, Inc.\n\t0206  Series 3xxx Cash Drawer\n\t0207  Series 3xxx Cash Drawer\n\t0500  Magnetic Stripe Reader\n0d3c  Sri Cable Technology, Ltd\n0d3d  Tangtop Technology Co., Ltd\n\t0001  HID Keyboard\n\t0040  PS/2 Adapter\n0d3e  Fitcom, inc.\n0d3f  MTS Systems Corp.\n0d40  Ascor, Inc.\n0d41  Ta Yun Terminals Industrial Co., Ltd\n0d42  Full Der Co., Ltd\n0d46  Kobil Systems GmbH\n\t2012  KAAN Standard Plus (Smartcard reader)\n\t3003  mIDentity Light / KAAN SIM III\n\t3014  Smart Token\n\t4000  mIDentity (mass storage)\n\t4001  mIDentity Basic/Classic (composite device)\n\t4081  mIDentity Basic/Classic (installationless)\n0d48  Promethean Limited\n\t0001  ACTIVboard\n\t0004  ACTIVboard\n\t0100  Audio\n0d49  Maxtor\n\t3000  Drive\n\t3005  Personal Storage 3000LS\n\t3010  3000LE Drive\n\t3100  Hi-Speed USB-IDE Bridge Controller\n\t3200  Personal Storage 3200\n\t5000  5000XT Drive\n\t5010  5000LE Drive\n\t5020  Mobile Hard Disk Drive\n\t7000  OneTouch\n\t7010  OneTouch\n\t7100  OneTouch II 300GB External Hard Disk\n\t7310  OneTouch 4\n\t7410  Mobile Hard Disk Drive (1TB)\n\t7450  Basics Portable USB Device\n0d4a  NF Corp.\n0d4b  Grape Systems, Inc.\n0d4c  Tedas AG\n0d4d  Coherent, Inc.\n0d4e  Agere Systems Netherland BV\n\t047a  WLAN Card\n\t1000  Wireless Card Model 0801\n\t1001  Wireless Card Model 0802\n0d4f  EADS Airbus France\n0d50  Cleware GmbH\n\t0011  USB-Temp2 Thermometer\n\t0030  Multiplexer\n\t0040  F4 foot switch\n0d51  Volex (Asia) Pte., Ltd\n0d53  HMI Co., Ltd\n0d54  Holon Corp.\n0d55  ASKA Technologies, Inc.\n0d56  AVLAB Technology, Inc.\n0d57  Solomon Microtech, Ltd\n0d59  TRC Simulators b.v.\n\t02a8  Digital Clock\n0d5c  SMC Networks, Inc.\n\ta001  SMC2662W (v1) EZ Connect 802.11b Wireless Adapter [Atmel AT76C503A]\n\ta002  SMC2662W v2 / SMC2662W-AR / Belkin F5D6050 [Atmel at76c503a]\n0d5e  Myacom, Ltd\n\t2346  BT Digital Access adapter\n0d5f  CSI, Inc.\n0d60  IVL Technologies, Ltd\n0d61  Meilu Electronics (Shenzhen) Co., Ltd\n0d62  Darfon Electronics Corp.\n\t0003  Smartcard Reader\n\t0004  Keyboard\n\t001b  Keyboard\n\t001c  Benq X120 Internet Keyboard Pro\n\t0306  M530 Mouse\n\t0800  Magic Wheel\n\t2021  AM805 Keyboard\n\t2026  TECOM Bluetooth Device\n\t2050  Mouse\n\t2106  Dell L20U Multimedia Keyboard\n\t910e  HP Business Slim Keyboard\n\ta100  Optical Mouse\n0d63  Fritz Gegauf AG\n0d64  DXG Technology Corp.\n\t0105  Dual Mode Digital Camera 1.3M\n\t0107  Horus MT-409 Camera\n\t0108  Dual Mode Digital Camera\n\t0202  Dual Mode Video Camera Device\n\t0303  DXG-305V Camera\n\t1001  SiPix Stylecam/UMAX AstraPix 320s\n\t1002  Fashion Cam 01 Dual-Mode DSC (Video Camera)\n\t1003  Fashion Cam Dual-Mode DSC (Controller)\n\t1021  D-Link DSC 350F\n\t1208  Dual Mode Still Camera Device\n\t2208  Mass Storage\n\t3105  Dual Mode Digital Camera Disk\n\t3108  Digicam Mass Storage Device\n\t5566  Contour Roam Model 1600\n0d65  KMJP Co., Ltd\n0d66  TMT\n0d67  Advanet, Inc.\n0d68  Super Link Electronics Co., Ltd\n0d69  NSI\n0d6a  Megapower International Corp.\n0d6b  And-Or Logic\n0d70  Try Computer Co., Ltd\n0d71  Hirakawa Hewtech Corp.\n0d72  Winmate Communication, Inc.\n0d73  Hit's Communications, Inc.\n0d76  MFP Korea, Inc.\n0d77  Power Sentry/Newpoint\n0d78  Japan Distributor Corp.\n0d7a  MARX Datentechnik GmbH\n\t0001  CrypToken\n0d7b  Wellco Technology Co., Ltd\n0d7c  Taiwan Line Tek Electronic Co., Ltd\n0d7d  Phison Electronics Corp.\n\t0100  PS1001/1011/1006/1026 Flash Disk\n\t0110  Gigabyte FlexDrive\n\t0120  Disk Pro 64MB\n\t0124  GIGABYTE Disk\n\t0240  I/O-Magic/Transcend 6-in-1 Card Reader\n\t110e  NEC uPD720121/130 USB-ATA/ATAPI Bridge\n\t1240  Apacer 6-in-1 Card Reader 2.0\n\t1270  Wolverine SixPac 6000\n\t1300  Flash Disk\n\t1320  PS2031 Flash Disk\n\t1400  Attache 256MB USB 2.0 Flash Drive\n\t1420  PS2044 Pen Drive\n\t1470  Vosonic X's-Drive II+ VP2160\n\t1620  USB Disk Pro\n\t1900  USB Thumb Drive\n0d7e  American Computer & Digital Components\n\t2507  Hi-Speed USB-to-IDE Bridge Controller\n\t2517  Hi-Speed Mass Storage Device\n\t25c7  Hi-Speed USB-to-IDE Bridge Controller\n0d7f  Essential Reality LLC\n\t0100  P5 Glove glove controller\n0d80  H.R. Silvine Electronics, Inc.\n0d81  TechnoVision\n0d83  Think Outside, Inc.\n0d87  Dolby Laboratories Inc.\n0d89  Oz Software\n0d8a  King Jim Co., Ltd\n\t0101  TEPRA PRO\n0d8b  Ascom Telecommunications, Ltd\n0d8c  C-Media Electronics, Inc.\n\t0001  Audio Device\n\t0002  Composite Device\n\t0003  Sound Device\n\t0004  CM6631A Audio Processor\n\t0005  Blue Snowball\n\t0006  Storm HP-USB500 5.1 Headset\n\t000c  Audio Adapter\n\t000d  Composite Device\n\t000e  Audio Adapter (Planet UP-100, Genius G-Talk)\n\t0014  Audio Adapter (Unitek Y-247A)\n\t001f  CM108 Audio Controller\n\t0102  CM106 Like Sound Device\n\t0103  CM102-A+/102S+ Audio Controller\n\t0104  CM103+ Audio Controller\n\t0105  CM108 Audio Controller\n\t0107  CM108 Audio Controller\n\t010f  CM108 Audio Controller\n\t0115  CM108 Audio Controller\n\t0139  Multimedia Headset [Gigaware by Ignition L.P.]\n\t013c  CM108 Audio Controller\n\t0201  CM6501\n\t5000  Mass Storage Controller\n\t5200  Mass Storage Controller(0D8C,5200)\n\tb213  USB Phone CM109 (aka CT2000,VPT1000)\n0d8d  Promotion & Display Technology, Ltd\n\t0234  V-234 Composite Device\n\t0550  V-550 Composite Device\n\t0551  V-551 Composite Device\n\t0552  V-552 Composite Device\n\t0651  V-651 Composite Device\n\t0652  V-652 Composite Device\n\t0653  V-653 Composite Device\n\t0654  V-654 Composite Device\n\t0655  V-655 Composite Device\n\t0656  V-656 Composite Device\n\t0657  V-657 Composite Device\n\t0658  V-658 Composite Device\n\t0659  V-659 Composite Device\n\t0660  V-660 Composite Device\n\t0661  V-661 Composite Device\n\t0662  V-662 Composite Device\n\t0850  V-850 Composite Device\n\t0851  V-851 Composite Device\n\t0852  V-852 Composite Device\n\t0901  V-901 Composite Device\n\t0902  V-902 Composite Device\n\t0903  V-903 Composite Device\n\t4754  Voyager DMP Composite Device\n\tbb00  Bloomberg Composite Device\n\tbb01  Bloomberg Composite Device\n\tbb02  Bloomberg Composite Device\n\tbb03  Bloomberg Composite Device\n\tbb04  Bloomberg Composite Device\n\tbb05  Bloomberg Composite Device\n\tfffe  Global Tuner Composite Device\n\tffff  Voyager DMP Composite Device\n0d8e  Global Sun Technology, Inc.\n\t0163  802.11g 54 Mbps Wireless Dongle\n\t1621  802.11b Wireless Adapter\n\t3762  Cohiba 802.11g Wireless Mini adapter [Intersil ISL3887]\n\t3763  802.11g Wireless dongle\n\t7100  802.11b Adapter\n\t7110  WL-210 / WU210P 802.11b Wireless Adapter [Atmel AT76C503A]\n\t7605  TRENDnet TEW-224UB 802.11b Wireless Adapter [Atmel AT76C503A]\n\t7801  AR5523\n\t7802  AR5523 (no firmware)\n\t7811  AR5523\n\t7812  AR5523 (no firmware)\n\t7a01  PRISM25 802.11b Adapter\n0d8f  Pitney Bowes\n0d90  Sure-Fire Electrical Corp.\n0d96  Skanhex Technology, Inc.\n\t0000  Jenoptik JD350 video\n\t3300  SX330z Camera\n\t4100  SX410z Camera\n\t4102  MD 9700 Camera\n\t4104  Jenoptik JD-4100z3s\n\t410a  Medion 9801/Novatech SX-410z\n\t5200  SX-520z Camera\n0d97  Santa Barbara Instrument Group\n\t0001  SBIG Astronomy Camera (without firmware)\n\t0101  SBIG Astronomy Camera (with firmware)\n0d98  Mars Semiconductor Corp.\n\t0300  Avaya Wireless Card\n\t1007  Discovery Kids Digital Camera\n0d99  Trazer Technologies, Inc.\n0d9a  RTX AS\n\t0001  Bluetooth Device\n0d9b  Tat Shing Electrical Co.\n0d9c  Chee Chen Hi-Technology Co., Ltd\n0d9d  Sanwa Supply, Inc.\n0d9e  Avaya\n\t0300  Wireless Card\n0d9f  Powercom Co., Ltd\n\t0001  Uninterruptible Power Supply\n\t0002  Black Knight PRO / WOW Uninterruptible Power Supply (Cypress HID->COM RS232)\n\t00a2  Imperial Uninterruptible Power Supply (HID PDC)\n\t00a3  Smart King PRO Uninterruptible Power Supply (HID PDC)\n\t00a4  WOW Uninterruptible Power Supply (HID PDC)\n\t00a5  Vanguard Uninterruptible Power Supply (HID PDC)\n\t00a6  Black Knight PRO Uninterruptible Power Supply (HID PDC)\n0da0  Danger Research\n0da1  Suzhou Peter's Precise Industrial Co., Ltd\n0da2  Land Instruments International, Ltd\n0da3  Nippon Electro-Sensory Devices Corp.\n0da4  Polar Electro Oy\n\t0001  Interface\n\t0003  FlowLink\n\t0008  Loop\n0da7  IOGear, Inc.\n0da8  softDSP Co., Ltd\n\t0001  SDS 200A Oscilloscope\n0dab  Cubig Group\n\t0100  DVR/CVR-M140 MP3 Player\n0dad  Westover Scientific\n0db0  Micro Star International\n\t1020  PC2PC WLAN Card\n\t1967  Bluetooth Dongle\n\t3713  Primo 73\n\t3801  Motorola Bluetooth 2.1+EDR Device\n\t3870  MS-3870 802.11bgn Wireless Module [Ralink RT3070]\n\t3871  MS-3871 802.11bgn Wireless Module [Ralink RT8070]\n\t4011  Medion Flash XL V2.0 Card Reader\n\t4023  Lexar Mobile Card Reader\n\t4600  802.11b/g Turbo Wireless Adapter\n\t5501  Mass Storage Device\n\t5502  Mass Storage Device\n\t5513  MP3 Player\n\t5515  MP3 Player\n\t5516  MP3 Player\n\t5580  Mega Sky 580 DVB-T Tuner [M902x]\n\t5581  Mega Sky 580 DVB-T Tuner [GL861]\n\t6823  UB11B/MS-6823 802.11b Wi-Fi adapter\n\t6826  IEEE 802.11g Wireless Network Adapter\n\t6855  Bluetooth Device\n\t6861  MSI-6861 802.11g WiFi adapter\n\t6865  RT2570\n\t6869  RT2570\n\t6874  RT2573\n\t6877  RT2573\n\t6881  Bluetooth Class I EDR Device\n\t688a  Bluetooth Class I EDR Device\n\t6899  802.11bgn 1T1R Mini Card Wireless Adapter\n\t6970  MS-6970 BToes Bluetooth adapter\n\t697a  Bluetooth Dongle\n\t6982  Medion Flash XL Card Reader\n\ta861  RT2573\n\ta874  RT2573\n\ta970  Bluetooth dongle\n\ta97a  Bluetooth EDR Device\n\tb970  Bluetooth EDR Device\n\tb97a  Bluetooth EDR Device\n\tffff  Bluetooth Adapter in DFU mode\n0db1  Wen Te Electronics Co., Ltd\n0db2  Shian Hwi Plug Parts, Plastic Factory\n0db3  Tekram Technology Co., Ltd\n0db4  Chung Fu Chen Yeh Enterprise Corp.\n0db5  Access IS\n\t0139  Barcode Module - CDC serial\n\t013a  Barcode Module - Virtual Keyboard\n\t013b  Barcode Module - HID\n\t0160  NFC and Smartcard Module (NSM)\n\t0164  NFC and Smartcard Module (NSM)with 4 SAM slots\n0db7  ELCON Systemtechnik\n\t0002  Goldpfeil P-LAN\n0dba  Digidesign\n\t1000  Mbox 1 [Mbox]\n\t3000  Mbox 2\n\tb011  Eleven Rack\n0dbc  A&D Medical\n\t0003  AND Serial Cable [AND Smart Cable]\n0dbe  Jiuh Shiuh Precision Industry Co., Ltd\n0dbf  Jess-Link International\n\t0002  SmartDongle Security Key\n\t0200  HDD Storage Solution\n\t021b  USB-2.0 IDE Adapter\n\t0300  Storage Adapter\n\t0333  Storage Adapter\n\t0502  FSC Storagebird XL hard disk\n\t0707  ZIV Drive\n0dc0  G7 Solutions (formerly Great Notions)\n0dc1  Tamagawa Seiki Co., Ltd\n0dc3  Athena Smartcard Solutions, Inc.\n\t0801  ASEDrive III\n\t0802  ASEDrive IIIe\n\t1104  ASEDrive IIIe KB\n\t1701  ASEKey\n\t1702  ASEKey\n0dc4  inXtron, Inc.\n\t0040  Mass Storage Device\n\t0041  Mass Storage Device\n\t0042  Mass Storage Device\n\t0101  Hi-Speed Mass Storage Device\n\t0209  SK-3500 S2\n\t020a  Oyen Digital MiniPro 2.5\" hard drive enclosure\n\t0290  Mass Storage Device [NT2 U3.1]\n0dc5  SDK Co., Ltd\n0dc6  Precision Squared Technology Corp.\n\t2301  Wireless Touchpad Keyboard\n0dc7  First Cable Line, Inc.\n0dcd  NetworkFab Corp.\n\t0001  Remote Interface Adapter\n\t0002  High Bandwidth Codec\n0dd0  Access Solutions\n\t1002  Triple Talk Speech Synthesizer\n0dd1  Contek Electronics Co., Ltd\n0dd2  Power Quotient International Co., Ltd\n\t0003  Mass Storage (P)\n0dd3  MediaQ\n0dd4  Custom Engineering SPA\n\t0237  K80 80mm Thermal Printer\n0dd5  California Micro Devices\n0dd7  Kocom Co., Ltd\n0dd8  Netac Technology Co., Ltd\n\t0562  Netac Portable SSD Z6s\n\t1060  USB-CF-Card\n\te007  OnlyDisk U222 Pendrive\n\tf607  OnlyDisk U210 1G flash drive [U-SAFE]\n0dd9  HighSpeed Surfing\n0dda  Integrated Circuit Solution, Inc.\n\t0001  Multi-Card Reader 6in1\n\t0002  Multi-Card Reader 7in1\n\t0003  Flash Disk\n\t0005  Internal Multi-Card Reader 6in1\n\t0008  SD single card reader\n\t0009  MS single card reader\n\t000a  MS+SD Dual Card Reader\n\t000b  SM single card reader\n\t0101  All-In-One Card Reader\n\t0102  All-In-One Card Reader\n\t0301  MP3 Player\n\t0302  Multi-Card MP3 Player\n\t1001  Multi-Flash Disk\n\t2001  Multi-Card Reader\n\t2002  Q018 default PID\n\t2003  Multi-Card Reader\n\t2005  Datalux DLX-1611 16in1 Card Reader\n\t2006  All-In-One Card Reader\n\t2007  USB to ATAPI bridge\n\t2008  All-In-One Card Reader\n\t2013  SD/MS Combo Card Reader\n\t2014  SD/MS Single Card Reader\n\t2023  card reader SD/MS DEMO board with ICSI brand name (MaskROM version)\n\t2024  card reader SD/MS DEMO board with Generic brand name (MaskROM version)\n\t2026  USB2.0 Card Reader\n\t2027  USB 2.0 Card Reader\n\t2315  UFD MP3 player (model 2)\n\t2318  UFD MP3 player (model 1)\n\t2321  UFD MP3 player\n0ddb  Tamarack, Inc.\n0ddd  Datelink Technology Co., Ltd\n0dde  Ubicom, Inc.\n0de0  BD Consumer Healthcare\n0de7  USBmicro\n\t0191  U401 Interface card\n\t01a5  U421 interface card\n\t01c3  U451 relay interface card\n0dea  UTECH Electronic (D.G.) Co., Ltd.\n0ded  Novasonics\n0dee  Lifetime Memory Products\n\t4010  Storage Adapter\n0def  Full Rise Electronic Co., Ltd\n0df4  NET&SYS\n\t0201  MNG-2005\n0df6  Sitecom Europe B.V.\n\t0001  C-Media VOIP Device\n\t0004  Bluetooth 2.0 Adapter 100m\n\t0007  Bluetooth 2.0 Adapter 10m\n\t000b  Bluetooth 2.0 Adapter DFU\n\t000d  WL-168 Wireless Network Adapter 54g\n\t0017  WL-182 Wireless-N Network USB Card\n\t0019  Bluetooth 2.0 adapter 10m CN-512v2 001\n\t001a  Bluetooth 2.0 adapter 100m CN-521v2 001 \n\t002b  WL-188 Wireless Network 300N USB Adapter\n\t002c  WL-301 Wireless Network 300N USB Adapter\n\t002d  WL-302 Wireless Network 300N USB dongle \n\t0036  WL-603 Wireless Adapter\n\t0039  WL-315 Wireless-N USB Adapter\n\t003b  WL-321 Wireless USB Gaming Adapter 300N\n\t003c  WL-323 Wireless-N USB Adapter\n\t003d  WL-324 Wireless USB Adapter 300N\n\t003e  WL-343 Wireless USB Adapter 150N X1\n\t003f  WL-608 Wireless USB Adapter 54g\n\t0040  WL-344 Wireless Adapter 300N X2 [Ralink RT3071]\n\t0041  WL-329 Wireless Dualband USB adapter 300N\n\t0042  WL-345 Wireless USB adapter 300N X3\n\t0045  WL-353 Wireless USB Adapter 150N Nano\n\t0047  WL-352v1 Wireless USB Adapter 300N 002\n\t0048  WL-349v1 Wireless Adapter 150N 002 [Ralink RT3070]\n\t0049  WL-356 Wireless Adapter 300N\n\t004a  WL-358v1 Wireless Micro USB Adapter 300N X3 002\n\t004b  WL-349v3 Wireless Micro Adapter 150N X1 [Realtek RTL8192SU]\n\t004c  WL-352 802.11n Adapter [Realtek RTL8191SU]\n\t0050  WL-349v4 Wireless Micro Adapter 150N X1 [Ralink RT3370]\n\t0056  LN-031 10/100/1000 Ethernet Adapter\n\t005d  WLA-2000 v1.001 WLAN [RTL8191SU]\n\t0060  WLA-4000 802.11bgn [Ralink RT3072]\n\t0062  WLA-5000 802.11abgn [Ralink RT3572]\n\t006f  WLA-5100\n\t0072  AX88179 Gigabit Ethernet [Sitecom]\n\t061c  LN-028 Network USB 2.0 Adapter\n\t214a  IDE/SATA Combo Adapter [CN-330]\n\t21f4  44 St Bluetooth Device\n\t2200  Sitecom bluetooth2.0 class 2 dongle CN-512\n\t2208  Sitecom bluetooth2.0 class 2 dongle CN-520\n\t2209  Sitecom bluetooth2.0 class 1 dongle CN-521\n\t3068  DC-104v2 ISDN Adapter [HFC-S]\n\t9071  WL-113 rev 1 Wireless Network USB Adapter\n\t9075  WL-117 Hi-Speed USB Adapter\n\t90ac  WL-172 Wireless Network USB Adapter 54g Turbo\n\t9712  WL-113 rev 2 Wireless Network USB Adapter\n0df7  Mobile Action Technology, Inc.\n\t0620  MA-620 Infrared Adapter\n\t0700  MA-700 Bluetooth Adapter\n\t0720  MA-720 Bluetooth Adapter\n\t0722  Bluetooth Dongle\n\t0730  MA-730/MA-730G Bluetooth Adapter\n\t0800  Data Cable\n\t0820  Data Cable\n\t0900  MA i-gotU Travel Logger GPS\n\t1800  Generic Card Reader\n\t1802  Card Reader\n0dfa  Toyo Communication Equipment Co., Ltd\n0dfc  GeneralTouch Technology Co., Ltd\n\t0001  Touchscreen\n\t0003  MultiTouch TouchScreen(Dualtouch)\n\t0101  5-point Touch Screen\n\td107  MultiTouch TouchScreen\n0e03  Nippon Systemware Co., Ltd\n0e08  Winbest Technology Co., Ltd\n0e0b  Amigo Technology Inc.\n\t9031  802.11n Wireless USB Card\n\t9041  802.11n Wireless USB Card\n0e0c  Gesytec\n\t0101  LonUSB LonTalk Network Adapter\n0e0d  PicoQuant GmbH\n\t0003  PicoHarp 300\n0e0f  VMware, Inc.\n\t0001  Device\n\t0002  Virtual USB Hub\n\t0003  Virtual Mouse\n\t0004  Virtual CCID\n\t0005  Virtual Mass Storage\n\t0006  Virtual Keyboard\n\t000a  Virtual Sensors\n\t8001  Root Hub\n\t8002  Root Hub\n\t8003  Root Hub\n\tf80a  Smoker FX2\n0e16  JMTek, LLC\n0e17  Walex Electronic, Ltd\n0e1a  Unisys\n0e1b  Crewave\n0e1e  Green Hills Software\n0e20  Pegasus Technologies Ltd.\n\t0101  NoteTaker\n\t0200  Seiko Instruments InkLink Handwriting System\n0e21  Cowon Systems, Inc.\n\t0300  iAudio CW200\n\t0400  MP3 Player\n\t0500  iAudio M3\n\t0510  iAudio X5, subpack USB port\n\t0513  iAudio X5, side USB port\n\t0520  iAudio M5, side USB port\n\t0601  iAudio G3\n\t0681  iAUDIO E2\n\t0700  iAudio U3\n\t0751  iAudio 7\n\t0760  iAUDIO U5 / iAUDIO G2\n\t0800  Cowon D2 (UMS mode)\n\t0801  Cowon D2 (MTP mode)\n\t0910  iAUDIO 9\n\t0920  J3\n0e22  Symbian Ltd.\n0e23  Liou Yuane Enterprise Co., Ltd\n0e25  VinChip Systems, Inc.\n0e26  J-Phone East Co., Ltd\n0e2c  Materialise Motion NV\n\t0012  footscan pressure plate (0.5m)\n\t0013  footscan pressure plate (1.0m)\n\t0018  footscan 2D interface box\n\t0020  footscan pressure plate (1.5m)\n\t002d  footscan heavy duty pressure plate (1.0m)\n0e2e  Brady Worldwide, Inc.\n\t000b  BMP 51\n\t000c  BMP 61\n\t000d  BMP 41\n0e30  HeartMath LLC\n0e34  Micro Computer Control Corp.\n0e35  3Pea Technologies, Inc.\n0e36  TiePie engineering\n\t0009  Handyscope HS3\n\t000b  Handyscope HS4\n\t000f  Handyscope HS4-DIFF (br)\n\t0010  Handyscope HS2\n\t0011  TiePieSCOPE HS805 (br)\n\t0012  TiePieSCOPE HS805\n\t0013  Handyprobe HP3\n\t0014  Handyprobe HP3\n\t0018  Handyprobe HP2\n\t001b  Handyscope HS5\n\t0042  TiePieSCOPE HS801\n\t00fd  USB To Parallel adapter\n\t00fe  USB To Parallel adapter\n0e38  Stratitec, Inc.\n0e39  Smart Modular Technologies, Inc.\n\t0137  Bluetooth Device\n0e3a  Neostar Technology Co., Ltd\n\t1100  CW-1100 Wireless Network Adapter\n0e3b  Mansella, Ltd\n0e41  Line6, Inc.\n\t4147  TonePort GX\n\t414d  Pod HD500\n\t4156  POD HD Desktop\n\t4250  BassPODxt\n\t4252  BassPODxt Pro\n\t4642  BassPODxt Live\n\t4650  PODxt Live\n\t4750  GuitarPort\n\t5044  PODxt\n\t5050  PODxt Pro\n\t534d  SeaMonkey\n0e44  Sun-Riseful Technology Co., Ltd.\n0e48  Julia Corp., Ltd\n\t0100  CardPro SmartCard Reader\n0e4a  Shenzhen Bao Hing Electric Wire & Cable Mfr. Co.\n0e4c  Radica Games, Ltd\n\t1097  Gamester Controller\n\t1103  Gamester Reflex\n\t2390  Jtech Controller\n\t3510  Gamester for Xbox\n\t7288  funkey reader\n0e50  TechnoData Interware\n\t0001  Matrix USB-Key\n\t0002  Matrixlock Dongle (HID)\n0e55  Speed Dragon Multimedia, Ltd\n\t110a  Tanic S110-SG1 + ISSC IS1002N [Slow Infra-Red (SIR) & Bluetooth 1.2 (Class 2) Adapter]\n\t110b  MS3303H USB-to-Serial Bridge\n0e56  Kingston Technology Company, Inc.\n\t6021  K-PEX 100\n0e5a  Active Co., Ltd\n0e5b  Union Power Information Industrial Co., Ltd\n0e5c  Bitland Information Technology Co., Ltd\n\t6118  LCD Device\n\t6119  remote receive and control device\n\t6441  C-Media Sound Device\n0e5d  Neltron Industrial Co., Ltd\n0e5e  Conwise Technology Co., Ltd.\n\t6622  CW6622\n0e66  Hawking Technologies\n\t0001  HWUN1 Hi-Gain Wireless-300N Adapter w/ Upgradable Antenna [Ralink RT2870]\n\t0003  HWDN1 Hi-Gain Wireless-300N Dish Adapter [Ralink RT2870]\n\t0009  HWUN2 Hi-Gain Wireless-150N Adapter w/ Upgradable Antenna [Ralink RT2770]\n\t000b  HWDN2 Hi-Gain Wireless-150N Dish Adapter [Ralink RT2770]\n\t0013  HWUN3 Hi-Gain Wireless-N Adapter [Ralink RT3070]\n\t0015  HWDN2 Rev. E Hi-Gain Wireless-150N Dish Adapter [Realtek RTL8191SU]\n\t0017  HAWNU1 Hi-Gain Wireless-150N Network Adapter with Range Amplifier [Ralink RT3070]\n\t0018  Wireless-N Network Adapter [Ralink RT2870]\n\t400b  UF100 10/100 Network Adapter\n\t400c  UF100 Ethernet [pegasus2]\n0e67  Fossil, Inc.\n\t0002  Wrist PDA\n0e6a  Megawin Technology Co., Ltd\n\t0101  MA100 [USB-UART Bridge IC]\n\t02c0  Defender Gaming Keyboard\n\t030b  Truly Ergonomic Computer Keyboard (Device Firmware Update mode)\n\t030c  Truly Ergonomic Computer Keyboard\n\t6001  GEMBIRD Flexible keyboard KB-109F-B-DE\n\t7f5c  BPF-015 Key Chain Photo Frame\n0e6f  Logic3\n\t0003  Freebird wireless Controller\n\t0005  Eclipse wireless Controller\n\t0006  Edge wireless Controller\n\t0008  After Glow Pro Controller\n\t0105  Disney's High School Musical 3 Dance Pad for Xbox 360\n\t0113  Afterglow AX.1 Gamepad\n\t011f  Rock Candy Wired Controller for Xbox 360\n\t0128  Wireless PS3 Controller\n\t0131  PDP EA Sports Controller\n\t0133  Wired Controller\n\t0139  Afterglow Prismatic Wired Controller for Xbox One\n\t013a  PDP Xbox One Controller\n\t0146  Rock Candy Wired Controller for Xbox One\n\t0147  PDP Marvel Controller for Xbox One\n\t015c  PDP Arcade Stick for Xbox One\n\t0161  Camo Wired Controller for Xbox One\n\t0162  Xbox One Wired Controller\n\t0163  Legendary Collection Deliverer of Truth\n\t0164  Battlefield 1 Wired Controller for Xbox One\n\t0165  Titanfall 2 Wired Controller for Xbox One\n\t0201  Pelican PL-3601\n\t0213  Afterglow Gamepad for Xbox 360\n\t021f  Rock Candy Gamepad for Xbox 360\n\t0246  Rock Candy Gamepad for Xbox One\n\t0301  Controller\n\t0346  Rock Candy Wired Controller for Xbox One\n\t0401  Controller\n\t0413  Afterglow AX.1 Gamepad for Xbox 360\n\t0501  Wired Controller\n\tf501  Hi-TEC Essentials Wired Gamepad\n\tf900  Afterglow AX.1\n0e70  Tokyo Electronic Industry Co., Ltd\n0e72  Hsi-Chin Electronics Co., Ltd\n0e75  TVS Electronics, Ltd\n0e79  Archos, Inc.\n\t1106  Pocket Media Assistant - PMA400\n\t1204  Gmini XS 200\n\t1306  504 Portable Multimedia Player\n\t1330  5 Tablet\n\t1332  5 IMT\n\t1416  32 IT\n\t1417  A43 IT\n\t14ad  97 Titanium HD\n\t150e  80 G9\n\t3001  40 Titanium\n0e7b  On-Tech Industry Co., Ltd\n0e7e  Gmate, Inc.\n\t0001  Yopy 3000 PDA\n\t1001  YP3X00 PDA\n0e82  Ching Tai Electric Wire & Cable Co., Ltd\n0e83  Shin An Wire & Cable Co.\n0e8c  Well Force Electronic Co., Ltd\n0e8d  MediaTek Inc.\n\t0002  phone (mass storage mode) [Doro Primo 413]\n\t0003  MT6227 phone\n\t0004  MT6227 phone\n\t0023  S103 / Powertel M6200\n\t00a5  GSM modem [Medion Surfstick Model:S4222]\n\t1806  Samsung SE-208 Slim Portable DVD Writer\n\t1836  Samsung SE-S084 Super WriteMaster Slim External DVD writer\n\t1887  Slim Portable DVD Writer\n\t1956  Samsung SE-506 Portable BluRay Disc Writer\n\t2000  MT65xx Preloader\n\t2008  Cyrus Technology CS 24\n\t3329  Qstarz BT-Q1000XT\n\t7612  MT7612U 802.11a/b/g/n/ac Wireless Adapter\n\t763e  MT7630e Bluetooth Adapter\n\t7668  MT7668 2x2 Dual Band Dual Concurrent 802.11a/b/g/n/ac WiFi with MU-MIMO and Bluetooth 5.0 Radios\n0e8f  GreenAsia Inc.\n\t0003  MaxFire Blaze2\n\t0012  Joystick/Gamepad\n\t0016  4 port USB 1.1 hub UH-174\n\t0020  USB to PS/2 Adapter\n\t0021  Multimedia Keyboard Controller\n\t0022  multimedia keyboard controller\n\t0201  SmartJoy Frag Xpad/PS2 adaptor\n\t3008  Xbox Controller\n\t300a  steering Wheel\n0e90  WiebeTech, LLC\n\t0100  Storage Adapter V1\n0e91  VTech Engineering Canada, Ltd\n0e92  C's Glory Enterprise Co., Ltd\n0e93  eM Technics Co., Ltd\n0e95  Future Technology Co., Ltd\n0e96  Aplux Communications, Ltd\n\tc001  TRUST 380 USB2 SPACEC@M\n0e97  Fingerworks, Inc.\n\t0908  Composite HID (Keyboard and Mouse)\n0e98  Advanced Analogic Technologies, Inc.\n0e99  Parallel Dice Co., Ltd\n0e9a  TA HSING Industries, Ltd\n0e9b  ADTEC Corp.\n0e9c  Streamzap, Inc.\n\t0000  Streamzap Remote Control\n0e9f  Tamura Corp.\n0ea0  Ours Technology, Inc.\n\t2126  7-in-1 Card Reader\n\t2153  SD Card Reader Key\n\t2168  Transcend JetFlash 2.0 / Astone USB Drive / Intellegent Stick 2.0\n\t2213  WinDroid N287 AH7N2502.013317\n\t6803  OTI-6803 Flash Disk\n\t6808  OTI-6808 Flash Disk\n\t6828  OTI-6828 Flash Disk\n\t6858  OTi-6858 serial adapter\n0ea6  Nihon Computer Co., Ltd\n0ea7  MSL Enterprises Corp.\n0ea8  CenDyne, Inc.\n0ead  Humax Co., Ltd\n0eb0  NovaTech\n\t9020  NovaTech NV-902W\n\t9021  RT2573\n0eb1  WIS Technologies, Inc.\n\t6666  WinFast WalkieTV TV Loader\n\t6668  WinFast WalkieTV TV Loader\n\t7007  WinFast WalkieTV WDM Capture\n0eb2  Y-S Electronic Co., Ltd\n0eb3  Saint Technology Corp.\n0eb7  Endor AG\n0eb8  Mettler Toledo\n\t2200  Ariva Scale\n\tf000  BC60 Scale\n0ebb  Thermo Fisher Scientific\n\t0002  FT-IR Spectrometer\n0ebe  VWeb Corp.\n0ebf  Omega Technology of Taiwan, Inc.\n0ec0  LHI Technology (China) Co., Ltd\n0ec1  Abit Computer Corp.\n0ec2  Sweetray Industrial, Ltd\n0ec3  Axell Co., Ltd\n0ec4  Ballracing Developments, Ltd\n0ec5  GT Information System Co., Ltd\n0ec6  InnoVISION Multimedia, Ltd\n0ec7  Theta Link Corp.\n\t1008  So., Show 301 Digital Camera\n0ecd  Lite-On IT Corp.\n\t1400  CD\\RW 40X\n\ta100  LDW-411SX DVD/CD Rewritable Drive\n0ece  TaiSol Electronics Co., Ltd\n0ecf  Phogenix Imaging, LLC\n0ed1  WinMaxGroup\n\t6660  Flash Disk 64M-C\n\t6680  Flash Disk 64M-B\n\t7634  MP3 Player\n0ed2  Kyoto Micro Computer Co., Ltd\n0ed3  Wing-Tech Enterprise Co., Ltd\n0ed5  Fiberbyte\n\te000  USB-inSync Device\n\tf000  Fiberbyte USB-inSync Device\n\tf201  Fiberbyte USB-inSync DAQ-2500X\n0eda  Noriake Itron Corp.\n0edf  e-MDT Co., Ltd\n\t2060  FID irock! 100 Series\n0ee0  Shima Seiki Mfg., Ltd\n0ee1  Sarotech Co., Ltd\n0ee2  AMI Semiconductor, Inc.\n0ee3  ComTrue Technology Corp.\n\t1000  Image Tank 1.5\n0ee4  Sunrich Technology, Ltd\n\t0690  SATA 3 Adapter\n0eee  Digital Stream Technology, Inc.\n\t8810  Mass Storage Drive\n0eef  D-WAV Scientific Co., Ltd\n\t0001  Titan6001 Surface Acoustic Wave Touchscreen Controller [eGalax]\n\t0002  Touchscreen Controller(Professional)\n\t7200  Touchscreen Controller\n\t7904  Multitouch Capacitive Touchscreen eGalaxTouch EXC7904-21v00_T13 [IIyama Prolite T1932-MSC]\n\ta802  eGalaxTouch EXC7920\n\tb10e  eGalaxTouch EXC3000\n\tc000  Multitouch Capacitive Touchscreen eGalaxTouch EXC3188-4643-08.00.00.00 Sirius_4643 PCAP3188UR Series [IIyama Prolite PLT1932MSC]\n0ef0  Hitachi Cable, Ltd\n0ef1  Aichi Micro Intelligent Corp.\n0ef2  I/O Magic Corp.\n0ef3  Lynn Products, Inc.\n0ef4  DSI Datotech\n0ef5  PointChips\n\t2202  Flash Disk\n\t2366  Flash Disk\n0ef6  Yield Microelectronics Corp.\n0ef7  SM Tech Co., Ltd (Tulip)\n0efd  Oasis Semiconductor\n0efe  Wem Technology, Inc.\n0f03  Unitek UPS Systems\n\t0001  Alpha 1200Sx\n0f06  Visual Frontier Enterprise Co., Ltd\n0f08  CSL Wire & Plug (Shen Zhen) Co.\n0f0c  CAS Corp.\n0f0d  Hori Co., Ltd\n\t000a  Dead or Alive 4 FightStick for Xbox 360\n\t000c  Horipad EX Turbo for Xbox 360\n\t000d  Fighting Stick EX2 for Xbox 360\n\t0011  Real Arcade Pro 3\n\t0016  Real Arcade Pro.EX for Xbox 360\n\t001b  Real Aracde Pro.VX\n\t0063  Real Arcade Pro Hayabusa for Xbox One\n\t0067  Horipad One\n\t0078  Real Arcade Pro V Kai for Xbox One / Xbox 360\n\t0090  Horipad Ultimate\n\t00c1  HORIPAD for Nintendo Switch\n0f0e  Energy Full Corp.\n0f0f  Silego Technology Inc\n\t0006  GreenPak Universal Dev Board (Active Mode)\n\t8006  GreenPak Universal Dev Board (Reset Mode)\n0f11  LD Didactic GmbH\n\t1000  CASSY-S\n\t1010  Pocket-CASSY\n\t1020  Mobile-CASSY\n\t1080  Joule and Wattmeter\n\t1081  Digital Multimeter P\n\t1090  UMI P\n\t1100  X-Ray Apparatus\n\t1101  X-Ray Apparatus\n\t1200  VideoCom\n\t2000  COM3LAB\n\t2010  Terminal Adapter\n\t2020  Network Analyser\n\t2030  Converter Control Unit\n\t2040  Machine Test System\n0f12  Mars Engineering Corp.\n0f13  Acetek Technology Co., Ltd\n0f14  Ingenico\n\t0012  Vital'Act 3S\n\t0038  XIRING Smart Card Terminal LEO V2\n0f18  Finger Lakes Instrumentation\n\t0002  CCD\n\t0006  Focuser\n\t0007  Filter Wheel\n\t000a  ProLine CCD\n\t000b  Color Filter Wheel 4\n\t000c  PDF2\n\t000d  Guider\n0f19  Oracom Co., Ltd\n0f1b  Onset Computer Corp.\n0f1c  Funai Electric Co., Ltd\n0f1d  Iwill Corp.\n0f21  IOI Technology Corp.\n0f22  Senior Industries, Inc.\n0f23  Leader Tech Manufacturer Co., Ltd\n0f24  Flex-P Industries, Snd., Bhd.\n0f2d  ViPower, Inc.\n0f2e  Geniality Maple Technology Co., Ltd\n0f2f  Priva Design Services\n0f30  Jess Technology Co., Ltd\n\t001c  PS3 Guitar Controller Dongle\n\t010b  Philips Recoil\n\t0110  Dual Analog Rumble Pad\n\t0111  Colour Rumble Pad\n\t0202  Joytech Advanced Controller\n\t0208  Xbox & PC Gamepad\n\t8888  BigBen XBMiniPad Controller\n0f31  Chrysalis Development\n0f32  YFC-BonEagle Electric Co., Ltd\n0f37  Kokuyo Co., Ltd\n0f38  Nien-Yi Industrial Corp.\n0f39  TG3 Electronics\n\t0404  Recreated ZX Spectrum Keyboard\n\t0876  Keyboard [87 Francium Pro]\n\t1086  DK2108SZ Keyboard [Ducky Zero]\n0f3d  Airprime, Incorporated\n\t0112  CDMA 1xEVDO PC Card, PC 5220\n0f41  RDC Semiconductor Co., Ltd\n0f42  Nital Consulting Services, Inc.\n0f44  Polhemus\n\tef11  Patriot (firmware not loaded)\n\tef12  Patriot\n\tff11  Liberty (firmware not loaded)\n\tff12  Liberty\n0f49  Evolis SA\n\t0a00  Zenius\n0f4b  St. John Technology Co., Ltd\n0f4c  WorldWide Cable Opto Corp.\n0f4d  Microtune, Inc.\n\t1000  Bluetooth Dongle\n0f4e  Freedom Scientific\n0f52  Wing Key Electrical Co., Ltd\n0f53  Dongguan White Horse Cable Factory, Ltd\n0f54  Kawai Musical Instruments Mfg. Co., Ltd\n\t0101  MP6 Stage Piano\n0f55  AmbiCom, Inc.\n0f5c  Prairiecomm, Inc.\n0f5d  NewAge International, LLC\n\t9455  Compact Drive\n0f5f  Key Technology Corp.\n0f60  NTK, Ltd\n0f61  Varian, Inc.\n0f62  Acrox Technologies Co., Ltd\n\t1001  Targus Mini Trackball Optical Mouse\n0f63  LeapFrog Enterprises\n\t0010  Leapster Explorer\n\t0022  Leap Reader\n\t0500  Fly Fusion\n\t0600  Leap Port Turbo\n\t0700  POGO\n\t0800  Didj\n\t0900  TAGSchool\n\t0a00  Leapster 2\n\t0b00  Crammer\n\t0c00  Tag Jr\n\t0d00  My Pal Scout\n\t0e00  Tag32\n\t0f00  Tag64\n\t1000  Kiwi16\n\t1100  Leapster L2x\n\t1111  Fly Fusion\n\t1300  Didj UK/France (Leapster Advance)\n0f68  Kobe Steel, Ltd\n0f69  Dionex Corp.\n0f6a  Vibren Technologies, Inc.\n0f6e  INTELLIGENT SYSTEMS\n\t0100  IS-CGB-EMULATOR\n\t0201  GameBoy Advance Flash Gang Writer\n\t0202  IS-AGB-CAPTURE\n\t0300  IS-DOL-VIEWER\n\t0400  IS-NITRO-EMULATOR\n\t0401  IS-NITRO-UIC\n\t0402  IS-NITRO-WRITER\n\t0403  IS-NITRO-CAPTURE\n\t0404  IS-NITRO-EMULATOR (DS Lite)\n\t0500  IS-TWL-DEBUGGER\n\t0501  IS-TWL-CAPTURE\n0f73  DFI\n0f78  Guntermann & Drunck GmbH\n0f7c  DQ Technology, Inc.\n0f7d  NetBotz, Inc.\n0f7e  Fluke Corp.\n0f88  VTech Holdings, Ltd\n\t3012  RT2570\n\t3014  ZD1211B\n0f8b  Yazaki Corp.\n0f8c  Young Generation International Corp.\n0f8d  Uniwill Computer Corp.\n0f8e  Kingnet Technology Co., Ltd\n0f8f  Soma Networks\n0f97  CviLux Corp.\n0f98  CyberBank Corp.\n0f9c  Hyun Won, Inc.\n\t0301  M-Any Premium DAH-610 MP3/WMA Player\n\t0332  mobiBLU DAH-1200 MP3/Ogg Player\n0f9e  Lucent Technologies\n0fa3  Starconn Electronic Co., Ltd\n0fa4  ATL Technology\n0fa5  Sotec Co., Ltd\n0fa7  Epox Computer Co., Ltd\n0fa8  Logic Controls, Inc.\n0faf  Winpoint Electronic Corp.\n0fb0  Haurtian Wire & Cable Co., Ltd\n0fb1  Inclose Design, Inc.\n0fb2  Juan-Chern Industrial Co., Ltd\n0fb6  Heber Ltd\n\t3fc3  Firefly X10i I/O Board (with firmware)\n\t3fc4  Firefly X10i I/O Board (without firmware)\n0fb8  Wistron Corp.\n\t0002  eHome Infrared Receiver\n0fb9  AACom Corp.\n0fba  San Shing Electronics Co., Ltd\n0fbb  Bitwise Systems, Inc.\n0fc1  Mitac Internatinal Corp.\n0fc2  Plug and Jack Industrial, Inc.\n0fc5  Delcom Engineering\n\t1222  I/O Development Board\n0fc6  Dataplus Supplies, Inc.\n0fca  Research In Motion, Ltd.\n\t0001  Blackberry Handheld\n\t0004  Blackberry Handheld\n\t0006  Blackberry Pearl\n\t0008  Blackberry Pearl\n\t8001  Blackberry Handheld\n\t8004  Blackberry\n\t8007  Blackberry Handheld\n\t8010  Blackberry Playbook (Connect to Windows mode)\n\t8011  Blackberry Playbook (Connect to Mac mode)\n\t8014  Blackberry Handheld Z30\n\t8020  Blackberry Playbook (CD-Rom mode)\n\t8037  Blackberry PRIV\n0fce  Sony Ericsson Mobile Communications AB\n\t0076  W910i (Multimedia mode)\n\t00af  V640i Phone [PTP Camera]\n\t00d4  C902 [MTP]\n\t00d9  C702 Phone\n\t0112  W995 Walkman Phone\n\t014e  J108i Cedar (MTP mode)\n\t015a  Xperia Pro [Media Transfer Protocol]\n\t0166  Xperia Mini Pro\n\t0167  ST15i (Xperia mini)\n\t0169  Xperia S\n\t0172  Xperia P\n\t0177  Xperia Ion [Mass Storage]\n\t0188  ST26i\n\t019c  C6833\n\t019e  C6903\n\t01a5  SO-04F\n\t01a7  D5503\n\t01ba  D6603 [Xperia Z3]\n\t01bb  D5803 [Xperia Z3 Compact] (MTP mode)\n\t01e0  F5122 [Xperia X dual] (MTP mode)\n\t01e8  F5321 [Xperia X Compact] (MTP mode)\n\t01f9  H8314 [Xperia XZ2 Compact]\n\t1010  WMC Modem\n\t10af  V640i Phone [PictBridge]\n\t10d4  C902 Phone [PictBridge]\n\t2105  W715 Phone\n\t2137  Xperia X10 mini (USB debug)\n\t2138  Xperia X10 mini pro (Debug)\n\t2149  Xperia X8 (debug)\n\t214e  J108i Cedar (Windows-driver mode)\n\t3137  Xperia X10 mini\n\t3138  Xperia X10 mini pro\n\t3149  Xperia X8\n\t514f  Xperia arc S [Adb-Enable Mode]\n\t5169  Xperia S [Adb-Enable Mode]\n\t5177  Xperia Ion [Debug Mode]\n\t518c  C1605 [Xperia E dual] MTD mode\n\t51a7  D5503 (Xperia Z1 Compact)\n\t51e0  F5122 [Xperia X dual] (developer mode)\n\t614f  Xperia X12 (debug mode)\n\t6166  Xperia Mini Pro\n\t618c  C1605 [Xperia E dual] MSC mode\n\t715a  Xperia Pro [Tethering]\n\t7166  Xperia Mini Pro (Tethering mode)\n\t7177  Xperia Ion [Tethering]\n\t71f4  G8441 (Xperia XZ1 Compact) [Tethering]\n\t71f9  H8314 [Xperia XZ2 Compact] (Tethering)\n\t8004  9000 Phone [Mass Storage]\n\t81f4  G8441 (Xperia XZ1 Compact) [Tethering]\n\tadde  C2005 (Xperia M dual) in service mode\n\tc1e0  F5122 [Xperia X dual] (MIDI mode)\n\tc1e8  F5321 [Xperia X Compact] (MIDI mode)\n\tc1f9  H8314 [Xperia XZ2 Compact] (MIDI)\n\td008  V800-Vodafone 802SE Phone\n\td016  K750i Phone\n\td017  K608i Phone\n\td019  VDC EGPRS Modem\n\td025  520 WMC Data Modem\n\td028  W800i\n\td038  W850i Phone\n\td039  K800i (phone mode)\n\td041  K510i Phone\n\td042  W810i Phone\n\td043  V630i Phone\n\td046  K610i Phone\n\td065  W960i Phone (PC Suite)\n\td076  W910i (Phone mode)\n\td079  K530 Phone\n\td089  W580i Phone (mass storage)\n\td0a1  K810\n\td0af  V640i Phone\n\td0cf  MD300 Mobile Broadband Modem\n\td0d4  C902 Phone [Modem]\n\td0e1  MD400 Mobile Broadband Modem\n\td12a  U100i Yari Phone\n\td12e  Xperia X10\n\td14e  J108i Cedar (modem mode)\n\te000  K810 (PictBridge mode)\n\te039  K800i (msc mode)\n\te042  W810i Phone\n\te043  V630i Phone [Mass Storage]\n\te075  K850i\n\te076  W910i (Mass storage)\n\te089  W580i Phone\n\te090  W200 Phone (Mass Storage)\n\te0a1  K810 (Mass Storage mode)\n\te0a3  W660i\n\te0af  V640i Phone [Mass Storage]\n\te0d4  C902 Phone [Mass Storage] \n\te0ef  C905 Phone [Mass Storage]\n\te0f3  W595\n\te105  W705\n\te112  W995 Phone (Mass Storage)\n\te12e  X10i Phone\n\te133  Vivaz\n\te14e  J108i Cedar (mass-storage mode)\n\te14f  Xperia Arc/X12\n\te15a  Xperia Pro [Mass Storage Class]\n\te161  Xperia Ray\n\te166  Xperia Mini Pro\n\te167  XPERIA mini\n\te19b  C2005 [Xperia M dual] (Mass Storage)\n\te1a9  D5303\n\te1aa  D2303\n\te1ad  D5103\n\te1b0  D6708\n\te1b5  D2004\n\te1ba  D6683\n\te1bb  SO-02G\n\te1bc  D2203\n\te1c0  SGP621\n\te1c2  D2533\n\te1c9  E6553\n\te1cf  SGP771\n\tf0fa  MN800 / Smartwatch 2 (DFU mode)\n0fcf  Dynastream Innovations, Inc.\n\t1003  ANT Development Board\n\t1004  ANTUSB Stick\n\t1006  ANT Development Board\n\t1008  ANTUSB2 Stick\n\t1009  ANTUSB-m Stick\n0fd0  Tulip Computers B.V.\n0fd1  Giant Electronics Ltd.\n0fd2  Seac Banche\n\t0001  RDS 6000\n0fd4  Tenovis GmbH & Co., KG\n0fd5  Direct Access Technology, Inc.\n0fd9  Elgato Systems GmbH\n\t0011  EyeTV Diversity\n\t0018  EyeTV Hybrid\n\t0020  EyeTV DTT Deluxe\n\t0021  EyeTV DTT\n\t002a  EyeTV Sat\n\t002c  EyeTV DTT Deluxe v2\n\t0033  Video Capture\n\t0037  Video Capture v2\n\t0060  Stream Deck\n\t0063  Stream Deck Mini\n\t006c  Stream Deck XL\n\t006d  Stream Deck original V2\n0fda  Quantec Networks GmbH\n\t0100  quanton flight control\n0fdc  Micro Plus\n0fde  Oregon Scientific\n\tca01  WMRS200 weather station\n\tca05  CM160\n\tca08  WMR300 Professional Weather System\n0fe0  Osterhout Design Group\n\t0100  Bluetooth Mouse\n\t0101  Bluetooth IMU\n\t0200  Bluetooth Keypad\n0fe2  Air Techniques\n0fe4  IN-Tech Electronics, Ltd\n0fe5  Greenconn (U.S.A.), Inc.\n0fe6  ICS Advent\n\t8101  DM9601 Fast Ethernet Adapter\n\t811e  Parallel Adapter\n\t9700  DM9601 Fast Ethernet Adapter\n0fe9  DVICO\n\t4020  TViX M-6500\n\t9010  FusionRemote IR receiver\n\tdb00  FusionHDTV DVB-T (MT352+LgZ201) (uninitialized)\n\tdb01  FusionHDTV DVB-T (MT352+LgZ201) (initialized)\n\tdb10  FusionHDTV DVB-T (MT352+Thomson7579) (uninitialized)\n\tdb11  FusionHDTV DVB-T (MT352+Thomson7579) (initialized)\n\tdb78  FusionHDTV DVB-T Dual Digital 4 (ZL10353+xc2028/xc3028) (initialized)\n0fea  United Computer Accessories\n0feb  CRS Electronic Co., Ltd\n0fec  UMC Electronics Co., Ltd\n0fed  Access Co., Ltd\n0fee  Xsido Corp.\n0fef  MJ Research, Inc.\n0ff6  Core Valley Co., Ltd\n0ff7  CHI SHING Computer Accessories Co., Ltd\n0ffc  Clavia DMI AB\n\t0021  Nord Stage 2\n\t002a  Nord Piano 4\n0ffd  EarlySense\n\tff00  OEM\n0fff  Aopen, Inc.\n1000  Speed Tech Corp.\n\t153b  TerraTec Electronic GmbH\n1001  Ritronics Components (S) Pte., Ltd\n1003  Sigma Corp.\n\t0003  SD14\n\t0100  SD9/SD10\n\t8781  Dock UD-01\n1004  LG Electronics, Inc.\n\t1fae  U8120 3G Cellphone\n\t6000  Various Mobile Phones\n\t6005  T5100\n\t6018  GM360/GD510/GW520/KP501\n\t618e  Ally/Optimus One/Vortex (debug mode)\n\t618f  Ally/Optimus One\n\t61c5  P880 / Charge only\n\t61c6  Vortex (msc)\n\t61cc  Optimus S\n\t61da  G2 Android Phone [tethering mode]\n\t61f1  Optimus Android Phone [LG Software mode]\n\t61f9  Optimus (Various Models) MTP Mode\n\t61fc  Optimus 3\n\t61fe  Optimus Android Phone [USB tethering mode]\n\t627f  G3 (VS985) Android Phone (MTP/Download mode)\n\t6300  G2/Optimus Android Phone [Charge mode]\n\t631c  LM-X420xxx/G2/Optimus Android Phone (charge mode)\n\t631d  Optimus Android Phone (Camera/PTP Mode)\n\t631e  LM-X420xxx/G2/Optimus Android Phone (PTP/camera mode)\n\t631f  Optimus Android Phone (Charge Mode)\n\t633a  Ultimate 2 Android Phone L41C\n\t633e  LM-X420xxx/G2/G3 Android Phone (MTP/download mode)\n\t6344  LM-X420xxx/G2 Android Phone (USB tethering mode)\n\t6348  LM-X420xxx Android Phone (MIDI mode)\n\t6356  Optimus Android Phone [Virtual CD mode]\n\t6800  CDMA Modem\n\t7000  LG LDP-7024D(LD)USB\n\t91c8  P880 / USB tethering\n\ta400  Renoir (KC910)\n1005  Apacer Technology, Inc.\n\t1001  MP3 Player\n\t1004  MP3 Player\n\t1006  MP3 Player\n\tb113  Handy Steno/AH123 / Handy Steno 2.0/HT203\n\tb155  Disk Module\n\tb223  CD-RW + 6in1 Card Reader Digital Storage / Converter\n1006  iRiver, Ltd.\n\t3001  iHP-100\n\t3002  iHP-120/140 MP3 Player\n\t3003  H320/H340\n\t3004  H340 (mtp)\n1009  Emuzed, Inc.\n\t000e  eHome Infrared Receiver\n\t0013  Angel MPEG Device\n\t0015  Lumanate Wave PAL SECAM DVBT Device\n\t0016  Lumanate Wave NTSC/ATSC Combo Device\n100a  AV Chaseway, Ltd\n\t2402  MP3 Player\n\t2404  MP3 Player\n\t2405  MP3 Player\n\t2406  MP3 Player\n\ta0c0  MP3 Player\n100b  Chou Chin Industrial Co., Ltd\n100d  Netopia, Inc.\n\t3342  Cayman 3352 DSL Modem\n\t3382  3380 Series Network Interface\n\t6072  DSL Modem\n\t9031  Motorola 802.11n Dualband USB Wireless Adapter\n\t9032  Motorola 802.11n 5G USB Wireless Adapter\n\tcb01  Cayman 3341 Ethernet DSL Router\n1010  Fukuda Denshi Co., Ltd\n1011  Mobile Media Tech.\n\t0001  AccFast Mp3\n1012  SDKM Fibres, Wires & Cables Berhad\n1013  TST-Touchless Sensor Technology AG\n1014  Densitron Technologies PLC\n1015  Softronics Pty., Ltd\n1016  Xiamen Hung's Enterprise Co., Ltd\n1017  Speedy Industrial Supplies, Pte., Ltd\n\t9015  M625 [Vendor: DELUX]\n1019  Elitegroup Computer Systems (ECS)\n\t0c55  Flash Reader, Desknote UCR-61S2B\n\t0f38  Infrared Receiver\n1020  Labtec\n\t0006  Wireless Keyboard\n\t000a  Wireless Optical Mouse\n\t0106  Wireless Optical Mouse/Keyboard\n1022  Shinko Shoji Co., Ltd\n1025  Hyper-Paltek\n\t005e  USB DVB-T device\n\t005f  USB DVB-T device\n\t0300  MP3 Player\n\t0350  MP3 Player\n1026  Newly Corp.\n1027  Time Domain\n1028  Inovys Corp.\n1029  Atlantic Coast Telesys\n102a  Ramos Technology Co., Ltd\n102b  Infotronic America, Inc.\n102c  Etoms Electronics Corp.\n\t6151  Q-Cam Sangha CIF\n\t6251  Q-Cam VGA\n\tff0c  Joytech Wireless Advanced Controller\n102d  Winic Corp.\n1031  Comax Technology, Inc.\n1032  C-One Technology Corp.\n1033  Nucam Corp.\n\t0068  3,5'' HDD case MD-231\n1038  SteelSeries ApS\n\t0100  Ideazon Zboard\n\t1260  Arctis 7 wireless adapter\n\t1361  Ideazon Sensei\n\t1410  SRW-S1 [Simraceway Steering Wheel]\n\t1720  Mouse\n1039  devolo AG\n\t0824  1866 802.11bg [Texas Instruments TNETW1450]\n\t2140  dsl+ 1100 duo\n103a  PSA\n\tf000  Actia Evo XS\n103d  Stanton\n\t0100  ScratchAmp\n\t0101  ScratchAmp\n1043  iCreate Technologies Corp.\n\t160f  Wireless Network Adapter\n\t4901  AV-836 Video Capture Device\n\t8006  Flash Disk 32-256 MB\n\t8012  Flash Disk 256 MB\n1044  Chu Yuen Enterprise Co., Ltd\n\t7001  Gigabyte U7000 DVB-T tuner\n\t7002  Gigabyte U8000 DVB-T tuner\n\t7004  Gigabyte U7100 DVB-T tuner\n\t7005  Gigabyte U7200 DVB-T tuner [AF9035]\n\t7006  Gigabyte U6000 DVB-T tuner [em2863]\n\t8001  GN-54G\n\t8002  GN-BR402W\n\t8003  GN-WLBM101\n\t8004  GN-WLBZ101 802.11b Adapter\n\t8005  GN-WLBZ201 802.11b Adapter\n\t8006  GN-WBZB-M 802.11b Adapter\n\t8007  GN-WBKG\n\t8008  GN-WB01GS\n\t800a  GN-WI05GS\n\t800b  GN-WB30N 802.11n WLAN Card\n\t800c  GN-WB31N 802.11n USB WLAN Card\n\t800d  GN-WB32L 802.11n USB WLAN Card\n1046  Winbond Electronics Corp. [hex]\n\t6694  Generic W6694 USB\n\t8901  Bluetooth Device\n\t9967  W9967CF/W9968CF Webcam IC\n1048  Targus Group International\n\t2010  4-Port hub\n104b  Mylex / Buslogic\n104c  AMCO TEC International, Inc.\n104d  Newport Corporation\n\t1003  Model-52 LED Light Source Power Supply and Driver\n\t3001  ESP301 3 Axis Motion Controller\n104f  WB Electronics\n\t0001  Infinity Phoenix\n\t0002  Smartmouse\n\t0003  FunProgrammer\n\t0004  Infinity Unlimited\n\t0006  Infinity Smart\n\t0007  Infinity Smart module\n\t0008  Infinity CryptoKey\n\t0009  RE-BL PlayStation 3 IR-to-Bluetooth converter\n1050  Yubico.com\n\t0010  Yubikey (v1 or v2)\n\t0110  Yubikey NEO(-N) OTP\n\t0111  Yubikey NEO(-N) OTP+CCID\n\t0112  Yubikey NEO(-N) CCID\n\t0113  Yubikey NEO(-N) U2F\n\t0114  Yubikey NEO(-N) OTP+U2F\n\t0115  Yubikey NEO(-N) U2F+CCID\n\t0116  Yubikey NEO(-N) OTP+U2F+CCID\n\t0120  Yubikey Touch U2F Security Key\n\t0200  Gnubby U2F\n\t0211  Gnubby\n\t0401  Yubikey 4/5 OTP\n\t0402  Yubikey 4/5 U2F\n\t0403  Yubikey 4/5 OTP+U2F\n\t0404  Yubikey 4/5 CCID\n\t0405  Yubikey 4/5 OTP+CCID\n\t0406  Yubikey 4/5 U2F+CCID\n\t0407  Yubikey 4/5 OTP+U2F+CCID\n\t0410  Yubikey plus OTP+U2F\n1053  Immanuel Electronics Co., Ltd\n1054  BMS International Beheer N.V.\n\t5004  DSL 7420 Loader\n\t5005  DSL 7420 LAN Modem\n1055  Complex Micro Interconnection Co., Ltd\n1056  Hsin Chen Ent Co., Ltd\n1057  ON Semiconductor\n1058  Western Digital Technologies, Inc.\n\t0200  FireWire USB Combo\n\t0400  External HDD\n\t0500  hub\n\t0701  WD Passport (WDXMS)\n\t0702  WD Passport (WDXMS)\n\t0704  My Passport Essential (WDME)\n\t0705  My Passport Elite (WDML)\n\t070a  My Passport Essential (WDBAAA), My Passport for Mac (WDBAAB), My Passport Essential SE (WDBABM), My Passport SE for Mac (WDBABW)\n\t070b  My Passport Elite (WDBAAC)\n\t070c  My Passport Studio (WDBAAE)\n\t071a  My Passport Essential (WDBAAA)\n\t071d  My Passport Studio (WDBALG)\n\t0730  My Passport Essential (WDBACY)\n\t0732  My Passport Essential SE (WDBGYS)\n\t0740  My Passport Essential (WDBACY)\n\t0741  My Passport Ultra\n\t0742  My Passport Essential SE (WDBGYS)\n\t0748  My Passport (WDBKXH, WDBY8L)\n\t07a8  My Passport (WDBBEP), My Passport for Mac (WDBLUZ)\n\t07ae  My Passport Edge for Mac (WDBJBH)\n\t07ba  PiDrive (WDLB)\n\t0810  My Passport Ultra (WDBZFP)\n\t0816  My Passport Air (WDBBLW)\n\t0820  My Passport Ultra (WDBMWV, WDBZFP)\n\t0822  My Passport Ultra (WDBBUZ)\n\t0824  My Passport Slim (WDBPDZ)\n\t0830  My Passport Ultra (WDBZFP)\n\t0837  My Passport Ultra (WDBBKD)\n\t0900  MyBook Essential External HDD\n\t0901  My Book Essential Edition (Green Ring) (WDG1U)\n\t0902  My Book Pro Edition (WDG1T)\n\t0903  My Book Premium Edition\n\t0905  My Book Pro Edition II (WD10000C033-001)\n\t0910  My Book Essential Edition (Green Ring) (WDG1U)\n\t1001  Elements Desktop (WDE1U)\n\t1003  WD Elements Desktop (WDE1UBK)\n\t1010  Elements Portable (WDBAAR)\n\t1021  Elements Desktop (WDBAAU)\n\t1023  Elements SE Portable (WDBABV)\n\t1042  Elements SE Portable (WDBPCK)\n\t1048  Elements Portable (WDBU6Y)\n\t1078  Elements Portable (WDBUZG)\n\t107c  Elements Desktop (WDBWLG)\n\t10a2  Elements SE Portable (WDBPCK)\n\t10a8  Elements Portable (WDBUZG)\n\t10b8  Elements Portable (WDBU6Y, WDBUZG)\n\t1100  My Book Essential Edition 2.0 (WDH1U)\n\t1102  My Book Home Edition (WDH1CS)\n\t1103  My Book Studio\n\t1104  My Book Mirror Edition (WDH2U)\n\t1105  My Book Studio II\n\t1110  My Book Essential (WDBAAF), My Book for Mac (WDBAAG)\n\t1111  My Book Elite (WDBAAH)\n\t1112  My Book Studio (WDBAAJ), My Book Studio LX (WDBACH)\n\t1123  My Book 3.0 (WDBABP)\n\t1130  My Book Essential (WDBACW)\n\t1140  My Book Essential (WDBACW)\n\t1170  My Book Essential 3TB (WDBACW0030HBK)\n\t1230  My Book (WDBFJK)\n\t1235  My Book (WDBFJK0040HBK)\n\t2599  My Passport Ultra (WD40NMZW)\n\t259d  My Passport Ultra (WDBBKD)\n\t259f  My Passport Ultra (WD10JMVW)\n\t25a1  Elements / My Passport\n\t25a2  Elements 25A2\n\t25a3  Elements Desktop (WDBWLG)\n\t25da  My Book (WDBFJK)\n\t25e1  My Passport (WD20NMVW)\n\t25e2  My Passport (WD40NMZW)\n\t25ee  My Book 25EE\n\t25f3  My Passport SSD (WDBK3E)\n\t25fa  easystore Portable 5TB (WDBKUZ0050)\n\t25fb  easystore Desktop (WDBCKA)\n\t2603  My Passport Game Storage for PS4 4TB (WDBZGE0040)\n\t2624  easystore Portable 5TB (WDBKUZ0050)\n\t2626  My Passport (WDBPKJ)\n\t30a0  SATA adapter cable\n1059  Giesecke & Devrient GmbH\n\t000b  StarSign Bio Token 3.0\n105b  Foxconn International, Inc.\n\te065  BCM43142A0 Bluetooth module\n105c  Hong Ji Electric Wire & Cable (Dongguan) Co., Ltd\n105d  Delkin Devices, Inc.\n105e  Valence Semiconductor Design, Ltd\n105f  Chin Shong Enterprise Co., Ltd\n1060  Easthome Industrial Co., Ltd\n1063  Motorola Electronics Taiwan, Ltd [hex]\n\t1555  MC141555 Hub\n\t4100  SB4100 USB Cable Modem\n1065  CCYU Technology\n\t0020  USB-DVR2 Dev Board\n\t2136  EasyDisk ED1064\n1068  Micropi Elettronica\n\t0001  CPUSB - V 1.8 - software-rights management key\n106a  Loyal Legend, Ltd\n106c  Curitel Communications, Inc.\n\t1101  CDMA 2000 1xRTT USB modem (HX-550C)\n\t1102  Packet Service\n\t1103  Packet Service Diagnostic Serial Port (WDM)\n\t1104  Packet Service Diagnostic Serial Port (WDM)\n\t1105  Composite Device\n\t1106  Packet Service Diagnostic Serial Port (WDM)\n\t1301  Composite Device\n\t1302  Packet Service Diagnostic Serial Port (WDM)\n\t1303  Packet Service\n\t1304  Packet Service\n\t1401  Composite Device\n\t1402  Packet Service\n\t1403  Packet Service Diagnostic Serial Port (WDM)\n\t1501  Packet Service\n\t1502  Packet Service Diagnostic Serial Port (WDM)\n\t1503  Packet Service\n\t1601  Packet Service\n\t1602  Packet Service Diagnostic Serial Port (WDM)\n\t1603  Packet Service\n\t2101  AudioVox 8900 Cell Phone\n\t2102  Packet Service\n\t2103  Packet Service Diagnostic Serial Port (WDM)\n\t2301  Packet Service\n\t2302  Packet Service Diagnostic Serial Port (WDM)\n\t2303  Packet Service\n\t2401  Packet Service Diagnostic Serial Port (WDM)\n\t2402  Packet Service\n\t2403  Packet Service Diagnostic Serial Port (WDM)\n\t2501  Packet Service\n\t2502  Packet Service Diagnostic Serial Port (WDM)\n\t2503  Packet Service\n\t2601  Packet Service\n\t2602  Packet Service Diagnostic Serial Port (WDM)\n\t2603  Packet Service\n\t3701  Broadband Wireless modem\n\t3702  Pantech PX-500\n\t3714  PANTECH USB MODEM [UM175]\n\t3716  UMW190 Modem\n\t3721  Option Beemo (GI0801) LTE surfstick\n\t3b14  Option Beemo (GI0801) LTE surfstick\n\t3eb4  Packet Service Diagnostic Serial Port (WDM)\n\t4101  Packet Service Diagnostic Serial Port (WDM)\n\t4102  Packet Service\n\t4301  Composite Device\n\t4302  Packet Service Diagnostic Serial Port (WDM)\n\t4401  Composite Device\n\t4402  Packet Service\n\t4501  Packet Service\n\t4502  Packet Service Diagnostic Serial Port (WDM)\n\t4601  Composite Device\n\t4602  Packet Service Diagnostic Serial Port (WDM)\n\t5101  Packet Service\n\t5102  Packet Service Diagnostic Serial Port (WDM)\n\t5301  Packet Service Diagnostic Serial Port (WDM)\n\t5302  Packet Service\n\t5401  Packet Service\n\t5402  Packet Service Diagnostic Serial Port (WDM)\n\t5501  Packet Service Diagnostic Serial Port (WDM)\n\t5502  Packet Service\n\t5601  Packet Service Diagnostic Serial Port (WDM)\n\t5602  Packet Service\n\t7101  Composite Device\n\t7102  Packet Service\n\ta000  Packet Service\n\ta001  Packet Service Diagnostic Serial Port (WDM)\n\tc100  Packet Service\n\tc200  Packet Service\n\tc500  Packet Service Diagnostic Serial Port (WDM)\n\te200  Packet Service\n106d  San Chieh Manufacturing, Ltd\n106e  ConectL\n106f  Money Controls\n\t0009  CT10x Coin Transaction\n\t000a  CR10x Coin Recycler\n\t000c  Xchange\n1076  GCT Semiconductor, Inc.\n\t0031  Bluetooth Device\n\t0032  Bluetooth Device\n\t8002  LU150 LTE Modem [Yota LU150]\n107b  Gateway, Inc.\n\t3009  eHome Infrared Transceiver\n\t55b2  WBU-110 802.11b Wireless Adapter [Intersil PRISM 3]\n\t55f2  WGU-210 802.11g Adapter [Intersil ISL3886]\n107d  Arlec Australia, Ltd\n107e  Midoriya Electric Co., Ltd\n107f  KidzMouse, Inc.\n1082  Shin-Etsukaken Co., Ltd\n1083  Canon Electronics, Inc.\n\t160c  CR-55\n\t160f  DR-1210C\n\t1614  DR-4010C\n\t1617  DR-2510C\n\t1618  DR-X10C\n\t161a  CR-25\n\t161b  DR-2010C Scanner\n\t161d  DR-3010C\n\t1620  DR-7090C\n\t1622  DR-9050C\n\t1623  DR-7550C\n\t1624  DR-6050C\n\t1626  DR-6010C\n\t162c  P-150 Scanner\n\t1638  DR-6030C\n\t1639  CR-135i\n\t163e  DR-M160\n\t163f  DR-M140\n\t1640  DR-C125\n\t1641  DR-P215\n\t1648  FSU-201\n\t164a  DR-C130\n\t164b  DR-P208\n\t164f  DR-G1130\n\t1650  DR-G1100\n\t1651  DR-C120\n\t1654  DR-F120\n\t1657  DR-M1060\n\t1658  DR-C225\n\t1659  DR-P215II\n\t165d  DR-P208II\n1084  Pantech Co., Ltd\n108a  Chloride Power Protection\n108b  Grand-tek Technology Co., Ltd\n\t0005  HID Keyboard/Mouse PS/2 Translator\n108c  Robert Bosch GmbH\n\t017e  GTC 400 C\n108e  Lotes Co., Ltd.\n1091  Numerik Jena\n\t8101  Absoflex\n1099  Surface Optics Corp.\n109a  DATASOFT Systems GmbH\n109b  Hisense\n\t9109  CROSSCALL Trekker-M1 Core (MTP-Mode)\n\t9118  Medion P4013 Mobile\n\t9119  CROSSCALL Trekker-M1 Core (PTP-Mode)\n\tf009  CROSSCALL Trekker-M1 Core (CD-ROM-Mode)\n109f  eSOL Co., Ltd\n\t3163  Trigem Mobile SmartDisplay84\n\t3164  Trigem Mobile SmartDisplay121\n10a0  Hirotech, Inc.\n10a3  Mitsubishi Materials Corp.\n10a9  SK Teletech Co., Ltd\n\t1102  Sky Love Actually IM-U460K\n\t1104  Sky Vega IM-A650S\n\t1105  VEGA Android composite\n\t1106  VEGA Android composite\n\t1107  VEGA Android composite\n\t1108  VEGA Android composite\n\t1109  VEGA Android composite\n\t6021  SIRIUS alpha\n\t6031  Pantech Android composite\n\t6032  Pantech Android composite\n\t6033  Pantech Android composite\n\t6034  Pantech Android composite\n\t6035  Pantech Android composite\n\t6036  Pantech Android composite\n\t6037  Pantech Android composite\n\t6050  Pantech Android composite\n\t6051  Pantech Android composite\n\t6052  Pantech Android composite\n\t6053  Pantech Android composite\n\t6054  Pantech Android composite\n\t6055  Pantech Android composite\n\t6056  Pantech Android composite\n\t6057  Pantech Android composite\n\t6058  Pantech Android composite\n\t6059  Pantech Android composite\n\t6080  MHS291LVW LTE Modem [Verizon Jetpack 4G LTE Mobile Hotspot MHS291L] (Zero CD Mode)\n\t6085  MHS291LVW LTE Modem [Verizon Jetpack 4G LTE Mobile Hotspot MHS291L] (Modem Mode)\n\t7031  Pantech Android composite\n\t7032  Pantech Android composite\n\t7033  Pantech Android composite\n\t7034  Pantech Android composite\n\t7035  Pantech Android composite\n\t7036  Pantech Android composite\n\t7037  Pantech Android composite\n10aa  Cables To Go\n10ab  USI Co., Ltd\n\t1002  Bluetooth Device\n\t1003  BC02-EXT in DFU\n\t1005  Bluetooth Adptr\n\t1006  BC04-EXT in DFU\n\t10c5  Sony-Ericsson / Samsung DataCable\n10ac  Honeywell, Inc.\n10ae  Princeton Technology Corp.\n10af  Liebert Corp.\n\t0000  UPS\n\t0001  PowerSure PSA UPS\n\t0002  PowerSure PST UPS\n\t0003  PowerSure PSP UPS\n\t0004  PowerSure PSI UPS\n\t0005  UPStation GXT 2U UPS\n\t0006  UPStation GXT UPS\n\t0007  Nfinity Power Systems UPS\n\t0008  PowerSure Interactive UPS\n10b5  Comodo (PLX?)\n\t9060  Test Board\n10b8  DiBcom\n\t0bb8  DVB-T reference design (MOD300) (cold)\n\t0bb9  DVB-T reference design (MOD300) (warm)\n\t0bc6  DVB-T reference design (MOD3000P) (cold)\n\t0bc7  DVB-T reference design (MOD3000P) (warm)\n10bb  TM Technology, Inc.\n10bc  Dinging Technology Co., Ltd\n10bd  TMT Technology, Inc.\n\t1427  Ethernet\n10bf  SmartHome\n\t0001  SmartHome PowerLinc\n10c3  Universal Laser Systems, Inc.\n\t00a4  ULS PLS Series Laser Engraver Firmware Loader\n\t00a5  ULS Print Support\n10c4  Silicon Labs\n\t0002  F32x USBXpress Device\n\t0003  CommandIR\n\t800a  SPORTident\n\t800b  AES\n\t8030  K4JRG Ham Radio devices\n\t8044  USB Debug Adapter\n\t804e  Software Bisque Paramount ME\n\t80a9  CP210x to UART Bridge Controller\n\t80c4  Infrared Thermometer Adapter\n\t80ca  ATM2400 Sensor Device\n\t813f  tams EasyControl\n\t8149  West Mountain Radio Computerized Battery Analyzer\n\t814a  West Mountain Radio RIGblaster P&P\n\t814b  West Mountain Radio RIGtalk\n\t818a  Silicon Labs FM Radio Reference Design\n\t81e8  Zephyr BioHarness\n\t834b  Infrared Online Sensor Adapter\n\t834e  Infrared Sensor Adapter\n\t8460  Sangoma Wanpipe VoiceTime\n\t8461  Sangoma U100\n\t8470  Juniper Networks BX Series System Console\n\t8477  Balluff RFID Reader\n\t8496  SiLabs Cypress FW downloader\n\t8497  SiLabs Cypress EVB\n\t84fb  Infrared Blackbody Adapter\n\t8508  RS485 Adapter\n\t8605  dilitronics ESoLUX solar lighting controller\n\t8660  Netronics CANdoISO\n\t86bc  C8051F34x AudioDelay [AD-340]\n\t8789  C8051F34x Extender & EDID MGR [EMX-DVI]\n\t87be  C8051F34x HDMI Audio Extractor [EMX-HD-AUD]\n\t8863  C8051F34x Bootloader\n\t8897  C8051F38x HDMI Splitter [UHBX]\n\t88c9  AES HID device\n\t8918  C8051F38x HDMI Audio Extractor [VSA-HA-DP]\n\t8973  C8051F38x HDMI Extender [UHBX-8X]\n\t89c6  SPORTident HID device\n\t89e1  C8051F38x HDMI Extender [UHBX-SW3-WP]\n\t89fb  Qivicon ZigBee Stick\n\t8a3c  C8051F38x HDBaseT Receiver [UHBX-R-XT]\n\t8a6c  C8051F38x 4K HDMI Audio Extractor [EMX-AMP]\n\t8acb  C8051F38x HDBaseT Wall Plate Receiver with IR, RS-232, and PoH [UHBX-R-WP]\n\t8af8  C8051F38x 4K HDMI Audio Extractor w/Audio Amplifier, HDBT Input, Line Audio Input RS-232 Ports and IP Control [VSA-X21]\n\t8b8c  C8051F38x 4K HDMI Audio Extractor w/Audio Amplifier, HDBT Input, Line Audio Input RS-232 Ports and IP Control [SC-3H]\n\t8db5  C8051F38x CATx HDMI Receiver with USB [EX-HDU-R]\n\t8db6  C8051F38x CATx HDMI Receiver\n\tea60  CP210x UART Bridge\n\tea61  CP210x UART Bridge\n\tea63  CP210x UART Bridge\n\tea70  CP2105 Dual UART Bridge\n\tea71  CP2108 Quad UART Bridge\n\tea80  CP2110 HID UART Bridge\n\tea90  CP2112 HID I2C Bridge\n\tea91  CP2112 HID SMBus/I2C Bridge for CP2614 Evaluation Kit\n\tea93  CP2112 HID SMBus/I2C Bridge for CP2615 Evaluation Kit\n\teab0  CP2114 I2S Audio Bridge\n\teac0  CP2614 MFi Accessory Digital Audio Bridge\n\teac1  CP2615 I2S Audio Bridge\n\teac9  EFM8UB1 Bootloader\n\teaca  EFM8UB2 Bootloader\n\teacb  EFM8UB3 Bootloader\n10c5  Sanei Electric, Inc.\n\t819a  FM Radio\n10c6  Intec, Inc.\n10cb  Eratech\n10cc  GBM Connector Co., Ltd\n\t1101  MP3 Player\n10cd  Kycon, Inc.\n10ce  Silicon Labs\n\t0007  Shinko/Sinfonia CHC-S1245\n\t000e  Shinko/Sinfonia CHC-S2145\n\t0019  Shinko/Sinfonia CHC-S6145\n\t001d  Shinko/Sinfonia CHC-S6245\n\t001e  Ciaat Brava 21\n\t0039  Sinfonia CHC-S2245\n\t10ce  Sinfonia CHC-S2245\n\tea6a  MobiData EDGE USB Modem\n10cf  Velleman Components, Inc.\n\t2011  R-Engine MPEG2 encoder/decoder\n\t5500  8055 Experiment Interface Board (address=0)\n\t5501  8055 Experiment Interface Board (address=1)\n\t5502  8055 Experiment Interface Board (address=2)\n\t5503  8055 Experiment Interface Board (address=3)\n10d1  Hottinger Baldwin Measurement\n\t0101  USB-Module for Spider8, CP32\n\t0202  CP22 - Communication Processor\n\t0301  CP42 - Communication Processor\n10d2  RayComposer - R. Adams\n\t5243  RayComposer\n10d4  Man Boon Manufactory, Ltd\n10d5  Uni Class Technology Co., Ltd\n\t0004  PS/2 Converter\n\t5552  KVM Human Interface Composite Device (Keyboard/Mouse ports)\n\t55a2  2Port KVMSwitcher\n\t5a08  Dual Bay Docking Station\n10d6  Actions Semiconductor Co., Ltd\n\t0c02  BioniQ 1001 Tablet\n\t1000  MP3 Player\n\t1100  MPMan MP-Ki 128 MP3 Player/Recorder\n\t1101  D-Wave 2GB MP4 Player / AK1025 MP3/MP4 Player\n\t2200  Acer MP-120 MP3 player\n\t8888  ADFU Device\n\tff51  ADFU Device\n\tff61  MP4 Player\n\tff66  Craig 2GB MP3/Video Player\n10de  Authenex, Inc.\n10df  In-Win Development, Inc.\n\t0500  iAPP CR-e500 Card reader\n10e0  Post-Op Video, Inc.\n10e1  CablePlus, Ltd\n10e2  Nada Electronics, Ltd\n10ec  Vast Technologies, Inc.\n10f0  Nexio Co., Ltd\n\t2002  iNexio Touchscreen controller\n10f1  Importek\n\t1a08  Internal Webcam\n\t1a1e  Laptop Integrated Webcam 1.3M\n\t1a2a  Laptop Integrated Webcam\n\t1a2e  HP Truevision HD Integrated Webcam\n10f5  Turtle Beach\n\t0200  Audio Advantage Roadie\n\t0231  Ear Force P11 Headset\n\t10f5  EarForce PX21 Gaming Headset\n10f8  Cesys GmbH\n\t3201  CeboLC\n\t3202  CeboStick\n\t3203  CeboMSA64\n\t3204  CeboDFN\n\t3205  PSAA2304W_CASC\n\tc401  USBV4F unconfigured\n\tc402  EFM01 unconfigured\n\tc403  MISS2 unconfigured\n\tc404  CID unconfigured\n\tc405  USBS6 unconfigured\n\tc406  OP_MISS2 unconfigured\n\tc407  NanoUsb uncofigured\n\tc481  USBV4F\n\tc482  EFM01\n\tc483  MISS2\n\tc484  CID\n\tc485  USBS6\n\tc486  OP_MISS2\n\tc487  NanoUsb\n\tc501  EFM02 unconfigured\n\tc502  EFM02/B unconfigured\n\tc503  EFM03 unconfigured\n\tc581  EFM02\n\tc582  EFM02/B\n\tc583  EFM03\n10fb  Pictos Technologies, Inc.\n10fd  Anubis Electronics, Ltd\n\t7e50  FlyCam Usb 100\n\t804d  Typhoon Webshot II Webcam [zc0301]\n\t8050  FlyCAM-USB 300 XP2\n\tde00  WinFast WalkieTV WDM Capture Driver.\n10fe  Thrane & Thrane\n\t000c  TT-3750 BGAN-XL Radio Module\n1100  VirTouch, Ltd\n\t0001  VTPlayer VTP-1 Braille Mouse\n1101  EasyPass Industrial Co., Ltd\n\t0001  FSK Electronics Super GSM Reader\n1108  Brightcom Technologies, Ltd\n110a  Moxa Technologies Co., Ltd.\n\t1110  UPort 1110\n\t1150  UPort 1150 1-Port RS-232/422/485\n\t1250  UPort 1250 2-Port RS-232/422/485\n\t1251  UPort 1250I 2-Port RS-232/422/485 with Isolation\n\t1410  UPort 1410 4-Port RS-232\n\t1450  UPort 1450 4-Port RS-232/422/485\n\t1451  UPort 1450I 4-Port RS-232/422/485 with Isolation\n\t1613  UPort 1610-16 16-Port RS-232\n\t1618  UPort 1610-8 8-Port RS-232\n\t1653  UPort 1650-16 16-Port RS-232/422/485\n\t1658  UPort 1650-8 8-Port RS-232/422/485\n1110  Analog Devices Canada, Ltd (Allied Telesyn)\n\t5c01  Huawei MT-882 Remote NDIS Network Device\n\t6489  ADSL ETH/USB RTR\n\t9000  ADSL LAN Adapter\n\t9001  ADSL Loader\n\t900f  AT-AR215 DSL Modem\n\t9010  AT-AR215 DSL Modem\n\t9021  ADSL WAN Adapter\n\t9022  ADSL Loader\n\t9023  ADSL WAN Adapter\n\t9024  ADSL Loader\n\t9031  ADSL LAN Adapter\n\t9032  ADSL Loader\n1111  Pandora International Ltd.\n\t8888  Evolution Device\n1112  YM ELECTRIC CO., Ltd\n1113  Medion AG\n\ta0a2  Active Sync device\n111e  VSO Electric Co., Ltd\n112a  RedRat\n\t0001  RedRat3 IR Transceiver\n\t0005  RedRat3II IR Transceiver\n112e  Master Hill Electric Wire and Cable Co., Ltd\n112f  Cellon International, Inc.\n1130  Tenx Technology, Inc.\n\t0001  BlyncLight\n\t0002  iBuddy\n\t0004  iBuddy Twins\n\t0202  Rocket Launcher\n\t6604  MCE IR-Receiver\n\t6606  U+P Mouse\n\t660c  Foot Pedal/Thermometer\n\t6626  Key\n\t6806  Keychain photo frame\n\tc301  Digital Photo viewer [Wallet Pix]\n\tf211  TP6911 Audio Headset\n1131  Integrated System Solution Corp.\n\t1001  KY-BT100 Bluetooth Adapter\n\t1002  Bluetooth Device\n\t1003  Bluetooth Device\n\t1004  Bluetooth Device\n1132  Toshiba Corp., Digital Media Equipment [hex]\n\t4331  PDR-M4/M5/M70 Digital Camera\n\t4332  PDR-M60 Digital Camera\n\t4333  PDR-M2300/PDR-M700\n\t4334  PDR-M65\n\t4335  PDR-M61\n\t4337  PDR-M11\n\t4338  PDR-M25\n1136  CTS Electronincs\n\t3131  CTS LS515\n113c  Arin Tech Co., Ltd\n113d  Mapower Electronics Co., Ltd\n113f  Integrated Biometrics, LLC\n\t1020  Watson Two-Finger Roll Scanner\n\t1100  Columbo Single-Finger Scanner\n1141  V One Multimedia, Pte., Ltd\n1142  CyberScan Technologies, Inc.\n\t0709  Cyberview High Speed Scanner\n1145  Japan Radio Company\n\t0001  AirH PHONE AH-J3001V/J3002V\n1146  Shimane SANYO Electric Co., Ltd.\n1147  Ever Great Electric Wire and Cable Co., Ltd\n114b  Sphairon Access Systems GmbH\n\t0110  Turbolink UB801R WLAN Adapter\n\t0150  Turbolink UB801RE Wireless 802.11g 54Mbps Network Adapter [RTL8187]\n114c  Tinius Olsen Testing Machine Co., Inc.\n114d  Alpha Imaging Technology Corp.\n114f  Wavecom\n\t1234  Fastrack Xtend FXT001 Modem\n115b  Salix Technology Co., Ltd.\n1162  Secugen Corp.\n1163  DeLorme Publishing, Inc.\n\t0100  Earthmate GPS (orig)\n\t0200  Earthmate GPS (LT-20, LT-40)\n\t2020  Earthmate GPS (PN-40)\n1164  YUAN High-Tech Development Co., Ltd\n\t0300  ELSAVISION 460D\n\t0601  Analog TV Tuner\n\t0900  TigerBird BMP837 USB2.0 WDM Encoder\n\t0bc7  Digital TV Tuner\n\t521b  MC521A mini Card ATSC Tuner\n\t6601  Digital TV Tuner Card [RTL2832U]\n1165  Telson Electronics Co., Ltd\n1166  Bantam Interactive Technologies\n1167  Salient Systems Corp.\n1168  BizConn International Corp.\n116e  Gigastorage Corp.\n116f  Silicon 10 Technology Corp.\n\t0005  Flash Card Reader\n\tc108  Flash Card Reader\n\tc109  Flash Card Reader\n1175  Shengyih Steel Mold Co., Ltd\n117d  Santa Electronic, Inc.\n117e  JNC, Inc.\n1182  Venture Corp., Ltd\n1183  Compaq Computer Corp. [hex] (Digital Dream ??)\n\t0001  DigitalDream l'espion XS\n\t19c7  ISDN TA\n\t4008  56k FaxModem\n\t504a  PJB-100 Personal Jukebox\n1184  Kyocera Elco Corp.\n1188  Bloomberg L.P.\n1189  Acer Communications & Multimedia\n\t0893  EP-1427X-2 Ethernet Adapter [Acer]\n118f  You Yang Technology Co., Ltd\n1190  Tripace\n1191  Loyalty Founder Enterprise Co., Ltd\n1196  Yankee Robotics, LLC\n\t0010  Trifid Camera without code\n\t0011  Trifid Camera\n1197  Technoimagia Co., Ltd\n1198  StarShine Technology Corp.\n1199  Sierra Wireless, Inc.\n\t0019  AC595U\n\t0021  AC597E\n\t0024  MC5727 CDMA modem\n\t0110  Composite Device\n\t0112  CDMA 1xEVDO PC Card, AirCard 580\n\t0120  AC595U\n\t0218  MC5720 Wireless Modem\n\t6467  MP Series Network Adapter\n\t6468  MP Series Network Adapter\n\t6469  MP Series Network Adapter\n\t6802  MC8755 Device\n\t6803  MC8765 Device\n\t6804  MC8755 Device\n\t6805  MC8765 Device\n\t6812  MC8775 Device\n\t6820  AC875 Device\n\t6832  MC8780 Device\n\t6833  MC8781 Device\n\t683a  MC8785 Device\n\t683c  Mobile Broadband 3G/UMTS (MC8790 Device)\n\t6850  AirCard 880 Device\n\t6851  AirCard 881 Device\n\t6852  AirCard 880E Device\n\t6853  AirCard 881E Device\n\t6854  AirCard 885 Device\n\t6856  ATT \"USB Connect 881\"\n\t6870  MC8780 Device\n\t6871  MC8781 Device\n\t6893  MC8777 Device\n\t68a3  MC8700 Modem\n\t68aa  4G LTE adapter\n\t9000  Gobi 2000 Wireless Modem (QDL mode)\n\t9001  Gobi 2000 Wireless Modem\n\t9002  Gobi 2000 Wireless Modem\n\t9003  Gobi 2000 Wireless Modem\n\t9004  Gobi 2000 Wireless Modem\n\t9005  Gobi 2000 Wireless Modem\n\t9006  Gobi 2000 Wireless Modem\n\t9007  Gobi 2000 Wireless Modem\n\t9008  Gobi 2000 Wireless Modem\n\t9009  Gobi 2000 Wireless Modem\n\t900a  Gobi 2000 Wireless Modem\n\t9011  MC8305 Modem\n\t9013  Sierra Wireless Gobi 3000 Modem device (MC8355)\n\t9041  EM7305 Modem\n\t9055  Gobi 9x15 Multimode 3G/4G LTE Modem (NAT mode)\n\t9057  Gobi 9x15 Multimode 3G/4G LTE Modem (IP passthrough mode)\n\t9071  AirPrime MC7455 3G/4G LTE Modem\n\t9079  EM7455\n119a  ZHAN QI Technology Co., Ltd\n119b  ruwido austria GmbH\n\t0400  Infrared Keyboard V2.01\n11a0  Chipcon AS\n\teb11  CC2400EB 2.0 ZigBee Sniffer\n11a3  Technovas Co., Ltd\n\t8031  MP3 Player\n\t8032  MP3 Player\n11aa  GlobalMedia Group, LLC\n\t1518  iREZ K2\n11ab  Exito Electronics Co., Ltd\n11ac  Nike\n\t6565  FuelBand\n11b0  ATECH FLASH TECHNOLOGY\n\t6208  PRO-28U\n\t6298  Kingston SNA-DC/U\n11be  R&D International NV\n\tf0a0  Martin Maxxyz DMX\n11c0  Betop\n\t5506  Gamepad\n11c5  Inmax\n\t0521  IMT-0521 Smartcard Reader\n11c9  Nacon\n\t55f0  GC-100XF\n11ca  VeriFone Inc\n\t0201  MX870/MX880\n\t0207  PIN Pad VX 810\n\t0220  PIN Pad VX 805\n11db  Topfield Co., Ltd.\n\t1000  PVR\n\t1100  PVR\n11e6  K.I. Technology Co. Ltd.\n11f5  Siemens AG\n\t0001  SX1\n\t0003  Mobile phone USB cable\n\t0004  X75\n\t0005  SXG75/EF81\n\t0008  UMTS/HSDPA Data Card\n\t0101  RCU Connect\n11f6  Prolific\n\t2001  Willcom WSIM\n11f7  Alcatel (?)\n\t02df  Serial cable (v2) for TD-10 Mobile Phone\n1203  TSC Auto ID Technology Co., Ltd\n\t0140  TTP-245C\n1209  Generic\n\t0001  pid.codes Test PID\n\t0002  pid.codes Test PID\n\t0003  pid.codes Test PID\n\t0004  pid.codes Test PID\n\t0005  pid.codes Test PID\n\t0006  pid.codes Test PID\n\t0007  pid.codes Test PID\n\t0008  pid.codes Test PID\n\t0009  pid.codes Test PID\n\t000a  pid.codes Test PID\n\t000b  pid.codes Test PID\n\t000c  pid.codes Test PID\n\t000d  pid.codes Test PID\n\t000e  pid.codes Test PID\n\t000f  pid.codes Test PID\n\t0010  pid.codes Test PID\n\t01c0  Input Club Kiibohd Device\n\t01cb  Input Club Kiibohd Device Bootloader\n\t0256  Schwalm & Tate LLC pISO Raspberry Pi Hat\n\t053a  Hackerspace San Salvador HSSV SAMR21-Mote\n\t0cbd  Andrzej Szombierski kuku.eu.org keyboard\n\t0d32  ODrive Robotics ODrive\n\t1001  InterBiometrics Hub\n\t1002  InterBiometrics Relais\n\t1003  InterBiometrics IBSecureCam-P\n\t1004  InterBiometrics IBSecureCam-O\n\t1005  InterBiometrics IBSecureCam-N\n\t1006  InterBiometrics Mini IO-Board\n\t1007  e-radionica.com Croduino SAMD\n\t1986  dgrubb Jaguar Tap\n\t1ab5  Arachnid Labs Tsunami\n\t1ab6  Arachnid Labs Tsunami Bootloader\n\t2000  Zygmunt Krynicki Lantern Brightness Sensor\n\t2001  OSHEC Pi-pilot opensource and openhardware autopilot system\n\t2002  Peter Lawrence PIC16F1-USB-DFU-Bootloader\n\t2003  Peter Lawrence SAMDx1-USB-DFU-Bootloader\n\t2004  GCBASIC Serial CDC Stack\n\t2005  GCBASIC OakTree Stack\n\t2006  GCBASIC Simulation Stack\n\t2016  Cupkee\n\t2017  Benjamin Shockley Mini SAM\n\t2020  Captain Credible Gate Crystal\n\t2048  Housedillon.com MRF49XA Transceiver\n\t2100  TinyFPGA B1 and B2 Boards\n\t2101  TinyFPGA A-Series Programmer\n\t2200  Dygma Shortcut Bootloader\n\t2201  Dygma Shortcut Keyboard\n\t2222  LabConnect Signalgenerator\n\t2300  Keyboardio Model 01 Bootloader\n\t2301  Keyboardio Model 01\n\t2323  bytewerk.org candleLight\n\t2327  K.T.E.C. Bootloader Device\n\t2328  K.T.E.C. Keyboard Device\n\t2333  Kai Ryu Kimera\n\t2334  Kai Ryu Staryu\n\t2335  Portwell Sense8\n\t2336  Portwell Sense8\n\t2337  /Dev /Net\n\t2342  Andreas Bogk Big Red Button\n\t2345  VV-Soft Simple Generic HID IO\n\t2357  KarolKucza TinyPassword\n\t2400  phooky Snap-Pad\n\t2488  Peter Lawrence CMSIS-DAP Dapper Miser\n\t2552  ProjectIota Electrolink\n\t2600  Majenko Technologies chipKIT Lenny\n\t2635  Sevinz GameBot\n\t2800  Entropic Engineering Triangulation\n\t2801  Entropic Engineering Object Manipulation\n\t2a00  mooware Wii adapter\n\t2a01  mooware SNES adapter\n\t3000  lloyd3000\n\t3100  OpenSimHardware Pedals & Buttons Controller\n\t317e  Codecrete Wirekite\n\t3210  OSH Lab, LLC Magic Keys\n\t3333  LabConnect Digitalnetzteil\n\t345b  kinX Hub\n\t345c  kinX Keyboard Controller\n\t3690  Kigakudoh TouchMIDI32\n\t4096  CynaraKrewe Cynara\n\t414c  Adi Linden\n\t414d  Adi Linden\n\t4242  Komakallio Astrophotography Community KomaHub Remote Power Switch\n\t4256  CuVoodoo BusVoodoo multi-protocol debugging adapter\n\t4321  mooltipass Offline Password Keeper Bootloader\n\t4322  mooltipass Arduino Sketch\n\t4356  CuVoodoo firmware\n\t4443  j1rie IRMP_STM32 Bootloader\n\t4444  j1rie IRMP_STM32\n\t4545  SlothCo Enterprises Teletype Adapter\n\t4646  SmartPID SPC1000\n\t4748  Kate Gray GHETT-iO Bootloader\n\t4750  Chris Pavlina (c4757p) C4-x computer (development interface)\n\t4757  Chris Pavlina (c4757p) WCP52 Gain/Phase Analyzer\n\t4801  Wojciech Krutnik NVMemProg\n\t4c60  MightyPork GEX module\n\t4c61  MightyPork GEX wireless dongle\n\t4d53  mindsensors.com NXTCam5\n\t5038  frotz.net mdebug rswd protocol\n\t5039  frotz.net lpcboot protocol\n\t5050  trebb ISO50\n\t5070  SoloHacker security key [SoloKey]\n\t50b0  boot for security key [SoloKey]\n\t5222  telavivmakers attami\n\t53c0  SatoshiLabs TREZOR Bootloader\n\t53c1  SatoshiLabs TREZOR\n\t5432  Open Programmer\n\t5457  Openlab.Taipei Taiwanduino\n\t571c  StreetoArcade PancadariaStick\n\t5a22  ikari_01 sd2snes\n\t6000  Pulsar Heavy Industries Cenx4\n\t600d  Makdaam N93 Interface\n\t6464  Electric Exploits Shinewave\n\t6502  jj1bdx avrhwrng v2rev1\n\t6570  Iowa Scaled Engineering, LLC CKT-AVRPROGRAMMER\n\t6666  Talpa Chen VSFLogic\n\t6667  SensePost Universal Serial aBUSe - Generic HID\n\t6742  NPK Cubitel Atomic Force Microscope\n\t6809  Tach Radio Doppelganger\n\t6948  MySensors Sensebender Gateway BootLoader\n\t6949  MySensors Sensebender Gateway\n\t6bcf  blaste Gameboy Cart Flasher\n\t7000  Secalot Dongle\n\t7001  Secalot Bootloader\n\t70b1  Sutajio Ko-Usagi (Kosagi) Tomu\n\t7331  Dangerous Prototypes Bus Pirate Next Gen CDC\n\t7332  Dangerous Prototypes Bus Pirate Next Gen Logic Analyzer\n\t7401  Beststream-jp Tool_CDC\n\t7530  PotentialLabs Refflion - IoT Development Board - Bootloader\n\t7531  PotentialLabs Refflion - IoT Development Board - Sketch\n\t7551  The Tessel Project Tessel 2\n\t7777  circuitvalley IO Board V3\n\t7778  circuitvalley IO Board V3 Bootloader\n\t7950  PIC18F87J94 Bootloader [GenII]\n\t7951  PIC18F87J94 Application [GenII]\n\t7952  PIC18F87J94 Bootloader [GenIII/IV]\n\t7953  PIC18F87J94 Application [GenIII/IV]\n\t7954  PIC18F87J94 Application [GenIII/IV]\n\t7bd0  pokey9000 Tiny Bit Dingus\n\t8000  Autonomii NODii 2\n\t8086  MisfitTech Nano Zero Bootloader\n\t8087  MisfitTech Nano Zero\n\t8123  Danyboard M0 bootloader\n\t812a  Danyboard M0\n\t813a  MickMad HACK Bootloader\n\t813b  MickMad HACK Sketch\n\t8242  Tom Wimmenhove Electronics NBS-DAC 192/24 UAC1\n\t8243  Tom Wimmenhove Electronics NBS-DAC 192/24 UAC2\n\t8472  Shantea Controls OpenDeck\n\t8661  ProgHQ TL866 programmer\n\t8844  munia.io MUNIA\n\t8888  Blinkinlabs POV Pendant\n\t8889  Blinkinlabs POV Pendant (bootloader)\n\t8b00  ReSwitched Libtransistor Serial Console\n\t9021  Connected Community Hackerspace ESPlant\n\t9317  Sutajio Ko-Usagi (Kosagi) Palawan-Tx\n\t9999  Sandeepan Sengupta CodeBridge Infineo\n\t9db5  PD Buddy Sink\n\ta033  area0x33 Memtype\n\ta100  KB LES Narsil analog breakout\n\ta10c  KB LES Aminoacid Synthesizer\n\ta1e5  Atreus Keyboards Atreus Keyboard\n\ta3a4  MK::Box MK::Kbd\n\ta3a5  MK::Box MK::Kbd Bootloader\n\ta55a  Forever Young Software ATTINY2313\n\ta602  Robotips RTBoard\n\ta7ea  area3001 Knixx SW04\n\ta800  sowbug.com WebLight\n\ta8b0  Intelectron BootWare\n\ta8b1  Intelectron FrameWare\n\taa00  Serg Oskin LinuxCNC HID Extender\n\taa0b  Open Bionics\n\tab3d  3DArtists Alligator board\n\tabba  CoinWISE SafeWISE\n\tabc0  Omzlo controller\n\tabcd  Sandeepan Sengupta CodeBridge\n\tabd1  OpenMV Cam\n\tacdc  Gediminas Zukaitis midi-grid\n\tace5  SimAces Panel Ace\n\taced  Open Lighting Project Ja Rule Device\n\tacee  Open Lighting Project Ja Rule Bootloader\n\tadb0  tibounise ADB converter\n\tadda  MicroPython Boards\n\tb007  Konsgn Global_Boot\n\tb00b  CrapLab Random Device\n\tb010  IObitZ CodeBridge\n\tb01d  WyoLum VeloKey\n\tb058  Model B, LLC Holoseat\n\tb0b0  Monero Hardware Monero Bootloader\n\tb100  ptrandem iBizi\n\tb101  IObitZ Infineo\n\tb195  flehrad Big Switch PCB\n\tbab1  ElectronicCats Meow Meow\n\tbabe  brunofreitas.com STM32 HID Bootloader\n\tbad1  Gregory POTEAU CommLinkUSB\n\tbad2  Gregory POTEAU XLinkUSB\n\tbade  Semarme SemarmeHID\n\tbb00  keyplus split keyboard firmware\n\tbb01  keyplus xusb bootloader\n\tbb02  keyplus nRF24 wireless keyboard dongle\n\tbb03  keyplus nrf24lu1p-512 bootloader\n\tbb05  keyplus kp_boot_32u4 bootloader\n\tbeba  serasidis.gr STM32 HID Bootloader\n\tbeef  Modal MC-USB\n\tc001  Cynteract Alpha\n\tc0c0  Geppetto_Electronics Orthrus\n\tc0c1  Michael Bemmerl cookie-mouse\n\tc0ca  Jean THOMAS DirtyJTAG\n\tc0d3  Samy Kamkar USBdriveby\n\tc0da  Monero Hardware Monero Firmware\n\tc0de  KMRH Labs SBL Brain\n\tc0f5  unethi PERswitch\n\tc1aa  Proyecto CIAA Computadora Industrial Abierta Argentina\n\tc1b1  Chibitronics Love-to-Code\n\tc311  bg nerilex GB-USB-Link\n\tca1c  KnightOS Generic Hub\n\tca1d  KnightOS MTP Device\n\tcaea  Open Music Kontrollers Chimaera\n\tcafe  ii iigadget\n\tcc14  trebb NaN-15\n\tcc86  Manfred's Technologies Anastasia Bootloader\n\tceb0  KG4LNE GE-FlashUSB\n\tcf20  Smart Citizen SCK 2.0\n\td00d  Monero Hardware Monero Developer\n\td017  empiriKit empiriKit Controller\n\td11d  Koi Science DI-Lambda AVR\n\td3d8  Duet3d Duet 0.8.5\n\td706  SkyBean SkyDrop\n\tda42  Devan Lai dap42 debug access probe\n\tdaa0  darknao btClubSportWheel\n\tdada  Rebel Technology OWL\n\tdb42  Devan Lai dapboot DFU bootloader\n\tdc21  FPGA-Computer Dual Charger\n\tdddd  Stephan Electronics OpenCVMeter\n\tdead  chaosfield.at AVR-Ruler\n\tdeaf  CrapLab 4chord MIDI\n\tded1  ManCave Made Quark One\n\tdeed  Kroneum Time Tracker\n\tdf00  D.F.Mac. @TripArts Music mi:muz:tuch\n\tdf01  D.F.Mac. @TripArts Music mi:muz:can\n\tdf02  D.F.Mac. @TripArts Music mi:muz:can-lite\n\te116  Elijah Motornyy open-oscilloscope-stm32f3\n\te1ec  FreeSRP\n\te4ee  trebb keytee\n\te500  GitleMikkelsen Helios Laser DAC\n\teaea  Pinscape Controller\n\teb01  RobotMaker.club EB1\n\teba7  VictorGrigoryev USBscope\n\tee00  Explore Embedded SODA(SWD OpenSource Debug Adapter)\n\tee02  Explore Embedded Explore M3 VCOM\n\tee03  Explore Embedded Explore M3 DFU\n\tee2c  jaka USB2RS485\n\teffa  EffigyLabs atmega32u4-USB-LUFA-Bootloader\n\teffe  EffigyLabs Control Pedal\n\tf000  Uniti ARC\n\tf00d  RomanStepanov Shifter/Pedals Adapter\n\tf12e  Michael Bemmerl Feuermelder\n\tf16a  uri_ba Cougar TQS adapter\n\tf16c  uri_ba adapter for Vipercore's FCC3 Force Sensing Module\n\tf380  Windsor Schmidt MD-380 Open Radio Firmware\n\tf3fc  dRonin Flight controller-Lumenier Lux\n\tf49a  TimVideos.us & HDMI2USB.tv Projects FPGA Programmer & UART Bridge (PIC based Firmware)\n\tfa11  moonglow OpenXHC\n\tfa57  3DRacers Pilot Board\n\tfa58  3DRacers Pilot Board (Bootloader)\n\tfab1  PAP Mechatronic Technology LamDiNao\n\tface  Protean Synth Craft\n\tfade  Open Collector dude\n\tfeed  ProgramGyar AVR-IR Sender\n\tffff  Life2Device Smart House\n120e  Hudson Soft Co., Ltd\n120f  Magellan\n\t524e  RoadMate 1475T\n\t5260  Triton Handheld GPS Receiver (300/400/500/1500/2000)\n1210  DigiTech\n\t000d  RP250 Guitar Multi-Effects Processor\n\t0016  RP500 Guitar Multi-Effects Processor\n\t001b  RP155 Guitar Multi-Effects Processor\n\t001c  RP255 Guitar Multi-Effects Processor\n121e  Jungsoft Co., Ltd\n\t3403  Muzio JM250 Audio Player\n121f  Panini S.p.A.\n\t0001  VisionX without Firmware\n\t0002  VisionX with Firmware\n\t0010  I-Deal\n\t0020  wI-Deal\n\t0021  VisionX Page Scanner Extension\n\t0030  VisionNext\n\t0040  mI:Deal Check Scanner\n\t0041  EverNext Check Scanner\n1220  TC Electronic\n\t000a  Hall of Fame Reverb\n\t002a  Polytune\n\t0032  Ditto X2 Looper\n\t0039  Alter Ego X4 Vintage Echo\n1221  Unknown manufacturer\n\t3234  Disk (Thumb drive)\n1222  TiPro\n\tfaca  programmable keyboard\n1223  SKYCABLE ENTERPRISE. CO., LTD.\n1228  Datapaq Limited\n\t0012  Q18 Data Logger\n\t0015  TPaq21/MPaq21 Datalogger\n\t584c  XL2 Logger\n1230  Chipidea-Microelectronica, S.A.\n1233  Denver Electronics\n\t5677  FUSB200 mp3 player\n1234  Brain Actuated Technologies\n\t0000  Neural Impulse Actuator Prototype 1.0 [NIA]\n\t4321  Human Interface Device\n\ted02  Emotiv EPOC Developer Headset Wireless Dongle\n1235  Focusrite-Novation\n\t0001  ReMOTE Audio/XStation First Edition\n\t0002  Speedio\n\t0003  RemoteSL + ZeroSL\n\t0004  ReMOTE LE\n\t0005  XIOSynth [First Edition]\n\t0006  XStation\n\t0007  XIOSynth\n\t0008  ReMOTE SL Compact\n\t0009  nIO\n\t000a  Nocturn\n\t000b  ReMOTE SL MkII\n\t000c  ZeRO MkII\n\t000e  Launchpad\n\t0010  Saffire 6\n\t0011  Ultranova\n\t0012  Nocturn Keyboard\n\t0013  VRM Box\n\t0014  VRM Box Audio Class (2-out)\n\t0015  Dicer\n\t0016  Ultranova\n\t0018  Twitch\n\t0019  Impulse 25\n\t001a  Impulse 49\n\t001b  Impulse 61\n\t0032  Launchkey 61\n\t0069  Launchpad MK2\n\t0102  LaunchKey Mini MK3\n\t4661  ReMOTE25\n\t8000  Scarlett 18i6\n\t8002  Scarlett 8i6\n\t8006  Focusrite Scarlett 2i2\n\t8008  Saffire 6\n\t800a  Scarlett 2i4\n\t800c  Scarlett 18i20\n\t800e  iTrack Solo\n\t8010  Forte\n\t8012  Scarlett 6i6\n\t8014  Scarlett 18i8\n\t8016  Focusrite Scarlett 2i2\n\t8202  Focusrite Scarlett 2i2 2nd Gen\n\t8203  Focusrite Scarlett 6i6\n\t8204  Scarlett 18i8 2nd Gen\n\t8210  Scarlett 2i2 3rd Gen\n\t8211  Scarlett Solo (3rd Gen.)\n\t8214  Scarlett 18i8 3rd Gen\n\t8215  Scarlett 18i20 3rd Gen\n1241  Belkin\n\t0504  Wireless Trackball Keyboard\n\t1111  Mouse\n\t1122  Typhoon Stream Optical Mouse USB+PS/2\n\t1155  Memorex Optical ScrollPro Mouse SE MX4600\n\t1166  MI-2150 Trust Mouse\n\t1177  Mouse [HT82M21A]\n\t1503  Keyboard\n\t1603  Keyboard\n\tf767  Keyboard\n1243  Holtek Semiconductor, Inc.\n\te000  Unique NFC/RFID reader (keyboard emulation)\n124a  AirVast\n\t168b  PRISM3 WLAN Adapter\n\t4017  PC-Chips 802.11b Adapter\n\t4023  WM168g 802.11bg Wireless Adapter [Intersil ISL3886]\n\t4025  IOGear GWU513 v2 802.11bg Wireless Adapter [Intersil ISL3887]\n124b  Nyko (Honey Bee)\n\t4d01  Airflo EX Joystick\n124c  MXI - Memory Experts International, Inc.\n\t3200  Stealth MXP 1GB\n125c  Apogee Inc.\n\t0010  Alta series CCD\n125d  JMicron\n\t0580  JM580\n125f  A-DATA Technology Co., Ltd.\n\t312a  Superior S102\n\t312b  Superior S102 Pro\n\ta15a  DashDrive Durable HD710 portable HDD various size\n\ta22a  DashDrive Elite HE720 500GB\n\ta31a  HV620 Portable HDD\n\ta91a  Portable HDD CH91\n\tc08a  C008 Flash Drive\n\tc81a  Flash drive\n\tc93a  4GB Pen Drive\n\tc96a  C906 Flash Drive\n\tcb10  Dash Drive UV100\n\tcb20  DashDrive UV110\n1260  Standard Microsystems Corp.\n\tee22  SMC2862W-G v3 EZ Connect 802.11g Adapter [Intersil ISL3887]\n1264  Covidien Energy-based Devices\n1266  Pirelli Broadband Solutions\n\t6302  Fastweb DRG A226M ADSL Router\n1267  Logic3 / SpectraVideo plc\n\t0103  G-720 Keyboard\n\t0201  Mouse\n\t0210  LG Optical Mouse 3D-310\n\ta001  JP260 PC Game Pad\n\tc002  Wireless Optical Mouse\n126c  Aristocrat Technologies\n126d  Bel Stewart\n126e  Strobe Data, Inc.\n126f  TwinMOS\n\t0163  Storage device (2gB thumb drive)\n\t1325  Mobile Disk\n\t2168  Mobile Disk III\n\ta006  G240 802.11bg\n1274  Ensoniq\n1275  Xaxero Marine Software Engineering, Ltd.\n\t0002  WeatherFax 2000 Demodulator\n\t0080  SkyEye Weather Satellite Receiver\n\t0090  WeatherFax 2000 Demodulator\n1278  Starlight Xpress\n\t0105  SXV-M5\n\t0107  SXV-M7\n\t0109  SXV-M9\n\t0110  SXVF-H16\n\t0115  SXVF-H5\n\t0119  SXV-H9\n\t0135  SXVF-H35\n\t0136  SXVF-H36\n\t0200  SXV interface for paraller MX cameras\n\t0305  SXV-M5C\n\t0307  SXV-M7C\n\t0319  SXV-H9C\n\t0325  SXV-M25C\n\t0326  SXVR-M26C\n\t0507  Lodestar autoguider\n\t0517  CoStar\n1283  zebris Medical GmbH\n\t0100  USB-RS232 Adaptor\n\t0110  CMS20\n\t0111  CMS 10\n\t0112  CMS 05\n\t0114  ARCUS digma PC-Interface\n\t0115  SAM Axioquick recorder\n\t0116  SAM Axioquick recorder\n\t0120  emed-X\n\t0121  emed-AT\n\t0130  PDM\n\t0150  CMS10GI (Golf)\n1286  Marvell Semiconductor, Inc.\n\t00bc  Marvell JTAG Probe\n\t1fab  88W8338 [Libertas] 802.11g\n\t2001  88W8388 802.11a/b/g WLAN\n\t2006  88W8362 802.11n WLAN\n\t203c  K30326 802.11bgn Wireless Module [Marvell 88W8786U]\n\t204c  Bluetooth and Wireless LAN Composite\n\t8001  BLOB boot loader firmware\n1291  Qualcomm Flarion Technologies, Inc. / Leadtek Research, Inc.\n\t0010  FDM 2xxx Flash-OFDM modem\n\t0011  LR7F06/LR7F14 Flash-OFDM modem\n1292  Innomedia\n\t0258  Creative Labs VoIP Blaster\n\t4154  Retro Link Atari cable\n1293  Belkin Components [hex]\n\t0002  F5U002 Parallel Port [uss720]\n\t2101  104-key keyboard\n1294  RISO KAGAKU CORP.\n\t1320  Webmail Notifier\n1297  DekTec\n\t020f  DTU-215 Multi-Standard Modulator\n129b  CyberTAN Technology\n\t160b  Siemens S30853-S1031-R351 802.11g Wireless Adapter [Atheros AR5523]\n\t160c  Siemens S30853-S1038-R351 802.11g Wireless Adapter [Atheros AR5523]\n\t1666  TG54USB 802.11bg\n\t1667  802.11bg\n\t1828  Gigaset USB Adapter 300\n12a7  Trendchip Technologies Corp.\n12ab  Honey Bee Electronic International Ltd.\n\t0004  Dance Pad for Xbox 360\n\t0301  Afterglow Wired Controller for Xbox 360\n\t0303  Mortal Kombat Klassic FightStick for Xbox 360\n\t8809  Dance Dance Revolution Dance Pad\n12b8  Zhejiang Xinya Electronic Technology Co., Ltd.\n12b9  E28\n12ba  Licensed by Sony Computer Entertainment America\n\t0032  Wireless Stereo Headset\n\t0042  Wireless Stereo Headset\n\t00ff  Rocksmith Guitar Adapter\n\t0100  RedOctane Guitar for PlayStation(R)3\n\t0120  RedOctane Drum Kit for PlayStation(R)3\n\t0200  Harmonix Guitar for PlayStation(R)3\n\t0210  Harmonix Drum Kit for PlayStation(R)3\n12bd  Gembird\n\td012  JPD Shockforce gamepad\n\td015  Generic 4-button NES USB Controller\n12c4  Autocue Group Ltd\n\t0006  Teleprompter Two-button Hand Control (v1)\n\t0008  Teleprompter Foot Control (v1)\n12cf  DEXIN\n\t0170  Tt eSPORTS BLACK Gaming mouse\n\t600b  Cougar 600M Gaming Mouse\n12d1  Huawei Technologies Co., Ltd.\n\t1001  E161/E169/E620/E800 HSDPA Modem\n\t1003  E220 HSDPA Modem / E230/E270/E870 HSDPA/HSUPA Modem\n\t1004  E220 (bis)\n\t1009  U120\n\t1010  ETS2252+ CDMA Fixed Wireless Terminal\n\t1021  U8520\n\t1035  U8120\n\t1037  Ideos\n\t1038  Ideos (debug mode)\n\t1039  Ideos (tethering mode)\n\t1052  MT7-L09 / P7-L10 / Y330-U01\n\t1053  P7-L10 (PTP)\n\t1054  P7-L10 (PTP + debug)\n\t1079  GEM-703LT [Honor/MediaPad X2]\n\t107e  P10 smartphone\n\t1404  EM770W miniPCI WCDMA Modem\n\t1406  E1750\n\t140b  EC1260 Wireless Data Modem HSD USB Card\n\t140c  E180v\n\t1412  EC168c\n\t1436  Broadband stick\n\t1446  HSPA modem\n\t1465  K3765 HSPA\n\t14ac  E815\n\t14c3  K5005 Vodafone LTE/UMTS/GSM Modem/Networkcard\n\t14c8  K5005 Vodafone LTE/UMTS/GSM MOdem/Networkcard\n\t14c9  K3770 3G Modem\n\t14cf  K3772\n\t14d1  K3770 3G Modem (Mass Storage Mode)\n\t14db  E353/E3131\n\t14dc  E3372 LTE/UMTS/GSM HiLink Modem/Networkcard\n\t14f1  Gobi 3000 HSPA+ Modem\n\t14fe  Modem (Mass Storage Mode)\n\t1501  Pulse\n\t1505  E398 LTE/UMTS/GSM Modem/Networkcard\n\t1506  Modem/Networkcard\n\t150a  E398 LTE/UMTS/GSM Modem/Networkcard\n\t1520  K3765 HSPA\n\t1521  K4505 HSPA+\n\t155a  R205 Mobile WiFi (CD-ROM mode)\n\t1573  ME909u-521 mPCIe LTE/GPS card\n\t1575  K5150 LTE modem\n\t15bb  ME936 LTE/HSDPA+ 4G modem\n\t15c1  ME906s LTE M.2 Module\n\t15ca  E3131 3G/UMTS/HSPA+ Modem (Mass Storage Mode)\n\t1805  AT&T Go Phone U2800A phone\n\t1c05  Broadband stick (modem on)\n\t1c0b  E173s 3G broadband stick (modem off)\n\t1c20  R205 Mobile WiFi (Charging)\n\t1d50  ET302s TD-SCDMA/TD-HSDPA Mobile Broadband\n\t1f01  E353/E3131 (Mass storage mode)\n\t1f16  K5150 LTE modem (Mass Storage Mode)\n\t360e  Y330-U01 (MTP Mode)\n\t380b  WiMAX USB modem(s)\n12d2  LINE TECH INDUSTRIAL CO., LTD.\n12d3  LINAK\n\t0002  DeskLine CBD Control Box\n12d6  EMS Dr. Thomas Wuensche\n\t0444  CPC-USB/ARM7\n\t0888  CPC-USB/M16C\n12d7  BETTER WIRE FACTORY CO., LTD.\n12d8  Araneus Information Systems Oy\n\t0001  Alea I True Random Number Generator\n12e6  Waldorf Music GmbH\n\t0013  Blofeld\n12ef  Tapwave, Inc.\n\t0100  Tapwave Handheld [Tapwave Zodiac]\n12f2  ViewPlus Technologies, Inc.\n\t000a  Braille embosser [SpotDot Emprint]\n12f5  Dynamic System Electronics Corp.\n12f7  Memorex Products, Inc.\n\t1a00  TD Classic 003B\n\t1e23  TravelDrive 2007 Flash Drive\n12fd  AIN Comm. Technology Co., Ltd\n\t1001  AWU2000b 802.11b Stick\n12ff  Fascinating Electronics, Inc.\n\t0101  Advanced RC Servo Controller\n1306  FM20 Barcode Scanner\n1307  Transcend Information, Inc.\n\t0163  256MB/512MB/1GB Flash Drive\n\t0165  2GB/4GB/8GB Flash Drive\n\t0190  Ut190 8 GB Flash Drive with MicroSD reader\n\t0310  SD/MicroSD CardReader [hama]/IT1327E [Basic Line flash drive]\n\t0330  63-in-1 Multi-Card Reader/Writer\n\t0361  CR-75: 51-in-1 Card Reader/Writer [Sakar]\n\t1169  TS2GJF210 JetFlash 210 2GB\n\t1171  Fingerprint Reader\n1308  Shuttle, Inc.\n\t0003  VFD Module\n\tc001  eHome Infrared Transceiver\n1310  Roper\n\t0001  Class 1 Bluetooth Dongle\n1312  ICS Electronics\n1313  ThorLabs\n\t0010  LC1 Linear Camera (Jungo)\n\t0011  SP1 Spectrometer (Jungo)\n\t0012  SP2 Spectrometer (Jungo)\n\t0110  LC1 Linear Camera (VISA)\n\t0111  SP1 Spectrometer (VISA)\n\t0112  SP2 Spectrometer (VISA)\n\t8001  TXP-Series Slot (TXP5001, TXP5004)\n\t8011  BP1 Slit Beam Profiler\n\t8012  BC106 Camera Beam Profiler\n\t8013  WFS10 Wavefront Sensor\n\t8016  DMP40 Deformable Mirror\n\t8017  BC206 Camera Beam Profiler\n\t8019  BP2 Multi Slit Beam Profiler\n\t8020  PM300 Optical Power Meter\n\t8021  PM300E Optical Power and Energy Meter\n\t8022  PM320E Optical Power and Energy Meter\n\t8025  WFS20 Wavefront Sensor\n\t8030  ER100 Extinction Ratio Meter\n\t8039  PAX1000 Rotating Waveplate Polarimeter\n\t8047  CLD1000\n\t8048  TED4000\n\t8049  LDC4000\n\t804a  ITC4000\n\t8058  LC-100\n\t8060  DC3100\n\t8061  DC4100\n\t8062  DC2100\n\t8065  CS2010\n\t8066  DC4104\n\t8070  PM100D\n\t8072  PM100USB Power and Energy Meter Interface\n\t8073  PM106 Wireless Powermeter Photodiode Sensor\n\t8074  PM160T Wireless Powermeter Thermal Sensor\n\t8075  PM400 Handheld Optical Power/Energy Meter\n\t8076  PM101 Serial PD Power Meter\n\t8078  PM100D Compact Power and Energy Meter Console\n\t8080  CCS100 - Compact Spectrometer\n\t8081  CCS100 Compact Spectrometer\n\t8083  CCS125 Spectrometer\n\t8085  CCS150 UV Spectrometer\n\t8087  CCS175 NIR Spectrometer\n\t8089  CCS200 Wide Range Spectrometer\n\t8090  SPCM Single Photon Counter\n\t80a0  LC100 series smart line camera\n\t80b0  PM200 Handheld Power and Energy Meter\n\t80c0  DC2200\n\t80c9  MTD Series\n\t80f0  TSP01\n\t80f1  M2SET Dongle\n\t8180  OCT Probe Controller (OCTH-1300)\n\t8181  OCT Device\n131d  Natural Point\n\t0155  TrackIR 3 Pro Head Tracker\n\t0156  TrackIR 4 Pro Head Tracker\n\t0158  TrackIR 5 Pro Head Tracker\n1325  ams AG\n\t00d6  I2C/SPI InterfaceBoard\n\t0c08  Embedded Linux Sensor Bridge\n\t4002  I2C Dongle\n132a  Envara Inc.\n\t1502  WiND 802.11abg / 802.11bg WLAN\n132b  Konica Minolta\n\t0000  Dimage A2 Camera\n\t0001  Minolta DiMAGE A2 (ptp)\n\t0003  Dimage Xg Camera\n\t0006  Dimage Z2 Camera\n\t0007  Minolta DiMAGE Z2 (PictBridge mode)\n\t0008  Dimage X21 Camera\n\t000a  Dimage Scan Dual IV AF-3200 (2891)\n\t000b  Dimage Z10 Camera\n\t000d  Dimage X50 Camera [storage?]\n\t000f  Dimage X50 Camera [p2p?]\n\t0010  Dimage G600 Camera\n\t0012  Dimage Scan Elite 5400 II (2892)\n\t0013  Dimage X31 Camera\n\t0015  Dimage G530 Camera\n\t0017  Dimage Z3 Camera\n\t0018  Minolta DiMAGE Z3 (PictBridge mode)\n\t0019  Dimage A200 Camera\n\t0021  Dimage Z5 Camera\n\t0022  Minolta DiMAGE Z5 (PictBridge mode)\n\t002c  Dynax 5D camera\n\t2001  Magicolor 2400w\n\t2004  Magicolor 5430DL\n\t2005  Magicolor 2430 DL\n\t2029  Magicolor 5440DL\n\t2030  PagePro 1350E(N)\n\t2033  PagePro 1400W\n\t2043  Magicolor 2530DL\n\t2045  Magicolor 2500W\n\t2049  Magicolor 2490MF\n133e  Kemper Digital GmbH\n\t0815  Virus TI Desktop\n1342  Mobility\n\t0200  EasiDock 200 Hub\n\t0201  EasiDock 200 Keyboard and Mouse Port\n\t0202  EasiDock 200 Serial Port\n\t0203  EasiDock 200 Printer Port\n\t0204  Ethernet\n\t0304  EasiDock Ethernet\n1343  Citizen Systems\n\t0002  CW-01\n\t0003  CX / DNP DS40\n\t0004  CX-W / DNP DS80 / Mitsubishi CP3800\n\t0005  CY / DNP DSRX1\n\t0006  CW-02 / OP900ii\n\t0007  DNP DS80DX\n\t0008  DNP DS620 (old)\n\t000a  CX-02\n\t000b  CX-02W\n1345  Sino Lite Technology Corp.\n\t001c  Xbox Controller Hub\n\t6006  Defender Wireless Controller\n1347  Moravian Instruments\n\t0400  G2CCD USB 1.1 obsolete\n\t0401  G2CCD-S with Sony ICX285 CCD\n\t0402  G2CCD2\n\t0403  G2/G3CCD-I KAI CCD\n\t0404  G2/G3/G4 CCD-F KAF CCD\n\t0405  Gx CCD-I CCD\n\t0406  Gx CCD-F CCD\n\t0410  G1-0400 CCD\n\t0411  G1-0800 CCD\n\t0412  G1-0300 CCD\n\t0413  G1-2000 CCD\n\t0414  G1-1400 CCD\n\t0415  G1-1200 CCD\n\t04b0  Gx CCD-B CCD\n\t04b1  Gx CCD-BI CCD\n1348  Katsuragawa Electric Co., Ltd.\n134c  PanJit International Inc.\n\t0001  Touch Panel Controller\n\t0002  Touch Panel Controller\n\t0003  Touch Panel Controller\n\t0004  Touch Panel Controller\n134e  Digby's Bitpile, Inc. DBA D Bit\n1357  P&E Microcomputer Systems\n\t0089  OpenSDA - CDC Serial Port\n\t0503  USB-ML-12 HCS08/HCS12 Multilink\n\t0504  DEMOJM\n\t1000  Smart Control Touchpad\n135e  Insta GmbH\n\t0021  Berker KNX Data Interface\n\t0022  Gira KNX Data Interface\n\t0023  JUNG KNX Data Interface\n\t0024  Merten/Schneider Electric KNX Data Interface\n\t0025  Hager KNX Data Interface\n\t0026  Feller KNX Data Interface\n135f  Control Development Inc.\n\t0110  Linear Spectrograph\n\t0111  Spectrograph - Renumerated\n\t0200  Linear Spectrograph\n\t0201  Spectrograph - Renumerated\n\t0240  MPP Spectrograph\n1366  SEGGER\n\t0101  J-Link PLUS\n\t1015  J-Link\n136b  STEC\n136e  Andor Technology Ltd.\n\t0012  iXon Ultra CCD\n\t0014  Zyla 5.5 sCMOS camera\n1370  Swissbit\n\t0323  Swissmemory cirrusWHITE\n\t6828  Victorinox Flash Drive\n1371  CNet Technology Inc.\n\t0001  CNUSB-611AR Wireless Adapter-G [AT76C503]\n\t0002  CNUSB-611AR Wireless Adapter-G [AT76C503] (FiberLine WL-240U)\n\t0013  CNUSB-611 Wireless Adapter [AT76C505]\n\t0014  CNUSB-611 Wireless Adapter [AT76C505] (FiberLine WL-240U)\n\t5743  CNUSB-611 (D) Wireless Adapter [AT76C503]\n\t9022  CWD-854 [RT2573]\n\t9032  CWD-854 rev F\n\t9401  CWD-854 Wireless 802.11g 54Mbps Network Adapter [RTL8187]\n1376  Vimtron Electronics Co., Ltd.\n1377  Sennheiser electronic GmbH & Co. KG\n\t4000  HDVD800\n137b  SCAPS GmbH\n\t0002  SCAPS USC-2 Scanner Controller\n137c  YASKAWA ELECTRIC CORP.\n\t0220  MP Series\n\t0250  SIGMA Series\n\t0401  AC Drive\n1385  Netgear, Inc\n\t4250  WG111T\n\t4251  WG111T (no firmware)\n\t5f00  WPN111 RangeMax(TM) Wireless USB 2.0 Adapter\n\t5f01  WPN111 (no firmware)\n\t5f02  WPN111 (no firmware)\n\t6e00  WPNT121 802.11g 240Mbps Wireless Adapter [Airgo AGN300]\n138a  Validity Sensors, Inc.\n\t0001  VFS101 Fingerprint Reader\n\t0005  VFS301 Fingerprint Reader\n\t0007  VFS451 Fingerprint Reader\n\t0008  VFS300 Fingerprint Reader\n\t0010  VFS Fingerprint sensor\n\t0011  VFS5011 Fingerprint Reader\n\t0015  VFS 5011 fingerprint sensor\n\t0017  VFS 5011 fingerprint sensor\n\t0018  Fingerprint scanner\n\t003c  VFS471 Fingerprint Reader\n\t003d  VFS491\n\t003f  VFS495 Fingerprint Reader\n\t0050  Swipe Fingerprint Sensor\n\t0090  VFS7500 Touch Fingerprint Sensor\n\t0091  VFS7552 Touch Fingerprint Sensor\n138e  Jungo LTD\n\t9000  Raisonance S.A. STM32 ARM evaluation board / RLink dongle\n1390  TOMTOM B.V.\n\t0001  GO 520 T / GO 630 / ONE / ONE XL\n\t5454  Blue & Me 2\n\t7474  GPS Sport Watch [Runner, Multi-Sport]\n\ta001  Bandit Action Camera Batt-Stick\n1391  IdealTEK, Inc.\n\t1000  URTC-1000\n1395  DSEA A/S\n\t0025  Headset [PC 8]\n\t0026  SC230\n\t0027  SC260\n\t0028  SC230 CTRL\n\t0029  SC260 CTRL\n\t002a  SC230 for Lync\n\t002b  SC260 for Lync\n\t002d  BTD-800\n\t002e  Presence\n\t0030  CEHS-CI 02\n\t0031  U320 Gaming\n\t0032  SC30 for Lync\n\t0033  SC60 for Lync\n\t0034  SC30 Control\n\t0035  SC60 Control\n\t0036  SC630 for Lync\n\t0037  SC660 for Lync\n\t0038  SC630 CTRL\n\t0039  SC660 CTRL\n\t003f  SP 20\n\t0040  MB Pro 1/2\n\t0041  SP 20 for Lync\n\t0042  SP 10\n\t0043  SP 10 for Lync\n\t0046  PXC 550\n\t004a  MOMENTUM M2 OEBT\n\t004b  MOMENTUM M2 AEBT\n\t004f  SC230 for MS II\n\t0050  SC260 for MS II\n\t0051  USB-ED CC 01\n\t0058  USB-ED CC 01 for MS\n\t0059  SC40 for MS\n\t005a  SC70 for MS\n\t005b  SC40 CTRL\n\t005c  SC70 CTRL\n\t0060  SCx5 MS\n\t0061  SCx5 CTRL\n\t0064  MB 660 MS\n\t0065  MB 660\n\t0066  SP 20 D UC\n\t0067  SP 20 D MS\n\t006b  SC6x5\n\t0072  Headset\n\t3556  USB Headset\n1397  BEHRINGER International GmbH\n\t0004  FCA1616\n\t00bc  BCF2000\n1398  Q-tec\n\t2103  USB 2.0 Storage Device\n13ad  Baltech\n\t9999  Card reader\n13b0  PerkinElmer Optoelectronics\n\t000a  Alesis Photon X25 MIDI Controller\n13b1  Linksys\n\t000a  WUSB54G v2 802.11g Adapter [Intersil ISL3887]\n\t000b  WUSB11 v4.0 802.11b Adapter [ALi M4301]\n\t000c  WUSB54AG 802.11a/g Adapter [Intersil ISL3887]\n\t000d  WUSB54G v4 802.11g Adapter [Ralink RT2500USB]\n\t000e  WUSB54GS v1 802.11g Adapter [Broadcom 4320 USB]\n\t0011  WUSB54GP v4.0 802.11g Adapter [Ralink RT2500USB]\n\t0014  WUSB54GS v2 802.11g Adapter [Broadcom 4320 USB]\n\t0018  USB200M 10/100 Ethernet Adapter\n\t001a  HU200TS Wireless Adapter\n\t001e  WUSBF54G 802.11bg\n\t0020  WUSB54GC v1 802.11g Adapter [Ralink RT73]\n\t0022  WUSB54GX4 802.11g 240Mbps Wireless Adapter [Airgo AGN300]\n\t0023  WUSB54GR\n\t0024  WUSBF54G v1.1 802.11bg\n\t0026  WUSB54GSC v1 802.11g Adapter [Broadcom 4320 USB]\n\t0028  WUSB200 802.11g Adapter [Ralink RT2671]\n\t0029  WUSB300N 802.11bgn Wireless Adapter [Marvell 88W8362+88W8060]\n\t002f  AE1000 v1 802.11n [Ralink RT3572]\n\t0031  AM10 v1 802.11n [Ralink RT3072]\n\t0039  AE1200 802.11bgn Wireless Adapter [Broadcom BCM43235]\n\t003a  AE2500 802.11abgn Wireless Adapter [Broadcom BCM43236]\n\t003b  AE3000 802.11abgn (3x3) Wireless Adapter [Ralink RT3573]\n\t003e  AE6000 802.11a/b/g/n/ac Wireless Adapter [MediaTek MT7610U]\n\t003f  WUSB6300 802.11a/b/g/n/ac Wireless Adapter [Realtek RTL8812AU]\n\t0041  Gigabit Ethernet Adapter\n\t0042  WUSB6100M 802.11a/b/g/n/ac Wireless Adapter\n\t13b1  WUSB200: Wireless-G Business Network Adapter with Rangebooster\n13b2  Alesis\n\t0030  Multimix 8\n13b3  Nippon Dics Co., Ltd.\n13ba  PCPlay\n\t0001  Konig Electronic CMP-KEYPAD12 Numeric Keypad\n\t0017  PS/2 Keyboard+Mouse Adapter\n\t0018  Barcode PCP-BCG4209\n13be  Ricoh Printing Systems, Ltd.\n13ca  JyeTai Precision Industrial Co., Ltd.\n13cf  Wisair Ltd.\n\t1200  Olidata Wireless Multimedia Adapter\n13d0  Techsan Electronics Co., Ltd.\n\t2282  TechniSat DVB-PC TV Star 2\n13d1  A-Max Technology Macao Commercial Offshore Co. Ltd.\n\t7019  MD 82288\n\tabe6  Wireless 802.11g 54Mbps Network Adapter [RTL8187]\n13d2  Shark Multimedia\n\t0400  Pocket Ethernet [klsi]\n13d3  IMC Networks\n\t3201  VisionDTV USB-Ter/HAMA USB DVB-T device cold\n\t3202  VisionDTV USB-Ter/HAMA USB DVB-T device warm\n\t3203  DTV-DVB UDST7020BDA DVB-S Box(DVBS for MCE2005)\n\t3204  DTV-DVB UDST7020BDA DVB-S Box(DVBS for MCE2005)\n\t3205  DNTV Live! Tiny USB2 BDA (No Remote)\n\t3206  DNTV Live! Tiny USB2 BDA (No Remote)\n\t3207  DTV-DVB UDST7020BDA DVB-S Box(DVBS for MCE2005)\n\t3208  DTV-DVB UDST7020BDA DVB-S Box(DVBS for MCE2005)\n\t3209  DTV-DVB UDST7022BDA DVB-S Box(Without HID)\n\t3211  DTV-DVB Hybrid Analog/Capture / Pinnacle PCTV 310e\n\t3212  DTV-DVB UDTT704C - DVBT/NTSC/PAL Driver(PCM4)\n\t3213  DTV-DVB UDTT704D - DVBT/NTSC/PAL Driver (PCM4)\n\t3214  DTV-DVB UDTT704F -(MiniCard) DVBT/NTSC/PAL Driver(Without HID)\n\t3215  DTV-DVB UDAT7240 - ATSC/NTSC/PAL Driver(PCM4)\n\t3216  DTV-DVB UDTT 7047-USB 2.0 DVB-T Driver\n\t3217  Digital-TV Receiver.\n\t3219  DTV-DVB UDTT7049 - DVB-T Driver(Without HID)\n\t3220  DTV-DVB UDTT 7047M-USB 2.0 DVB-T Driver\n\t3223  DNTV Live! Tiny USB2 BDA (No Remote)\n\t3224  DNTV Live! Tiny USB2 BDA (No Remote)\n\t3226  DigitalNow TinyTwin DVB-T Receiver\n\t3234  DVB-T FTA Half Minicard [RTL2832U]\n\t3236  DTV-DVB UDTT 7047A-USB 2.0 DVB-T Driver\n\t3237  DTV-DVB UDTT 704J - dual DVB-T Driver\n\t3239  DTV-DVB UDTT704D - DVBT/NTSC/PAL Driver(Without HID)\n\t3240  DTV-DVB UDXTTM6010 - A/D Driver(Without HID)\n\t3241  DTV-DVB UDXTTM6010 - A/D Driver(Without HID)\n\t3242  DTV-DVB UDAT7240LP - ATSC/NTSC/PAL Driver(Without HID)\n\t3243  DTV-DVB UDXTTM6010 - A/D Driver(Without HID)\n\t3244  DTV-DVB UDTT 7047Z-USB 2.0 DVB-T Driver\n\t3247  AW-NU222 802.11bgn Wireless Module [Ralink RT2770+RT2720]\n\t3249  Internal Bluetooth\n\t3250  Broadcom Bluetooth 2.1\n\t3262  802.11 n/g/b Wireless LAN USB Adapter\n\t3273  802.11 n/g/b Wireless LAN USB Mini-Card\n\t3274  DVB-T Dongle [RTL2832U]\n\t3282  DVB-T + GPS Minicard [RTL2832U]\n\t3284  Wireless LAN USB Mini-Card\n\t3304  Asus Integrated Bluetooth module [AR3011]\n\t3306  Mediao 802.11n WLAN [Realtek RTL8191SU]\n\t3315  Bluetooth module\n\t3327  AW-NU137 802.11bgn Wireless Module [Atheros AR9271]\n\t3362  Atheros AR3012 Bluetooth 4.0 Adapter\n\t3375  Atheros AR3012 Bluetooth 4.0 Adapter\n\t3392  Azurewave 43228+20702\n\t3394  Bluetooth\n\t3474  Atheros AR3012 Bluetooth\n\t3526  Bluetooth Radio\n\t5070  Webcam\n\t5111  Integrated Webcam\n\t5115  Integrated Webcam\n\t5116  Integrated Webcam\n\t5122  2M Integrated Webcam\n\t5126  PC Cam\n\t5130  Integrated Webcam\n\t5134  Integrated Webcam\n\t5615  Lenovo EasyCamera\n\t5670  HP TrueVision HD\n\t5682  SunplusIT Integrated Camera\n\t5702  UVC VGA Webcam\n\t5710  UVC VGA Webcam\n\t5716  UVC VGA Webcam\n\t5a07  VGA UVC WebCam\n\t7020  DTV-DVB UDST7020BDA DVB-S Box(DVBS for MCE2005)\n\t7022  DTV-DVB UDST7022BDA DVB-S Box(Without HID)\n\t784b  XHC Camera\n13d7  Guidance Software, Inc.\n\t0001  T5 PATA forensic bridge\n\t000c  T8-R2 forensic bridge\n13dc  ALEREON, INC.\n13dd  i.Tech Dynamic Limited\n13e1  Kaibo Wire & Cable (Shenzhen) Co., Ltd.\n13e5  Rane\n\t0001  SL-1\n\t0003  TTM 57SL\n13e6  TechnoScope Co., Ltd.\n13ea  Hengstler\n\t0001  C-56 Thermal Printer\n13ec  Zydacron\n\t0006  HID Remote Control\n13ee  MosArt\n\t0001  Optical Mouse\n\t0003  Optical Mouse\n13fd  Initio Corporation\n\t0550  INIC-1530 PATA Bridge\n\t0840  INIC-1618L SATA\n\t0841  Samsung SE-T084M DVD-RW\n\t0940  ASUS SBW-06D2X-U\n\t1040  INIC-1511L PATA Bridge\n\t1340  Hi-Speed USB to SATA Bridge\n\t160f  RocketFish SATA Bridge [INIC-1611]\n\t1640  INIC-1610L SATA Bridge\n\t1669  INIC-1609PN\n\t1840  INIC-1608 SATA bridge\n\t1e40  INIC-1610P SATA bridge\n\t2040  Samsung Writemaster external DVD writer\n\t3920  INIC-3619PN SATA Bridge\n\t3940  external DVD burner ECD819-SU3\n\t3960  INIC-3639\n\t3e40  ZALMAN ZM-VE350\n13fe  Phison Electronics Corp.\n\t1a00  512MB/1GB Flash Drive\n\t1a23  512MB Flash Drive\n\t1d00  DataTraveler 2.0 1GB/4GB Flash Drive / Patriot Xporter 4GB Flash Drive\n\t1e00  Flash Drive 2 GB [ICIDU 2 GB]\n\t1e50  U3 Smart Drive\n\t1f00  Kingston DataTraveler / Patriot Xporter\n\t1f23  PS2232 flash drive controller\n\t2240  microSD card reader\n\t3100  2/4 GB stick\n\t3123  Verbatim STORE N GO 4GB\n\t3200  flash drive (2GB, EMTEC)\n\t3600  flash drive (4GB, EMTEC)\n\t3800  Rage XT Flash Drive\n\t3d00  Flash Drive\n\t3e00  Flash Drive\n\t4100  Flash drive\n\t4200  Platinum USB drive mini\n\t5000  USB flash drive (32 GB SHARKOON Accelerate)\n\t5100  Flash Drive\n\t5200  DataTraveler R3.0\n\t5500  Flash drive\n\t6300  SP Mobile C31 (64GB)\n1400  Axxion Group Corp.\n1402  Bowe Bell & Howell\n1403  Sitronix\n\t0001  Digital Photo Frame\n\t0003  Digital Photo Frame (DPF-1104)\n1404  Fundamental Software, Inc.\n\tcddc  Dongle\n1409  IDS Imaging Development Systems GmbH\n\t1000  generic (firmware not loaded yet)\n\t1485  uEye UI1485\n\t3240  uEye UI3240\n140e  Telechips, Inc.\n\tb011  TCC780X-based player (USB Boot mode)\n\tb021  TCC77X-based players (USB Boot mode)\n1410  Novatel Wireless\n\t1110  Merlin S620\n\t1120  Merlin EX720\n\t1130  Merlin S720\n\t1400  Merlin U730/U740 (Vodafone)\n\t1410  Merlin U740 (non-Vodafone)\n\t1430  Merlin XU870\n\t1450  Merlin X950D\n\t2110  Ovation U720/MCD3000\n\t2410  Expedite EU740\n\t2420  Expedite EU850D/EU860D/EU870D\n\t4100  U727\n\t4400  Ovation MC930D/MC950D\n\t9010  Expedite E362\n\ta001  Gobi Wireless Modem\n\ta008  Gobi Wireless Modem (QDL mode)\n\tb001  Ovation MC551\n1415  Nam Tai E&E Products Ltd. or OmniVision Technologies, Inc.\n\t0000  Sony SingStar USBMIC\n\t0020  Sony Wireless SingStar\n\t2000  Sony Playstation Eye\n1419  ABILITY ENTERPRISE CO., LTD.\n1421  Sensor Technology\n\t0605  Sentech Camera\n1424  Posnet Polska S.A.\n\t1001  Temo\n\t1002  Thermal\n\t1003  Neo\n\t1004  Combo DF\n\t1005  Thermal-A\n\t1006  Thermal FV\n\t1007  Bingo HS\n\t1008  Thermal HS FV\n\t1009  Thermal FV EJ\n\t100a  Thermal HD\n\t100b  Thermal\n\t100c  Neo\n\t100d  Ergo\n\t100e  Trio\n\t1010  Thermal HS FV EJ\n\t1011  Neo EJ\n\t1012  Thermal-A\n\t1013  Thermal-A EJ\n\t1014  Mobile\n\t1015  Temo HS\n\t1016  Mobile HS\n\t1017  TH230+ FV EJ\n\t1018  4610-1NR FV EJ\n1429  Vega Technologies Industrial (Austria) Co.\n142a  Thales E-Transactions\n\t0003  Artema Hybrid\n\t0005  Artema Modular\n\t0043  medCompact\n142b  Arbiter Systems, Inc.\n\t03a5  933A Portable Power Sentinel\n1430  RedOctane\n\t0150  wireless receiver for skylanders wii\n\t4734  Guitar Hero4 hub\n\t4748  Guitar Hero X-plorer\n\t474b  Guitar Hero MIDI interface\n\t8888  TX6500+ Dance Pad\n\tf801  Controller\n1431  Pertech Resources, Inc.\n1435  Wistron NeWeb\n\t0427  UR054g 802.11g Wireless Adapter [Intersil ISL3887]\n\t0711  UR055G 802.11bg\n\t0804  AR9170+AR9104 802.11abgn Wireless Adapter\n\t0826  AR5523\n\t0827  AR5523 (no firmware)\n\t0828  AR5523\n\t0829  AR5523 (no firmware)\n1436  Denali Software, Inc.\n143c  Altek Corporation\n1443  Digilent\n\t0007  Development board JTAG\n1446  X.J.GROUP\n\t6a73  Stamps.com Model 510 5LB Scale\n\t6a78  DYMO Endicia 75lb Digital Scale\n1451  Force Dimension\n\t0301  haptic device\n\t0302  haptic device\n\t0400  haptic device\n\t0401  delta.x haptic device\n\t0402  omega.x haptic device\n\t0403  sigma.x haptic device\n\t0404  haptic controller\n\t0405  dedicated haptic device\n\t0406  dedicated haptic device\n\t0407  dedicated haptic device\n\t0408  dedicated haptic device\n1452  Dai Nippon Printing, Inc\n\t8b01  DS620\n\t9001  DS820\n1453  Radio Shack\n\t4026  26-183 Serial Cable\n1456  Extending Wire & Cable Co., Ltd.\n1457  First International Computer, Inc.\n\t5117  OpenMoko Neo1973 kernel usbnet (g_ether, CDC Ethernet) mode\n\t5118  OpenMoko Neo1973 Debug board (V2+)\n\t5119  OpenMoko Neo1973 u-boot cdc_acm serial port\n\t511a  HXD8 u-boot usbtty CDC ACM Mode\n\t511b  SMDK2440 u-boot usbtty CDC ACM mode\n\t511c  SMDK2443 u-boot usbtty CDC ACM mode\n\t511d  QT2410 u-boot usbtty CDC ACM mode\n\t5120  OpenMoko Neo1973 u-boot usbtty generic serial\n\t5121  OpenMoko Neo1973 kernel mass storage (g_storage) mode\n\t5122  OpenMoko Neo1973 / Neo Freerunner kernel cdc_ether USB network\n\t5123  OpenMoko Neo1973 internal USB CSR4 module\n\t5124  OpenMoko Neo1973 Bluetooth Device ID service\n145f  Trust\n\t0106  K56 V92 Modem\n\t013d  PC Camera (SN9C201 + OV7660)\n\t013f  Megapixel Auto Focus Webcam\n\t0142  WB-6250X Webcam\n\t015a  WB-8300X 2MP Webcam\n\t0161  15901 802.11bg Wireless Adapter [Realtek RTL8187L]\n\t0167  Widescreen 3MP Webcam\n\t0176  Isla Keyboard\n\t019f  17676 Webcam\n\t01e5  Keyboard [GXT 830]\n\t0212  Panora Widescreen Graphic Tablet\n\t023f  Mouse [GXT 168]\n1460  Tatung Co.\n\t9150  eHome Infrared Transceiver\n1461  Staccato Communications\n1462  Micro Star International\n\t5512  MegaStick-1 Flash Stick\n\t8807  DIGIVOX mini III [af9015]\n146b  BigBen Interactive\n\t0601  Controller for Xbox 360\n\t0902  Wired Mini PS3 Game Controller\n1472  Huawei-3Com\n\t0007  Aolynk WUB300g [ZyDAS ZD1211]\n\t0009  Aolynk WUB320g\n147a  Formosa Industrial Computing, Inc.\n\te015  eHome Infrared Receiver\n\te016  eHome Infrared Receiver\n\te017  eHome Infrared Receiver\n\te018  eHome Infrared Receiver\n\te02c  Infrared Receiver\n\te03a  eHome Infrared Receiver\n\te03c  eHome Infrared Receiver\n\te03d  2 Channel Audio\n\te03e  Infrared Receiver [IR605A/Q]\n147e  Upek\n\t1000  Biometric Touchchip/Touchstrip Fingerprint Sensor\n\t1001  TCS5B Fingerprint sensor\n\t1002  Biometric Touchchip/Touchstrip Fingerprint Sensor\n\t2016  Biometric Touchchip/Touchstrip Fingerprint Sensor\n\t2020  TouchChip Fingerprint Coprocessor (WBF advanced mode)\n\t3000  TCS1C EIM/Cypress Fingerprint sensor\n\t3001  TCS1C EIM/STM32 Fingerprint sensor\n147f  Hama GmbH & Co., KG\n1482  Vaillant\n\t1005  VRD PC-Interface\n1484  Elsa AG [hex]\n\t1746  Ecomo 19H99 Monitor\n\t7616  Elsa Hub\n1485  Silicom\n\t0001  U2E\n\t0002  Psion Gold Port Ethernet\n1487  DSP Group, Ltd.\n148e  EVATRONIX SA\n148f  Ralink Technology, Corp.\n\t1000  Motorola BC4 Bluetooth 3.0+HS Adapter\n\t1706  RT2500USB Wireless Adapter\n\t2070  RT2070 Wireless Adapter\n\t2570  RT2570 Wireless Adapter\n\t2573  RT2501/RT2573 Wireless Adapter\n\t2671  RT2601/RT2671 Wireless Adapter\n\t2770  RT2770 Wireless Adapter\n\t2870  RT2870 Wireless Adapter\n\t3070  RT2870/RT3070 Wireless Adapter\n\t3071  RT3071 Wireless Adapter\n\t3072  RT3072 Wireless Adapter\n\t3370  RT3370 Wireless Adapter\n\t3572  RT3572 Wireless Adapter\n\t3573  RT3573 Wireless Adapter\n\t5370  RT5370 Wireless Adapter\n\t5372  RT5372 Wireless Adapter\n\t5572  RT5572 Wireless Adapter\n\t7601  MT7601U Wireless Adapter\n\t760b  MT7601U Wireless Adapter\n\t761a  MT7610U (\"Archer T2U\" 2.4G+5G WLAN Adapter\n\t9020  RT2500USB Wireless Adapter\n\t9021  RT2501USB Wireless Adapter\n1491  Futronic Technology Co. Ltd.\n\t0020  FS81 Fingerprint Scanner Module\n\t0088  Fingerprint Scanner Model FS88\n1493  Suunto\n\t0010  Bluebird [Ambit]\n\t0019  Duck [Ambit2]\n\t001a  Colibri [Ambit2 S]\n\t001b  Emu [Ambit3 Peak]\n\t001c  Finch [Ambit3 Sport]\n\t001d  Greentit [Ambit2 R]\n\t001e  Ibisbill [Ambit3 Run]\n1497  Panstrong Company Ltd.\n1498  Microtek International Inc.\n\ta090  DVB-T Tuner\n149a  Imagination Technologies\n\t069b  PURE Digital Evoke-1XT Tri-band\n\t2107  DBX1 DSP core\n14aa  WideView Technology Inc.\n\t0001  Avermedia AverTV DVBT USB1.1 (cold)\n\t0002  Avermedia AverTV DVBT USB1.1 (warm)\n\t0201  AVermedia/Yakumo/Hama/Typhoon DVB-T USB2.0 (cold)\n\t0221  WT-220U DVB-T dongle\n\t022b  WT-220U DVB-T dongle\n\t0301  AVermedia/Yakumo/Hama/Typhoon DVB-T USB2.0 (warm)\n14ad  CTK Corporation\n14ae  Printronix Inc.\n14af  ATP Electronics Inc.\n14b0  StarTech.com Ltd.\n\t3410  Serial Adapter ICUSB2321X [TUSB3410I]\n14b2  Ralink Technology, Corp.\n\t3a93  Topcom 802.11bg Wireless Adapter [Atheros AR5523]\n\t3a95  Toshiba WUS-G06G-JT 802.11bg Wireless Adapter [Atheros AR5523]\n\t3a98  Airlink101 AWLL4130 802.11bg Wireless Adapter [Atheros AR5523]\n\t3c02  Conceptronic C54RU v2 802.11bg Wireless Adapter [Ralink RT2571]\n\t3c05  rt2570 802.11g WLAN\n\t3c06  Conceptronic C300RU v1 802.11bgn Wireless Adapter [Ralink RT2870]\n\t3c07  802.11n adapter\n\t3c09  802.11n adapter\n\t3c22  Conceptronic C54RU v3 802.11bg Wireless Adapter [Ralink RT2571W]\n\t3c23  Airlink101 AWLL6080 802.11bgn Wireless Adapter [Ralink RT2870]\n\t3c24  NEC NP01LM 802.11abg Wireless Adapter [Ralink RT2571W]\n\t3c25  DrayTek Vigor N61 802.11bgn Wireless Adapter [Ralink RT2870]\n\t3c27  Airlink101 AWLL6070 802.11bgn Wireless Adapter [Ralink RT2770]\n\t3c28  Conceptronic C300RU v2 802.11bgn Wireless Adapter [Ralink RT2770]\n\t3c2b  NEC NP02LM 802.11bgn Wireless Adapter [Ralink RT3072]\n\t3c2c  Keebox W150NU 802.11bgn Wireless Adapter [Ralink RT3070]\n14c0  Rockwell Automation, Inc.\n14c2  Gemlight Computer, Ltd\n\t0250  Storage Adapter V2\n\t0350  Storage Adapter V2\n14c8  Zytronic\n\t0005  Touchscreen Controller\n14cd  Super Top\n\t1212  microSD card reader (SY-T18)\n\t121c  microSD card reader\n\t121f  microSD CardReader SY-T18\n\t123a  SD/MMC/RS-MMC Card Reader\n\t125c  SD card reader\n\t127b  SDXC Reader\n\t168a  Elecom Co., Ltd MR-K013 Multicard Reader\n\t6116  M6116 SATA Bridge\n\t6600  M110E PATA bridge\n\t6700  Card Reader\n\t6900  Card Reader\n\t8123  SD MMC Reader\n\t8125  SD MMC Reader\n\t8601  4-Port hub\n\t8608  Hub [Super Top]\n14d8  JAMER INDUSTRIES CO., LTD.\n14dd  Raritan Computer, Inc.\n\t1007  D2CIM-VUSB KVM connector\n14e0  WiNRADiO Communications\n\t0501  WR-G528e 'CHEETAH'\n14e1  Dialogue Technology Corp.\n\t5000  PenMount 5000 Touch Controller\n14e5  SAIN Information & Communications Co., Ltd.\n14ea  Planex Communications\n\tab10  GW-US54GZ\n\tab11  GU-1000T\n\tab13  GW-US54Mini 802.11bg\n14ed  Shure Inc.\n\t1000  MV5\n\t1002  MV51\n\t1003  MVi\n\t1004  SHA900\n\t1005  KSE1500\n\t1011  MV88+\n\t1100  ANIUSB-MATRIX\n\t1101  P300\n\t29b6  X2u Adapter\n\t3000  RMCE-USB\n14f7  TechniSat Digital GmbH\n\t0001  SkyStar 2 HD CI\n\t0002  SkyStar 2 HD CI\n\t0003  CableStar Combo HD CI\n\t0004  AirStar TeleStick 2\n\t0500  DVB-PC TV Star HD\n1500  Ellisys\n1501  Pine-Tum Enterprise Co., Ltd.\n1504  Bixolon CO LTD\n\t001f  SRP-350II Thermal Receipt Printer\n1508  Fibocom\n1509  First International Computer, Inc.\n\t0a01  LI-3100 Area Meter\n\t0a02  LI-7000 CO2/H2O Gas Analyzer\n\t0a03  C-DiGit Blot Scanner\n\t9242  eHome Infrared Transceiver\n1513  medMobile\n\t0444  medMobile\n1514  Actel\n\t2003  FlashPro3 Programmer\n\t2004  FlashPro3 Programmer\n\t2005  FlashPro3 Programmer\n1516  CompUSA\n\t1603  Flash Drive\n\t8628  Pen Drive\n1518  Cheshire Engineering Corp.\n\t0001  HDReye High Dynamic Range Camera\n\t0002  HDReye (before firmware loads)\n1519  Comneon\n\t0020  HSIC Device\n151f  Opal Kelly Incorporated\n\t0020  XEM3001v1\n\t0021  XEM3001v2\n\t0022  XEM3010\n\t0023  XEM3005\n\t0028  XEM3050\n\t002b  XEM5010\n\t002c  XEM6001\n\t002d  XEM6010-LX45\n\t002e  XEM6010-LX150\n\t0030  XEM6006-LX16\n\t0033  XEM6002-LX9\n\t0034  XEM7001-A15\n\t0036  XEM7010-A50\n\t0037  XEM7010-A200\n\t0120  ZEM4310\n\t0121  XEM6310-LX45\n\t0122  XEM6310-LX150\n\t0123  XEM6310MT-LX45T\n\t0125  XEM7350-K70T\n\t0126  XEM7350-K160T\n\t0127  XEM7350-K410T\n\t0128  XEM6310MT-LX150T\n\t0129  ZEM5305-A2\n\t012b  XEM7360-K160T\n\t012c  XEM7360-K410T\n\t012d  ZEM5310-A4\n\t0130  XEM7310-A75\n\t0131  XEM7310-A200\n1520  Bitwire Corp.\n1524  ENE Technology Inc\n\t6680  UTS 6680\n1527  Silicon Portals\n\t0200  YAP Phone (no firmware)\n\t0201  YAP Phone\n1529  UBIQUAM Co., Ltd.\n\t3100  CDMA 1xRTT USB Modem (U-100/105/200/300/520)\n152a  Thesycon Systemsoftware & Consulting GmbH\n\t8350  NET Gmbh iCube Camera\n\t8400  INI DVS128\n\t840d  INI DAViS\n\t841a  INI DAViS FX3\n152b  MIR Srl\n\t0001  spirobank II\n\t0002  spirolab III\n\t0003  MiniSpir\n\t0004  Oxi\n\t0005  spiros II\n\t0006  smiths spirobank II\n\t0007  smiths spirobank G-USB\n\t0008  smiths MiniSpir\n\t0009  spirobank G-USB\n\t000a  smiths Oxi\n\t000b  smiths spirolab III\n\t000c  chorus III\n\t000d  spirolab III Bw\n\t000e  spirolab III\n\t000f  easySpiro\n\t0010  Spirotel converter\n\t0011  spirobank\n\t0012  spiro3 Zimmer\n\t0013  spirotel serial\n\t0014  spirotel II\n\t0015  spirodoc\n152d  JMicron Technology Corp. / JMicron USA Technology Corp.\n\t0539  JMS539/567 SuperSpeed SATA II/III 3.0G/6.0G Bridge\n\t0551  JMS551 SuperSpeed two ports SATA 3Gb/s bridge\n\t0561  JMS551 - Sharkoon SATA QuickPort Duo\n\t0562  JMS567 SATA 6Gb/s bridge\n\t0567  JMS567 SATA 6Gb/s bridge\n\t0576  Gen1 SATA 6Gb/s Bridge\n\t0578  JMS578 SATA 6Gb/s\n\t0583  JMS583Gen 2 to PCIe Gen3x2 Bridge\n\t0770  Alienware Integrated Webcam\n\t1561  JMS561U two ports SATA 6Gb/s bridge\n\t1576  External Disk 3.0\n\t2329  JM20329 SATA Bridge\n\t2335  ATA/ATAPI Bridge\n\t2336  Hard Disk Drive\n\t2337  ATA/ATAPI Bridge\n\t2338  JM20337 Hi-Speed USB to SATA & PATA Combo Bridge\n\t2339  JM20339 SATA Bridge\n\t2352  ATA/ATAPI Bridge\n\t2509  JMS539, JMS551 SATA 3Gb/s bridge\n\t2551  JMS551 SATA 3Gb/s bridge\n\t2561  CEB-2235S-U3 external RAID box\n\t2566  JMS566 SATA 3Gb/s bridge\n\t2590  JMS567 SATA 6Gb/s bridge\n\t3562  JMS567 SATA 6Gb/s bridge\n\t3569  JMS566 SATA 3Gb/s bridge\n\t578e  JMS578 SATA 6Gb/s bridge\n\t8561  salcar docking station two disks\n152e  LG (HLDS)\n\t1640  INIC-1605 SATA Bridge\n\t2507  PL-2507 IDE Controller\n\t2571  GP08NU6W DVD-RW\n\te001  GSA-5120D DVD-RW\n1532  Razer USA, Ltd\n\t0001  RZ01-020300 Optical Mouse [Diamondback]\n\t0002  Diamondback Optical Mouse\n\t0003  Krait Mouse\n\t0005  Boomslang CE\n\t0007  DeathAdder Mouse\n\t0009  Gaming Mouse [Tempest Habu]\n\t000a  Mamba (Wired)\n\t000c  Lachesis\n\t000d  DiamondBack 3G\n\t000e  Megalodon\n\t000f  Mamba (Wireless)\n\t0012  Gaming Mouse [Salmosa]\n\t0013  Orochi 2011\n\t0015  Naga Mouse\n\t0016  DeathAdder 3.5G\n\t0017  RZ01-0035 Laser Gaming Mouse [Imperator]\n\t0019  Marauder\n\t001a  Spectre\n\t001b  Gaming Headset\n\t001c  RZ01-0036 Optical Gaming Mouse [Abyssus]\n\t001e  Lachesis (5600 DPI)\n\t001f  Naga Epic (Wired)\n\t0020  Abyssus 1800\n\t0021  Naga Epic Dock (Wireless, Bluetooth)\n\t0022  Gaming Mouse [TRON]\n\t0023  Gaming Keyboard [TRON]\n\t0024  Mamba 2012 (Wired)\n\t0025  Mamba 2012 (Wireless)\n\t0029  DeathAdder Black Edition\n\t002a  Gaming Mouse [Star Wars: The Old Republic]\n\t002b  Gaming Keyboard [Star Wars: The Old Republic]\n\t002c  Gaming Headset [Star Wars: The Old Republic]\n\t002e  RZ01-0058 Gaming Mouse [Naga 2012]\n\t002f  Imperator 2012\n\t0031  Gaming Mouse Dock [Star Wars: The Old Republic]\n\t0032  Ouroboros 2012 (Wired)\n\t0033  Ouroboros 2012 (Wireless)\n\t0034  Taipan\n\t0035  Krait 2013 Essential\n\t0036  RZ01-0075, Gaming Mouse [Naga Hex (Red)]\n\t0037  DeathAdder 2013\n\t0038  DeathAdder 1800\n\t0039  Orochi 2013\n\t003e  Naga Epic Chroma (Wired)\n\t003f  Naga Epic Chroma (Wireless)\n\t0040  Naga 2014\n\t0041  Naga Hex\n\t0042  Abyssus 2014\n\t0043  DeathAdder Chroma\n\t0044  Mamba Chroma (Wired)\n\t0045  Mamba Chroma (Wireless)\n\t0046  Mamba 2015 Tournament Edition [RZ01-01370100-R3]\n\t0048  Orochi 2015 (Wired)\n\t004a  RZ03-0133 Gaming Lapboard, Keyboard Mouse Combo, Dongle [Turret Dongle]\n\t004c  Diamondback Chroma\n\t004d  DeathAdder 2000 (Cynosa Pro Bundle)\n\t004f  RZ01-0145, Gaming Mouse [DeathAdder 2000 (Alternate)]\n\t0050  Naga Hex V2\n\t0053  Naga Chroma\n\t0054  DeathAdder 3500\n\t0056  Orochi 2015 (Wireless)\n\t0059  RZ01-0212 Gaming Mouse [Lancehead (Wired)]\n\t005a  RZ01-0212 Gaming Mouse [Lancehead (Wireless)]\n\t005b  Abyssus V2\n\t005c  DeathAdder Elite\n\t005e  Abyssus 2000\n\t005f  DeathAdder 2000\n\t0060  RZ01-0213 Gaming Mouse [Lancehead Tournament Edition]\n\t0062  Atheris\n\t0064  Basilisk\n\t0065  RZ01-0265, Gaming Mouse [Basilisk Essential]\n\t0067  Naga Trinity\n\t0068  Gaming Mouse Mat [Firefly Hyperflux]\n\t0069  Gaming Mouse [Mamba Hyperflux]\n\t006a  Abyssus Elite (D.Va Edition)\n\t006b  Abyssus Essential\n\t006c  Mamba Elite (Wired)\n\t006e  DeathAdder Essential\n\t006f  RZ01-0257 Gaming Mouse [Lancehead Wireless (2019, Wireless, Receiver)]\n\t0070  RZ01-0257 Gaming Mouse [Lancehead Wireless (2019, Wired)]\n\t0071  RZ01-0254 Gaming Mouse [DeathAdder Essential White Edition]\n\t0072  Mamba 2018 (Wireless)\n\t0073  Mamba 2018 (Wired)\n\t0078  Viper (wired)\n\t007a  RC30-0305 Gaming Mouse [Viper Ultimate (Wired)]\n\t007b  RC30-0305 Gaming Mouse Dongle [Viper Ultimate (Wireless)]\n\t007e  RC30-030502 Mouse Dock\n\t0083  RC30-0315, Gaming Mouse [Basilisk X HyperSpeed]\n\t0084  RZ01-0321 Gaming Mouse [DeathAdder V2]\n\t0085  RZ01-0316 Gaming Mouse [Basilisk V2]\n\t0086  Gaming Mouse [Basilisk Ultimate, Wired]\n\t0088  Gaming Mouse [Basilisk Ultimate, Wireless, Receiver]\n\t008a  RZ01-0325, Gaming Mouse [Viper Mini]\n\t0101  Copperhead Mouse\n\t0102  Tarantula Keyboard\n\t0103  Gaming Keyboard [Reclusa]\n\t0105  Gaming Keyboard [ProType]\n\t0106  Gaming Keyboard [ProType]\n\t0109  Lycosa Keyboard\n\t010b  Gaming Keyboard [Arctosa]\n\t010d  BlackWidow Ultimate 2012\n\t010e  BlackWidow Classic (Alternate)\n\t010f  Anansi\n\t0110  Cyclosa\n\t0111  Nostromo\n\t0113  RZ07-0074 Gaming Keypad [Orbweaver]\n\t0114  DeathStalker Ultimate\n\t0116  Blade Pro (2015)\n\t0118  RZ03-0080, Gaming Keyboard [Deathstalker Essential]\n\t0119  Gaming Keyboard [Lycosa]\n\t011a  BlackWidow Ultimate 2013\n\t011b  BlackWidow Classic\n\t011c  BlackWidow Tournament Edition Stealth\n\t011d  Blade 2013\n\t011e  Gaming Keyboard Dock [Edge Keyboard Dock]\n\t011f  Deathstalker Essential 2014\n\t0200  Gaming Keyboard [Reclusa]\n\t0201  Tartarus\n\t0202  DeathStalker Expert\n\t0203  BlackWidow Chroma\n\t0204  DeathStalker Chroma\n\t0205  Blade Stealth\n\t0207  Orbweaver Chroma keypad\n\t0208  Tartarus Chroma\n\t0209  BlackWidow Tournament Edition Chroma\n\t020d  Cynosa Pro keyboard (Cynosa Pro Bundle)\n\t020f  Blade QHD\n\t0210  Blade Pro (Late 2016)\n\t0211  BlackWidow Chroma (Overwatch)\n\t0214  BlackWidow Ultimate 2016\n\t0215  Core\n\t0216  BlackWidow X Chroma\n\t0217  BlackWidow X Ultimate\n\t021a  BlackWidow X Tournament Edition Chroma\n\t021b  Gaming Keyboard [BlackWidow X Tournament Edition]\n\t021e  Ornata Chroma\n\t021f  Ornata\n\t0220  Blade Stealth (2016)\n\t0221  RZ03-0203 Gaming Keyboard [BlackWidow Chroma V2]\n\t0224  Blade (Late 2016)\n\t0225  Blade Pro (2017)\n\t0226  Huntsman Elite\n\t0227  Huntsman\n\t0228  BlackWidow Elite\n\t022a  Cynosa Chroma\n\t022b  Tartarus V2\n\t022c  Cynosa Chroma Pro\n\t022d  Blade Stealth (Mid 2017)\n\t022f  Blade Pro FullHD (2017)\n\t0232  Blade Stealth (Late 2017)\n\t0233  Blade 15 (2018)\n\t0234  Blade Pro 17 (2019)\n\t0235  BlackWidow Lite (2018)\n\t0237  BlackWidow Essential\n\t0239  Blade Stealth (2019)\n\t023a  Blade 15 (2019) Advanced\n\t023b  Blade 15 (2018) Base Model\n\t023f  RZ03-0274 Gaming Keyboard [Cynosa Lite]\n\t0240  Blade 15 (2018) Mercury\n\t0241  BlackWidow (2019)\n\t0243  Huntsman Tournament Edition\n\t0244  RZ07-0311 Gaming Keypad [Tartarus Pro]\n\t0245  Blade 15 (Mid 2019) Mercury\n\t0246  Blade 15 (Mid 2019) Base Model\n\t024a  Blade Stealth (Late 2019)\n\t024b  Gaming Laptop [Blade 15 Advanced (Late 2019)]\n\t024c  Gaming Laptop [Blade Pro (Late 2019)]\n\t024d  Blade 15 Studio Edition (2019)\n\t0253  RZ09-0330, Gaming Laptop [Blade 15 Advanced (Early 2020)]\n\t0255  RZ09-0328, Gaming Laptop [Blade 15 Base Model (2020)]\n\t0256  RZ09--0329, Gaming Laptop [Blade Pro 17 Full HD (2020)]\n\t025d  RZ03-0338, Gaming Keyboard [Ornata V2]\n\t0300  RZ06-0063 Motion Sensing Controllers [Hydra]\n\t0401  Gaming Arcade Stick [Panthera]\n\t0501  Kraken 7.1\n\t0502  Gaming Headset [Kraken USB]\n\t0504  Kraken 7.1 Chroma\n\t0506  Kraken 7.1 (Alternate Version)\n\t0510  Kraken 7.1 V2\n\t0511  RZ19-0229 Gaming Microphone\n\t0514  Electra V2 USB\n\t0517  Nommo Chroma\n\t0518  Nommo Pro\n\t051a  Nari Ultimate\n\t051c  Nari (Wireless)\n\t051d  Nari (Wired)\n\t051e  RC30-026902, Gaming Headset [Nari Essential, Wireless, Receiver]\n\t051f  RC30-026901, Gaming Headset [Nari Essential, Wired]\n\t0520  Kraken Tournament Edition\n\t0521  Kraken Kitty Edition\n\t0527  RZ04-0318 Gaming Headset [Kraken Ultimate]\n\t0904  R201-0282 Gaming Keyboard, Mouse Combination [Turret For Xbox One]\n\t0a00  Atrox Arcade Stick for Xbox One\n\t0a02  ManO'War\n\t0a03  Wildcat\n\t0a15  RZ06-0199, Gaming Controller [Wolverine Tournament Edition]\n\t0c00  RZ02-0135 Hard Gaming Mouse Mat [Firefly]\n\t0c01  Goliathus\n\t0c02  Goliathus Extended\n\t0c04  Firefly V2\n\t0e03  Gaming Webcam [Kiyo]\n\t0f03  Tiamat 7.1 V2\n\t0f07  Chroma Mug Holder\n\t0f08  Base Station Chroma\n\t0f09  Chroma HDK\n\t0f0d  Laptop Stand Chroma\n\t0f13  Lian Li O11 Dynamic Razer Edition\n\t0f1a  Core X Chroma\n\t1000  Gaming Controller [Raiju]\n\t1004  Gaming Controller [Raiju Ultimate Wired]\n\t1007  Gaming Controller [Raiju 2 Tournament Edition (USB)]\n\t1008  Gaming Flightstick [Panthera Evo]\n\t1009  Gaming Controller [Raiju 2 Ultimate Edition (BT)]\n\t100a  Gaming Controller [Raiju 2 Tournament Edition (BT)]\n\t110d  Bootloader (Alternate)\n\t800e  Bootloader\n153b  TerraTec Electronic GmbH\n\t1181  Cinergy S2 PCIe Dual Port 1\n\t1182  Cinergy S2 PCIe Dual Port 2\n1546  U-Blox AG\n\t01a4  Antaris 4\n\t01a5  [u-blox 5]\n\t01a6  [u-blox 6]\n\t01a7  [u-blox 7]\n\t01a8  [u-blox 8]\n\t1102  LISA-U2\n1547  SG Intec Ltd & Co KG\n\t1000  SG-Lock[U2]\n154a  Celectronic GmbH\n\t8180  CARD STAR/medic2\n154b  PNY\n\t000f  Flash Drive\n\t0010  USB 2.0 Flash Drive\n\t0048  Flash Drive\n\t004d  8 GB Flash Drive\n\t0053  Flash Drive\n\t0057  32GB Micro Slide Attache Flash Drive\n\t005b  Flash Drive\n\t0062  Flash Drive\n\t007a  Classic Attache Flash Drive\n\t5408  2.5in drive enclosure\n\t6000  Flash Drive\n\t6545  FD Device\n\tfa05  Flash Drive\n154d  ConnectCounty Holdings Berhad\n154e  D&M Holdings, Inc. (Denon/Marantz)\n\t3000  Marantz RC9001 Remote Control\n154f  SNBC CO., Ltd\n1554  Prolink Microsystems Corp.\n\t5010  PV-D231U(RN)-F [PixelView PlayTV SBTVD Full-Seg]\n1557  OQO\n\t0002  model 01 WiFi interface\n\t0003  model 01 Bluetooth interface\n\t0a80  Gobi Wireless Modem (QDL mode)\n\t7720  model 01+ Ethernet\n\t8150  model 01 Ethernet interface\n1568  Sunf Pu Technology Co., Ltd\n156f  Quantum Corporation\n1570  ALLTOP TECHNOLOGY CO., LTD.\n157b  Ketron SRL\n157e  TRENDnet\n\t3006  TEW-444UB EU [TRENDnet]\n\t3007  TEW-444UB EU (no firmware)\n\t300a  TEW-429UB 802.11bg\n\t300b  TEW-429UB 802.11bg\n\t300c  TEW-429UF A1 802.11bg Wireless Adapter [ZyDAS ZD1211B]\n\t300d  TEW-429UB C1 802.11bg\n\t300e  SMC SMCWUSB-N 802.11bgn 2x2:2 Wireless Adapter [Ralink RT2870]\n\t3012  TEW-604UB 802.11bg Wireless Adapter [Atheros AR5523]\n\t3013  TEW-645UB 802.11bgn 1x2:2 Wireless Adapter [Ralink RT2770]\n\t3204  Allnet ALL0298 v2 802.11bg\n\t3205  Allnet ALL0283 [AR5523]\n\t3206  Allnet ALL0283 [AR5523](no firmware)\n\t3207  TEW-509UB A1 802.11abg Wireless Adapter [ZyDAS ZD1211]\n\t3208  TEW-509UB 1.1R 802.11abg Wireless Adapter\n1582  Fiberline\n\t6003  WL-430U 802.11bg\n1587  SMA Technologie AG\n158d  Oakley Inc.\n158e  JDS Uniphase Corporation (JDSU)\n\t0820  SmartPocket Class Device\n1598  Kunshan Guoji Electronics Co., Ltd.\n15a2  Freescale Semiconductor, Inc.\n\t0038  9S08JS Bootloader\n\t003b  USB2CAN Application for ColdFire DEMOJM board\n\t0041  i.MX51 SystemOnChip in RecoveryMode\n\t0042  OSBDM - Debug Port\n\t004e  i.MX53 SystemOnChip in RecoveryMode\n\t004f  i.MX28 SystemOnChip in RecoveryMode\n\t0052  i.MX50 SystemOnChip in RecoveryMode\n\t0054  i.MX 6Dual/6Quad SystemOnChip in RecoveryMode\n\t0061  i.MX 6Solo/6DualLite SystemOnChip in RecoveryMode\n\t006a  Vybrid series SystemOnChip in RecoveryMode\n\t0076  i.MX 7Solo/7Dual SystemOnChip in RecoveryMode\n\t0080  i.MX 6ULL SystemOnChip in RecoveryMode\n15a4  Afatech Technologies, Inc.\n\t1000  AF9015/AF9035 DVB-T stick\n\t1001  AF9015/AF9035 DVB-T stick\n\t1336  SDHC/MicroSD/MMC/MS/M2/CF/XD Flash Card Reader\n\t9015  AF9015 DVB-T USB2.0 stick\n\t9016  AF9015 DVB-T USB2.0 stick\n15a8  Teams Power Limited\n15a9  Gemtek\n\t0002  SparkLAN WL-682 802.11bg Wireless Adapter [Intersil ISL3887]\n\t0004  WUBR-177G [Ralink RT2571W]\n\t0006  Wireless 11n USB Adapter\n\t0010  802.11n USB Wireless Card\n\t0012  WUBR-208N 802.11abgn Wireless Adapter [Ralink RT2870]\n\t002d  WLTUBA-107 [Yota 4G LTE]\n15aa  Gearway Electronics (Dong Guan) Co., Ltd.\n15ad  VMware Inc.\n15ba  Olimex Ltd.\n\t0003  OpenOCD JTAG\n\t0004  OpenOCD JTAG TINY\n\t002a  ARM-USB-TINY-H JTAG interface\n\t002b  ARM-USB-OCD-H JTAG+RS232\n\t003c  TERES Keyboard+Touchpad\n15c0  XL Imaging\n\t0001  2M pixel Microscope Camera\n\t0002  3M pixel Microscope Camera\n\t0003  1.3M pixel Microscope Camera (mono)\n\t0004  1.3M pixel Microscope Camera (colour)\n\t0005  3M pixel Microscope Camera (Mk 2)\n\t0006  2M pixel Microscope Camera (with capture button)\n\t0007  3M pixel Microscope Camera (with capture button)\n\t0008  1.3M pixel Microscope Camera (colour, with capture button)\n\t0009  1.3M pixel Microscope Camera (colour, with capture button)\n\t000a  2M pixel Microscope Camera (Mk 2)\n\t0010  1.3M pixel \"Tinycam\"\n\t0101  3M pixel Microscope Camera\n15c2  SoundGraph Inc.\n\t0036  LC16M VFD Display/IR Receiver\n\t0038  GD01 MX LCD Display/IR Receiver\n\t0042  Antec Veris Multimedia Station E-Z IR Receiver\n\tffda  iMON PAD Remote Controller\n\tffdc  iMON PAD Remote Controller\n15c5  Pressure Profile Systems, Inc.\n\t0008  Advance Multimedia Internet Technology Inc. (AMIT) WL532U 802.11g Adapter\n15c6  Laboratoires MXM\n\t1000  DigistimSP (cold)\n\t1001  DigistimSP (warm)\n\t1002  DigimapSP USB (cold)\n\t1003  DigimapSP USB (warm)\n\t1004  DigistimSP (cold)\n\t1005  DigistimSP (warm)\n\t1100  Odyssee (cold)\n\t1101  Odyssee (warm)\n\t1200  Digispy\n15c8  KTF Technologies\n\t3201  EVER EV-W100/EV-W250\n15c9  D-Box Technologies\n15ca  Textech International Ltd.\n\t00c3  Mini Optical Mouse\n\t0101  MIDI Interface cable\n\t1806  MIDI Interface cable\n15d5  Coulomb Electronics Ltd.\n15d9  Trust International B.V.\n\t0a33  Optical Mouse\n\t0a37  Mouse\n\t0a41  MI-2540D [Optical mouse]\n\t0a4c  USB+PS/2 Optical Mouse\n\t0a4d  Optical Mouse\n\t0a4e  AM-5400 [Optical Mouse]\n\t0a4f  Optical Mouse\n15dc  Hynix Semiconductor Inc.\n15e0  Seong Ji Industrial Co., Ltd.\n15e1  RSA\n\t2007  RSA SecurID (R) Authenticator\n15e4  Numark\n\t0024  Mixtrack\n\t003c  DJ2GO2 Touch\n\t0140  ION VCR 2 PC / Video 2 PC\n\t3f00  Power A Mini Pro Elite\n\t3f0a  Airflo Wired Controller for Xbox 360\n\t3f10  Batarang controller for Xbox 360\n15e8  SohoWare\n\t9100  NUB100 Ethernet [pegasus]\n\t9110  10/100 USB Ethernet\n15e9  Pacific Digital Corp.\n\t04ce  MemoryFrame MF-570\n\t1968  MemoryFrame MF-570\n\t1969  Digital Frame\n15ec  Belcarra Technologies Corp.\n15f4  HanfTek\n\t0001  HanfTek UMT-010 USB2.0 DVB-T (cold)\n\t0025  HanfTek UMT-010 USB2.0 DVB-T (warm)\n\t0131  Astrometa DVB-T/T2/C FM & DAB receiver [RTL2832P]\n\t0135  Astrometa T2hybrid\n1604  Tascam\n\t10c0  Dell Integrated Hub\n\t8000  US-428 Audio/Midi Controller (without fw)\n\t8001  US-428 Audio/Midi Controller\n\t8004  US-224 Audio/Midi Controller (without fw)\n\t8005  US-224 Audio/Midi Controller\n\t8006  US-122 Audio/Midi Interface (without fw)\n\t8007  US-122 Audio/Midi Interface\n1605  ACCES I/O Products, Inc.\n\t0001  DIO-32 (No Firmware Yet)\n\t0002  USB-DIO-48 (No Firmware Yet)\n\t0003  USB-DIO-96 (No Firmware Yet)\n\t0004  USB-DIO-32I (No Firmware Yet)\n\t0005  USB-DIO24 (based on -CTR6) (No Firmware Yet)\n\t0006  USB-DIO24-CTR6 (No Firmware Yet)\n1606  Umax\n\t0002  Astra 1236U Scanner\n\t0010  Astra 1220U\n\t0030  Astra 1600U/2000U\n\t0050  Scanner\n\t0060  Astra 3400/3450\n\t0070  Astra 4400/4450\n\t0130  Astra 2100U\n\t0160  Astra 5400U\n\t0170  Uniscan D50\n\t0230  Astra 2200/2200SU\n\t0350  Astra 4800/4850 Scanner\n\t1030  Astra 4000U\n\t1220  Genesys Logic Scanner Controller NT5.0\n\t2010  AstraCam Digital Camera\n\t2020  AstraCam 1000\n\t2030  AstraCam 1800 Digital Camera\n1608  Inside Out Networks [hex]\n\t0001  EdgePort/4 Serial Port\n\t0002  Edgeport/8\n\t0003  Rapidport/4\n\t0004  Edgeport/4\n\t0005  Edgeport/2\n\t0006  Edgeport/4i\n\t0007  Edgeport/2i\n\t0008  Edgeport/8\n\t000c  Edgeport/421\n\t000d  Edgeport/21\n\t000e  Edgeport/4\n\t000f  Edgeport/8\n\t0010  Edgeport/2\n\t0011  Edgeport/4\n\t0012  Edgeport/416\n\t0014  Edgeport/8i\n\t0018  Edgeport/412\n\t0019  Edgeport/412\n\t001a  Edgeport/2+2i\n\t0101  Edgeport/4\n\t0105  Edgeport/2\n\t0106  Edgeport/4i\n\t0107  Edgeport/2i\n\t010c  Edgeport/421\n\t010d  Edgeport/21\n\t0110  Edgeport/2\n\t0111  Edgeport/4\n\t0112  Edgeport/416\n\t0114  Edgeport/8i\n\t0201  Edgeport/4\n\t0203  Rapidport/4\n\t0204  Edgeport/4\n\t0205  Edgeport/2\n\t0206  Edgeport/4i\n\t0207  Edgeport/2i\n\t020c  Edgeport/421\n\t020d  Edgeport/21\n\t020e  Edgeport/4\n\t020f  Edgeport/8\n\t0210  Edgeport/2\n\t0211  Edgeport/4\n\t0212  Edgeport/416\n\t0214  Edgeport/8i\n\t0215  Edgeport/1\n\t0216  EPOS/44\n\t0217  Edgeport/42\n\t021a  Edgeport/2+2i\n\t021b  Edgeport/2c\n\t021c  Edgeport/221c\n\t021d  Edgeport/22c\n\t021e  Edgeport/21c\n\t021f  Edgeport/62\n\t0240  Edgeport/1\n\t0241  Edgeport/1i\n\t0242  Edgeport/4s\n\t0243  Edgeport/8s\n\t0244  Edgeport/8\n\t0245  Edgeport/22c\n\t0301  Watchport/P\n\t0302  Watchport/M\n\t0303  Watchport/W\n\t0304  Watchport/T\n\t0305  Watchport/H\n\t0306  Watchport/E\n\t0307  Watchport/L\n\t0308  Watchport/R\n\t0309  Watchport/A\n\t030a  Watchport/D\n\t030b  Watchport/D\n\t030c  Power Management Port\n\t030e  Power Management Port\n\t030f  Watchport/G\n\t0310  Watchport/Tc\n\t0311  Watchport/Hc\n\t1403  MultiTech Systems MT4X56 Modem\n\t1a17  Agilent Technologies (E6473)\n160a  VIA Technologies, Inc.\n\t3184  VIA VNT-6656 [WiFi 802.11b/g USB Dongle]\n160e  INRO\n\t0001  E2USBKey\n1614  Amoi Electronics\n\t0404  WMA9109 UMTS Phone\n\t0600  Vodafone VDA GPS / Toschiba Protege G710\n\t0804  WP-S1 Phone\n1617  Sony Corp.\n\t2002  NVX-P1 Personal Navigation System\n1619  L & K Precision Technology Co., Ltd.\n161c  Digitech Systems\n\t0002  DTC-02U [Digi Touch Controller]\n1621  Wionics Research\n1628  Stonestreet One, Inc.\n162a  Airgo Networks Inc.\n162f  WiQuest Communications, Inc.\n1630  2Wire, Inc.\n\t0005  802.11g Wireless Adapter [Intersil ISL3886]\n\t0011  PC Port 10 Mps Adapter\n\tff81  802.11b Wireless Adapter [Lucent/Agere Hermes I]\n1631  Good Way Technology\n\t6200  GWUSB2E\n\tc019  RT2573\n1633  AIM GmbH\n\t4510  ASC1553\n\t4520  ASC429\n\t4560  ASC-FDX\n1645  Entrega [hex]\n\t0001  1S Serial Port\n\t0002  2S Serial Port\n\t0003  1S25 Serial Port\n\t0004  4S Serial Port\n\t0005  E45 Ethernet [klsi]\n\t0006  Parallel Port\n\t0007  U1-SC25 SCSI\n\t0008  Ethernet\n\t0016  Bi-directional to Parallel Printer Converter\n\t0080  1 port to Serial Converter\n\t0081  1 port to Serial Converter\n\t0093  1S9 Serial Port\n\t8000  EZ-USB\n\t8001  1 port to Serial\n\t8002  2x Serial Port\n\t8003  1 port to Serial\n\t8004  2U4S serial/usb hub\n\t8005  Ethernet\n\t8080  1 port to Serial\n\t8081  1 port to Serial\n\t8093  PortGear Serial Port\n1649  SofTec Microsystems\n\t0102  uDART In-Circuit Debugger\n\t0200  SpYder USBSPYDER08\n164a  ChipX\n164c  Matrix Vision GmbH\n\t0101  mvBlueFOX camera (no firmware)\n\t0103  mvBlueFOX camera\n\t0201  mvBlueLYNX-X intelligent camera (bootloader)\n\t0203  mvBlueLYNX-X intelligent camera\n1657  Struck Innovative Systeme GmbH\n\t3150  SIS3150 USB2.0 to VME interface\n165b  Frontier Design Group\n\t8101  Tranzport Control Surface\n\tfad1  Alphatrack Control Surface\n165c  Kondo Kagaku\n\t0002  Serial Adapter\n\t0006  FT232 [ICS adapter HS]\n\t0008  FT232 [Dual adapter HS]\n1660  Creatix Polymedia GmbH\n1667  GIGA-TMS INC.\n\t0005  PCR330A RFID Reader (125 kHz, keyboard emulation)\n1668  Actiontec Electronics, Inc. [hex]\n\t0009  Gateway\n\t0333  Modem\n\t0358  InternetPhoneWizard\n\t0405  Gateway\n\t0408  Prism2.5 802.11b Adapter\n\t0413  Gateway\n\t0421  Prism2.5 802.11b Adapter\n\t0441  IBM Integrated Bluetooth II\n\t0500  BTM200B BlueTooth Adapter\n\t1050  802UIG-1 802.11g Wireless Mini Adapter [Intersil ISL3887]\n\t1200  802AIN Wireless N Network Adapter [Atheros AR9170+AR9101]\n\t1441  IBM Integrated Bluetooth II\n\t2441  BMDC-2 IBM Bluetooth III w.56k\n\t3441  IBM Integrated Bluetooth III\n\t6010  Gateway\n\t6097  802.11b Wireless Adapter\n\t6106  802UI3(B) 802.11b Wireless Adapter [Intersil PRISM 3]\n\t7605  UAT1 Wireless Ethernet Adapter\n1669  PiKRON Ltd. [hex]\n\t1001  uLan2USB Converter - PS1 protocol\n166a  Clipsal\n\t0101  C-Bus Multi-room Audio Matrix Switcher\n\t0201  C-Bus Pascal Automation Controller\n\t0301  C-Bus Wireless PC Interface\n\t0303  C-Bus interface\n\t0304  C-Bus Black and White Touchscreen\n\t0305  C-Bus Spectrum Colour Touchscreen\n\t0401  C-Bus Architectural Dimmer\n1677  China Huada Integrated Circuit Design (Group) Co., Ltd. (CIDC Group)\n\t0103  Token\n1679  Total Phase\n\t2001  Beagle Protocol Analyzer\n\t2002  Cheetah SPI Host Adapter\n167b  Pure Digital Technologies, Inc.\n\t2009  Flip Ultra U1120\n1680  Golden Bridge Electech Inc.\n\ta332  DVB-T Dongle [RTL2832U]\n1681  Prevo Technologies, Inc.\n\t0001  Tuner's Dashboard\n\t0002  DocuBrain(R) Tubachron\n\t0003  DocuBrain(R) I2C\n\t0004  DocuBrain(R) WWVB Receiver\n\t0005  DocuBrain(R) WWVB Transmitter\n1682  Maxwise Production Enterprise Ltd.\n1684  Godspeed Computer Corp.\n1685  Delock\n\t0200  Infrared adapter\n1686  ZOOM Corporation\n\t0045  Handy Recorder stereo mix\n\t01c0  Zoom Handy Recorder card reader\n\t01c5  Zoom Handy Recorder multi track\n\t03d5  LiveTrak L-12\n1687  Kingmax Digital Inc.\n\t5289  FlashDisk\n\t6211  FlashDisk\n\t6213  FlashDisk\n1688  Saab AB\n1689  Razer USA, Ltd\n\tfd00  Onza Tournament Edition controller\n\tfd01  Onza Classic Edition\n\tfe00  Sabertooth Elite\n168c  Atheros Communications\n\t0001  AR5523\n\t0002  AR5523 (no firmware)\n1690  Askey Computer Corp. [hex]\n\t0001  Arcaze Gamepad\n\t0101  Creative Modem Blaster DE5670\n\t0102  V1456 VQE-R2 Modem [conexant]\n\t0103  1456 VQE-R3 Modem [conexant]\n\t0104  HCF V90 Data Fax RTAD Modem\n\t0107  HCF V.90 Data,Fax,RTAD Modem\n\t0109  MagicXpress V.90 Pocket Modem [conexant]\n\t0203  Voyager ADSL Modem Loader\n\t0204  Voyager ADSL Modem\n\t0205  DSL Modem\n\t0206  GlobeSpan ADSL WAN Modem\n\t0208  DSL Modem\n\t0209  Voyager 100 ADSL Modem\n\t0211  Globespan Virata ADSL LAN Modem\n\t0212  DSL Modem\n\t0213  HM121d DSL Modem\n\t0214  HM121d DSL Modem\n\t0215  Voyager 105 ADSL Modem\n\t0701  WLAN\n\t0710  SMCWUSBT-G\n\t0711  SMCWUSBT-G (no firmware)\n\t0712  AR5523\n\t0713  AR5523 (no firmware)\n\t0715  Name: Voyager 1055 Laptop 802.11g Adapter [Broadcom 4320]\n\t0722  RT2573\n\t0726  Wi-Fi Wireless LAN Adapter\n\t0740  802.11n Wireless LAN Card\n\t0901  Voyager 205 ADSL Router\n\t2000  naturaSign Pad Standard\n\t2001  naturaSign Pad Standard\n\tfe12  Bootloader\n1696  Hitachi Video and Information System, Inc.\n1697  VTec Test, Inc.\n16a5  Shenzhen Zhengerya Cable Co., Ltd.\n16a6  Unigraf\n\t3000  VTG-3xxx Video Test Generator family\n\t4000  VTG-4xxx Video Test Generator family\n\t5000  VTG-5xxx Video Test Generator family\n\t5001  VTG-5xxx Special (update) mode of VTG-5xxx family\n16ab  Global Sun Technology\n\t7801  AR5523\n\t7802  AR5523 (no firmware)\n\t7811  AR5523\n\t7812  AR5523 (no firmware)\n16ac  Dongguan ChingLung Wire & Cable Co., Ltd.\n16b4  iStation\n\t0801  U43\n16b5  Persentec, Inc.\n\t0002  Otto driving companion\n16c0  Van Ooijen Technische Informatica\n\t03e8  free for internal lab use 1000\n\t03e9  free for internal lab use 1001\n\t03ea  free for internal lab use 1002\n\t03eb  free for internal lab use 1003\n\t03ec  free for internal lab use 1004\n\t03ed  free for internal lab use 1005\n\t03ee  free for internal lab use 1006\n\t03ef  free for internal lab use 1007\n\t03f0  free for internal lab use 1008\n\t03f1  free for internal lab use 1009\n\t0477  Teensy Rebootor\n\t0478  Teensy Halfkay Bootloader\n\t0479  Teensy Debug\n\t047a  Teensy Serial\n\t047b  Teensy Serial+Debug\n\t047c  Teensy Keyboard\n\t047d  Teensy Keyboard+Debug\n\t047e  Teensy Mouse\n\t047f  Teensy Mouse+Debug\n\t0480  Teensy RawHID\n\t0481  Teensy RawHID+Debug\n\t0482  Teensyduino Keyboard+Mouse+Joystick\n\t0483  Teensyduino Serial\n\t0484  Teensyduino Disk\n\t0485  Teensyduino MIDI\n\t0486  Teensyduino RawHID\n\t0487  Teensyduino Serial+Keyboard+Mouse+Joystick\n\t0488  Teensyduino Flight Sim Controls\n\t05b5  BU0836\n\t05dc  shared ID for use with libusb\n\t05dd  BlackcatUSB2\n\t05de  Flashcat\n\t05df  HID device except mice, keyboards, and joysticks\n\t05e1  Free shared USB VID/PID pair for CDC devices\n\t05e4  Free shared USB VID/PID pair for MIDI devices\n\t06b4  USB2LPT with 2 interfaces\n\t06b5  USB2LPT with 3 interfaces (native, HID, printer)\n\t074e  DSP-Weuffen USB-HPI-Programmer\n\t074f  DSP-Weuffen USB2-HPI-Programmer\n\t0762  Osmocom SIMtrace\n\t076b  OpenPCD 13.56MHz RFID Reader\n\t076c  OpenPICC 13.56MHz RFID Simulator (native)\n\t08ac  OpenBeacon USB stick\n\t08ca  Alpermann+Velte Universal Display\n\t08cb  Alpermann+Velte Studio Clock\n\t08cc  Alpermann+Velte SAM7S MT Boot Loader\n\t08cd  Alpermann+Velte SAM7X MT Boot Loader\n\t09ce  LINKUSB\n\t0a32  jbmedia Light-Manager Pro\n\t27d8  libusb-bound devices\n\t27d9  HID device except mice, keyboards, and joysticks\n\t27da  Mouse\n\t27db  Keyboard\n\t27dc  Joystick\n\t27dd  CDC-ACM class devices (modems)\n\t27de  MIDI class devices\n\t294a  Eye Movement Recorder [Visagraph]\n\t294b  Eye Movement Recorder [ReadAlyzer]\n16ca  Wireless Cables, Inc.\n\t1502  Bluetooth Dongle\n16cc  silex technology, Inc.\n16d0  MCS\n\t0436  Xylanta Ltd, XSP Device\n\t0498  Braintechnology USB-LPS\n\t0504  RETRO Innovations ZoomFloppy\n\t054b  GrauTec ReelBox OLED Display (external)\n\t05be  EasyLogic Board\n\t05f0  Superior Freedom Programmable IR Remote\n\t06cc  Trinamic TMCM-3110\n\t06f0  Axium AX-R4C Controller\n\t06f1  Axium AX-R1D Controller\n\t06f9  Gabotronics Xminilab\n\t0726  Autonomic M400 Amplifier\n\t0727  Autonomic M800 Amplifier\n\t0753  Digistump DigiSpark\n\t075c  AB-1.x UAC1 [Audio Widget]\n\t075d  AB-1.x UAC2 [Audio Widget]\n\t07cc  Xylanta Ltd, Saint3 Device\n\t07f8  Axium AX-R4D Controller\n\t080a  S2E1 Interface\n\t0830  DMXControl Projects e.V., Nodle U1\n\t0831  DMXControl Projects e.V., Desklamp\n\t0832  DMXControl Projects e.V., Nodle U2\n\t0833  DMXControl Projects e.V., Nodle R4S\n\t0870  Kaufmann Automotive GmbH, RKS+CAN Interface\n\t09f2  Axium AX-1250 Amplifier\n\t09f4  Axium AX-Mini4 Amplifier\n\t0b03  AIS Receiver [dAISy]\n\t0b7d  Autonomic M801 Amplifier\n\t0b7e  Autonomic M401 Amplifier\n\t0b7f  Autonomic M120e Amplifier\n\t0bd4  codesrc SCSI2SD\n\t0c9b  Fermium LABS srl/LabTrek srl Hall Effect Apparatus\n\t0d3c  InputStick BT4.0\n\t0e1e  AtomMiner\n16d1  Suprema Inc.\n\t0401  SUP-SFR400(A) BioMini Fingerprint Reader\n16d3  Frontline Test Equipment, Inc.\n16d5  AnyDATA Corporation\n\t6202  CDMA/UMTS/GPRS modem\n\t6501  CDMA 2000 1xRTT/EV-DO Modem\n\t6502  CDMA/UMTS/GPRS modem\n\t6603  ADU-890WH modem\n16d6  JABLOCOM s.r.o.\n\t8000  GDP-04 desktop phone\n\t8001  EYE-02\n\t8003  GDP-04 modem\n\t8004  Bootloader\n\t8005  GDP-04i\n\t8007  BTP-06 modem\n16d8  CMOTECH Co., Ltd.\n\t5141  CMOTECH CDMA Technologies modem\n\t5533  CCU-550 CDMA EV-DO modem\n\t5543  CDMA 2000 1xRTT/1xEVDO modem\n\t6280  CMOTECH CDMA Technologies modem\n\t6803  CNU-680 CDMA EV-DO modem\n\t8001  Gobi 2000 Wireless Modem (QDL mode)\n\t8002  Gobi 2000 Wireless Modem\n16dc  Wiener, Plein & Baus\n\t0001  CC\n\t000b  VM\n\t0010  PL512 Power Supply System\n\t0011  MARATON Power Supply System\n\t0012  MPOD Multi Channel Power Supply System\n\t0015  CML Control, Measurement and Data Logging System\n16de  Telemecanique\n16df  King Billion Electronics Co., Ltd.\n16f0  GN Hearing A/S\n\t0001  Speedlink Programming Interface\n\t0003  Airlink Wireless Programming Interface\n\t0004  Accessory Programming Interface\n16f5  Futurelogic Inc.\n1702  FDI-MATELEC\n\t0002  Encodeur\n1706  BlueView Technologies, Inc.\n1707  ARTIMI\n170b  Swissonic\n\t0011  MIDI-USB 1x1\n170d  Avnera\n1711  Leica Microsystems\n\t0101  DFC-365FX camera\n\t3020  IC80 HD Camera\n1724  Meyer Instruments (MIS)\n\t0115  PAXcam5\n1725  Vitesse Semiconductor\n1726  Axesstel, Inc.\n\t1000  wireless modem\n\t2000  wireless modem\n\t3000  wireless modem\n172f  Waltop International Corp.\n\t0022  Tablet\n\t0024  Tablet\n\t0025  Tablet\n\t0026  Tablet\n\t0031  Slim Tablet 12.1\"\n\t0032  Slim Tablet 5.8\"\n\t0034  Slim Tablet 12.1\"\n\t0038  Genius G-Pen F509\n\t0500  Media Tablet 14.1\"\n\t0501  Media Tablet 10.6\"\n\t0502  Sirius Battery Free Tablet\n1733  Cellink Technology Co., Ltd\n\t0101  RF Wireless Optical Mouse OP-701\n1736  CANON IMAGING SYSTEM TECHNOLOGIES INC.\n1737  802.11g Adapter [Linksys WUSB54GC v3]\n\t0039  USB1000 Gigabit Notebook Adapter\n\t0070  WUSB100 v1 RangePlus Wireless Network Adapter [Ralink RT2870]\n\t0071  WUSB600N v1 Dual-Band Wireless-N Network Adapter [Ralink RT2870]\n\t0073  WUSB54GC v2 802.11g Adapter [Realtek RTL8187B]\n\t0075  WUSB54GSC v2 802.11g Adapter [Broadcom 4326U]\n\t0077  WUSB54GC v3 802.11g Adapter [Ralink RT2070L]\n\t0078  WUSB100 v2 RangePlus Wireless Network Adapter [Ralink RT3070]\n\t0079  WUSB600N v2 Dual-Band Wireless-N Network Adapter [Ralink RT3572]\n173a  Roche\n\t2198  Accu-Chek Mobile\n\t21ca  ACCU-CHEK Mobile Model U1\n173d  QSENN\n\t0002  GP-K7000 keyboard\n1740  Senao\n\t0100  EUB1200AC AC1200 DB Wireless Adapter [Realtek RTL8812AU]\n\t0600  EUB600v1 802.11abgn Wireless Adapter [Ralink RT3572]\n\t0605  LevelOne WUA-0605 N_Max Wireless USB Adapter\n\t0615  LevelOne WUA-0615 N_Max Wireless USB Adapter\n\t1000  NUB-350 802.11g Wireless Adapter [Intersil ISL3887]\n\t2000  NUB-8301 802.11bg\n\t3701  EUB-3701 EXT 802.11g Wireless Adapter [Ralink RT2571W]\n\t9603  RTL8188S WLAN Adapter\n\t9701  EnGenius 802.11n Wireless USB Adapter\n\t9702  EnGenius 802.11n Wireless USB Adapter\n\t9703  EnGenius 802.11n Wireless USB Adapter\n\t9705  EnGenius 802.11n Wireless USB Adapter\n\t9706  EUB9706 802.11n Wireless Adapter [Ralink RT3072]\n\t9801  EUB9801 802.11abgn Wireless Adapter [Ralink RT3572]\n1743  General Atomics\n1748  MQP Electronics\n\t0101  Packet-Master USB12\n174c  ASMedia Technology Inc.\n\t07d1  Transcend ESD400 Portable SSD (USB 3.0)\n\t1151  ASM1151W\n\t1153  ASM1153 SATA 3Gb/s bridge\n\t2074  ASM1074 High-Speed hub\n\t3074  ASM1074 SuperSpeed hub\n\t5106  ASM1051 SATA 3Gb/s bridge\n\t5136  ASM1053 SATA 3Gb/s bridge\n\t51d6  ASM1051W SATA 3Gb/s bridge\n\t55aa  ASM1051E SATA 6Gb/s bridge, ASM1053E SATA 6Gb/s bridge, ASM1153 SATA 3Gb/s bridge, ASM1153E SATA 6Gb/s bridge\n174f  Syntek\n\t1105  SM-MS/Pro-MMC-XD Card Reader\n\t110b  HP Webcam\n\t1122  HP Webcam\n\t1169  Lenovo EasyCamera\n\t1403  Integrated Webcam\n\t1404  USB Camera device, 1.3 MPixel Web Cam\n\t1758  XYZ printing cameraR2\n\t1759  XYZ printing cameraL2\n\t5212  USB 2.0 UVC PC Camera\n\t5a11  PC Camera\n\t5a31  Sonix USB 2.0 Camera\n\t5a35  Sonix 1.3MPixel USB 2.0 Camera\n\t6a31  Web Cam - Asus A8J, F3S, F5R, VX2S, V1S\n\t6a33  Web Cam - Asus F3SA, F9J, F9S\n\t6a51  2.0MPixel Web Cam - Asus Z96J, Z96S, S96S\n\t6a54  Web Cam\n\t6d51  2.0Mpixel Web Cam - Eurocom D900C\n\t8a12  Syntek 0.3MPixel USB 2.0 UVC PC Camera\n\t8a33  Syntek USB 2.0 UVC PC Camera\n\ta311  1.3MPixel Web Cam - Asus A3A, A6J, A6K, A6M, A6R, A6T, A6V, A7T, A7sv, A7U\n\ta312  1.3MPixel Web Cam\n\ta821  Web Cam - Packard Bell BU45, PB Easynote MX66-208W\n\taa11  Web Cam\n1753  GERTEC Telecomunicacoes Ltda.\n\tc901  PPC900 Pinpad Terminal\n1756  ENENSYS Technologies\n\t0006  DiviPitch\n1759  LucidPort Technology, Inc.\n1761  ASUSTek Computer, Inc. (wrong ID)\n\t0b05  802.11n Network Adapter (wrong ID - swapped vendor and device)\n1770  MSI\n\tff00  steel series rgb keyboard\n1772  System Level Solutions, Inc.\n1776  Arowana\n\t501c  300K CMOS Camera\n1777  Microscan Systems, Inc.\n\t0003  MicroHAWK ID-20\n177f  Sweex\n\t0004  MM004V5 Photo Key Chain (Digital Photo Frame) 1.5\"\n\t0153  LW153 802.11n Adapter [ralink rt3070]\n\t0154  LW154 802.11bgn (1x1:1) Wireless Adapter [Realtek RTL8188SU]\n\t0313  LW313 802.11n Adapter [ralink rt2770 + rt2720]\n1781  Multiple Vendors\n\t07df  Axium AX-800DAV Amplifier\n\t07e1  Axium AX-KPC Keypad\n\t07e2  Axium AX-KPD Keypad\n\t07e3  Axium AX-400DA Amplifier\n\t083e  MetaGeek Wi-Spy\n\t083f  MetaGeek Wi-Spy 2.4x\n\t0938  Iguanaworks USB IR Transceiver\n\t0941  qNimble Quark\n\t0a96  raphnet.net usb_game12\n\t0a97  raphnet.net SNES mouse adapter\n\t0a98  raphnet.net USBTenki\n\t0a99  raphnet.net NES\n\t0a9a  raphnet.net Gamecube/N64 controller\n\t0a9b  raphnet.net DB9Joy\n\t0a9c  raphnet.net Intellivision\n\t0a9d  raphnet.net 4nes4snes\n\t0a9e  raphnet.net Megadrive multitap\n\t0a9f  raphnet.net MultiDB9joy\n\t0bad  Mantracourt Load Cell\n\t0c30  Telldus TellStick\n\t0c31  Telldus TellStick Duo\n\t0c9f  USBtiny\n\t1eef  OpenAPC SecuKey\n\t1ef0  E1701 Modular Controller Card\n\t1ef1  E1701 Modular Controller Card\n\t1ef2  E1803 Compact Controller Card\n1782  Spreadtrum Communications Inc.\n\t3d00  F200n mobile phone\n1784  TopSeed Technology Corp.\n\t0001  eHome Infrared Transceiver\n\t0004  RF Combo Device\n\t0006  eHome Infrared Transceiver\n\t0007  eHome Infrared Transceiver\n\t0008  eHome Infrared Transceiver\n\t000a  eHome Infrared Transceiver\n\t0011  eHome Infrared Transceiver\n1787  ATI AIB\n1788  ShenZhen Litkconn Technology Co., Ltd.\n178e  ASUSTek Computer, Inc. (wrong ID)\n\t0b05  CrossLink cable 2GB (wrong ID - swapped vendor and device)\n1796  Printrex, Inc.\n1797  JALCO CO., LTD.\n1799  Thales Norway A/S\n\t7051  Belkin F5D7051 802.11g Adapter v1000 [Broadcom 4320]\n\t8051  Belkin F5D8051 v2 802.11bgn Wireless Adapter [Marvell 88W8362]\n179d  Ricavision International, Inc.\n\t0010  Internal Infrared Transceiver\n17a0  Samson Technologies Corp.\n\t0001  C01U condenser microphone\n\t0002  Q1U dynamic microphone\n\t0100  C03U multi-pattern microphone\n\t0101  UB1 boundary microphone\n\t0120  Meteorite condenser microphone\n\t0130  Go Mic Direct\n\t0132  Go Mic Mobile wireless receiver\n\t0200  StudioDock monitors (internal hub)\n\t0201  StudioDock monitors (audio)\n\t0210  StudioGT monitors\n\t0211  StudioGT monitors [CM6400]\n\t0240  Go Mic Connect\n\t0241  G-Track Pro microphone\n\t0301  Q2U handheld microphone with XLR\n\t0302  GoMic compact condenser microphone\n\t0303  C01U Pro condenser microphone\n\t0304  Q2U handheld mic with XLR\n\t0305  GoMic compact condenser mic\n\t0310  Meteor condenser microphone\n\t0311  Satellite condenser microphone\n\t1616  RXD1 wireless receiver\n\tb241  G-Track Pro firmware update\n\tb311  Satellite firmware update\n17a4  Concept2\n\t0001  Performance Monitor 3\n\t0002  Performance Monitor 4\n17a5  Advanced Connection Technology Inc.\n17a7  MICOMSOFT CO., LTD.\n17a8  Kamstrup A/S\n\t0001  Optical Eye/3-wire\n\t0005  M-Bus Master MultiPort 250D\n\t0010  444MHz Radio Mesh Frontend\n\t0011  444MHz RF sniffer\n\t0012  870MHz Radio Mesh Frontend\n\t0013  870MHz RF sniffer\n17b3  Grey Innovation\n\t0004  Linux-USB Midi Gadget\n17b5  Lunatone\n\t0010  MFT Sensor\n17ba  SAURIS GmbH\n\t0001  SAU510-USB [no firmware]\n\t0510  SAU510-USB and SAU510-USB plus JTAG Emulators\n\t0511  SAU510-USB Iso Plus JTAG Emulator\n\t0520  SAU510-USB Nano JTAG Emulator\n\t1511  Onboard Emulator on SAUModule development kit\n17c3  Singim International Corp.\n17cc  Native Instruments\n\t041c  Audio 2 DJ\n\t041d  Traktor Audio 2\n\t0808  Maschine Controller\n\t0815  Audio Kontrol 1\n\t0839  Audio 4 DJ\n\t0d8d  Guitarrig Mobile\n\t1001  Komplete Audio 6\n\t1110  Maschine Mikro\n\t1915  Session I/O\n\t1940  RigKontrol3\n\t1969  RigKontrol2\n\t1978  Audio 8 DJ\n\t2280  Medion MDPNA1500 in card reader mode\n\t2305  Traktor Kontrol X1\n\t4711  Kore Controller\n\t4712  Kore Controller 2\n\tbaff  Traktor Kontrol S4\n17cf  Hip Hing Cable & Plug Mfy. Ltd.\n17d0  Sanford L.P.\n17d3  Korea Techtron Co., Ltd.\n17e9  DisplayLink\n\t0051  USB VGA Adaptor\n\t0198  DisplayLink\n\t019e  Overfly FY-1016A\n\t028f  HIS Multi-View II\n\t030b  HP T100\n\t0377  Plugable UD-160-A (M)\n\t0378  Plugable UGA-2K-A\n\t0379  Plugable UGA-125\n\t037a  Plugable UGA-165\n\t037b  Plugable USB-VGA-165\n\t037c  Plugable DC-125\n\t037d  Plugable USB2-HDMI-165\n\t410a  HDMI Adapter\n\t430a  HP Port Replicator (Composite Device)\n\t430f  Kensington Dock (Composite Device)\n\t4312  S2340T\n\t436e  Dell D3100 Docking Station\n\tff10  I1659FWUX {AOC Powered Monitor]\n17eb  Cornice, Inc.\n17ef  Lenovo\n\t1000  ThinkPad X6 UltraBase\n\t1003  Integrated Smart Card Reader\n\t1004  Integrated Webcam\n\t1005  ThinkPad X200 Ultrabase (42X4963 )\n\t1008  Hub\n\t100a  ThinkPad Mini Dock Plus Series 3\n\t100f  ThinkPad Ultra Dock Hub\n\t1010  ThinkPad Ultra Dock Hub\n\t1020  ThinkPad Dock Hub\n\t1021  ThinkPad Dock Hub [Cypress HX2VL]\n\t3049  ThinkPad OneLink integrated audio\n\t304b  AX88179 Gigabit Ethernet [ThinkPad OneLink GigaLAN]\n\t304f  RTL8153 Gigabit Ethernet [ThinkPad OneLink Pro Dock]\n\t3060  ThinkPad Dock\n\t3062  ThinkPad Dock Ethernet [Realtek RTL8153B]\n\t3063  ThinkPad Dock Audio\n\t3066  ThinkPad Thunderbolt 3 Dock MCU\n\t3069  ThinkPad TBT3 LAN\n\t306a  ThinkPad Thunderbolt 3 Dock Audio\n\t3815  ChipsBnk 2GB USB Stick\n\t4802  Vc0323+MI1310_SOC Camera\n\t4807  UVC Camera\n\t480c  Integrated Webcam\n\t480d  Integrated Webcam [R5U877]\n\t480e  Integrated Webcam [R5U877]\n\t480f  Integrated Webcam [R5U877]\n\t4810  Integrated Webcam [R5U877]\n\t4811  Integrated Webcam [R5U877]\n\t4812  Integrated Webcam [R5U877]\n\t4813  Integrated Webcam [R5U877]\n\t4814  Integrated Webcam [R5U877]\n\t4815  Integrated Webcam [R5U877]\n\t4816  Integrated Webcam\n\t481c  Integrated Webcam\n\t481d  Integrated Webcam\n\t6004  ISD-V4 Tablet Pen\n\t6007  Smartcard Keyboard\n\t6009  ThinkPad Keyboard with TrackPoint\n\t600e  Optical Mouse\n\t6014  Mini Wireless Keyboard N5901\n\t6019  M-U0025-O Mouse\n\t6022  Ultraslim Plus Wireless Keyboard and Mouse\n\t6025  ThinkPad Travel Mouse\n\t602d  Black Silk Keyboard\n\t6032  Wireless Dongle for Keyboard and Mouse\n\t6044  ThinkPad Laser Mouse\n\t6047  ThinkPad Compact Keyboard with TrackPoint\n\t604b  Precision Wireless Mouse\n\t608d  Optical Mouse\n\t609b  Professional Wireless Keyboard and Mouse Combo\n\t609c  Professional Wireless Keyboard\n\t7203  Ethernet adapter [U2L 100P-Y1]\n\t7205  Thinkpad LAN\n\t7217  VGA adapter\n\t7423  IdeaPad A1 Tablet\n\t7435  A789 (Mass Storage mode, with debug)\n\t743a  A789 (Mass Storage mode)\n\t7497  A789 (MTP mode)\n\t7498  A789 (MTP mode, with debug)\n\t749a  A789 (PTP mode)\n\t749b  A789 (PTP mode, with debug)\n\t7604  A760 (Mass Storage mode)\n\t7605  A760 (Mass Storage mode, with debug)\n\t760a  A760 (MTP mode)\n\t760b  A760 (MTP mode, with debug)\n\t760c  A760 (PTP mode)\n\t760d  A760 (PTP mode, with debug)\n\t76fc  B8000-H (Yoga Tablet 10) (mass storage)\n\t76fd  B8000-H (Yoga Tablet 10) (debug , mass storage)\n\t76fe  B8000-H (Yoga Tablet 10) (MTP)\n\t76ff  B8000-H (Yoga Tablet 10) (debug , MTP)\n\t7702  B8000-H (Yoga Tablet 10) (PTP)\n\t7703  B8000-H (Yoga Tablet 10) (debug , PTP)\n\t7704  B8000-H (Yoga Tablet 10) (USB tether)\n\t7705  B8000-H (Yoga Tablet 10) (debug , USB tether)\n\t7706  B8000-H (Yoga Tablet 10) (zerocd)\n\t7707  B8000-H (Yoga Tablet 10) (debug , zerocd)\n\t785f  TAB 2 A7-10 Tablet\n\tb000  Virtual Keyboard and Mouse\n\tb001  Ethernet\n\tb003  Virtual Keyboard and Mouse / Mass Storage\n\tf003  MEDION LIFETAB X10605 MTP mode\n17f4  WaveSense\n\taaaa  Jazz Blood Glucose Meter\n17f5  K.K. Rocky\n17f6  Unicomp, Inc.\n\t0709  Model M Keyboard\n\t0822  Ruffian 6 Keyboard v3 [Model M]\n1809  Advantech\n\t4604  USB-4604\n\t4761  USB-4761 Portable Data Acquisition Module\n1822  Twinhan\n\t3201  VisionDTV USB-Ter/HAMA USB DVB-T device cold\n\t3202  VisionDTV USB-Ter/HAMA USB DVB-T device warm\n1831  Gwo Jinn Industries Co., Ltd.\n1832  Huizhou Shenghua Industrial Co., Ltd.\n183d  VIVOphone\n\t0010  VoiceKey\n1843  Vaisala\n1849  ASRock Incorporation\n184f  K2L GmbH\n\t0012  MOCCA compact\n1852  GYROCOM C&C Co., LTD\n\t7022  Fiio E10\n\t7921  Audiotrak ProDigy CUBE\n\t7922  Audiotrak DR.DAC2 DX [GYROCOM C&C]\n1854  Memory Devices Ltd.\n185b  Compro\n\t3020  K100 Infrared Receiver\n\t3082  K100 Infrared Receiver v2\n\td000  Compro Videomate DVB-U2000 - DVB-T USB cold\n\td001  Compro Videomate DVB-U2000 - DVB-T USB warm\n1861  Tech Technology Industrial Company\n1862  Teridian Semiconductor Corp.\n1870  Nexio Co., Ltd\n\t0001  iNexio Touchscreen controller\n1871  Aveo Technology Corp.\n\t0101  UVC camera (Bresser microscope)\n\t0141  Camera\n\t0d01  USB2.0 Camera\n1873  Navilock\n\tee93  EasyLogger\n187c  Alienware Corporation\n\t0511  AlienFX Mobile lighting\n\t0513  Gaming Desktop [Aurora R4]\n\t0550  LED controller\n\t0600  Dual Compatible Game Pad\n187f  Siano Mobile Silicon\n\t0010  Stallar Board\n\t0100  Stallar Board\n\t0200  Nova A\n\t0201  Nova B\n\t0202  Nice\n\t0300  Vega\n\t0301  VeNice\n1892  Vast Technologies, Inc.\n1894  Topseed\n\t5632  Atek Tote Remote\n\t5641  TSAM-004 Presentation Remote\n1897  Evertop Wire Cable Co.\n189f  3Shape A/S\n\t0002  Legato2 3D Scanner\n18a4  CSSN\n\t0001  Snapshell IDR\n18a5  Verbatim, Ltd\n\t0214  Portable Hard Drive\n\t0216  External Hard Drive\n\t0218  External Hard Drive\n\t0224  Store 'n' Go Micro Plus\n\t0227  Pocket Hard Drive\n\t022b  Portable Hard Drive (Store'n'Go)\n\t0237  Portable Harddrive\n\t0243  Flash Drive (Store'n'Go)\n\t0245  Store'n'Stay\n\t0302  Flash Drive\n\t0304  Store 'n' Go\n\t0408  Store 'n' Go\n\t4123  Store N Go\n18b1  Petalynx\n\t0037  Maxter Remote Control\n18b4  e3C Technologies\n\t1001  DUTV007\n\t1002  EC168 (v5) based USB DVB-T receiver\n\t1689  DUTV009\n\tfffa  EC168 (v2) based USB DVB-T receiver\n\tfffb  EC168 (v3) based USB DVB-T receiver\n18b6  Mikkon Technology Limited\n18b7  Zotek Electronic Co., Ltd.\n18c5  AMIT Technology, Inc.\n\t0002  CG-WLUSB2GO\n\t0008  CG-WLUSB2GNR Corega Wireless USB Adapter\n\t0012  CG-WLUSB10 Corega Wireless USB Adapter\n18cd  Ecamm\n\tcafe  Pico iMage\n18d1  Google Inc.\n\t0001  Onda V972 (storage access)\n\t0003  Android-powered device using AllWinner Technology SoC\n\t0006  Onda V972 MTP\n\t0008  Onda V972 PTP (camera)\n\t0d02  Celkon A88\n\t2d00  Android Open Accessory device (accessory)\n\t2d01  Android Open Accessory device (accessory + ADB)\n\t2d02  Android Open Accessory device (audio)\n\t2d03  Android Open Accessory device (audio + ADB)\n\t2d04  Android Open Accessory device (accessory + audio)\n\t2d05  Android Open Accessory device (accessory + audio + ADB)\n\t4e11  Nexus One\n\t4e12  Nexus One (debug)\n\t4e13  Nexus One (tether)\n\t4e20  Nexus S (fastboot)\n\t4e21  Nexus S\n\t4e22  Nexus S (debug)\n\t4e24  Nexus S (tether)\n\t4e30  Galaxy Nexus (fastboot)\n\t4e40  Nexus 7 (fastboot)\n\t4e41  Nexus 7 (MTP)\n\t4e42  Nexus 7 (debug)\n\t4e43  Nexus 7 (PTP)\n\t4e44  Nexus 7 2012 (PTP)\n\t4ee0  Nexus/Pixel Device (fastboot)\n\t4ee1  Nexus/Pixel Device (MTP)\n\t4ee2  Nexus/Pixel Device (MTP + debug)\n\t4ee3  Nexus/Pixel Device (tether)\n\t4ee4  Nexus/Pixel Device (tether+ debug)\n\t4ee5  Nexus/Pixel Device (PTP)\n\t4ee6  Nexus/Pixel Device (PTP + debug)\n\t4ee7  Nexus/Pixel Device (charging + debug)\n\t4ee8  Nexus/Pixel Device (MIDI)\n\t4ee9  Nexus/Pixel Device (MIDI + debug)\n\t5033  Pixel earbuds\n\t7102  Toshiba Thrive tablet\n\tb004  Pandigital / B&N Novel 9\" tablet\n\td001  Nexus 4 (fastboot)\n\td002  Nexus 4 (debug)\n\td00d  Xiaomi Mi/Redmi 2 (fastboot)\n\td109  LG G2x MTP\n\td10a  LG G2x MTP (debug)\n18d5  Starline International Group Limited\n18d9  Kaba\n\t01a0  B-Net 91 07\n18dc  LKC Technologies, Inc.\n18dd  Planon System Solutions Inc.\n\t1000  DocuPen RC800\n18e3  Fitipower Integrated Technology Inc\n\t7102  Multi Card Reader (Internal)\n\t9101  All-in-1 Card Reader\n\t9102  Multi Card Reader\n\t9512  Webcam\n18e8  Qcom\n\t6144  LR802UA 802.11b Wireless Adapter [ALi M4301AU]\n\t6196  RT2573\n\t6229  RT2573\n\t6232  Wireless 802.11g 54Mbps Network Adapter [RTL8187]\n18ea  Matrox Graphics, Inc.\n\t0002  DualHead2Go [Analog Edition]\n\t0004  TripleHead2Go [Digital Edition]\n18ec  Arkmicro Technologies Inc.\n\t3118  USB to IrDA adapter [ARK3116T]\n\t3188  ARK3188 UVC Webcam\n\t3299  Webcam Carrefour\n\t3366  Bresser Biolux NV\n\t5850  CVBS / S-Video Capture Device [UVC]\n18ef  ELV Elektronik AG\n\te014  FS20PCE\n\te015  FS20PCS\n\te01a  Bedien-Anzeige-Terminal\n18f8  [Maxxter]\n\t0f97  Optical Gaming Mouse [Xtrem]\n\t0f99  Optical gaming mouse\n\t1142  Optical gaming mouse\n\t1486  X5s ZEUS Macro Pro Gaming Mouse\n18fb  Scriptel Corporation\n\t01c0  ST1501-STN\n\t01c1  ST1526-STN\n\t01c2  ST1501-PYJ\n\t01c3  ST1501B-PYJ\n\t01c4  ST1501-PUN\n\t01c5  ST1401-STN\n\t01c7  ST1526-PYJ\n\t01c8  ST1501-ECA\n\t01c9  ST1476-STN\n\t01cb  ST1571-STN\n\t0200  ST1500\n\t0201  ST1550\n\t0202  ST1525\n\t0204  ST1400\n\t0206  ST1475\n\t0207  ST1570\n18fd  FineArch Inc.\n1901  GE Healthcare\n\t0015  Nemo Tracker\n1908  GEMBIRD\n\t0102  Digital Photo Frame\n\t0226  MicroSD Card Reader/Writer\n\t1315  Digital Photo Frame\n\t1320  DM8261 Flashdisc\n\t2070  Honk HK-5002 USB Speaker\n\t2220  Buildwin Media-Player\n\t2311  Generic UVC 1.00 camera [AppoTech AX2311]\n190d  Motorola GSG\n1914  Alco Digital Devices Limited\n1915  Nordic Semiconductor ASA\n\t000c  Wireless Desktop nRF24L01 CX-1766\n\t0101  HP Prime Wireless Kit [FOK65AA] (Flash mode)\n\t2233  Linksys WUSB11 v2.8 802.11b Adapter [Atmel AT76C505]\n\t2234  Linksys WUSB54G v1 OEM 802.11g Adapter [Intersil ISL3886]\n\t2235  Linksys WUSB54GP v1 OEM 802.11g Adapter [Intersil ISL3886]\n\t2236  Linksys WUSB11 v3.0 802.11b Adapter [Intersil PRISM 3]\n\t7777  Bitcraze Crazyradio (PA) dongle\n191c  Innovative Technology LTD\n\t4104  Banknote validator NV-150\n1923  FitLinxx\n\t0002  Personal SyncPoint\n1926  NextWindow\n\t0003  1900 HID Touchscreen\n\t0006  1950 HID Touchscreen\n\t0064  1950 HID Touchscreen\n\t0065  1950 HID Touchscreen\n\t0066  1950 HID Touchscreen\n\t0067  1950 HID Touchscreen\n\t0068  1950 HID Touchscreen\n\t0069  1950 HID Touchscreen\n\t0071  1950 HID Touchscreen\n\t0072  1950 HID Touchscreen\n\t0073  1950 HID Touchscreen\n\t0074  1950 HID Touchscreen\n\t0075  1950 HID Touchscreen\n\t0076  1950 HID Touchscreen\n\t0077  1950 HID Touchscreen\n\t0078  1950 HID Touchscreen\n\t0079  1950 HID Touchscreen\n\t007a  1950 HID Touchscreen\n\t007e  1950 HID Touchscreen\n\t007f  1950 HID Touchscreen\n\t0080  1950 HID Touchscreen\n\t0081  1950 HID Touchscreen\n\t0082  1950 HID Touchscreen\n\t0083  1950 HID Touchscreen\n\t0084  1950 HID Touchscreen\n\t0085  1950 HID Touchscreen\n\t0086  1950 HID Touchscreen\n\t0087  1950 HID Touchscreen\n\t0dbf  HID Touchscreen\n\t0dc2  HID Touchscreen\n1928  Proceq SA\n\t0400  Equotip Piccolo\n192f  Avago Technologies, Pte.\n\t0000  Mouse\n\t0416  ADNS-5700 Optical Mouse Controller (3-button)\n\t0616  ADNS-5700 Optical Mouse Controller (5-button)\n\t0916  ADNS-2710 Optical Mouse Controller\n1930  Shenzhen Xianhe Technology Co., Ltd.\n1931  Ningbo Broad Telecommunication Co., Ltd.\n1934  Feature Integration Technology Inc. (Fintek)\n\t0602  F71610 or F71612 Consumer Infrared Receiver/Transceiver\n\t0702  Integrated Consumer Infrared Receiver/Transceiver\n\t5168  F71610A or F71612A Consumer Infrared Receiver/Transceiver\n1935  Elektron Music Machines\n\t000d  Elektron Digitakt\n1938  Meinberg Funkuhren GmbH & Co. KG\n\t0501  TCR51USB IRIG Time Code Reader\n\t0502  TCR600USB IRIG Time Code Reader\n1941  Dream Link\n\t8021  WH1080 Weather Station / USB Missile Launcher\n1943  Sensoray Co., Inc.\n\t2250  Model 2250 MPEG and JPEG Capture Card\n\t2253  Model 2253 Audio/Video Codec Card\n\t2255  Model 2255 4 Channel Capture Card\n\t2257  Model 2257 4 Channel Capture Card\n\t2263  Model 2263 UVC HD Audio/Video Codec Card\n\ta250  Model 2250 MPEG and JPEG Capture Card (cold)\n\ta253  Model 2253 Audio/Video Codec Card (cold)\n1949  Lab126, Inc.\n\t0002  Amazon Kindle\n\t0004  Amazon Kindle 3/4/Paperwhite\n\t0006  Amazon Kindle Fire\n\t0008  Amazon Kindle Fire HD 8.9\"\n\t000a  Amazon Kindle Fire 2nd generation (2012)\n\t0331  Kindle Fire HD 8 (2018)\n\t0417  Amazon Zukey; clone of Yubikey 4 OTP+U2F\n\t0800  Fire Phone\n194f  PreSonus Audio Electronics, Inc.\n\t0101  AudioBox 22 VSL\n\t0102  AudioBox 44 VSL\n\t0103  AudioBox 1818 VSL\n\t0201  FaderPort\n\t0301  AudioBox\n1951  Hyperstone AG\n1953  Ironkey Inc.\n\t0202  S200 2GB Rev. 1\n1954  Radiient Technologies\n195d  Itron Technology iONE\n\t2030  Func KB-460 Gaming Keyboard\n\t7002  Libra-Q11 IR remote\n\t7006  Libra-Q26 / 1.0 Remote\n\t7777  Scorpius wireless keyboard\n\t7779  Scorpius-P20MT\n1963  IK Multimedia\n\t0005  iRig KEYS\n\t0046  UNO Synth\n1965  Uniden Corporation\n\t0016  HomePatrol-1\n\t0018  UBC125XLT\n\t001a  BCD436HP Scanner\n1967  CASIO HITACHI Mobile Communications Co., Ltd.\n196b  Wispro Technology Inc.\n1970  Dane-Elec Corp. USA\n\t0000  Z Mate 16GB\n1973  Spectralink Corporation\n\t0002  Pivot recovery\n\t0003  Pivot Media Transfer Protocol\n\t0004  Pivot Media Transfer Protocol\n1975  Dongguan Guneetal Wire & Cable Co., Ltd.\n1976  Chipsbrand Microelectronics (HK) Co., Ltd.\n\t1307  microSD Card Reader\n\t6025  CBM2090 Flash Drive\n1977  T-Logic\n\t0111  TL203 MP3 Player and Voice Recorder\n197d  Leuze electronic\n\t0222  BCL 508i\n1980  Storage Appliance Corporation\n\t0808  Clickfree C2 Slimline (527SE)\n1989  Nuconn Technology Corp.\n198f  Beceem Communications Inc.\n\t0210  BCS200 WiMAX Adapter\n\t0220  BCSM250 WiMAX Adapter\n1990  Acron Precision Industrial Co., Ltd.\n1995  Trillium Technology Pty. Ltd.\n\t3202  REC-ADPT-USB (recorder)\n\t3203  REC-A-ADPT-USB (recorder)\n1996  PixeLINK\n\t3010  Camera Release 4\n\t3011  OEM Camera\n\t3012  e-ImageData Corp. ScanPro\n1997  Shenzhen Riitek Technology Co., Ltd\n\t0409  wireless mini keyboard with touchpad\n\t2433  wireless mini keyboard with touchpad\n199b  MicroStrain, Inc.\n\t3065  3DM-GX3-25 Orientation Sensor\n199e  The Imaging Source Europe GmbH\n\t8101  DFx 21BU04 Camera\n\t8457  DFK AFU130-L53 camera\n199f  Benica Corporation\n19a5  HARRIS Corp.\n\t0004  Remote NDIS Network Device\n\t0012  RF-7800S Secure Personal Radio\n\t0401  Mass Storage Device\n\t0402  Falcon III RF-7800V family RNDIS\n19a8  Biforst Technology Inc.\n19ab  Bodelin\n\t1000  ProScope HR\n19af  S Life\n\t6611  Celestia VoIP Phone\n19b2  Batronix\n\t0010  BX32 Batupo\n\t0011  BX32P Barlino\n\t0012  BX40 Bagero\n\t0013  BX48 Batego\n19b4  Celestron\n\t0002  SkyScout Personal Planetarium\n\t0101  Handheld Digital Microscope 44302\n19b5  B & W Group\n19b6  Infotech Logistic, LLC\n19b9  Data Robotics\n\t4b10  Drobo\n\t8d20  Drobo Elite\n19c2  Futuba\n\t6a11  MDM166A Fluorescent Display\n19ca  Mindtribe\n\t0001  Sandio 3D HID Mouse\n19cf  Parrot SA\n\t0001  MiniKit Slim handsfree car kit in firmware update mode\n19d1  BYD\n19d2  ZTE WCDMA Technologies MSM\n\t0001  CDMA Wireless Modem\n\t0002  MF632/ONDA ET502HS/MT505UP\n\t0007  TU25 WiMAX Adapter [Beceem BCS200]\n\t0017  MF669\n\t0031  MF110/MF627/MF636\n\t0037  ONDA MC503HSA\n\t0039  MF100\n\t0063  K3565-Z HSDPA\n\t0064  MF627 AU\n\t0083  MF190\n\t0103  MF112\n\t0104  K4505-Z\n\t0117  MF667\n\t0146  MF 195E (HSPA+ Modem)\n\t0167  MF820 4G LTE\n\t0172  AX226 WIMAX MODEM (After Modeswitch)\n\t0325  LTE4G O2 ZTE MF821D LTE/UMTS/GSM Modem/Networkcard\n\t0326  LTE4G O2 ZTE MF821D LTE/UMTS/GSM Modem/Networkcard\n\t0501  Lever Cell Phone Model Z936L\n\t1001  K3805-Z vodafone WCDMA/GSM Modem - storage mode (made by ZTE)\n\t1002  K3805-Z vodafone WCDMA/GSM Modem/Networkcard (made by ZTE)\n\t1008  K3570-Z\n\t1010  K3571-Z\n\t1017  K5006-Z vodafone LTE/UMTS/GSM Modem/Networkcard\n\t1018  K5006-Z vodafone LTE/UMTS/GSM Modem/Networkcard\n\t1203  MF691 [ T-Mobile webConnect Rocket 2.0]\n\t1217  MF652\n\t1218  MF652\n\t1270  MF667\n\t2000  MF627/MF628/MF628+/MF636+ HSDPA/HSUPA\n\tfff2  Gobi Wireless Modem (QDL mode)\n\tfff3  Gobi Wireless Modem\n19db  KFI Printers\n\t02f1  NAUT324C\n19e1  WeiDuan Electronic Accessory (S.Z.) Co., Ltd.\n19e8  Industrial Technology Research Institute\n19ef  Pak Heng Technology (Shenzhen) Co., Ltd.\n19f7  RODE Microphones\n\t0001  Podcaster\n19fa  Gampaq Co.Ltd\n\t0607  GAME CONTROLLER\n\t0703  Steering Wheel\n19fd  MTI Instruments Inc.\n19ff  Dynex\n\t0102  1.3MP Webcam\n\t0201  Rocketfish Wireless 2.4G Laser Mouse\n\t0220  RF-HDWEBLT RocketFish HD WebCam\n\t0238  DX-WRM1401 Mouse\n\t0239  Bluetooth 4.0 Adapter [Broadcom, 1.12, BCM20702A0]\n1a08  Bellwood International, Inc.\n1a0a  USB-IF non-workshop\n\tbadd  USB OTG Compliance test device\n1a12  KES Co., Ltd.\n1a1d  Veho\n\t0407  Mimi WiFi speakers\n1a25  Amphenol East Asia Ltd.\n1a2a  Seagate Branded Solutions\n1a2c  China Resource Semico Co., Ltd\n\t0021  Keyboard\n\t0024  Multimedia Keyboard\n\t2124  Keyboard\n\t2d23  Keyboard\n\t427c  Backlit Keyboard [Cougar Vantar]\n1a32  Quanta Microsystems, Inc.\n\t0304  802.11n Wireless LAN Card\n1a34  ACRUX\n\t0802  Gamepad\n1a36  Biwin Technology Ltd.\n1a40  Terminus Technology Inc.\n\t0101  Hub\n\t0201  FE 2.1 7-port Hub\n1a41  Action Electronics Co., Ltd.\n1a44  VASCO Data Security International\n\t0001  Digipass 905 SmartCard Reader\n1a4a  Silicon Image\n1a4b  SafeBoot International B.V.\n1a5a  Tandberg Data\n1a61  Abbott Diabetes Care\n\t3410  CoPilot System Cable\n\t3650  FreeStyle Libre\n\t3850  FreeStyle Optium/Precision Neo\n\t3950  FreeStyle Libre 2\n1a64  Mastervolt\n\t0000  MasterBus Link\n1a6a  Spansion Inc.\n1a6d  SamYoung Electronics Co., Ltd\n1a6e  Global Unichip Corp.\n1a6f  Sagem Orga GmbH\n1a72  Physik Instrumente\n\t1008  E-861 PiezoWalk NEXACT Controller\n1a79  Bayer Health Care LLC\n\t6002  Contour\n\t6210  Contour Next Link 2.4 glucometer\n\t6300  Contour next link\n\t7410  Contour Next\n\t7800  Contour Plus One\n1a7b  Lumberg Connect  GmbH & Co. KG\n1a7c  Evoluent\n\t0068  VerticalMouse 3\n\t0168  VerticalMouse 3 Wireless\n\t0191  VerticalMouse 4\n\t0195  VerticalMouse C Wireless\n1a7e  Meltec Systementwicklung\n\t1001  UFT75, UT150, UT60\n\t1003  Thermostick\n1a81  Holtek Semiconductor, Inc.\n\t1004  Wireless Dongle 2.4 GHZ HT82D40REW\n\t1701  Wireless dongle\n\t2004  Keyboard\n\t2203  Laser Gaming mouse\n\t2204  Optical Mouse\n\t2205  Laser Mouse\n\t4001  Keyboard\n1a86  QinHeng Electronics\n\t5512  CH341 in EPP/MEM/I2C mode, EPP/I2C adapter\n\t5523  CH341 in serial mode, usb to serial port converter\n\t5584  CH341 in parallel mode, usb to printer port converter\n\t7522  CH340 serial converter\n\t7523  CH340 serial converter\n\t752d  CH345 MIDI adapter\n\t7584  CH340S\n\te008  HID-based serial adapter\n1a89  Dynalith Systems Co., Ltd.\n1a8b  SGS Taiwan Ltd.\n1a8d  BandRich, Inc.\n\t1002  BandLuxe 3.5G HSDPA Adapter\n\t1009  BandLuxe 3.5G HSPA Adapter\n\t100d  4G LTE adapter\n1a98  Leica Camera AG\n1aa4  Data Drive Thru, Inc.\n1aa5  UBeacon Technologies, Inc.\n1aa6  eFortune Technology Corp.\n1aab  Silvercreations Software AG\n\t7736  sceye (Gen 2)\n\t7737  sceye (Gen 3)\n\t7738  sceye (Gen 4, 3 Mpix)\n\t7750  sceyeS (Gen 5, 5 MPix)\n1aad  KeeTouch\n\t0001  Touchscreen\n1ab1  Rigol Technologies\n\t04b0  DS6000 SERIES\n\t04be  DS4000 SERIES\n\t04ce  DS1xx4Z/MSO1xxZ series\n\t0588  DS1000 SERIES\n1ab2  Allied Vision\n\t0001  Vision device\n1acb  Salcomp Plc\n1acc  Midiplus Co, Ltd.\n\t0103  AudioLink plus 4x4 2.9.28\n1ad1  Desay Wire Co., Ltd.\n1ad4  APS\n\t0002  KM290-HRS\n1adb  Schweitzer Engineering Laboratories, Inc\n\t0001  C662 Serial Cable\n\t0003  CDC Ethernet Gadget\n1ae4  ic-design Reinhard Gottinger GmbH\n1ae7  X-TENSIONS\n\t0381  VS-DVB-T 380U (af9015 based)\n\t0525  X-Tensions ISDN TA XC-525 [HFC-S USB]\n\t2001  SpeedLink Snappy Mic webcam (SL-6825-SBK)\n\t9003  SpeedLink Vicious And Devine Laplace webcam, white (VD-1504-SWT)\n\t9004  SpeedLink Vicious And Devine Laplace webcam, black (VD-1504-SBK)\n1aed  High Top Precision Electronic Co., Ltd.\n1aef  Conntech Electronic (Suzhou) Corporation\n1af1  Connect One Ltd.\n1af3  Kingsis Technology Corporation\n\t0001  ZOWIE Gaming mouse\n1afe  A. Eberle GmbH & Co. KG\n\t0001  PQ Box 100\n1b04  Meilhaus Electronic GmbH\n\t0630  ME-630\n\t0940  ME-94\n\t0950  ME-95\n\t0960  ME-96\n\t1000  ME-1000\n\t100a  ME-1000\n\t100b  ME-1000\n\t1400  ME-1400\n\t140a  ME-1400A\n\t140b  ME-1400B\n\t140c  ME-1400C\n\t140d  ME-1400D\n\t140e  ME-1400E\n\t14ea  ME-1400EA\n\t14eb  ME-1400EB\n\t1604  ME-1600/4U\n\t1608  ME-1600/8U\n\t160c  ME-1600/12U\n\t160f  ME-1600/16U\n\t168f  ME-1600/16U8I\n\t4610  ME-4610\n\t4650  ME-4650\n\t4660  ME-4660\n\t4661  ME-4660I\n\t4662  ME-4660\n\t4663  ME-4660I\n\t4670  ME-4670\n\t4671  ME-4670I\n\t4672  ME-4670S\n\t4673  ME-4670IS\n\t4680  ME-4680\n\t4681  ME-4680I\n\t4682  ME-4680S\n\t4683  ME-4680IS\n\t6004  ME-6000/4\n\t6008  ME-6000/8\n\t600f  ME-6000/16\n\t6014  ME-6000I/4\n\t6018  ME-6000I/8\n\t601f  ME-6000I/16\n\t6034  ME-6000ISLE/4\n\t6038  ME-6000ISLE/8\n\t603f  ME-6000ISLE/16\n\t6044  ME-6000/4/DIO\n\t6048  ME-6000/8/DIO\n\t604f  ME-6000/16/DIO\n\t6054  ME-6000I/4/DIO\n\t6058  ME-6000I/8/DIO\n\t605f  ME-6000I/16/DIO\n\t6074  ME-6000ISLE/4/DIO\n\t6078  ME-6000ISLE/8/DIO\n\t607f  ME-6000ISLE/16/DIO\n\t6104  ME-6100/4\n\t6108  ME-6100/8\n\t610f  ME-6100/16\n\t6114  ME-6100I/4\n\t6118  ME-6100I/8\n\t611f  ME-6100I/16\n\t6134  ME-6100ISLE/4\n\t6138  ME-6100ISLE/8\n\t613f  ME-6100ISLE/16\n\t6144  ME-6100/4/DIO\n\t6148  ME-6100/8/DIO\n\t614f  ME-6100/16/DIO\n\t6154  ME-6100I/4/DIO\n\t6158  ME-6100I/8/DIO\n\t615f  ME-6100I/16/DIO\n\t6174  ME-6100ISLE/4/DIO\n\t6178  ME-6100ISLE/8/DIO\n\t617f  ME-6100ISLE/16/DIO\n\t6259  ME-6200I/9/DIO\n\t6359  ME-6300I/9/DIO\n\t810a  ME-8100A\n\t810b  ME-8100B\n\t820a  ME-8200A\n\t820b  ME-8200B\n1b0e  BLUTRONICS S.r.l.\n\t1078  BLUDRIVE II CCID\n\t1079  BLUDRIVE II CCID\n\t1080  WRITECHIP II CCID\n1b12  Eventide\n\t0011  ModFactor\n1b1c  Corsair\n\t0890  Flash Padlock\n\t0a00  SP2500 Speakers\n\t0a60  Vengeance K60 Keyboard\n\t0c04  Link Cooling Node\n\t0c06  RM-Series C-Link Adapter\n\t0c0a  Hydro Series H115i Liquid CPU Cooler\n\t0c0b  Lighting Node Pro\n\t0c0c  Lighting Node Loader\n\t0c22  iCUE H150i RGB PRO XT Liquid CPU Cooler\n\t1a01  Flash Voyager GT\n\t1a03  Voyager 3.0\n\t1a09  Voyager GT 3.0\n\t1a0a  Survivor Stealth Flash Drive\n\t1a0b  Flash Voyager LS\n\t1a0e  Voyager GTX\n\t1a14  Voyager Vega\n\t1a15  Voyager Slider Flash Drive\n\t1a90  Flash Voyager GT\n\t1ab1  Voyager\n\t1b04  Raptor K50 Keyboard\n\t1b07  Vengeance K65 Gaming Keyboard\n\t1b08  Vengeance K95 Keyboard\n\t1b09  Vengeance K70R keyboard\n\t1b11  K95 RGB Mechanical Gaming Keyboard\n\t1b13  Vengeance K70RGB keyboard\n\t1b20  STRAFE RGB Gaming Keyboard\n\t1b2d  K95 RGB Platinum Keyboard [RGP0056]\n\t1b2e  Corsair Corsair Gaming M65 Pro RGB Mouse\n\t1b2f  Sabre RGB [CH-9303011-XX]\n\t1b3d  Corsair Corsair Gaming K55 RGB Keyboard\n\t1b5e  Harpoon Wireless Mouse\n\t1b65  Harpoon Wireless Dongle\n\t1c00  Controller for Corsair Link\n\t1c02  AX1500i Power Supply\n\t1c05  HX750i Power Supply\n\t1c07  HX1000i Power Supply\n\t1c08  HX1200i Power Supply\n\t1c0b  RM750i Power Supply\n\t1c0c  RM850i Power Supply\n\t1c1a  Corsair CORSAIR Lighting Node CORE\n1b1e  General Imaging / General Electric\n\t1003  A1250\n1b1f  eQ-3 Entwicklung GmbH\n\tc00f  HM-CFG-USB/HM-CFG-USB-2 [HomeMatic Configuration adapter]\n\tc020  HmIP-RFUSB\n1b20  MStar Semiconductor, Inc.\n1b22  WiLinx Corp.\n1b24  Telegent Systems, Inc.\n\t4001  TLG2300 Hybrid TV Device\n1b26  Cellex Power Products, Inc.\n1b27  Current Electronics Inc.\n1b28  NAVIsis Inc.\n1b32  Ugobe Life Forms, Inc.\n\t0064  Pleo robotic dinosaur\n1b36  ViXS Systems, Inc.\n1b3b  iPassion Technology Inc.\n\t2933  PC Camera/Webcam controller\n\t2935  PC Camera/Webcam controller\n\t2936  PC Camera/Webcam controller\n\t2937  PC Camera/Webcam controller\n\t2938  PC Camera/Webcam controller\n\t2939  PC Camera/Webcam controller\n\t2950  PC Camera/Webcam controller\n\t2951  PC Camera/Webcam controller\n\t2952  PC Camera/Webcam controller\n\t2953  PC Camera/Webcam controller\n\t2955  PC Camera/Webcam controller\n\t2956  PC Camera/Webcam controller\n\t2957  PC Camera/Webcam controller\n\t2958  PC Camera/Webcam controller\n\t2959  PC Camera/Webcam controller\n\t2960  PC Camera/Webcam controller\n\t2961  PC Camera/Webcam controller\n\t2962  PC Camera/Webcam controller\n\t2963  PC Camera/Webcam controller\n\t2965  PC Camera/Webcam controller\n\t2966  PC Camera/Webcam controller\n\t2967  PC Camera/Webcam controller\n\t2968  PC Camera/Webcam controller\n\t2969  PC Camera/Webcam controller\n1b3f  Generalplus Technology Inc.\n\t0c52  808 Camera #9 (mass storage mode)\n\t2002  808 Camera #9 (web-cam mode)\n\t2003  GPD6000 [Digital MP3 Player]\n1b47  Energizer Holdings, Inc.\n\t0001  CHUSB Duo Charger (NiMH AA/AAA USB smart charger)\n1b48  Plastron Precision Co., Ltd.\n1b52  ARH Inc.\n\t2101  FXMC Neural Network Controller\n\t2102  FXMC Neural Network Controller V2\n\t2103  FXMC Neural Network Controller V3\n\t4101  Passport Reader CLR device\n\t4201  Passport Reader PRM device\n\t4202  Passport Reader PRM extension device\n\t4203  Passport Reader PRM DSP device\n\t4204  Passport Reader PRMC device\n\t4205  Passport Reader CSHR device\n\t4206  Passport Reader PRMC V2 device\n\t4301  Passport Reader MRZ device\n\t4302  Passport Reader MRZ DSP device\n\t4303  Passport Reader CSLR device\n\t4401  Card Reader\n\t4501  Passport Reader RFID device\n\t4502  Passport Reader RFID AIG device\n\t6101  Neural Network Controller\n\t6202  Fingerprint Reader device\n\t6203  Fingerprint Scanner device\n\t8101  Camera V1\n\t8102  Recovery / Camera V2\n\t8103  Camera V3\n1b59  K.S. Terminals Inc.\n1b5a  Chao Zhou Kai Yuan Electric Co., Ltd.\n1b65  The Hong Kong Standards and Testing Centre Ltd.\n1b71  Fushicai\n\t0050  Encore ENUTV-4 Analog TV Tuner\n\t3002  USBTV007 Video Grabber [EasyCAP]\n1b72  ATERGI TECHNOLOGY CO., LTD.\n1b73  Fresco Logic\n\t1000  xHC1 Controller\n1b75  Ovislink Corp.\n\t3072  AirLive WN-360USB adapter\n\t8171  WN-370USB 802.11bgn Wireless Adapter [Realtek RTL8188SU]\n\t8187  AirLive WL-1600USB 802.11g Adapter [Realtek RTL8187L]\n\t9170  AirLive X.USB 802.11abgn [Atheros AR9170+AR9104]\n\ta200  AirLive WN-200USB wireless 11b/g/n dongle\n1b76  Legend Silicon Corp.\n1b80  Afatech\n\tc810  MC810 [af9015]\n\td393  DVB-T receiver [RTL2832U]\n\td396  UB396-T [RTL2832U]\n\td397  DVB-T receiver [RTL2832U]\n\td398  DVB-T receiver [RTL2832U]\n\td700  FM Radio SnapMusic Mobile 700 (FM700)\n\te297  Conceptronic DVB-T CTVDIGRCU V3.0\n\te302  CVBS / S-Video Capture Device [Pinnacle Dazzle / UB315-E]\n\te34c  UB435-Q ATSC TV Stick\n\te383  DVB-T UB383-T [af9015]\n\te385  DVB-T UB385-T [af9015]\n\te386  DVB-T UB385-T [af9015]\n\te399  DVB-T KWorld PlusTV 399U [af9015]\n\te39a  DVB-T395U [af9015]\n\te39b  DVB-T395U [af9015]\n\te401  Sveon STV22 DVB-T [af9015]\n\te409  IT9137FN Dual DVB-T [KWorld UB499-2T]\n1b86  Dongguan Guanshang Electronics Co., Ltd.\n1b88  ShenMing Electron (Dong Guan) Co., Ltd.\n1b8c  Altium Limited\n1b8d  e-MOVE Technology Co., Ltd.\n1b8e  Amlogic, Inc.\n1b8f  MA LABS, Inc.\n1b96  N-Trig\n\t0001  Duosense Transparent Electromagnetic Digitizer\n1b98  YMax Communications Corp.\n1b99  Shenzhen Yuanchuan Electronic\n1ba1  JINQ CHERN ENTERPRISE CO., LTD.\n1ba2  Lite Metals & Plastic (Shenzhen) Co., Ltd.\n1ba4  Ember Corporation\n\t0001  InSight USB Link\n\t0002  EM358 Virtual COM Port\n1ba6  Abilis Systems\n1ba8  China Telecommunication Technology Labs\n1bad  Harmonix Music\n\t0002  Rock Band Guitar for Xbox 360\n\t0003  Rock Band Drum Kit for Xbox 360\n\t0130  Ion Drum Rocker for Xbox 360\n\t028e  Controller\n\t3330  Rock Band 3 Keyboard wii interface\n\tf016  Controller\n\tf018  Street Fighter IV SE FightStick for Xbox 360\n\tf019  BrawlStick for Xbox 360\n\tf021  Ghost Recon Future Soldier Gamepad for Xbox 360\n\tf023  MLG Pro Circuit Controller for Xbox 360\n\tf025  Call of Duty Controller for Xbox 360\n\tf027  FPS Pro Controller for Xbox 360\n\tf028  Street Fighter IV FightPad for Xbox 360\n\tf02e  FightPad\n\tf030  MC2 MicroCON Racing Wheel for Xbox 360\n\tf036  MicroCON Gamepad Pro for Xbox 360\n\tf038  Street Fighter IV FightStick TE for Xbox 360\n\tf039  Marvel VS Capcom 2 Tournament Stick for Xbox 360\n\tf03a  Street Fighter X Tekken FightStick Pro for Xbox 360\n\tf03d  Street Fighter IV Arcade Stick TE for Xbox 360\n\tf03e  MLG Arcade FightStick TE for Xbox 360\n\tf03f  Soulcalibur FightStick for Xbox 360\n\tf042  Arcade FightStick TE S+ for Xbox 360\n\tf080  FightStick TE2 for Xbox 360\n\tf501  Horipad EX2 Turbo for Xbox 360\n\tf502  Real Arcade Pro.VX SA for Xbox 360\n\tf503  Fighting Stick VX for Xbox 360\n\tf504  Real Arcade Pro.EX\n\tf505  Fighting Stick EX2B for Xbox 360\n\tf506  Real Arcade Pro.EX Premium VLX for Xbox 360\n\tf900  Controller\n\tf901  GameStop Controller\n\tf903  Tron Controller for Xbox 360\n\tf904  PDP Versus Fighting Pad for Xbox 360\n\tf906  Mortal Kombat FightStick for Xbox 360\n\tf907  Afterglow Gamepad\n\tfa01  Gamepad\n\tfd00  Razer Onza Tournament Edition\n\tfd01  Razer Onza Classic Edition\n1bae  Vuzix Corporation\n\t0002  VR920 Immersive Eyewear\n1bbb  T & A Mobile Phones\n\t0003  Alcatel one touch 4030D modem connection\n\t0017  HSPA Data Card\n\t007a  Alcatel OneTouch (firmware upgrade mode)\n\t011e  Alcatel One Touch L100V / Telekom Speedstick LTE II\n\t0169  Alcatel ONE TOUCH Fierce\n\t0195  Alcatel OneTouch L850V / Telekom Speedstick LTE\n\ta00e  Vodafone Smart Tab 4G\n\tf000  Alcatel OneTouch (mass storage mode)\n\tf017  Alcatel One Touch L100V / Telekom Speedstick LTE II\n1bbd  Videology Imaging Solutions, Inc.\n\t0060  1.3MP Mono Camera\n\t0066  1.3MP Mono Camera\n\t0067  1.3MP Mono Camera\n1bc0  Beijing Senseshield Technology Co.,Ltd.\n\t0013  Elitee-e\n\t0014  Elite4\n\t0020  iToken\n\t0021  Mikey\n\t0051  Elite5\n\t0055  Elite5 v3.x\n\t485d  EliteIV\n1bc4  Ford Motor Co.\n1bc5  AVIXE Technology (China) Ltd.\n1bc7  Telit Wireless Solutions\n\t0020  HE863\n\t0021  HE910\n\t0022  GE910-QUAD\n\t0023  HE910-D ECM\n\t0032  LE910-EU V2\n\t1003  UC864-E\n\t1004  UC864-G\n\t1005  CC864-DUAL\n\t1006  CC864-SINGLE\n\t1010  DE910-DUAL\n\t1011  CE910-DUAL\n\t1012  UE910 V2\n\t1101  ME910C1\n\t110a  ME310\n\t1200  LE920 (old firmware)\n\t1201  LE910 / LE920\n1bce  Contac Cable Industrial Limited\n1bcf  Sunplus Innovation Technology Inc.\n\t0005  Optical Mouse\n\t0007  Optical Mouse\n\t053a  Targa Silvercrest OMC807-C optische Funkmaus\n\t05c5  SPRF2413A [2.4GHz Wireless Keyboard/Mouse Receiver]\n\t05cf  Micro keyboard & mouse receiver\n\t08a0  Gaming mouse [Philips SPK9304]\n\t0c31  SPIF30x Serial-ATA bridge\n\t2281  SPCA2281 Web Camera\n\t2880  Dell HD Webcam\n\t2883  Asus Webcam\n\t2885  ASUS Webcam\n\t2888  HP Universal Camera\n\t2895  Dell Integrated Webcam\n\t28a2  Dell Integrated Webcam\n\t28a6  DELL XPS Integrated Webcam\n\t28ae  Laptop Integrated Webcam HD\n\t28bd  Dell Integrated HD Webcam\n\t2985  Laptop Integrated Webcam HD\n\t2b83  Laptop Integrated Webcam FHD\n\t2b91  Dell E5570 integrated webcam\n\t2b97  Laptop Integrated Webcam FHD\n\t2c6e  Laptop Integrated WebCam HD\n1bd0  Hangzhou Riyue Electronic Co., Ltd.\n1bd5  BG Systems, Inc.\n1bda  University Of Southampton\n\t0010  Power Board v4 Rev B\n\t0011  Student Robotics SBv4B\n1bde  P-TWO INDUSTRIES, INC.\n1bef  Shenzhen Tongyuan Network-Communication Cables Co., Ltd\n1bf0  RealVision Inc.\n1bf5  Extranet Systems Inc.\n1bf6  Orient Semiconductor Electronics, Ltd.\n1bfd  TouchPack\n\t1268  Touch Screen\n\t1368  Touch Screen\n\t1568  Capacitive Touch Screen\n\t1668  IR Touch Screen\n\t1688  Resistive Touch Screen\n\t2968  Touch Screen\n\t5968  Touch Screen\n\t6968  Touch Screen\n1c02  Kreton Corporation\n1c04  QNAP System Inc.\n\t2074  ASM1074 High-Speed hub\n\t3074  ASM1074 SuperSpeed hub\n1c05  Shenxhen Stager Electric\n\tea75  G540 Programmer\n1c0c  Ionics EMS, Inc.\n\t0102  Plug Computer\n1c0d  Relm Wireless\n1c10  Lanterra Industrial Co., Ltd.\n1c11  Input Club Inc.\n\tb04d  ErgoDox Infinity\n1c13  ALECTRONIC LIMITED\n1c1a  Datel Electronics Ltd.\n\t0100  Action Replay DS \"3DS/DSi/DS/Lite Compatible\"\n1c1b  Volkswagen of America, Inc.\n1c1f  Goldvish S.A.\n1c20  Fuji Electric Device Technology Co., Ltd.\n1c21  ADDMM LLC\n1c22  ZHONGSHAN CHIANG YU ELECTRIC CO., LTD.\n1c26  Shanghai Haiying Electronics Co., Ltd.\n1c27  HuiYang D & S Cable Co., Ltd.\n1c28  PMD Technologies\n\tc003  CamCube\n\tc004  CamBoard\n\tc005  ConceptCam\n\tc006  CamBoard 22\n\tc007  CamBoard nano\n\tc008  CamBoard mod\n\tc009  CamBoard plus\n\tc00a  DigiCam\n\tc00d  CamBoard pico LDD\n\tc00f  CamBoard pico\n1c29  Elster GmbH\n\t0001  ExMFE5 Simulator\n\t10fc  enCore device\n1c31  LS Cable Ltd.\n1c34  SpringCard\n\t7241  Prox'N'Roll RFID Scanner\n1c37  Authorizer Technologies, Inc.\n\t6190  U2F Fido-compliant cryptotoken\n1c3d  NONIN MEDICAL INC.\n1c3e  Wep Peripherals\n1c40  EZPrototypes\n\t0533  TiltStick\n\t0534  i2c-tiny-usb interface\n\t0535  glcd2usb interface\n\t0536  Swiss ColorPAL\n\t0537  MIST Board\n1c49  Cherng Weei Technology Corp.\n1c4b  Geratherm Medical AG\n\t026f  Spirostik\n1c4f  SiGma Micro\n\t0002  Keyboard TRACER Gamma Ivory\n\t0003  HID controller\n\t000e  Genius KB-120 Keyboard\n\t0026  Keyboard\n\t0032  Optical Mouse with Scroll Wheel\n\t0034  XM102K Optical Wheel Mouse\n\t0063  Touchpad (integrated in detachable keyboard of Chuwi SurBook)\n\t0065  Optical Wheel Mouse [Rapoo N1130]\n\t3000  Micro USB Web Camera\n\t3002  WebCam SiGma Micro\n1c57  Zalman Tech Co., Ltd.\n\t1e45  FPSGUN FG1000 Mouse\n1c6b  Philips & Lite-ON Digital Solutions Corporation\n\ta220  DVD Writer Slimtype eSAU108\n\ta222  DVD Writer Slimtype eTAU108\n\ta223  DVD Writer Slimtype eUAU108\n1c6c  Skydigital Inc.\n1c71  Humanware Inc\n\tc004  Braille Note Apex (braille terminal mode)\n1c73  AMT\n\t861f  Anysee E30 USB 2.0 DVB-T Receiver\n1c75  Arturia\n\t0288  KeyStep\n1c77  Kaetat Industrial Co., Ltd.\n1c78  Datascope Corp.\n1c79  Unigen Corporation\n1c7a  LighTuning Technology Inc.\n\t0577  Fingerprint Sensor\n\t0603  ES603 Swipe Fingerprint Sensor\n\t0801  Fingerprint Reader\n1c7b  LUXSHARE PRECISION INDUSTRY (SHENZHEN) CO., LTD.\n1c82  Atracsys\n\t0200  spryTrac\n1c83  Schomaecker GmbH\n\t0001  RS150 V2\n\t0002  RFID card reader\n\t0003  Communicator\n\t0005  Mobile RFID Reader\n1c87  2N TELEKOMUNIKACE a.s.\n1c88  Somagic, Inc.\n\t0007  SMI Grabber (EasyCAP DC60+ clone) (no firmware) [SMI-2021CBE]\n\t003c  SMI Grabber (EasyCAP DC60+ clone) [SMI-2021CBE]\n1c89  HONGKONG WEIDIDA ELECTRON LIMITED\n1c8e  ASTRON INTERNATIONAL CORP.\n1c98  ALPINE ELECTRONICS, INC.\n1c9e  OMEGA TECHNOLOGY\n\t6061  WL-72B 3.5G MODEM\n1ca0  ACCARIO Inc.\n1ca1  Symwave\n\t18ab  SATA bridge\n1cac  Kinstone\n\ta332  C8 Webcam\n\tb288  C18 Webcam\n1cb3  Aces Electronic Co., Ltd.\n1cb4  OPEX CORPORATION\n1cb6  IdeaCom Technology Inc.\n\t6681  IDC6681\n1cbe  Luminary Micro Inc.\n\t0002  CDC serial port [TivaWare]\n\t00fd  In-Circuit Debug Interface\n\t00ff  Stellaris ROM DFU Bootloader\n\t0166  CANAL USB2CAN\n\t0240  McGill Robotics TM4C Microcontroller\n1cbf  FORTAT SKYMARK INDUSTRIAL COMPANY\n1cc0  PlantSense\n1cca  NextWave Broadband Inc.\n1ccd  Bodatong Technology (Shenzhen) Co., Ltd.\n1cd4  adp corporation\n1cd5  Firecomms Ltd.\n1cd6  Antonio Precise Products Manufactory Ltd.\n1cde  Telecommunications Technology Association (TTA)\n1cdf  WonTen Technology Co., Ltd.\n1ce0  EDIMAX TECHNOLOGY CO., LTD.\n1ce1  Amphenol KAE\n1cf1  Dresden Elektronik\n\t0001  Sensor Terminal Board\n\t0004  Wireless Handheld Terminal\n\t0017  deRFusbSniffer 2.4 GHz\n\t0018  deRFusb24E001\n\t0019  deRFusb14E001\n\t001a  deRFusb23E00\n\t001b  deRFusb13E00\n\t001c  deRFnode\n\t001d  deRFnode / gateway\n\t0022  deUSB level shifter\n\t0023  deRFusbSniffer Sub-GHz\n\t0025  deRFusb23E06\n\t0027  deRFusb13E06\n\t0030  ZigBee gateway [ConBee II]\n1cfc  ANDES TECHNOLOGY CORPORATION\n1cfd  Flextronics Digital Design Japan, LTD.\n1d03  iCON\n\t0028  iCreativ MIDI Controller\n1d07  Solid-Motion\n1d08  NINGBO HENTEK DRAGON ELECTRONICS CO., LTD.\n1d09  TechFaith Wireless Technology Limited\n\t1026  HSUPA Modem FLYING-LARK46-VER0.07 [Flying Angel]\n1d0a  Johnson Controls, Inc. The Automotive Business Unit\n1d0b  HAN HUA CABLE & WIRE TECHNOLOGY (J.X.) CO., LTD.\n1d0d  TDKMedia\n\t0214  Trans-It Drive\n1d0f  Sonix Technology Co., Ltd.\n1d14  ALPHA-SAT TECHNOLOGY LIMITED\n1d17  C-Thru Music Ltd.\n\t0001  AXiS-49 Harmonic Table MIDI Keyboard\n1d19  Dexatek Technology Ltd.\n\t1101  DK DVB-T Dongle\n\t1102  DK mini DVB-T Dongle\n\t1103  DK 5217 DVB-T Dongle\n\t1104  MSI DigiVox Micro HD\n\t6105  Video grabber\n\t610a  Video grabber\n\t8202  DK DVBC/T DONGLE\n1d1f  Diostech Co., Ltd.\n1d20  SAMTACK INC.\n1d27  ASUS\n\t0601  Xtion\n1d34  Dream Cheeky\n\t0001  Fidget\n\t0002  Fidget (Basketball)\n\t0003  Fidget (Golf Ball)\n\t0004  Webmail Notifier\n\t0008  button\n\t000a  Mailbox Friends Alert\n\t000d  Big Red Button\n\t0013  LED Message Board\n\t0020  Stress Ball\n1d45  Touch\n\t1d45  Foxlink Optical touch sensor\n\t459d  BenQ F5\n\t465c  Harrier Mini by EE\n1d4d  PEGATRON CORPORATION\n\t0002  Ralink RT2770/2720 802.11b/g/n Wireless LAN Mini-USB Device\n\t000c  Ralink RT3070 802.11b/g/n Wireless Lan USB Device\n\t000e  Ralink RT3070 802.11b/g/n Wireless Lan USB Device\n1d50  OpenMoko, Inc.\n\t1db5  IDBG (DFU)\n\t1db6  IDBG\n\t5117  Neo1973/FreeRunner kernel usbnet (g_ether, CDC Ethernet) mode\n\t5118  Neo1973/FreeRunner Debug board (V2+)\n\t5119  Neo1973/FreeRunner u-boot cdc_acm serial port\n\t511a  HXD8 u-boot usbtty CDC ACM Mode\n\t511b  SMDK2440 u-boot usbtty CDC ACM mode\n\t511c  SMDK2443 u-boot usbtty CDC ACM mode\n\t511d  QT2410 u-boot usbtty CDC ACM mode\n\t5120  Neo1973/FreeRunner u-boot usbtty generic serial\n\t5121  Neo1973/FreeRunner kernel mass storage (g_storage) mode\n\t5122  Neo1973/FreeRunner kernel cdc_ether USB network\n\t5123  Neo1973/FreeRunner internal USB CSR4 module\n\t5124  Neo1973/FreeRunner Bluetooth Device ID service\n\t5300  Rockbox\n\t530e  iriver H10 20GB (Rockbox)\n\t530f  iriver H10 5/6GB (Rockbox)\n\t5314  Apple iPod Color/Photo (Rockbox)\n\t5315  Apple iPod Nano 1g (Rockbox)\n\t5316  Apple iPod Video (Rockbox)\n\t5318  Apple iPod 4g Grayscale (Rockbox)\n\t5319  Apple iPod Mini 1g (Rockbox)\n\t531a  Apple iPod Mini 2g (Rockbox)\n\t531c  Apple iPod Nano 2g (Rockbox)\n\t531d  Apple iPod Classic/6G (Rockbox)\n\t5321  Cowon D2 (Rockbox)\n\t5329  Toshiba Gigabeat S (Rockbox)\n\t5332  Sandisk Sansa e200 series (Rockbox)\n\t5334  Sandisk Sansa c200 series (Rockbox)\n\t5337  Sandisk Sansa Clip (Rockbox)\n\t5338  Sandisk Sansa e200v2 series (Rockbox)\n\t5339  Sandisk Sansa m200 v4 series (Rockbox)\n\t533a  Sandisk Sansa Fuze (Rockbox)\n\t533b  Sandisk Sansa c200v2 series (Rockbox)\n\t533c  Sandisk Sansa Clipv2 (Rockbox)\n\t533e  Sandisk Sansa Clip+ (Rockbox)\n\t533f  Sandisk Sansa Fuze v2 (Rockbox)\n\t5340  Sandisk Sansa Fuze+ (Rockbox)\n\t5341  Sandisk Sansa Zip (Rockbox)\n\t5342  Sandisk Sansa Connect (Rockbox)\n\t5346  Olympus M:Robe 500i (Rockbox)\n\t5347  Olympus m:robe MR-100 (Rockbox)\n\t5359  Creative Zen X-Fi Style (Rockbox)\n\t535d  Creative Zen X-Fi2 (Rockbox)\n\t535e  Creative Zen X-Fi3 (Rockbox)\n\t5360  Creative Zen X-Fi (Rockbox)\n\t5361  Creative ZEN Mozaic (Rockbox)\n\t5362  Creative Zen (Rockbox)\n\t5364  Philips GoGear SA9200 (Rockbox)\n\t5365  Philips GoGear HDD16x0 (Rockbox)\n\t5366  Philips GoGear HDD63x0 (Rockbox)\n\t5378  Onda VX747 (Rockbox)\n\t5379  Onda VX767 (Rockbox)\n\t537b  Onda VX777 (Rockbox)\n\t538c  Samsung YH-820 (Rockbox)\n\t538d  Samsung YH-920 (Rockbox)\n\t538e  Samsung YH-925 (Rockbox)\n\t53a0  Packard Bell Vibe 500 (Rockbox)\n\t53b4  Rockchip 27xx generic (Rockbox)\n\t53be  HiFiMAN HM-60x (Rockbox)\n\t53bf  HiFiMAN HM-801 (Rockbox)\n\t53d2  HiFi E.T. MA9 (Rockbox)\n\t53d3  HiFi E.T. MA9C (Rockbox)\n\t53d4  HiFi E.T. MA8 (Rockbox)\n\t53d5  HiFi E.T. MA8C (Rockbox)\n\t53dc  Sony NWZ-E370/E380 series (Rockbox)\n\t53dd  Sony NWZ-E360 series (Rockbox)\n\t53e6  IHIFI 760 (Rockbox)\n\t53e7  IHIFI 960 (Rockbox)\n\t53ff  Generic Rockbox device\n\t6000  Ubertooth Zero\n\t6001  Ubertooth Zero (DFU)\n\t6002  Ubertooth One\n\t6003  Ubertooth One (DFU)\n\t6004  LeoLipo\n\t6005  LED Flower S\n\t6006  LED Cube\n\t6007  LED Flower\n\t6008  Kisbee 802.15.4 transceiver\n\t6009  Adjacent Reality Tracker\n\t600a  AVR Programmer\n\t600b  Hypna Go Go\n\t600c  CatNip LPC1343 development board\n\t600d  Enhanced RoboBrrd Brain board\n\t600e  OpenRISC Ordb2a-ep4ce22 development board\n\t600f  Paparazzi Lisa/M (DFU)\n\t6010  OpenPipe: OSHW Bagpipes MIDI controller\n\t6011  LeoLipo (DFU)\n\t6012  Universal C64 Cartridge\n\t6013  DiscFerret magnetic disc analyser (bootloader)\n\t6014  DiscFerret magnetic disc analyser\n\t6015  Smoothieboard\n\t6016  phInterface\n\t6017  Black Magic Debug Probe (DFU)\n\t6018  Black Magic Debug Probe (Application)\n\t6019  4pi 5 axis motion controller\n\t601a  Paparazzi Lisa/M\n\t601b  IST-2 chronograph for bullet speeds\n\t601c  EPOSMote II\n\t601d  UDS18B20 temperature sensor\n\t601e  5x5 STM32 prototyping board\n\t601f  uNSF\n\t6020  Toad3\n\t6021  AlphaSphere\n\t6022  LightPack\n\t6023  Pixelkit\n\t6024  Illucia\n\t6025  Keyglove (HID)\n\t6026  Keyglove (Serial)\n\t6027  Key64 Keyboard\n\t6028  Teensy 2.0 Development Board [ErgoDox Keyboard]\n\t6029  Marlin 2.0 (Serial)\n\t602a  Marlin 2.0 (Mass Storage)\n\t602b  FPGALink\n\t602c  5nes5snes (5x8)\n\t602d  5nes5snes (4x12)\n\t602e  Flexibity\n\t602f  K-copter\n\t6030  USB-oscope\n\t6031  Handmade GSM GPS tracker\n\t6032  ncrmnt.org uISP\n\t6033  frobiac / adnw keyboard\n\t6034  Tiflomag Ergo 2\n\t6035  FreeLaserTag Gun\n\t6036  FreeLaserTag Big Brother\n\t6037  FreeLaserTag Node\n\t6038  Monaka\n\t6039  eXtreme Feedback Device\n\t603a  TiLDA\n\t603b  Raspiface\n\t603c  Paparazzi (bootloader)\n\t603d  Paparazzi (Serial)\n\t603e  Paparazzi (Mass Storage)\n\t603f  airGuitar\n\t6040  moco\n\t6041  AlphaSphere (bootloader)\n\t6042  Dspace robot controller\n\t6043  pc-power\n\t6044  open-usb-can (DFU)\n\t6045  open-usb-can\n\t6046  mimus-weigand\n\t6047  RfCat Chronos Dongle\n\t6048  RfCat Dons Dongle\n\t6049  RfCat Chronos bootloader\n\t604a  RfCat Dons bootloader\n\t604b  HackRF Jawbreaker Software-Defined Radio\n\t604c  Makibox A6\n\t604d  Paella Pulse height analyzer\n\t604e  Miniscope v2b\n\t604f  Miniscope v2c\n\t6050  GoodFET\n\t6051  pinocc.io\n\t6052  APB Team Robotic Development Board\n\t6053  Darkgame Controller\n\t6054  Satlab/AAUSAT3 BlueBox\n\t6055  RADiuS ER900TRS-02 transceiver with SMA Connector\n\t6056  The Glitch\n\t6057  OpenPipe MIDI Shield\n\t6058  Novena OTG port\n\t6059  xser serial\n\t605a  Daisho test\n\t605b  RfCat YARD Stick One\n\t605c  YARD Stick One bootloader\n\t605d  Funky Sensor v2\n\t605e  Blinkiverse Analog LED Fader\n\t605f  Small DIP package Cypress FX2\n\t6060  Data logger using the Cypress FX2\n\t6061  Power Manager\n\t6062  WhiteRabbit console and Wishbone bridge\n\t6063  CPC FPGA\n\t6064  CPC FPGA (DFU)\n\t6065  CPC FPGA (Serial)\n\t6066  Nuand BladeRF\n\t6067  Orbotron 9000 (Serial)\n\t6068  Orbotron 9000 (HID)\n\t6069  xser (DFU)\n\t606a  xser (legacy)\n\t606b  S08-245, urJtag compatible firmware for S08JS\n\t606c  Blinkytape full-color light tape\n\t606d  TinyG open source motion controller\n\t606e  Reefangel Evolution 1.0\n\t606f  Geschwister Schneider CAN adapter\n\t6070  Open Pinball Project\n\t6071  The Glitch HID\n\t6072  The Glitch Disk\n\t6073  The Glitch Serial\n\t6074  The Glitch MIDI\n\t6075  The Glitch RawHID\n\t6076  Vultureprog BIOS chip programmer\n\t6077  PaintDuino\n\t6078  DTplug\n\t6079  Mood Light\n\t607a  Fadecandy\n\t607b  RCDongle for IR remote control\n\t607c  OpenVizsla USB sniffer/analyzer\n\t607d  Spark Core Arduino-compatible board with WiFi\n\t607e  OSHUG Wuthering multi-tool\n\t607f  Spark Core Arduino-compatible board with WiFi (bootloader)\n\t6080  arcin arcade controller\n\t6081  BladeRF (bootloader)\n\t6082  Facecandy (DFU)\n\t6083  LightUp (bootloader)\n\t6084  arcin arcade controller (DFU)\n\t6085  IRKit for controlloing home electronics from iOS devices\n\t6086  OneRNG entropy device\n\t6087  Blinkytape (alternate endpoint config)\n\t6088  picp PIC16F145x based PIC16F145x programmer\n\t6089  Great Scott Gadgets HackRF One SDR\n\t608a  BLEduino\n\t608b  Loctronix ASR-2300 SDR/motion sensing module\n\t608c  Fx2lafw\n\t608d  Fx2lafw\n\t608e  Fx2lafw\n\t608f  Fx2lafw\n\t6090  Fx2lafw\n\t6091  Fx2lafw\n\t6092  Fx2lafw\n\t6093  Fx2lafw\n\t6094  Fx2lafw\n\t6095  Fx2lafw\n\t6096  LightUp (sketch)\n\t6097  Tessel JavaScript enabled Microcontroller with built-in WiFi\n\t6098  RFIDler\n\t6099  RASDR Radio Astronomy SDR Rx Interface\n\t609a  RASDR Radio Astronomy SDR Tx Interface\n\t609b  RASDR Radio Astronomy SDR (bootloader)\n\t609c  antiAFK keyboard\n\t609d  PIC16F145x bootloader\n\t609e  Clyde Lamp by Fabule (bootloader)\n\t609f  Clyde Lamp by Fabule (sketch)\n\t60a0  Smoothiepanel robotic control interface\n\t60a1  Airspy\n\t60a2  barebox (DFU)\n\t60a3  keyboard (bootloader)\n\t60a4  Papilio Duo (AVR)\n\t60a5  Papilio Duo (FPGA)\n\t60a6  HydraBus/HydraNFC (bootloader)\n\t60a7  HydraBus/HydraNFC\n\t60a8  reserved\n\t60a9  Blinky Light Controller (DFU)\n\t60aa  Blinky Light Controller\n\t60ab  AllPixel\n\t60ac  OpenBLT generic microcontroller (bootloader)\n\t60ad  Clasic Gamepad Adapter (NES)\n\t60ae  Clasic Gamepad Adapter (N64)\n\t60af  Clasic Gamepad Adapter (DB9)\n\t60b0  Waterott Arduino based Clock (caterina bootloader)\n\t60b1  Drinkbot (processing)\n\t60b2  Drinkbot (OTG-tablet support)\n\t60b3  calc.pw password generator device (standard)\n\t60b4  calc.pw password generator device (enhanced)\n\t60b5  TimVideos' HDMI2USB (FX2) - Unconfigured device\n\t60b6  TimVideos' HDMI2USB (FX2) - Firmware load/upgrade\n\t60b7  TimVideos' HDMI2USB (FX2) - HDMI/DVI Capture Device\n\t60b8  TimVideos' HDMI2USB (Soft+UTMI) - Unconfigured device\n\t60b9  TimVideos' HDMI2USB (Soft+UTMI) - Firmware upgrade\n\t60ba  TimVideos' HDMI2USB (Soft+UTMI) - HDMI/DVI Capture Device\n\t60bc  Simple CC25xx programmer / serial board\n\t60bd  Open Source control interface for multimedia applications\n\t60be  Pixelmatix Aurora (bootloader)\n\t60bf  Pixelmatix Aurora\n\t60c0  Nucular Keyboard adapter\n\t60c1  BrewBit Model-T pOSHW temperature controller for homebrewers (bootloader)\n\t60c2  BrewBit Model-T pOSHW temperature controller for homebrewers\n\t60c3  X Antenna Tracker arduino board\n\t60c4  CAN bus communication device\n\t60c5  PIC16F1 bootloader\n\t60c6  USBtrng hardware random number generator\n\t60c7  Zubax GNSS positioning module for light UAV systems\n\t60c8  Xlink data transfer and control system for Commodore C64\n\t60c9  random number generator\n\t60ca  FinalKey password manager\n\t60cb  PteroDAQ Data Acquisition on FRDM-KL25Z and future boards\n\t60cc  LamDiNao\n\t60cd  Open Lighting DMX512 / RDM widget\n\t60de  Cryptech.is random number generator\n\t60df  Numato Opsis HDMI2USB board (unconfigured)\n\t60e0  Numato Opsis HDMI2USB board (JTAG Programming Mode)\n\t60e1  Numato Opsis HDMI2USB board (User Mode)\n\t60e2  Osmocom SIMtrace 2 (DFU)\n\t60e3  Osmocom SIMtrace 2\n\t60e4  3D printed racing game - (Catalina CDC bootloader)\n\t60e5  3D printed racing game\n\t60e6  replacement for GoodFET/FaceDancer - GreatFet\n\t60e7  replacement for GoodFET/FaceDancer - GreatFet target\n\t60e8  Alpen Clack keyboard\n\t60e9  keyman64 keyboard itercepter\n\t60ea  Wiggleport FPGA-based I/O board\n\t60eb  candleLight CAN adapter\n\t60ec  Duet 2 WiFi or Duet 2 Ethernet 3D printer control electronics\n\t60ed  Duet 2 Maestro 3D printer control electronics\n\t60ee  Duet 3 motion control electronics\n\t60f0  UDAD-T1 data acquisition device (boot)\n\t60f1  UDAD-T1 data acquisition device\n\t60f2  UDAD-T2 data acquisition device (boot)\n\t60f3  UDAD-T2 data acquisition device\n\t60f4  Uniti ARC motor controller\n\t60f5  EightByEight Blinky Badge (DFU)\n\t60f6  EightByEight Blinky Badge\n\t60f7  cardio NFC/RFID card reader (bootloader)\n\t60f8  cardio NFC/RFID card reader\n\t60fc  OnlyKey Two-factor Authentication and Password Solution\n\t6100  overlay64 video overlay module\n\t6104  ScopeFun open source instrumentation\n\t6108  Myriad-RF LimeSDR\n\t610c  Magic Keys (boot)\n\t610d  Magic Keys\n\t6114  MIDI key\n\t6118  Thomson MO5 keyboard\n\t6122  Ultimate Hacking Keyboard\n\t614c  dwtk In-Circuit Emulator\n\t614d  Generic Display\n\t8085  Box0 (box0-v5)\n\tcc15  rad1o badge for CCC summer camp 2015\n1d57  Xenta\n\t0005  Wireless Receiver (Keyboard and Mouse)\n\t0006  Wireless Receiver (RC Laser Pointer)\n\t000c  Optical Mouse\n\t130f  2.4Ghz wireless optical mouse receiver\n\t2400  Wireless Mouse Receiver\n\t32da  2.4GHz Receiver (Keyboard and Mouse)\n\t83d0  Click-mouse!\n\tac01  Wireless Receiver (Keyboard and Mouse)\n\tac02  ViFit Activity Tracker\n\tac08  RFID Receiver (Keyboard)\n\tad02  SE340D PC Remote Control\n\tad03  [T3] 2.4GHz and IR Air Mouse Remote Control\n\taf01  AUVIO Universal Remote Receiver for PlayStation 3\n\taf03  Wireless Receiver\n\tfa20  2.4GHz Wireless Receiver (Mini Keyboard & Mouse)\n1d5b  Smartronix, Inc.\n1d5c  Fresco Logic\n\t2000  FL2000/FL2000DX VGA/DVI/HDMI Adapter\n1d6b  Linux Foundation\n\t0001  1.1 root hub\n\t0002  2.0 root hub\n\t0003  3.0 root hub\n\t0100  PTP Gadget\n\t0101  Audio Gadget\n\t0102  EEM Gadget\n\t0103  NCM (Ethernet) Gadget\n\t0104  Multifunction Composite Gadget\n\t0105  FunctionFS Gadget\n\t0200  Qemu Audio Device\n1d88  Mahr GmbH\n\t0001  Measurement Device [MarECon]\n\t0002  Probe\n\t0003  Surface Measurement [PS10]\n1d90  Citizen\n\t201e  PPU-700\n\t2037  CL-S631 Barcode Printer\n\t20f0  Thermal Receipt Printer [CT-E351]\n1d9d  Sigma Sport\n\t1010  Docking Station Topline 2009\n\t1011  Docking Station Topline 2012\n\t1012  Docking Station Topline 2016\n1dd2  Leo Bodnar Electronics Ltd\n1dd3  Dajc Inc.\n\t0001  Expert I/O 1000\n1de1  Actions Microelectronics Co.\n\t1101  Generic Display Device (Mass storage mode)\n\tc101  Generic Display Device\n1de6  MICRORISC s.r.o.\n1df7  SDRplay\n\t2500  RSP1\n\t3000  RSP1a\n\t3010  RSP2/RSP2pro\n\t3020  RSPduo\n\t3030  RSPdx\n1e0e  Qualcomm / Option\n\tf000  iCON 210 UMTS Surfstick\n1e10  Point Grey Research, Inc.\n\t2004  Sony 1.3MP 1/3\" ICX445 IIDC video camera [Chameleon]\n1e17  Mirion Technologies Dosimetry Services Division\n\t0001  instadose dosimeter\n1e1d  Kanguru Solutions\n\t0165  Secure Pen drive\n\t1101  FlashBlu Flash Drive\n1e1f  INVIA\n1e29  Festo AG & Co. KG\n\t0101  CPX Adapter\n\t0102  CPX Adapter >=HW10.09 [CP2102]\n\t0401  iL3-TP [AT90USB646]\n\t0402  FTDI232 [EasyPort]\n\t0403  FTDI232 [EasyPort Mini]\n\t0404  FTDI232 [Netzteil-GL]\n\t0405  FTDI232 [MotorPrüfstand]\n\t0406  STM32F103 [EasyKit]\n\t0407  LPC2378 [Robotino]\n\t0408  LPC2378 [Robotino-Arm]\n\t0409  LPC2378 [Robotino-Arm Bootloader]\n\t040a  LPC2378 [Robotino Bootloader]\n\t040b  LPC2378 [Robotino XT]\n\t040c  LPC2378 [Robotino XT Bootloader]\n\t040d  LPC2378 [Robotino 3]\n\t040e  LPC2378 [Robotino 3 Bootloader]\n\t040f  LPC2148 [Robotino gripper]\n\t0410  LPC2148 [Robotino IR panel]\n\t0501  CP2102 [CMSP]\n\t0601  CMMP-AS\n\t0602  FTDI232 [CMMS]\n1e2d  Gemalto M2M GmbH\n\t004f  EGS3 GSM/GPRS modem\n\t0054  PH8 wireless module\n\t0058  Wireless Module [Cinterion EHS6]\n\t0059  Wireless Module [Cinterion BGx]\n\t005b  Zoom 4625 Modem\n\t0061  ALSx PLSx LTE modem\n\t00a0  Cinterion ELS31-V\n1e3d  Chipsbank Microelectronics Co., Ltd\n\t198a  Flash Disk\n\t2093  CBM209x Flash Drive (OEM)\n\t4082  CBM4082 SD Card Reader\n1e41  Cleverscope\n\t0001  CS328A PC Oscilloscope\n\t0004  CS448\n1e44  SHIMANO INC.\n\t7220  SM-BCR2\n1e4e  Cubeternet\n\t0100  WebCam\n\t0102  GL-UPC822 UVC WebCam\n\t0109  EtronTech CMOS based eSP570 WebCam [Onyx Titanium TC101]\n1e54  TypeMatrix\n\t2030  2030 USB Keyboard\n1e68  TrekStor GmbH & Co. KG\n\t001b  DataStation maxi g.u\n\t004c  DataStation Pocket Click\n\t0050  DataStation maxi light\n\t1045  ST70408-3 [SurfTab breeze 7.0 quad 3G] (MTP Mode)\n\t1046  ST70408-3 [SurfTab breeze 7.0 quad 3G] (PTP Mode)\n1e71  NZXT\n\t0001  Avatar Optical Mouse\n\t170e  Kraken X\n\t1711  Grid+ V3\n\t1714  Smart Device\n\t1715  Kraken M22\n\t2006  Smart Device V2\n1e74  Coby Electronics Corporation\n\t2211  MP300\n\t2647  2 GB 2 Go Video MP3 Player [MP601-2G]\n\t2659  Coby 4GB Go Video MP3 Player [MP620-4G]\n\t4641  A8705 MP3/Video Player\n\t6511  MP705-8G MP3 player\n\t6512  MP705-4G\n\t7111  MP957 Music and Video Player\n1e7b  Zurich Instruments\n\t0002  HF2\n\t0003  UHF\n\t0004  MFLI\n1e7d  ROCCAT\n\t2c24  Pyra Mouse (wired)\n\t2c2e  Lua Mouse\n\t2c38  Kiro Mouse\n\t2ced  Kone Mouse\n\t2cee  Kova 2016 Gray Mouse\n\t2cef  Kova 2016 White Mouse\n\t2cf0  Kova 2016 Black Mouse\n\t2cf6  Pyra Mouse (wireless)\n\t2d50  Kova[+] Mouse\n\t2d51  Kone[+] Mouse\n\t2d5a  Savu Mouse\n\t2db4  Kone Pure Optical Mouse\n\t2dbe  Kone Pure Mouse\n\t2dbf  Kone Pure Military Mouse\n\t2dc2  Kone Pure Optical Black Mouse\n\t2dcb  Kone Pure SE(L) Mouse\n\t2e22  Kone XTD Mouse\n\t2e23  Kone XTD Optical Mouse\n\t2e27  Kone AIMO Mouse\n\t2e4a  Tyon Black Mouse\n\t2e4b  Tyon White Mouse\n\t2e7c  Nyth Black Mouse\n\t2e7d  Nyth White Mouse\n\t2f76  Sova Keyboard\n\t2f94  Sova MK Keyboard\n\t2fa8  Suora Keyboard\n\t2fc6  Skeltr Keyboard\n\t2fda  Ryos MK FX Keyboard\n\t30d4  Arvo Keyboard\n\t3138  Ryos MK Keyboard\n\t316a  Ryos TKL Keyboard\n\t319c  Isku Keyboard\n\t31ce  Ryos MK Glow Keyboard\n\t3232  Ryos MK Pro Keyboard\n\t3246  Suora FX Keyboard\n\t3264  Isku FX Keyboard\n1e8e  Airbus Defence and Space\n\t6001  P8GR\n1e91  Other World Computing\n\tb0b1  miniStack\n1ea7  SHARKOON Technologies GmbH\n\t0030  Trust GXT 158 Orna Laser Gaming Mouse\n\t0064  2.4GHz Wireless rechargeable vertical mouse [More&Better]\n\t0066  [Mediatrack Edge Mini Keyboard]\n\t0907  Keyboard\n\t1002  Vintorez Gaming Mouse\n\t2007  SHARK ZONE K30 Illuminated Gaming Keyboard\n1eab  Fujian Newland Computer Co., Ltd\n\t0103  HR200 Barcode scanner engine (HID keyboard)\n\t0106  HR200 Barcode scanner engine (Serial CDC)\n\t0110  HR200 Barcode scanner engine (HID Pos)\n\t0c03  HR100/HR3260 cordless/HR3290 cordless/BS80 Barcode scanner engine (HID keyboard)\n\t0c06  HR100/HR3260 cordless/HR3290 cordless/BS80 Barcode scanner engine (USB Serial CDC)\n\t0c10  HR100/HR3260 cordless/HR3290 cordless/BS80 Barcode scanner engine (HID Pos)\n\t0d03  EM2028 Barcode scanner engine (HID keyboard)\n\t0d06  EM2028 Barcode scanner engine (Serial CDC)\n\t0d10  EM2028 Barcode scanner engine (HID Pos)\n\t1303  EM30xx/EM20xx/HR3260 corded/HR200C Barcode scanner engine (HID keyboard)\n\t1306  EM30xx/EM20xx/HR3260 corded/HR200C Barcode scanner engine (USB serial CDC)\n\t1310  EM30xx/EM20xx/HR3260 corded/HR200C Barcode scanner engine (HID Pos)\n\t1403  HR15-xx Barcode scanner engine (HID keyboard)\n\t1406  HR15-xx Barcode scanner engine (Serial CDC)\n\t1410  HR15-xx Barcode scanner engine (HID Pos)\n\t1603  FM100-M/3250 Barcode scanner engine (HID keyboard)\n\t1606  FM100-M/3250 Barcode scanner engine (Serial CDC)\n\t1610  FM100-M/3250 Barcode scanner engine (HID Pos)\n\t1903  EM1300 Barcode scanner engine (HID keyboard)\n\t1906  EM1300 Barcode scanner engine (Serial CDC)\n\t1910  EM1300 Barcode scanner engine (HID Pos)\n\t1a03  HR3290 corded/HR22 Barcode scanner engine (HID keyboard)\n\t1a06  HR3290 corded/HR22 Barcode scanner engine (Serial CDC)\n\t1a10  HR3290 corded/HR22 Barcode scanner engine (HID Pos)\n\t1c03  HR2150 Barcode scanner engine (HID keyboard)\n\t1c06  HR2150 Barcode scanner engine (Serial CDC)\n\t1c10  HR2150 Barcode scanner engine (HID Pos)\n\t1d03  FM430 Barcode scanner engine (HID keyboard)\n\t1d06  FM430 Barcode scanner engine (Serial CDC)\n\t1d10  FM430 Barcode scanner engine (HID Pos)\n\t1e03  HR42 Barcode scanner engine (HID keyboard)\n\t1e06  HR42 Barcode scanner engine (Serial CDC)\n\t1e10  HR42 Barcode scanner engine (HID Pos)\n\t1f03  HR11+ Barcode scanner engine (HID keyboard)\n\t1f06  HR11+ Barcode scanner engine (Serial CDC)\n\t1f10  HR11+ Barcode scanner engine (HID Pos)\n\t2003  EM2037v2 Barcode scanner engine (HID keyboard)\n\t2006  EM2037v2 Barcode scanner engine (Serial CDC)\n\t2010  EM2037v2 Barcode scanner engine (HID Pos)\n\t8003  EM13x5-LD/HR15-70/HR100-70/HR12/HR1150-70 Barcode scanner engine (HID keyboard)\n\t8006  EM13x5-LD/HR15-70/HR100-70/HR12/HR1150-70 Barcode scanner engine (USB Serial CDC)\n\t8010  EM13x5-LD/HR15-70/HR100-70/HR12/HR1150-70 Barcode scanner engine (HID Pos)\n\t8203  EM3080-01/EM3095/FR20/FM30 Barcode scanner engine (HID keyboard)\n\t8206  EM3080-01/EM3095/FR20/FM30 Barcode scanner engine (USB Serial CDC)\n\t8210  EM3080-01/EM3095/FR20/FM30 Barcode scanner engine (HID Pos)\n\t8303  HR2160 Barcode scanner engine (HID keyboard)\n\t8306  HR2160 Barcode scanner engine (Serial CDC)\n\t8310  HR2160 Barcode scanner engine (HID Pos)\n1eaf  Leaflabs\n\t0003  Maple DFU interface\n\t0004  Maple serial interface\n1eb8  Modacom Co., Ltd.\n\t7f00  MW-U3500 WiMAX adapter\n1ebb  NuCORE Technology, Inc.\n1ecb  AMTelecom\n\t02e2  JMR1140 [Jiofi]\n1ed8  FENDER MUSICAL INSTRUMENTS CORPORATION\n\t0004  Mustang I/II\n\t0005  Mustang III/IV/V\n\t0006  Mustang I/II [Firmware Update]\n\t0007  Mustang III/IV/V [Firmware Update]\n\t0010  Mustang Mini\n\t0011  Mustang Mini [Firmware Update]\n\t0014  Mustang I (V.2)\n\t0016  Mustang IV v.2\n1eda  AirTies Wireless Networks\n\t2012  Air2210 54 Mbps Wireless Adapter\n\t2210  Air2210 54 Mbps Wireless Adapter\n\t2310  Air2310 150 Mbps Wireless Adapter\n\t2410  Air2410 300 Mbps Wireless Adapter\n1edb  Blackmagic design\n\tbd3b  Intensity Shuttle\n\tbd46  Mini Converter Analog to SDI\n\tbd75  2.5K Cinema Camera (BMCC)\n1ee8  ONDA COMMUNICATION S.p.a.\n\t0014  MT833UP\n1ef6  EADS Deutschland GmbH\n\t2233  Cassidian NH90 STTE\n\t5064  FDR Interface\n\t5523  Cassidian SSDC Adapter II\n\t5545  Cassidian SSDC Adapter III\n\t5648  RIU CSMU/BSD\n\t564a  Cassidian RIU CSMU/BSD Simulator\n1f0c  CMX Systems\n\t2000  HP StreamSmart 410 [NW278AA]\n1f28  Cal-Comp\n\t0020  CDMA USB Modem A600\n\t0021  CD INSTALLER USB Device\n1f3a  Allwinner Technology\n\t1000  Prestigio PER3464B ebook reader (Mass storage mode)\n\t1002  mediacom XPRO 415\n\t1010  Android device in fastboot mode\n\tefe8  sunxi SoC OTG connector in FEL/flashing mode\n1f44  The Neat Company\n\t0001  NM-1000 scanner\n1f48  H-TRONIC GmbH\n\t0627  Data capturing system\n\t0628  Data capturing and control module\n1f4d  G-Tek Electronics Group\n\ta115  EVOLVEO XtraTV stick [DVB-T]\n\tb803  Lifeview LV5TDLX DVB-T [RTL2832U]\n\tc803  NotOnlyTV (Lifeview) LV5TDLX DVB-T [RTL2832U]\n\td220  Geniatech T220 DVB-T2 TV Stick\n1f52  Systems & Electronic Development FZCO (SEDCO)\n\t0001  Ultima 49 Printer\n\t0002  Ultima 90 Printer\n\t0003  FormsPro 50 Printer\n\t0004  Ultima 90+ Printer\n1f6f  Aliph\n\t0023  Jawbone Jambox\n\t8000  Jawbone Jambox - Updating\n1f75  Innostor Technology Corporation\n\t0611  IS611 SATA/PATA Bridge Controller\n\t0621  IS621 SATA Storage Controller\n\t0888  IS888 SATA Storage Controller\n\t0902  IS902 UFD controller\n\t0916  IS916 Flash Drive\n\t0917  IS917 Mass storage\n\t0918  IS918 Flash Drive\n1f82  TANDBERG\n\t0001  PrecisionHD Camera\n1f84  Alere, Inc.\n\t1f7e  Lateral Flow Engine\n1f87  Stantum\n\t0002  Multi-touch HID Controller\n1f9b  Ubiquiti Networks, Inc.\n\t0241  AirView2-EXT\n\tb0b1  UniFi VoIP Phone\n1fab  Samsung Opto-Electroncs Co., Ltd.\n\t104d  ES65\n1fac  Franklin Wireless\n\t0232  U770 3G/4G Wimax/4G LTE Modem\n1fae  Lumidigm\n\t0040  M311 Fingerprint Scanner\n\t212c  M30x (Mercury) fingerprint sensor\n1fb2  Withings\n\t0001  Wi-Fi Body Scale (WBS01)\n1fba  DERMALOG Identification Systems GmbH\n1fbd  Delphin Technology AG\n\t0001  Expert Key - Data acquisition system\n\t0004  MetiOS Device (RNDIS)\n\t0005  Loggito\n\t0006  LoggitoLab 8 AI-RTD\n\t0007  LoggitoLab 8 TC\n\t0008  LoggitoLab 4 AI-RTD 4 TC\n1fc9  NXP Semiconductors\n\t0003  LPC1343\n\t000c  LPC4330FET180 [ARM Cortex M4 + M0] (device firmware upgrade mode)\n\t0082  LPC4330FET180 [ARM Cortex M4 + M0] (mass storage controller mode)\n\t010b  PR533\n\t0126  i.MX 7ULP SystemOnChip in RecoveryMode\n\t012b  i.MX 8M Dual/8M QuadLite/8M Quad Serial Downloader\n\t5002  PTN5002 [Startech VGA/DVI-D adapter]\n\t8124  SharkRF Bootloader\n\t824c  LumiNode1\n1fde  ILX Lightwave Corporation\n\t0001  UART Bridge\n1fe7  Vertex Wireless Co., Ltd.\n\t1000  VW100 series CDMA EV-DO Rev.A modem\n1ff7  CVT Electronics.Co.,Ltd\n\t0013  CVTouch Screen (HID)\n\t001a  Human Interface Device\n1ffb  Pololu Corporation\n\t0081  AVR Programmer\n\t0083  Jrk 21v3 Motor Controller\n\t0089  Micro Maestro 6-Servo Controller\n\t008a  Mini Maestro 12-Channel Servo Controller\n\t008b  Mini Maestro 18-Channel Servo Controller\n\t008c  Mini Maestro 24-Channel Servo Controller\n\t00b0  AVR Programmer v2\n1fff  Ideofy Inc.\n2000  CMX Systems\n\t1f0c  HP StreamSmart 410 [NW278AA]\n2001  D-Link Corp.\n\t0001  DWL-120 WIRELESS ADAPTER\n\t0201  DHN-120 10Mb Home Phoneline Adapter\n\t1a00  DUB-E100 Fast Ethernet Adapter(rev.A) [ASIX AX88172]\n\t1a02  DUB-E100 Fast Ethernet Adapter(rev.C1) [ASIX AX88772]\n\t200c  10/100 Ethernet\n\t3101  DWA-182 AC1200 DB Wireless Adapter(rev.A1) [Broadcom BCM43526]\n\t3200  DWL-120 802.11b Wireless Adapter(rev.E1) [Atmel at76c503a]\n\t3301  DWA-130 802.11n Wireless N Adapter(rev.C1) [Realtek RTL8192U]\n\t3306  DWL-G122 Wireless Adapter(rev.F1) [Realtek RTL8188SU]\n\t3308  DWA-121 802.11n Wireless N 150 Pico Adapter [Realtek RTL8188CUS]\n\t3309  DWA-135 802.11n Wireless N Adapter(rev.A1) [Realtek RTL8192CU]\n\t330a  DWA-133 802.11n Wireless N Adapter [Realtek RTL8192CU]\n\t330d  DWA-131 802.11n Wireless N Nano Adapter (rev.B1) [Realtek RTL8192CU]\n\t330f  DWA-125 Wireless N 150 Adapter(rev.D1) [Realtek RTL8188ETV]\n\t3310  DWA-123 Wireless N 150 Adapter (rev.D1)\n\t3314  DWA-171 AC600 DB Wireless Adapter(rev.A1) [Realtek RTL8811AU]\n\t3315  DWA-182 Wireless AC Dualband Adapter(rev.C) [Realtek RTL8812AU]\n\t3317  DWA-137 Wireless N High-Gain Adapter [Ralink RT5372]\n\t3319  DWA-131 Wireless N Nano Adapter (Rev. E1) [Realtek RTL8192EU]\n\t3500  Elitegroup Computer Systems WLAN card WL-162\n\t3700  DWL-122 802.11b [Intersil Prism 3]\n\t3701  DWL-G120 Spinnaker 802.11g [Intersil ISL3886]\n\t3702  DWL-120 802.11b Wireless Adapter(rev.F) [Intersil ISL3871]\n\t3703  AirPlus G DWL-G122 Wireless Adapter(rev.A1) [Intersil ISL3880]\n\t3704  AirPlus G DWL-G122 Wireless Adapter(rev.A2) [Intersil ISL3887]\n\t3705  AirPlus G DWL-G120 Wireless Adapter(rev.C) [Intersil ISL3887]\n\t3761  IEEE 802.11g USB2.0 Wireless Network Adapter-PN\n\t3a00  DWL-AG132 [Atheros AR5523]\n\t3a01  DWL-AG132 (no firmware) [Atheros AR5523]\n\t3a02  DWL-G132 [Atheros AR5523]\n\t3a03  DWL-G132 (no firmware) [Atheros AR5523]\n\t3a04  DWL-AG122 [Atheros AR5523]\n\t3a05  DWL-AG122 (no firmware) [Atheros AR5523]\n\t3a80  AirPlus Xtreme G DWL-G132 Wireless Adapter\n\t3a81  predator Bootloader Download\n\t3a82  AirPremier AG DWL-AG132 Wireless Adapter\n\t3a83  predator Bootloader Download\n\t3b00  AirPlus DWL-120+ Wireless Adapter [Texas Instruments ACX100USB]\n\t3b01  WLAN Boot Device\n\t3c00  AirPlus G DWL-G122 Wireless Adapter(rev.B1) [Ralink RT2571]\n\t3c01  AirPlus AG DWL-AG122 Wireless Adapter\n\t3c02  AirPlus G DWL-G122 Wireless Adapter\n\t3c05  DUB-E100 Fast Ethernet Adapter(rev.B1) [ASIX AX88772]\n\t3c15  DWA-140 RangeBooster N Adapter(rev.B3) [Ralink RT5372]\n\t3c17  DWA-123 Wireless N 150 Adapter(rev.A1) [Ralink RT3370]\n\t3c19  DWA-125 Wireless N 150 Adapter(rev.A3) [Ralink RT5370]\n\t3c1a  DWA-160 802.11abgn Xtreme N Dual Band Adapter(rev.B2) [Ralink RT5572]\n\t3c1b  DWA-127 Wireless N 150 High-Gain Adapter(rev.A1) [Ralink RT3070]\n\t3c1e  DWA-125 Wireless N 150 Adapter(rev.B1) [Ralink RT5370]\n\t4000  DSB-650C Ethernet [klsi]\n\t4001  DSB-650TX Ethernet [pegasus]\n\t4002  DSB-650TX Ethernet [pegasus]\n\t4003  DSB-650TX-PNA Ethernet [pegasus]\n\t400b  10/100 Ethernet\n\t4102  10/100 Ethernet\n\t4a00  DUB-1312 Gigabit Ethernet Adapter\n\t5100  DSL-200 ADSL ATM Modem\n\t5102  DSL-200 ADSL Loader\n\t5b00  Remote NDIS Network Device\n\t9414  Cable Modem\n\t9b00  Broadband Cable Modem Remote NDIS Device\n\tabc1  DSB-650 Ethernet [pegasus]\n\tf013  DLink 7 port USB2.0 Hub\n\tf103  DUB-H7 7-port USB 2.0 hub\n\tf10d  Accent Communications Modem\n\tf110  DUB-AV300 A/V Capture\n\tf111  DBT-122 Bluetooth adapter\n\tf112  DUB-T210 Audio Device\n\tf116  Formosa 2\n\tf117  Formosa 3\n\tf118  Formosa 4\n2002  DAP Technologies\n2003  detectomat\n\tea61  dc3500\n2006  LenovoMobile\n2009  iStorage\n\t5004  datAshur 4GB\n\t5016  datAshur 16GB\n\t5032  datAshur 32GB\n200c  Reloop\n\t100b  Play audio soundcard\n2013  PCTV Systems\n\t0242  QuatroStick 510e\n\t0245  PCTV 73ESE\n\t0246  PCTV 74E\n\t0248  PCTV 282E\n\t024c  DVB-S2 Stick 460e\n\t024f  nanoStick T2 290e\n\t0251  QuatroStick nano 520e\n\t0258  DVB-S2 Stick 461e\n\t025a  AndroiDTV 78e\n\t025f  tripleStick 292e\n\t0262  microStick 79e\n2018  Deutsche Telekom AG\n\t0406  Eumex 800\n\t0408  Eumex 800\n2019  PLANEX\n\t3220  GW-US11S WLAN [Atmel AT76C503A]\n\t4901  GW-USSuper300 802.11bgn Wireless Adapter [Realtek RTL8191SU]\n\t4903  GW-USFang300 802.11abgn Wireless Adapter [Realtek RTL8192DU]\n\t4904  GW-USUltra300 802.11abgn Wireless Adapter [Realtek RTL8192DU]\n\t5303  GW-US54GXS 802.11bg\n\t5304  GWUS300 802.11n\n\tab01  GW-US54HP\n\tab24  GW-US300MiniS\n\tab25  GW-USMini2N 802.11n Wireless Adapter [Ralink RT2870]\n\tab28  GW-USNano\n\tab29  GW-USMicro300\n\tab2a  GW-USNano2 802.11n Wireless Adapter [Realtek RTL8188CUS]\n\tab2b  GW-USEco300 802.11bgn Wireless Adapter [Realtek RTL8192CU]\n\tab2c  GW-USDual300 802.11abgn Wireless Adapter [Realtek RTL8192DU]\n\tab50  GW-US54Mini2\n\tc002  GW-US54SG\n\tc007  GW-US54GZL\n\ted02  GW-USMM\n\ted06  GW-US300MiniW 802.11bgn Wireless Adapter\n\ted10  GW-US300Mini2\n\ted14  GW-USMicroN\n\ted16  GW-USMicroN2W 802.11bgn Wireless Adapter [Realtek RTL8188SU]\n\ted17  GW-USValue-EZ 802.11n Wireless Adapter [Realtek RTL8188CUS]\n\ted18  GW-USHyper300 / GW-USH300N 802.11bgn Wireless Adapter [Realtek RTL8191SU]\n201e  Haier\n\t2009  CE100 CDMA EVDO\n203a  PARALLELS\n203d  Encore Electronics Inc.\n\t1480  ENUWI-N3 [802.11n Wireless N150 Adapter]\n2040  Hauppauge\n\t0265  WinTV-dualHD DVB\n\t026d  WinTV-dualHD ATSC\n\t0c80  Windham\n\t0c90  Windham\n\t1605  WinTV-HVR 930C HD\n\t1700  CataMount\n\t1800  Okemo A\n\t1801  Okemo B\n\t2000  Tiger Minicard\n\t2009  Tiger Minicard R2\n\t200a  Tiger Minicard\n\t2010  Tiger Minicard\n\t2011  WinTV MiniCard [Dell Digital TV Receiver]\n\t2019  Tiger Minicard\n\t2400  WinTV PVR USB2 (Model 24019)\n\t4200  WinTV\n\t4700  WinTV Nova-S-USB2\n\t4902  HD PVR\n\t4903  HS PVR\n\t4982  HD PVR\n\t5500  Windham\n\t5510  Windham\n\t5520  Windham\n\t5530  Windham\n\t5580  Windham\n\t5590  Windham\n\t6500  WinTV HVR-900\n\t6502  WinTV HVR-900\n\t6503  WinTV HVR-930\n\t6513  WinTV HVR-950/HVR-980\n\t6600  WinTV HVR-900H (Model 660xx)\n\t7050  Nova-T Stick\n\t7060  Nova-T Stick 2\n\t7070  Nova-T Stick 3\n\t7240  WinTV HVR-850\n\t8400  WinTV Nova-T-500\n\t9300  WinTV NOVA-T USB2 (cold)\n\t9301  WinTV NOVA-T USB2 (warm)\n\t9941  WinTV Nova-T-500\n\t9950  WinTV Nova-T-500\n\tb123  WinTV-HVR-955Q\n\tb138  WinTV-HVR-900 model 00246 [WinTV-T Video]\n\tb910  Windham\n\tb980  Windham\n\tb990  Windham\n\tc000  Windham\n\tc010  Windham\n2047  Texas Instruments\n\t0013  MSP eZ-FET lite\n\t0014  MSP-FET\n\t0200  MSP430 Bootloader\n\t0203  eZ-FET Bootloader\n\t0204  MSP-FET Bootloader\n\t0300  MSP430 CDC Example\n\t0301  MSP430 HID Datapipe Example\n\t0302  MSP430 CDC+HID Example\n\t0309  MSP430 HID Mouse Example\n\t0313  MSP430 CDC+CDC Example\n\t0314  MSP430 HID+HID Example\n\t0315  MSP430 HID Keyboard Example\n\t0316  MSP430 MSC File System Emulation Example\n\t0317  MSP430 MSC SD Card Example\n\t0318  MSP430 MSC Multiple LUNs Example\n\t0319  MSP430 MSC+CDC+HID Example\n\t0320  MSP430 SYSBIOS Tasks MSC+CDC+HID Example\n\t0321  MSP430 SYSBIOS SWIs MSC+CDC+HID Example\n\t0322  MSP430 MSC Double-Buffering Example\n\t0323  MSP430 MSC CD-ROM Example\n\t03df  MSP430 User Experiment\n\t03e0  MSP430 User Experiment\n\t03e1  MSP430 User Experiment\n\t03e2  MSP430 User Experiment\n\t03e3  MSP430 User Experiment\n\t03e4  MSP430 User Experiment\n\t03e5  MSP430 User Experiment\n\t03e6  MSP430 User Experiment\n\t03e7  MSP430 User Experiment\n\t03e8  MSP430 User Experiment\n\t03e9  MSP430 User Experiment\n\t03ea  MSP430 User Experiment\n\t03eb  MSP430 User Experiment\n\t03ec  MSP430 User Experiment\n\t03ed  MSP430 User Experiment\n\t03ee  MSP430 User Experiment\n\t03ef  MSP430 User Experiment\n\t03f0  MSP430 User Experiment\n\t03f1  MSP430 User Experiment\n\t03f2  MSP430 User Experiment\n\t03f3  MSP430 User Experiment\n\t03f4  MSP430 User Experiment\n\t03f5  MSP430 User Experiment\n\t03f6  MSP430 User Experiment\n\t03f7  MSP430 User Experiment\n\t03f8  MSP430 User Experiment\n\t03f9  MSP430 User Experiment\n\t03fa  MSP430 User Experiment\n\t03fb  MSP430 User Experiment\n\t03fc  MSP430 User Experiment\n\t03fd  MSP430 User Experiment\n\t0401  MSP430 Keyboard Example\n\t0855  Invensense Embedded MotionApp HID Sensor\n\t08f8  FDC2x14/LDC13xx/LDC16xx EVM\n\t0964  Inventio Software MSP430\n\t0a76  GEOKON S-3810A-5 USB-RS485 CONVERTER\n\tffe7  HID v1.00 Device [Improv Device]\n2058  Nano River Technology\n\t2058  ViperBoard I2C, SPI, GPIO interface\n2077  Taicang T&W Electronics Co. Ltd\n\t9002  W1M100 HSPA/WCDMA Module\n2080  Barnes & Noble\n\t0001  nook\n\t0002  NOOKcolor\n\t0003  NOOK Simple Touch\n\t0004  NOOK Tablet\n\t0005  BNTV600 [Nook HD+]\n\t0006  BNTV400 [Nook HD]\n\t0007  BNRV500 [Nook Glowlight]\n\t000a  BNRV510 [Nook Glowlight Plus]\n\t000b  BNRV520 [Nook Glowlight 3]\n\t000c  BNRV700 [Nook Glowlight Plus]\n2086  SIMPASS\n2087  Cando\n\t0a01  Multi Touch Panel\n\t0a02  Multi Touch Panel\n\t0b03  Multi Touch Panel\n20a0  Clay Logic\n\t0006  flirc\n\t4107  GPF Crypto Stick V1.2\n\t4108  Nitrokey Pro\n\t4109  Nitrokey Storage\n\t4123  IKALOGIC SCANALOGIC 2\n\t414a  MDE SPI Interface\n\t415a  OpenPilot\n\t415b  CopterControl\n\t415c  PipXtreme\n\t41e5  BlinkStick\n\t4211  Nitrokey Start\n\t4223  ATSAMD21 [castAR]\n\t4230  Nitrokey HSM\n\t4287  Nitrokey FIDO U2F\n\t428d  Electrosense wideband converter\n\t42b1  Nitrokey FIDO2\n\t42b2  Nitrokey 3A Mini/3A NFC/3C NFC\n\t42b4  Nitrokey Pro Bootloader\n\t42da  MuteMe\n\t42dd  Nitrokey 3A NFC Bootloader/3C NFC Bootloader\n\t42e8  Nitrokey 3A Mini Bootloader\n\t42ec  RP2040 [PicoWifi]\n20b1  XMOS Ltd\n\t10ad  XUSB Loader\n\tf7d1  XTAG2 - JTAG Adapter\n20b3  Hanvon\n\t0a18  10.1 Touch screen overlay\n20b7  Qi Hardware\n\t0713  Milkymist JTAG/serial\n\t1540  ben-wpan, AT86RF230-based\n\t1db5  IDBG in DFU mode\n\t1db6  IDBG in normal mode\n\t9db1  Glasgow Debug Tool\n\tc25b  C2 Dongle\n\tcb72  ben-wpan, cntr\n20bc  ShenZhen ShanWan Technology Co., Ltd.\n\t5500  Frostbite controller\n20ce  Minicircuits\n\t0012  RF Sythesizer 250-4200MHz model SSG-4000LH\n\t0021  RF Switch Matrix\n\t0022  I/O Controller\n20df  Simtec Electronics\n\t0001  Entropy Key [UDEKEY01]\n20f0  L3Harris Technologies\n\t2102  EWLA V2 Module\n20f1  NET New Electronic Technology GmbH\n\t0101  iCube3 Camera\n20f4  TRENDnet\n\t646b  TEW-646UBH High Power 150Mbps Wireless N Adapter [Realtek RTL8188SU]\n\t648b  TEW-648UBM 802.11n 150Mbps Micro Wireless N Adapter [Realtek RTL8188CUS]\n\t664b  TEW-664UB H/W:V2.0R\n\t804b  TEW-804UB 802.11a/b/g/n/ac (1x1) Wireless Adapter [Realtek RTL8811AU]\n\t805b  TEW-805UB 300Mbps+867Mbps Wireless AC Adapter [Realtek RTL8812AU]\n\t806b  TEW-806UBH 802.11a/b/g/n/ac (1x1) Wireless Adapter [MediaTek MT7610U]\n20f7  XIMEA\n\t3001  MQ or MD camera\n\t3002  MU camera\n\t3021  MJ camera\n\t30b3  MQ in U3V mode or MC camera\n\ta003  MU camera\n2100  RT Systems\n\t0e56  USB62C Radio Cable [Yaesu 857/D - 897/D]\n\t9e50  USB-59 Radio Cable [Yaesu VX-8/D/DR]\n\t9e52  Yaesu VX-7\n\t9e54  CT29B Radio Cable\n\t9e57  RTS01 Radio Cable\n\t9e58  USB63C Radio Cable [Yaesu FTDX-1200]\n\t9e5d  K4Y Radio Cable\n\t9e5f  FT232RL [RTS05 Serial Cable]\n2101  ActionStar\n\t0201  SIIG 4-to-2 Printer Switch\n\t1402  Keyboard/Mouse Switch\n2104  Tobii Technology AB\n\t0050  Eye tracker [EYEX2]\n\t0124  Eyechip\n2107  RDING TECH CO.,LTD\n2109  VIA Labs, Inc.\n\t0210  Hub\n\t0700  VL700 SATA 3Gb/s bridge\n\t0701  VL701 SATA 3Gb/s bridge\n\t0711  VL711 SATA 6Gb/s bridge\n\t0715  VL817 SATA Adaptor\n\t0810  VL81x Hub\n\t0811  Hub\n\t0812  VL812 Hub\n\t0813  VL813 Hub\n\t0820  VL820 Hub\n\t2210  Hub\n\t2811  Hub\n\t2812  VL812 Hub\n\t2813  VL813 Hub\n\t2820  VL820 Hub\n\t3431  Hub\n\t711f  External\n\t8110  Hub\n2113  Softkinetic\n\t0137  DepthSense 311 (3D)\n\t0145  DepthSense 325\n\t8000  DepthSense 311 (Color)\n2116  KT Tech\n\t000a  IDE Hard Drive Enclosure\n211f  CELOT Corporation\n\t6801  CDMA Products\n2123  Cheeky Dream\n\t1010  Rocket Launcher\n2125  Fiberpro Inc.\n\t0000  Bootloader\n\t0010  MCB-100 Series\n2133  signotec GmbH\n\t0001  LCD Signature Pad Sigma\n\t0018  Delta Pen\n\t0019  Delta Touch\n\t001c  Kronos Pen\n\t0022  Epsilon Pen\n2149  Advanced Silicon S.A.\n\t211b  Touchscreen Controller\n\t2306  TS58xxA/TC56xxA [CoolTouch]\n\t2703  TS58xxA/TC56xxA [CoolTouch]\n214b  Huasheng Electronics\n\t7000  4-port hub [Maxxter ACT-HUB2-4P, HS8836, iSoul ultra-slim]\n214e  Swiftpoint\n\t0005  Z - Gaming mouse [SM700]\n2162  Broadxent (Creative Labs)\n\t2031  Network Blaster Wireless Adapter\n\t500c  DE5771 Modem Blaster\n\t8001  Broadxent BritePort DSL Bridge 8010U\n2166  JVC Kenwood\n\t600b  TH-D74\n2184  GW Instek\n\t0005  GDS-3000 Oscilloscope\n\t0006  GDS-3000 Oscilloscope\n\t0011  AFG Function Generator (CDC)\n\t0017  DSO\n\t0018  DSO\n\t0036  AFG-125 Function Generator (CDC)\n2188  No brand\n\t0610  Hub\n\t0611  Hub\n\t0620  Hub\n\t0625  Hub\n\t0754  Card Reader\n\t4042  CalDigit Pro Audio\n219c  Seal One AG\n\t0010  USB 2200 K Secure Sign Token\n21a1  Emotiv Systems Pty. Ltd.\n\t0001  EPOC Consumer Headset Wireless Dongle\n21a4  Electronic Arts Inc.\n\tac27  SPORTS Active 2 Wireless Controller for PS3\n\tac40  SPORTS Active 2 Wireless Controller for Wii\n21a9  Saleae, Inc.\n\t1001  16-channel Logic Analyzer [Logic16]\n\t1003  Logic 4\n\t1004  Logic8\n\t1005  Logic Pro 8\n\t1006  Logic Pro 16\n21ab  Planeta Informatica\n\t0010  RC700 NFC SmartCard Reader\n\t0011  DSR700 SmartCard Reader\n21b4  AudioQuest\n\t0081  DragonFly\n\t0082  DragonFly Red\n21d6  Agecodagis SARL\n\t0002  Seismic recorder [Tellus]\n2207  Fuzhou Rockchip Electronics Company\n\t0010  GoClever Tab R83\n\t0011  SmartTab\n\t281a  RK2818 in Mask ROM mode\n\t290a  RK2918 in Mask ROM mode\n\t292a  RK2928 in Mask ROM mode\n\t292c  RK3026 in Mask ROM mode\n\t300a  RK3066 in Mask ROM mode\n\t300b  RK3168 in Mask ROM mode\n\t301a  RK3036 in Mask ROM mode\n\t310a  RK3066B in Mask ROM mode\n\t310b  RK3188 in Mask ROM mode\n\t310c  RK3126/RK3128 in Mask ROM mode\n\t310d  RK3126 in Mask ROM mode\n\t320a  RK3288 in Mask ROM mode\n\t320b  RK3228/RK3229 in Mask ROM mode\n\t320c  RK3328 in Mask ROM mode\n\t330a  RK3368 in Mask ROM mode\n\t330c  RK3399 in Mask ROM mode\n221a  ZTEX GmbH\n\t0100  FPGA Boards\n2222  MacAlly\n\t0004  iWebKey Keyboard\n\t0005  ICEKey Keyboard\n\t1001  Generic Hub\n\t2520  Mini Tablet\n\t4050  AirStick joystick\n2226  Copper Mountain technologies\n2227  SAMWOO Enterprise\n\t3105  SKYDATA SKD-U100\n222a  ILI Technology Corp.\n\t0001  Multi-Touch Screen\n\t0037  Multi-Touch Screen\n2230  Plugable\n\t0001  UD-160-A / M Integrated Hub\n\t0003  DC-125 / M Integrated Hub\n2232  Silicon Motion\n\t1005  WebCam SCB-0385N\n\t1024  Webcam SC-13HDL11624N [Namuga Co., Ltd.]\n\t1028  WebCam SC-03FFL11939N\n\t1029  WebCam SC-13HDL11939N\n\t1037  WebCam SC-03FFM12339N\n\t1045  WebCam SC-10HDP12631N\n2233  RadioShack Corporation\n\t6323  USB Electronic Scale\n2237  Kobo Inc.\n\t4161  eReader White\n\t4163  Touch\n\t4173  Glo\n2245  Aspeed Technology, Inc.\n\t1500  AST1500/1510 PC-over-LAN Virtual Hub\n224f  APDM\n\t0001  Access Point\n\t0002  Docking Station\n\t0004  V2 Opal ACM\n\t0005  V2 Opal\n\t0006  V2 Docking Station\n\t0007  V2 Access Point ACM\n\t0008  V2 Access Point\n2256  Faderfox\n\t1007  LV3 MIDI Controller\n225d  Morpho\n\t0001  FINGER VP Multimodal Biometric Sensor\n\t0008  CBM-E3 Fingerprint Sensor\n\t0009  CBM-V3 Fingerprint Sensor\n\t000a  MSO1300-E3 Fingerprint Sensor\n\t000b  MSO1300-V3 Fingerprint Sensor\n\t000c  MSO1350-E3 Fingerprint Sensor & SmartCard Reader\n\t000d  MSO1350-V3 Fingerprint Sensor & SmartCard Reader\n\t000e  MorphoAccess SIGMA Biometric Access Control Terminal\n\t9015  Tablet 2\n\t9024  Tablet 2\n\t9039  Tablet 2 secure multifunction biometric tablet\n\t904d  Tablet 2 secure multifunction biometric tablet\n\t904e  Tablet 2 secure multifunction biometric tablet\n\t9091  Tablet 2 secure multifunction biometric tablet\n\t9092  Tablet 2 secure multifunction biometric tablet\n\tf000  Tablet 2 secure multifunction biometric tablet\n\tf003  Tablet 2 secure multifunction biometric tablet\n\tf006  Tablet 2 secure multifunction biometric tablet\n\tf00e  Tablet 2 secure multifunction biometric tablet\n226e  DISPLAX\n228d  8D Technologies inc.\n\t0001  Terminal Bike Key Reader\n22a4  VERZO Technology\n22a6  Pie Digital, Inc.\n\tffff  PieKey \"beta\" 4GB model 4E4F41482E4F5247 (SM3251Q BB)\n22a7  Fortinet Technologies\n\t1001  FortiGate Device\n22b1  Secret Labs LLC\n\t1000  Netduino MCU pcb\n22b8  Motorola PCS\n\t0001  Wally 2.2 chipset\n\t0002  Wally 2.4 chipset\n\t0005  V.60c/V.60i GSM Phone\n\t002e  XT1806\n\t0830  2386C-HT820\n\t0833  2386C-HT820 [Flash Mode]\n\t0850  Bluetooth Device\n\t1001  Patriot 1.0 (GSM) chipset\n\t1002  Patriot 2.0 chipset\n\t1005  T280e GSM/GPRS Phone\n\t1101  Patriot 1.0 (TDMA) chipset\n\t1801  Rainbow chipset flash\n\t2035  Bluetooth Device\n\t2805  GSM Modem\n\t2821  T720 GSM Phone\n\t2822  V.120e GSM Phone\n\t2823  Flash Interface\n\t2a01  MSM6050 chipset\n\t2a02  CDMA modem\n\t2a03  MSM6050 chipset flash\n\t2a21  V710 GSM Phone (P2K)\n\t2a22  V710 GSM Phone (AT)\n\t2a23  MSM6100 chipset flash\n\t2a41  MSM6300 chipset\n\t2a42  Usb Modem\n\t2a43  MSM6300 chipset flash\n\t2a61  E815 GSM Phone (P2K)\n\t2a62  E815 GSM Phone (AT)\n\t2a63  MSM6500 chipset flash\n\t2a81  MSM6025 chipset\n\t2a83  MSM6025 chipset flash\n\t2ac1  MSM6100 chipset\n\t2ac3  MSM6100 chipset flash\n\t2d78  XT300[SPICE]\n\t2e82  XT1541 [Moto G 3rd Gen]\n\t2e83  XT1033 [Moto G], PTP mode\n\t3001  A835/E1000 GSM Phone (P2K)\n\t3002  A835/E1000 GSM Phone (AT)\n\t3801  C350L/C450 (P2K)\n\t3802  C330/C350L/C450/EZX GSM Phone (AT)\n\t3803  Neptune LT chipset flash\n\t4001  OMAP 1.0 chipset\n\t4002  A920/A925 UMTS Phone\n\t4003  OMAP 1.0 chipset flash\n\t4008  OMAP 1.0 chipset RDL\n\t41d6  Droid X (Windows media mode)\n\t41d9  Droid/Milestone\n\t41db  Droid/Milestone (Debug mode)\n\t41de  Droid X (PC mode)\n\t4204  MPx200 Smartphone\n\t4214  MPc GSM\n\t4224  MPx220 Smartphone\n\t4234  MPc CDMA\n\t4244  MPx100 Smartphone\n\t4285  Droid X (Mass storage)\n\t42d9  XT910 [Droid RAZR]\n\t4801  Neptune LTS chipset\n\t4803  Neptune LTS chipset flash\n\t4810  Triplet GSM Phone (storage)\n\t4901  Triplet GSM Phone (P2K)\n\t4902  Triplet GSM Phone (AT)\n\t4903  Neptune LTE chipset flash\n\t4a01  Neptune LTX chipset\n\t4a03  Neptune LTX chipset flash\n\t4a32  L6-imode Phone\n\t5801  Neptune ULS chipset\n\t5803  Neptune ULS chipset flash\n\t5901  Neptune VLT chipset\n\t5903  Neptune VLT chipset flash\n\t6001  Dalhart EZX\n\t6003  Dalhart flash\n\t6004  EZX GSM Phone (CDC Net)\n\t6006  MOTOROKR E6\n\t6008  Dalhart RDL\n\t6009  EZX GSM Phone (P2K)\n\t600a  Dalhart EZX config 17\n\t600b  Dalhart EZX config 18\n\t600c  EZX GSM Phone (USBLAN)\n\t6021  JUIX chipset\n\t6023  JUIX chipset flash\n\t6026  Flash RAM Downloader/miniOS\n\t6027  USBLAN\n\t604c  EZX GSM Phone (Storage)\n\t6101  Talon integrated chipset\n\t6401  Argon chipset\n\t6403  Argon chipset flash\n\t6411  ROKR Z6 (print mode)\n\t6415  ROKR Z6 (MTP mode)\n\t6422  ROKR Z6 (modem mode)\n\t6426  ROKR Z6 (storage mode)\n\t6604  Washington CDMA Phone\n\t6631  CDC Modem\n\t7001  Q Smartphone\n\t7086  Atrix\n\t70a8  Xoom Tablet\n\tfe01  StarTAC III MS900\n22b9  eTurboTouch Technology, Inc.\n\t0006  Touch Screen\n22ba  Technology Innovation Holdings, Ltd\n\t0108  Double Shock Steering Wheel HID\n\t0109  Double Shock Steering Wheel Hub\n22c9  StepOver GmbH\n\t0601  naturaSign Pad Colour\n\t0701  naturaSign Pad Mobile\n\t0801  naturaSign Pad Comfort\n\t0881  naturaSign Pad Flawless\n\t0901  naturaSign Pad Classic\n\t09e1  naturaSign Pad Biometric\n\t0ce1  duraSign Pad Brilliance\n\t0cf1  duraSign Pad Biometric 5.0\n\t0d01  duraSign 10.0\n\t0df1  duraSign Pad Biometric 10.0\n22cd  Kinova Robotics Inc.\n22d4  Laview Technology\n\t1301  Mionix NAOS 8200 [STM32F103 MCU]\n\t1308  Mionix Avior 7000\n\t130c  Mionix Naos 7000\n\t1316  Mionix Castor\n22d9  OPPO Electronics Corp.\n\t2765  Oppo N1\n\t2767  Oppo Find 5 (X909)\n22db  Phase One\n\t0003  IQ3 100MP IG030372\n22dc  Mellanox Technologies\n\t0004  BlueField SOC\n22de  WeTelecom Incorporated\n22df  Medicom MTD, Ltd\n22e0  secunet Security Networks AG\n\t0002  SINA Flash Drive\n\t0003  SINA ID Token A\n22e8  Cambridge Audio\n\t6512  651N Audio\n\t6969  Audio Prototype\n\t7512  751R Audio\n\t770a  X70A Audio\n\t850c  851C Audio [Azur 850C]\n\t851d  851D Audio [Azur 851D]\n\tca02  Audio\n\tca04  Audio\n\tca06  AmpMagic\n\tdac2  DacMagic Plus\n\tdac3  Azur DacMagic 100\n\tdac4  Azur DacMagic 100\n\tdac6  DacMagicXS 2.0\n\tdac8  Audio\n2304  Pinnacle Systems, Inc.\n\t0109  Studio PCTV USB (SECAM)\n\t0110  Studio PCTV USB (PAL)\n\t0111  Miro PCTV USB\n\t0112  Studio PCTV USB (NTSC) with FM radio\n\t0201  Systems MovieBox Device\n\t0204  MovieBox USB_B\n\t0205  DVC 150B\n\t0206  Systems MovieBox Deluxe Device\n\t0207  Dazzle DVC90 Video Device\n\t0208  Studio PCTV USB2\n\t020e  PCTV 200e\n\t020f  PCTV 400e BDA Device\n\t0210  Studio PCTV USB (PAL) with FM radio\n\t0212  Studio PCTV USB (NTSC)\n\t0213  500-USB Device\n\t0214  Studio PCTV USB (PAL) with FM radio\n\t0216  PCTV 60e\n\t0219  PCTV 260e\n\t021a  Dazzle DVC100 Audio Device\n\t021b  Dazzle DVC130/DVC170\n\t021d  Dazzle DVC130\n\t021e  Dazzle DVC170\n\t021f  PCTV Sat HDTV Pro BDA Device\n\t0222  PCTV Sat Pro BDA Device\n\t0223  DazzleTV Sat BDA Device\n\t0225  Remote Kit Infrared Transceiver\n\t0226  PCTV 330e\n\t0227  PCTV for Mac, HD Stick\n\t0228  PCTV DVB-T Flash Stick\n\t0229  PCTV Dual DVB-T 2001e\n\t022a  PCTV 160e\n\t022b  PCTV 71e [Afatech AF9015]\n\t0232  PCTV 170e\n\t0236  PCTV 72e [DiBcom DiB7000PC]\n\t0237  PCTV 73e [DiBcom DiB7000PC]\n\t023a  PCTV 801e\n\t023b  PCTV 801e SE\n\t023d  PCTV 340e\n\t023e  PCTV 340e SE\n\t0300  Studio Linx Video input cable (NTSC)\n\t0301  Studio Linx Video input cable (PAL)\n\t0302  Dazzle DVC120\n\t0419  PCTV Bungee USB (PAL) with FM radio\n\t061d  PCTV Deluxe (NTSC) Device\n\t061e  PCTV Deluxe (PAL) Device\n\t2304  1689\n2309  TimeLink Technology Co., Ltd\n\t1001  Touch Device(hid)\n\t1005  Touch Device\n\t1006  Touch Device(2)\n\t1007  MulTouch Device(hid)\n\t1009  Touch Device(hid)\n230d  Teracom\n\t0103  Huwaii 3g wireless modem\n2314  INQ Mobile\n2318  Shining Technologies, Inc. [hex]\n\t0011  CitiDISK Jr. IDE Enclosure\n2319  Tronsmart\n\t0014  TSM01 Air Mouse + Keyboard\n232b  Pantum Ltd.\n\t0810  P2000\n232e  EA Elektro-Automatik GmbH & Co. KG\n\t0010  EA-PS-2000 B Series Power Supply\n2340  Teleepoch\n2341  Arduino SA\n\t0001  Uno (CDC ACM)\n\t0010  Mega 2560 (CDC ACM)\n\t0036  Leonardo Bootloader\n\t003b  Serial Adapter (CDC ACM)\n\t003d  Due Programming Port\n\t003e  Due\n\t003f  Mega ADK (CDC ACM)\n\t0042  Mega 2560 R3 (CDC ACM)\n\t0043  Uno R3 (CDC ACM)\n\t0044  Mega ADK R3 (CDC ACM)\n\t0045  Serial R3 (CDC ACM)\n\t0049  ISP\n\t8036  Leonardo (CDC ACM, HID)\n\t8038  Robot Control Board (CDC ACM, HID)\n\t8039  Robot Motor Board (CDC ACM, HID)\n2349  P2 Engineering Group, LLC\n234b  Free Software Initiative of Japan\n\t0000  Gnuk Token\n\t0001  NeuG True RNG\n2357  TP-Link\n\t0005  M7350 4G Mi-Fi Router\n\t0100  TL-WN8200ND [Realtek RTL8192CU]\n\t0101  RTL8812AU Archer T4U 802.11ac\n\t0103  Archer T4UH wireless Realtek 8812AU\n\t0105  Archer T1U 802.11a/n/ac Wireless Adapter [MediaTek MT7610U]\n\t0106  Archer T9UH v1 [Realtek RTL8814AU]\n\t0107  TL-WN821N v5/v6 [RTL8192EU]\n\t0108  TL-WN822N Version 4 RTL8192EU\n\t0109  TL-WN823N v2/v3 [Realtek RTL8192EU]\n\t010b  Archer T2UHP [MediaTek MT7610U]\n\t010c  TL-WN722N v2/v3 [Realtek RTL8188EUS]\n\t010d  Archer T4U v2 [Realtek RTL8812AU]\n\t010e  Archer T4UH v2 [Realtek RTL8812AU]\n\t010f  Archer T4UHP [Realtek RTL8812AU]\n\t0115  Archer T4U ver.3\n\t011e  AC600 wireless Realtek RTL8811AU [Archer T2U Nano]\n\t0120  Archer T2U PLUS [RTL8821AU]\n\t012d  Archer T3U [Realtek RTL8812BU]\n\t0200  MA 180 Zero CD\n\t0201  HSUPA Modem MA180\n\t0600  UE300 10/100/1000 LAN (mass storage CD-ROM mode) [Realtek RTL8153]\n\t0601  UE300 10/100/1000 LAN (ethernet mode) [Realtek RTL8153]\n2366  Bitmanufaktur GmbH\n\t0001  Reserved Prototyping PID\n\t0002  OpenBeacon USB 2\n\t0003  OpenPCD 2 RFID Reader for 13.56MHz\n\t0004  OpenBeacon\n\t0005  Blinkenlights WDIM\n\t0006  Blinkenlights WMCU\n\t0007  OpenBeacon Ethernet EasyReader PoE II - Active 2.4GHz RFID Reader\n\t0008  OpenBeacon WLAN\n\t0009  OpenPCD 2 RFID Reader for 13.56MHz\n\t000a  OpenPCD 2 Audio & LCD Display\n2367  Teenage Engineering\n\t0002  OP-1 Portable synthesizer\n\t000c  OP-Z Portable synthesizer\n2368  Peterson Electro-Musical Products Inc.\n\t0001  BBS-1 [BodyBeat Sync]\n236a  SiBEAM\n\t1965  SB6501 802.11ad Wireless Network Adapter\n2373  Pumatronix Ltda\n\t0001  5 MegaPixel Digital Still Camera [DSC5M]\n2375  Digit@lway, Inc.\n\t0001  Digital Audio Player\n2378  OnLive\n\t100a  Universal Wireless Controller\n237d  Cradlepoint\n\t0400  MC400\n2386  Raydium Corporation\n\t3125  Touch System\n\t4328  Touch System\n\t432f  Touch System\n238b  Hytera Communications\n\t0a11  DMR Radio\n239a  Adafruit\n\t0001  CDC Bootloader\n\t801e  Trinket M0\n23a0  BIFIT\n\t0001  Token iBank2key\n\t0002  iBank2Key Type M Token\n\t0003  iToken\n\t0008  MS_KEY K - Angara\n23a6  Tronical Components GmbH\n\t2000  Gibson Firebird X Pedal Board\n\t2001  Gibson Firebird X Switch Board\n23b4  Dental Wings Inc.\n\t0200  DW0200 Color Camera\n\t0300  DW0300 Hight Speed Monochrome Camera\n23c7  Gemini\n\t1021  FirstMix\n23fc  SesKion GmbH\n\t0201  SPI-Simulyzer box for SPI data communication\n\t0202  PSI5-Simulyzer box for PSI5 (Peripheral-Sensor-Interfacs) data communication\n\t0203  SENT-Simulyzer box for SENT data communication\n\t0204  DSI-Simulyzer box for DSI3 data communication\n2405  Custom Computer Services, Inc\n\t0002  West Mountain Radio RIGblaster Advantage Audio\n\t0003  West Mountain Radio RIGblaster Advantage\n2406  SANHO Digital Electronics Co., Ltd.\n\t6688  PD7X Portable Storage\n2420  IRiver\n242e  Vossloh-Schwabe Deutschland GmbH\n\t0001  DALI Master\n\t0002  LiCS Bootloader Mode\n\t0003  LiCS Running Mode\n\t0004  iProgrammer\n\t0005  NFC programming device\n2433  ASETEK\n\tb200  [NZXT Kraken X60]\n2443  Aessent Technology Ltd\n\t00dc  aes220 FPGA Mini-Module\n2457  Ocean Optics Inc.\n\t100a  HR2000 Spectrometer 1.00.0\n\t1012  HR4000 Spectrometer\n2458  Bluegiga Technologies\n\t0001  BLED112 Bluetooth 4.0 Single Mode Dongle\n245f  Chord Electronics Limited\n2464  Nest\n\t0001  Learning Thermostat\n\t0002  Learning Thermostat (2nd Generation)\n\t0010  Protect : Smoke + Carbon Monoxide\n\t0020  Heat Link\n2466  Fractal Audio Systems\n\t8003  Axe-Fx II\n\t8010  Axe-FX III\n2476  YEI Technology\n\t1040  3-Space Embedded Sensor\n2478  Tripp-Lite\n\t2008  U209-000-R Serial Port\n248a  Maxxter\n\t8366  Wireless Optical Mouse ACT-MUSW-002\n\t8367  Telink Wireless Receiver\n249c  M2Tech s.r.l.\n24a4  Primare AB\n\t0002  I15_v1.06 [Primare Audio DAC]\n24ae  Shenzhen Rapoo Technology Co., Ltd.\n\t0001  KX Keyboard\n\t0197  meva Barcode Scanner\n\t1813  E9260 Wireless Multi-mode Keyboard\n\t2000  2.4G Wireless Device Serial\n\t2001  5 GHz Wireless Receiver\n\t2003  5GHz Wireless Transceiver\n\t4110  Optical Gaming Mouse [V280]\n\t6000  Wireless Audio\n24c0  Chaney Instrument\n\t0003  Model 01036 weather center\n24c6  ThrustMaster, Inc.\n\t5000  Razer Atrox Gaming Arcade Stick\n\t5300  PowerA Mini ProEX Controller for Xbox 360\n\t5303  Airflo Wired Controller for Xbox 360\n\t530a  ProEX Controller for Xbox 360\n\t531a  Pro Ex mini for XBOX\n\t5397  FUS1ON Tournament Controller\n\t541a  PowerA CPFA115320-01 [Mini Controller for Xbox One]\n\t542a  Spectra for Xbox One\n\t543a  PowerA Wired Controller for Xbox One\n\t5500  Horipad EX2 Turbo\n\t5501  Hori Real Arcade Pro.VX-SA for Xbox 360\n\t5502  Hori Fighting Stick VX Alt for Xbox 360\n\t5503  Hori Fighting Edge for Xbox 360\n\t5506  Hori Soulcalibur V Stick for Xbox 360\n\t550d  Hori Gem Controller for Xbox 360\n\t550e  Real Arcade Pro V Kai for Xbox One / Xbox 360\n\t551a  Fusion Pro Controller\n\t561a  Fusion Controller for Xbox One\n\t5b00  Ferrari 458 Italia Racing Wheel\n\t5b02  GPX Controller\n\t5d04  Sabertooth Elite\n\tfa00  INF-8032385 Disney Infinity Reader\n\tfafb  Aplay Controller\n\tfafd  Afterglow Gamepad for Xbox 360\n\tfafe  Rock Candy Gamepad for Xbox 360\n24cf  Lytro, Inc.\n\t00a1  Light Field Camera\n24dc  Aladdin R.D.\n\t0406  JaCarta SF GOST\n24e0  Yoctopuce Sarl\n24e1  Paratronic\n\t3001  Adp-usb\n\t3005  Radius\n24e3  K-Touch\n24ea  Meva\n\t0197  Barcode Scanner\n24ed  Zen Group\n\t044d  Chat Headset\n24f0  Metadot\n\t0105  Das Keyboard 4\n\t0140  Das Keyboard 4\n\t2020  Das Keyboard 5Q\n24ff  Acroname Inc.\n2500  Ettus Research LLC\n\t0020  USRP B210\n\t0021  USRP B200-mini\n\t0022  USRP B205-mini\n\t0200  USRP B200\n2516  Cooler Master Co., Ltd.\n\t0003  Storm Xornet\n\t0004  Storm QuickFire Rapid Mechanical Keyboard\n\t0006  Storm Recon\n\t0007  Storm Sentinel Advance II\n\t0009  Storm Quick Fire PRO\n\t0011  Storm Quick Fire TK 6keys\n\t0014  Storm Quick Fire TK Nkeys\n\t0015  Storm QuickFire Pro/Ultimate keyboard\n\t0017  CM Storm Quick Fire Stealth\n\t001a  Storm Quick Fire XT\n\t0020  QuickFire Rapid-i Keyboard\n\t0027  CM Storm Coolermaster Novatouch TKL\n\t002d  Alcor mouse\n\t0042  Masterkeys Lite L Combo RGB Keyboard\n\t0044  Masterkeys Lite L Combo RGB Mouse\n\t0046  Masterkeys PRO L\n\t0047  MasterKeys Pro L\n\t0055  MasterKeys L\n\t1006  MasterCase SL600M\n\t9494  Sirus Headset\n2520  ANA-U GmbH\n\t0001  EasyPrinter S3\n2527  Software Bisque\n\t1388  Paramount 5\n2537  Norelsys\n\t1066  NS1066\n\t1068  NS1068/NS1068X SATA Bridge Controller\n2544  Energy Micro AS\n2546  Ravensburger\n\te301  TipToi Pen\n2548  Pulse-Eight\n\t1001  CEC Adapter\n\t1002  CEC Adapter\n254e  SHF Communication Technologies AG\n\te2b3  SHF 58035 A BiasBoard\n2554  ASSA ABLOY AB\n2555  Basis Science Inc.\n\t0001  B1 Fitness Band\n255e  Beijing Bonxeon Technology Co., Ltd.\n\t0001  Device\n\t0002  Dual\n2560  e-con Systems\n\tc152  See3CAM_CU51 5 Mpx monochrome camera\n2563  ShenZhen ShanWan Technology Co., Ltd.\n\t031d  DXT Mouse\n\t0523  BM0523 WirelessGamepad\n\t0575  ZD-V+ Wired Gaming Controller\n256b  Perreaux Industries Ltd\n\t0121  Audiant 80i\n256f  3Dconnexion\n\tc62e  SpaceMouse Wireless (cabled)\n\tc62f  SpaceMouse Wireless Receiver\n\tc631  SpaceMouse Pro Wireless (cabled)\n\tc632  SpaceMouse Pro Wireless Receiver\n\tc633  SpaceMouse Enterprise\n\tc635  SpaceMouse Compact\n\tc651  CadMouse Wireless\n\tc652  Universal Receiver\n\tc654  CadMouse Pro Wireless\n\tc657  CadMouse Pro Wireless Left\n2573  ESI Audiotechnik GmbH\n\t0017  MAYA22\n2574  AVer Information, Inc.\n\t0901  VC520\n\t0910  CAM520\n\t0920  VC320\n\t0930  CAM530\n\t0940  CAM340\n\t0950  VC322\n\t0960  VB342\n2575  Weida Hi-Tech Co., Ltd.\n2576  AFO Co., Ltd.\n\t0003  TCM\n\t0005  BL [Boot Loader]\n\t0011  THM\n2578  Pluscom\n\t4168  2.4GHZ Wireless Arc Folding Mouse\n2581  Plug-up\n\t1807  Generic HID Smartcard\n\t1808  WinUSB Smartcard\n\tf1d0  Nitrokey U2F\n258d  Sequans Communications\n259a  TriQuint Semiconductor\n25a7  Areson Technology Corp\n\t2410  Laser mouse\n\tfa23  2.4G Receiver\n\tfa61  Elecom Co., Ltd MR-K013 Multicard Reader\n25b5  FlatFrog\n\t0002  Multitouch 3200\n25bb  Brunner Elektronik AG\n\t0063  PRT.5105 [Yoke]\n\t0064  PRT.5105 [reserved]\n\t0065  PRT.5096 [Battery Management System]\n\t0066  PRT.5096 [Battery Management System]\n\t0067  PRT.5094\n\t0068  PRT.5094\n\t0069  PRT.5119 [Ethernet2CAN LC Gateway]\n\t006a  PRT.5113 [CLS CANaerospace Gateway]\n\t006b  PRT.5123\n\t006c  PRT.5123 [reserved]\n\t006d  PRT.5127\n\t00ff  MSP430 HID Update Agent\n25bf  Elegant Invention\n\t0001  Isostick\n\t0002  Isostick updater\n25c4  ARCAM\n25c6  Vitus Audio (AVA Group A/S)\n25c8  Visual Planet Ltd\n\t0014  Single User touchfoil(tm) (SU2-80)\n25da  Netatmo\n\t0001  Weather Station\n25dd  Bit4id Srl\n\t1101  miniLector-s\n\t1201  cryptokey\n\t2221  iAM\n\t2311  keyfour-a1\n\t2321  CKey4\n\t2341  tokenME FIPS v3\n\t2351  Digital DNA Key\n\t2354  Digital-DNA Key\n\t2361  Digital-DNA Key BT\n\t2362  Digital-DNA Key\n\t2371  TokenME EVO v2\n\t23b4  ArubaKey AK901\n\t3111  miniLector EVO\n\t3211  miniLector AIR EVO\n\t3403  miniLector AIR NFC v3\n\t3503  mLector AIR DI V3\n\tb001  miniLector Blue\n25e3  Lumigon\n25f0  ShanWan\n\tc131  Gioteck PS3 2.4G Wireless Controller\n25fb  Pentax Ricoh Imaging Co., Ltd\n\t0102  K-5\n2604  Tenda\n\t0012  U12\n2625  MilDef AB\n2626  Aruba Networks\n\tea60  UART Bridge Controller [cp210x]\n262a  SAVITECH Corp.\n\t100e  SA9027 Audio Streaming Controller\n\t10e0  SA9023 Audio Streaming Controller\n\t9020  SA9020 audio controller\n\t9023  SA9023 audio controller\n\t9027  SA9027 audio controller\n\t9226  SA9226 192KHz audio controller\n\t9227  SA9227 384KHz audio controller\n\t9228  SA9228 384KHz/DSD audio controller\n2632  TwinMOS\n\t3209  7-in-1 Card Reader\n2639  Xsens\n\t0001  MTi-10 IMU\n\t0002  MTi-20 VRU\n\t0003  MTi-30 AHRS\n\t0011  MTi-100 IMU\n\t0012  MTi-200 VRU\n\t0013  MTi-300 AHRS\n\t0017  MTi-G 7xx GNSS/INS\n\t0100  Body Pack\n\t0101  Awinda Station\n\t0102  Awinda Dongle\n\t0103  Sync Station\n\t0200  MTw\n\t0300  Motion Tracker Development Board\n\t0301  MTi Converter\n\td00d  Wireless Receiver\n264a  Thermaltake\n\t1004  Ventus\n2650  Electronics For Imaging, Inc. [hex]\n\t1311  eBeam Classic [Luidia]\n2659  Sundtek\n\t1101  TNT DVB-T/DAB/DAB+/FM\n\t1201  FM Transmitter/Receiver\n\t1202  MediaTV Analog/FM/DVB-T\n\t1203  MediaTV Analog/FM/DVB-T MiniPCIe\n\t1204  MediaTV Analog/FM/ATSC\n\t1205  SkyTV Ultimate V\n\t1206  MediaTV DVB-T MiniPCIe\n\t1207  Sundtek HD Capture\n\t1208  Sundtek SkyTV Ultimate III\n\t1209  MediaTV Analog/FM/ATSC MiniPCIe\n\t1210  MediaTV Pro III (EU)\n\t1211  MediaTV Pro III (US)\n\t1212  MediaTV Pro III MiniPCIe (EU)\n\t1213  MediaTV Pro III MiniPCIe (US)\n2662  Moog Music Inc.\n266e  Silicon Integrated Systems\n2672  GoPro\n\t0004  Hero 3\n\t0006  HERO 3+ Silver Edition\n\t0007  HERO 3+ Black\n\t000e  HERO4 Black\n\t0011  Hero 3+ Black\n2676  Basler AG\n\tba02  ace\n\tba03  ba03 dart Vision Caera\n\tba04  ba04 pulse Vision Camera\n\tba05  Vision Camera\n\tba06  Vision Camera\n\tba07  Vision Camera\n\tba08  Vision Camera\n\tba09  Vision Camera\n\tba0a  Vision Camera\n\tba0b  Vision Camera\n\tba0c  Vision Camera\n\tba0d  Vision Camera\n\tba0e  Vision Camera\n\tba0f  Vision Camera\n2685  Cardo Peripheral Systems LTD\n\t0900  [Packtalk Bold Bluetooth Motorcycle Intercom]\n2687  Fitbit Inc.\n\tfb01  Base Station\n2689  StepOver International GmbH\n\t0601  naturaSign Pad POS\n\t0901  naturaSign Pad Light\n\t0ce1  Pad Vivid US\n\t0cf1  Pad Biometric US 5.0\n\t0d01  duraSign Pad US 10.0\n\t0df1  duraSign Pad Biometric US 10.0\n268b  Dimension Engineering\n\t0101  DELink 2\n\t0201  Sabertooth 2x32\n\t0405  Evolv DNA 200\n\t0406  Evolv DNA 200\n\t0407  Evolv DNA 200\n\t0408  Evolv DNA 75\n\t0409  Evolv DNA 250\n\t0412  Evolv DNA 60\n\t0413  Evolv DNA 200\n\t0414  Evolv DNA 250\n\t0415  Evolv DNA 75\n\t0416  Evolv DNA 60\n\t0417  Evolv DNA Go\n\t0419  Evolv DNA 250 Color\n\t0423  Evolv DNA 200\n\t0424  Evolv DNA 250\n\t0425  Evolv DNA 75\n\t0426  Evolv DNA 60\n\t8405  Evolv DNA 200 (recovery mode)\n\t8406  Evolv DNA 200 (recovery mode)\n\t8407  Evolv DNA 200 (recovery mode)\n\t8408  Evolv DNA 75 (recovery mode)\n\t8409  Evolv DNA 250 (recovery mode)\n\t8412  Evolv DNA 60 (recovery mode)\n\t8413  Evolv DNA 200 (recovery mode)\n\t8414  Evolv DNA 250 (recovery mode)\n\t8415  Evolv DNA 75 (recovery mode)\n\t8416  Evolv DNA 60 (recovery mode)\n\t8423  Evolv DNA 200 (recovery mode)\n\t8424  Evolv DNA 250 (recovery mode)\n\t8425  Evolv DNA 75 (recovery mode)\n\t8426  Evolv DNA 60 (recovery mode)\n26a9  Research Industrial Systems Engineering\n\t0001  Payment Terminal v1.0\n26aa  Yaesu Musen\n\t0001  FT-1D\n\t000e  FTA-550\n\t000f  FTA-750\n26b5  Electrocompaniet\n\t0002  ECD 2\n\t0003  ECD 2 (Audio Class 1)\n\t0004  PI 2D\n\t0005  PI 2D (Audio Class 1)\n\t0006  ECI 6\n\t0007  ECI 6 (Audio Class 1)\n\t0020  ECI 80\n26bd  Integral Memory\n\t9917  Fusion Flash Drive\n26e2  Ingenieurbuero Dietzsch und Thiele, PartG\n26f2  Micromega\n\t0200  MyDac\n2707  Bardac Corporation\n\t0005  drive.web\n270d  Rosand Technologies\n\t1001  R-Idge Bootloader\n\t1002  R-Idge Router\n2717  Xiaomi Inc.\n\t0011  100Mbps Network Card Adapter\n\t0360  Mi3W\n\t0368  Mi4 LTE\n\t3801  Mi ANC & Type-C In-Ear Earphones\n\t4106  MediaTek MT7601U [MI WiFi]\n\tff08  Redmi Note 3 (ADB Interface)\n\tff10  Mi/Redmi series (PTP)\n\tff18  Mi/Redmi series (PTP + ADB)\n\tff40  Mi/Redmi series (MTP)\n\tff48  Mi/Redmi series (MTP + ADB)\n\tff60  redmi prime 2\n\tff68  Mi-4c\n\tff80  Mi/Redmi series (RNDIS)\n\tff88  Mi/Redmi series (RNDIS + ADB)\n272a  StarLeaf Ltd.\n272c  Signum Systems\n\t7d13  I-jet\n2730  Citizen\n\t0fff  CT-S2000/4000/310/CLP-521/621/631/CL-S700 Series\n\t1004  PPU-700\n\t2002  CT-S2000 Thermal Printer (Parallel mode)\n\t200f  CT-S310 Label printer\n2735  DigitalWay\n\t0003  MPIO HS100\n\t1001  MPIO FY200\n\t1002  MPIO FL100\n\t1003  MPIO FD100\n\t1004  MPIO HD200\n\t1005  MPIO HD300\n\t1006  MPIO FG100\n\t1007  MPIO FG130\n\t1008  MPIO FY300\n\t1009  MPIO FY400\n\t100a  MPIO FL300\n\t100b  MPIO HS200\n\t100c  MPIO FL350\n\t100d  MPIO FY500\n\t100e  MPIO FY500\n\t100f  MPIO FY600\n\t1012  MPIO FL400\n\t1013  MPIO HD400\n\t1014  MPIO HD400\n\t1016  MPIO FY700\n\t1017  MPIO FY700\n\t1018  MPIO FY800\n\t1019  MPIO FY800\n\t101a  MPIO FY900\n\t101b  MPIO FY900\n\t102b  MPIO FL500\n\t102c  MPIO FL500\n\t103f  MPIO FY570\n\t1040  MPIO FY570\n\t1041  MPIO FY670\n\t1042  MPIO FY670\n\t1043  HCT HMD-180A\n\t1044  HCT HMD-180A\n273f  Hughski Limited\n\t1000  ColorHug bootloader\n\t1001  ColorHug\n\t1002  ColorHug+\n\t1003  ColorHug+ Bootloader\n\t1004  ColorHug2\n\t1005  ColorHug2 bootloader\n2756  Victor Hasselblad AB\n\t0002  X1D Camera\n2759  Philip Morris Products S.A.\n\t0003  IQOS Pocket Charger 2.4\n2765  Firstbeat Technologies, Ltd.\n\t0004  Bodyguard 2\n2766  LifeScan\n\t0000  OneTouch Verio\n2770  NHJ, Ltd\n\t0a01  ScanJet 4600 series\n\t905c  Che-Ez Snap SNAP-U/Digigr8/Soundstar TDC-35\n\t9060  A130\n\t9120  Che-ez! Snap / iClick Tiny VGA Digital Camera\n\t9130  TCG 501\n\t913c  Argus DC-1730\n\t9150  Mini Cam\n\t9153  iClick 5X\n\t915d  Cyberpix S-210S / Little Tikes My Real Digital Camera\n\t930b  CCD Webcam(PC370R)\n\t930c  CCD Webcam(PC370R)\n27a8  Square, Inc.\n\ta120  Contactless + Chip Reader\n27b8  ThingM\n\t01ed  blink(1)\n27bd  Codethink Ltd.\n\t0001  Slab Node Manager\n\t0002  Slab Node Manager JTAG\n27c0  Cadwell Laboratories, Inc.\n\t0818  Paperlike HD-FT\n27c6  Shenzhen Goodix Technology Co.,Ltd.\n\t5117  Fingerprint Reader\n\t5201  Fingerprint Reader\n\t5301  Fingerprint Reader\n\t530c  Fingerprint Reader\n\t532d  Fingerprint\n\t5381  Fingerprint Reader\n\t5385  Fingerprint Reader\n\t538c  Fingerprint Reader\n\t5395  Fingerprint Reader\n\t5584  Fingerprint Reader\n\t55b4  Fingerprint Reader\n\t5740  Fingerprint Reader\n27d4  Blackstar Amplification Limited\n27dd  Mindeo\n\t0002  Mindeo Virtual COM Port\n27f2  Softnautics LLP\n2803  StarLine LLC.\n\t0001  Controller Area Network car alarm module [SLCAN-2]\n2806  SIMPASS\n\t0001  N-PASS X1\n2817  Signal Hound, Inc.\n\t0002  BB60C Spectrum Analyzer\n\t0004  SM200A Spectrum Analyzer\n2818  Codex Digital Limited\n\t0001  Transfer Drive Dock\n2821  ASUSTek Computer Inc.\n\t0161  WL-161 802.11b Wireless Adapter [SiS 162U]\n\t160f  WL-160g 802.11g Wireless Adapter [Envara WiND512]\n\t3300  WL-140 / Hawking HWU36D 802.11b Wireless Adapter [Intersil PRISM 3]\n2822  REFLEXdigital\n2833  Oculus VR, Inc.\n\t0001  Rift Developer Kit 1\n\t0021  Rift DK2\n\t0031  Rift CV1\n\t0101  Latency Tester\n\t0137  Quest Headset\n\t0201  Camera DK2\n\t0211  Rift CV1 Sensor\n\t0330  Rift CV1 Audio\n\t1031  Rift CV1\n\t2021  Rift DK2\n\t2031  Rift CV1\n\t3031  Rift CV1\n2836  OUYA\n286b  STANEO SAS\n\t0003  D6BB/D9 seismic digitizer\n2886  Seeed Technology Co., Ltd.\n\t0002  Seeeduino Lite\n2890  Teknic, Inc\n\t0213  ClearPath 4-axis Comm Hub\n2899  Toptronic Industrial Co., Ltd\n\t012c  Camera Device\n289b  Dracal/Raphnet technologies\n\t0001  Gamecube/N64 controller v2.2\n\t0002  2nes2snes\n\t0003  4nes4snes\n\t0004  Gamecube/N64 controller v2.3\n\t0005  Saturn (Joystick mode)\n\t0006  Saturn (Mouse mode)\n\t0007  Famicom controller\n\t0008  Dreamcast (Joystick mode)\n\t0009  Dreamcast (Mouse mode)\n\t000a  Dreamcast (Keyboard mode)\n\t000b  Gamecube/N64 controller v2.9 (Keyboard mode)\n\t000c  Gamecube/N64 controller v2.9 (Joystick mode)\n\t000e  VirtualBoy controller\n\t0010  WUSBMote v1.2 (Joystick mode)\n\t0011  WUSBMote v1.2 (Mouse mode)\n\t0012  WUSBMote v1.2.1 (Joystick mode)\n\t0013  WUSBMote v1.2.1 (Mouse mode)\n\t0014  WUSBMote v1.3 (Joystick mode)\n\t0015  WUSBMote v1.3 (Mouse mode)\n\t0016  WUSBMote v1.3 (I2C interface mode)\n\t0017  Gamecube/N64 controller v3.0\n\t0018  Atari Jaguar controller\n\t0019  MultiDB9joy v3\n\t001a  MultiDB9joy v3 (multitap mode)\n\t0100  Dual-relay board\n\t0500  Energy meter\n\t0502  Precision barometer\n289d  Seek Thermal, Inc.\n\t0010  PIR206 Thermal Camera [Seek Compact]\n28bd  XP-Pen\n\t0920  Star G960 Graphic Tablet\n28c7  Ultimaker B.V.\n\t0001  3D printer serial interface\n28d4  Devialet\n\t0008  120/200/250/400/800/D-Premier\n28de  Valve Software\n\t1102  Wired Controller\n\t1142  Wireless Steam Controller\n\t2000  Lighthouse FPGA RX\n\t2012  Virtual Reality Controller [VRC]\n\t2101  Watchman Dongle\n\t2500  Lighthouse Base Station\n28e0  PT. Prasimax Inovasi Teknologi\n\t1001  BTS Monitoring Config for Prototype\n\t5740  TRUMON TS-107\n\t5741  TRUMON TS-108\n28e9  GDMicroelectronics\n\t0189  GD32 DFU Bootloader (Longan Nano)\n28f3  Clover Network, Inc.\n\t2000  Mobile Wi-Fi (C200)\n\t3000  Mini\n\t4000  Flex\n28f9  Profitap HQ BV\n\t0001  Profishark 1G Black\n\t0003  Profishark 1G+\n\t0004  Profishark 1G\n\t0005  Profishark 10G\n\t0006  Profishark 100M\n290c  R. Hamilton & Co. Ltd.\n\t4b4d  Mercury iPod Dock\n2912  Audioengine\n\t20c8  D1 24-bit DAC\n\t30c8  D1 24-bit DAC\n2916  Yota Devices\n2931  Jolla Oy\n\t0a01  Jolla Phone MTP\n\t0a02  Jolla Phone Developer\n\t0a05  Jolla PC connection\n\t0a07  Phone MTP\n\t0afe  Jolla charging only\n2939  Zaber Technologies Inc.\n\t4959  A-MCB2\n\t495a  X-MCB1\n\t495b  X-MCB2\n\t49b1  X-MCB1\n\t49b2  X-MCB2\n\t49c1  X-MCC1\n\t49c2  X-MCC2\n\t49c3  X-MCC3\n\t49c4  X-MCC4\n2957  Obsidian Research Corporation\n\t0001  Management Console\n2961  Miselu\n\t0001  C.24 keyboard\n296b  Xacti Corporation\n\t3917  CX-WE100 Camera\n2972  FiiO Electronics Technology\n\t0007  X3 2nd gen audio player / DAC\n298d  Next Biometrics\n\t2020  NB-2020-U Fingerprint Reader\n29bd  Silicon Works\n\t4101  Multi-touch Device\n29c1  Taztag\n\t1105  M17-G903-1 [Tazpad]\n\t1107  M17-G903-A [Tazpad] (CCID)\n29c2  Lewitt GmbH\n\t0001  DGT 650\n\t0003  DGT 450\n\t0009  DGT 260\n\t0011  Stream 4x5\n29c3  Noviga\n29e2  Huatune Technology (Shanghai) Co., Ltd.\n29e7  Brunel University\n29e8  4Links Limited\n29ea  Kinesis Corporation\n\t0102  Advantage2 Keyboard\n29f1  Canaan Creative Co., Ltd\n\t33f1  Avalon nano 1.0\n\t33f2  Avalon USB2IIC Converter\n\t33f3  Avalon nano 2.0\n\t40f1  Avalon4 mini\n2a03  dog hunter AG\n\t0001  Linino ONE (bootloader)\n\t0036  Arduino Leonardo (bootloader)\n\t0037  Arduino Micro (bootloader)\n\t0038  Arduino Robot Control (bootloader)\n\t0039  Arduino Robot Motor (bootloader)\n\t003a  Arduino Micro ADK rev3 (bootloader)\n\t003b  Arduino usb2serial\n\t003c  Arduino Explora (bootloader)\n\t003d  Arduino Due (usb2serial)\n\t003e  Arduino Due\n\t0041  Arduino Yun (bootloader)\n\t0042  Arduino Mega 2560 Rev3\n\t0043  Arduino Uno Rev3\n\t004d  Arduino Zero Pro (bootloader)\n\t8001  Linino ONE (CDC ACM)\n\t8036  Arduino Leonardo (CDC ACM)\n\t8037  Arduino Micro (CDC ACM)\n\t8038  Arduino Robot Control (CDC ACM)\n\t8039  Arduino Robot Motor (CDC ACM)\n\t803a  Arduino Micro ADK rev3 (CDC ACM)\n\t803c  Arduino Explora (CDC ACM)\n\t8041  Arduino Yun (CDC ACM)\n\t804d  Arduino Zero Pro (CDC ACM)\n2a0e  Shenzhen DreamSource Technology Co., Ltd.\n2a13  Grabba International\n\t0000  S-Series data capture device\n2a19  Numato Systems Pvt. Ltd\n\t1002  Mimas V2 Spartan6 FPGA Development Board\n\t5440  TimVideos' HDMI2USB Opsis (FX2) - Unconfigured device\n\t5441  TimVideos' HDMI2USB Opsis (FX2) - Firmware load/upgrade\n\t5442  TimVideos' HDMI2USB Opsis (FX2) - HDMI/DVI Capture Device\n2a1d  Oxford Nanopore Technologies plc\n\t0000  MinION\n\t0001  MinION\n\t0010  VolTRAX\n\t0011  VolTRAX\n\t0020  GridION\n\t0021  GridION\n\t0120  GridION Mk1 Bay\n\t0121  GridION Mk1 Bay\n2a37  RTD Embedded Technologies, Inc.\n\t5110  UPS35110/UPS25110\n2a39  RME\n\t3fb0  Babyface Pro (Class Compliant Mode)\n\t3fc0  Babyface Pro\n\t3fc1  Fireface UFX+\n\t3fc2  Fireface UFX+\n\t3fd1  Fireface UFX+\n2a3c  Trinamic Motion Control GmbH & Co KG\n\t0100  Stepper Device\n\t0200  BLDC/PMSM Device\n\t0300  Motor Control Device\n\t0400  Motor Control Device\n\t0500  PANdrive(TM)\n\t0600  motionCookie(TM)\n\t0700  Evaluation Device\n\t0800  Interface Device\n\t0900  Generic Device\n2a45  Meizu Corp.\n\t0001  MX Phone (BICR)\n\t0c02  MX Phone (MTP & ADB)\n\t0c03  MX Phone (BICR & ADB)\n\t2008  MX Phone (MTP)\n\t200a  MX Phone (MTP & ACM & ADB)\n\t200b  MX Phone (PTP)\n\t200c  MX Phone (PTP & ADB)\n\t2012  MX Phone (MTP & ACM)\n2a47  Mundo Reader, S.L.\n\t0c02  bq Aquaris E4.5\n\t201d  Tablet Edison 3\n\t903a  bq Aquaris U\n2a4b  EMULEX Corporation\n\t0400  Pilot4 Integrated Hub\n2a62  Flymaster Avionics\n\tb301  LiveSD\n\tb302  NavSD\n2a6e  Bare Conductive\n\t0003  Touch Board\n\t8003  Touch Board\n2a70  OnePlus Technology (Shenzhen) Co., Ltd.\n\t4ee7  ONEPLUS A3010 [OnePlus 3T] / A5010 [OnePlus 5T] / A6003 [OnePlus 6] (Charging + USB debugging modes)\n\t904d  A3000 phone (PTP mode) [3T]\n\t904e  A3000 phone (PTP mode, with debug) [3T]\n2a88  DFU Technology Ltd\n\tffff  DFU\n2a8d  Keysight Technologies, Inc.\n2ab6  T+A elektroakustik GmbH & Co KG, Germany\n\t0001  PDP3000HV DAC\n\t0002  MP1000E, MP2000R, MP2500R, MP3100HV\n\t0003  TA HD AUDIO V2\n2ac7  Ultrahaptics Ltd.\n\t0101  Evaluation Kit [Dragonfly]\n\t0102  UHDK5\n\t0104  Touchbase\n\t0110  STRATOS Explore\n\t0111  STRATOS Explore DFU\n\t0112  STRATOS Inspire\n\t0113  STRATOS Inspire DFU\n\tffff  DFU\n2ad1  Picotronic GmbH\n\t7ab8  Turningtable\n2ae5  Fairphone B.V.\n\t9015  2 (Mass storage & ADB)\n\t9024  2 (RNDIS & ADB)\n\t9039  2 (MTP & ADB)\n\t904d  2 (PTP)\n\t904e  2 (PTP & ADB)\n\t90de  2 (Charging)\n\tf000  2 (Mass storage)\n\tf003  2 (MTP)\n\tf005  2 (tethering)\n\tf00e  2 (RNDIS)\n2aec  Ambiq Micro, Inc.\n\t6011  Converter\n2af4  ROLI Ltd.\n\t0100  Seaboard GRAND\n\t0200  Seaboard RISE\n\t0300  BlueWing Proto\n\t0400  VOICE\n\t0500  BLOCKS\n2b03  STEREOLABS\n\tf580  ZED camera\n\tf582  ZED camera\n\tf680  ZED-M camera\n\tf681  ZED-M HID Interface\n\tf682  ZED-M camera\n\tf683  ZED-M HID Interface\n\tf684  ZED-M camera\n2b0e  LeEco\n\t171b  Le2\n\t171e  Le2 in USB tethering mode\n\t1830  Le1 Pro\n\t1844  Le Max2\n\t2b0e  LeEco\n\t6108  Lex720 [LePro 3] in connection sharing usb\n\t610b  Lex720 [LePro 3] in Camera mode\n\t610c  Lex720 [LePro 3]\n\t610d  Lex720 [LePro 3] in debug\n2b23  Red Hat, Inc.\n\tcafe  UsbDk (USB Development Kit)\n2b24  KeepKey LLC\n\t0001  Bitcoin Wallet [KeepKey]\n\t0002  Bitcoin Wallet\n2b3e  NewAE Technology Inc.\n\tace2  CW1173 [ChipWhisperer-Lite]\n2b4c  ZUK\n\t1004  Z1 MTP\n2bc5  Orbbec 3D Technology International, Inc\n\t0401  Astra\n\t0403  Astra Pro\n\t0407  Astra Mini S\n2bcc  InoTec GmbH Organisationssysteme\n2bd6  Coroware, Inc.\n\t4201  RS-485 Controller and Interface [Cypress Semiconductor]\n2bd8  ROPEX Industrie-Elektronik GmbH\n2c02  Planex Communications\n\t14ea  GW-US11H WLAN\n2c1a  Dolphin Peripherals\n\t0000  Wireless Optical Mouse\n2c23  Supermicro Computer Incorporated\n\t1b83  NIC\n2c4e  Mercucys INC\n\t0100  MW300UM RTL8192EU wifi\n2c4f  Canon Electronic Business Machines Co., Ltd.\n\t3003  PR Wireless Presenter\n2c55  Magic Leap, Inc.\n\ta100  ML1 Lightpack (MLDB)\n\tb100  ML1 Lightpack (fastboot)\n\tc001  ML1 Control (COM)\n\tc002  ML1 Control (Bootloader)\n2c7c  Quectel Wireless Solutions Co., Ltd.\n\t0121  EC21 LTE modem\n\t0125  EC25 LTE modem\n\t0191  EG91 LTE modem\n\t0195  EG95 LTE modem\n\t0296  BG96 CAT-M1/NB-IoT modem\n\t0306  EG06/EP06/EM06 LTE-A modem\n\t0435  AG35 LTE modem\n2c97  Ledger\n\t0000  Blue\n\t0001  Nano S\n\t0004  Nano X\n2c99  Prusa\n\t0001  i3 MK2S\n2c9c  Vayyar Imaging Ltd.\n\t1000  Walabot Makers Series\n\t1020  Walabot DIY\n\t1022  Walabot DIY Plus\n\t1030  Walabot Home (vHC)\n\t9100  VNAKit\n2c9d  Nod Inc\n\t90a0  Goa\n\tbac5  Backspin\n2ca3  DJI Technology Co., Ltd.\n\t0008  Mavic Mini MR1SD25 Remote controller\n2cb7  Fibocom\n\t0210  L830-EB-00 LTE WWAN Modem\n2cc0  Hangzhou Zero Zero Infinity Technology Co., Ltd.\n2cc2  Lautsprecher Teufel GmbH\n2ccf  Hypersecu\n\t0880  HyperFIDO\n2cd9  Cambrionix Ltd\n\t0804  PowerSync4 USBPD Hub\n2cdc  Sea & Sun Technology GmbH\n\tf232  CTD48Mc CTD Probe\n2ce5  InX8 Inc [AKiTiO]\n\t0014  Mass Storage [NT2 U31C]\n2cf0  Nuand LLC\n\t5246  bladeRF\n\t5250  bladeRF 2.0 micro\n2d1f  Wacom Taiwan Information Co. Ltd.\n2d25  Kronegger GmbH.\n2d2d  proxmark.org\n\t504d  Proxmark3\n2d37  Zhuhai Poskey Technology Co.,Ltd\n2d6b  NetUP Inc.\n\t7777  Joker TV universal DTV receiver\n2d81  Evollve Inc.\n\t4f01  Ozobot Evo\n2d84  Zhuhai Poskey Technology Co.,Ltd\n\tb806  DT-108B Thermal Label Printer\n2dc8  8BitDo\n\t5006  M30 Bluetooth gamepad\n\t5750  Bootloader\n\t6000  SF30 Pro gamepad\n\t6001  SN30/SF30 Pro gamepad\n\tab11  F30 gamepad\n\tab12  N30 gamepad\n\tab20  SN30/SF30 gamepad\n\tab21  SF30 gamepad\n2dcf  Dialog Semiconductor\n\tc951  Audio Class 1.0 Devices\n\tc952  Audio Class 2.0 Devices\n2def  Kirale Technologies\n\t0000  KiNOS Boot DFU\n\t0102  KTWM102 Module\n2df2  LIPS Corporation\n\t0213  LIPSedge DL 3D ToF Camera\n\t0215  LIPSedge DL RGB Camera\n\t2102  LIPSedge 5 Megapixel RGB Camera\n2e04  HMD Global\n\t0001  Nokia 3310 3G\n\t0002  Nokia 3310 3G\n\t0a14  Nokia 3310 3G\n\tc008  Tethering Network Interface\n\tc009  Nokia 1 (bootloader)\n\tc025  Nokia 8 (MTP mode)\n\tc026  Nokia Smartphone\n\tc029  Nokia 8 (PTP mode)\n\tc031  Nokia 1 (PTP)\n\tc03f  Nokia 8 (MIDI mode)\n2e0e  Hatteland Display AS\n\t0001  CAN Gateway\n2e24  Hyperkin\n\t0652  Duke Xbox One controller\n\t1688  X91 Xbox One controller\n2e3b  uSens Inc.\n2e57  MEGWARE Computer Vertrieb und Service GmbH\n\t454d  SlideSX EnergyMeter\n\t454e  SlideSX EnergyMeter DFU\n\t5cba  SlideSX / ClustSafe Bus Adapter\n2e69  Swift Navigation\n\t1001  Piksi Multi\n2e95  SCUF Gaming\n\t7725  Controller\n2ecc  ASR Microelectronics\n\t2001  Smartphone (MTP)\n\t2002  Smartphone (MTP + ADB)\n\t2007  Smartphone (ADB Interface)\n2f76  KeyXentic Inc.\n\t0905  KX905 Smart Terminal\n\t0906  KX906 Smart Card Reader\n\t1906  KX906 Smart Token (Mass Storage)\n2fad  Definium Technologies\n2fb0  Infocrypt\n2fb2  Fujitsu, Ltd\n2fc0  Sensidyne, LP\n\t0001  Project Archer\n2fc6  Comtrue Inc.\n\t6012  UAC2 Device GB\n2fe0  Xaptum, Inc.\n\t8b01  XAP-RC-001 ENF Router Card\n\t8b02  XAP-RW-001 ENF Router Card with WiFi\n\t8bde  XAP-EA-002 ENF Access Card\n\t8bee  XAP-EA-003 ENF Access Card\n2fe3  NordicSemiconductor\n2fe7  ELGIN S.A.\n\t0001  SMART S@T\n2feb  Beijing Veikk E-Commerce Co., Ltd.\n\t0004  Veikk A15 Pen Tablet\n2ff4  Quixant Plc\n3016  Boundary Devices, LLC\n\t0001  Nitrogen Bootloader\n3036  Control iD\n\t0001  Print iD\n\t0002  iDBio\n3037  Beijing Chushifengmang Technology Development Co.,Ltd.\n3057  Kingsis Corporation\n\t0002  ZOWIE Gaming mouse\n308f  Input Club\n\t0000  Infinity 60% Bootloader\n\t0001  Infinity 60% - Standard\n\t0002  Infinity 60% - Hacker\n\t0003  Infinity Ergodox Bootloader\n\t0004  Infinity Ergodox\n\t0005  WhiteFox Bootloader\n\t0006  WhiteFox - Vanilla\n\t0007  WhiteFox - ISO\n\t0008  WhiteFox - Aria\n\t0009  WhiteFox - Winkeyless\n\t000a  WhiteFox - True Fox\n\t000b  WhiteFox - Jack of All Trades\n\t000c  Infinity 60% LED Bootloader\n\t000d  Infinity 60% LED - Standard\n\t000e  Infinity 60% LED - Hacker\n\t000f  Infinity 60% LED - Alphabet\n\t0010  K-Type Bootloader\n\t0011  K-Type\n\t0012  Kira Bootloader\n\t0013  Kira\n\t0014  Gemini Dawn/Dusk Bootloader\n\t0015  Gemini Dawn/Dusk\n\t0016  Re:Type Bootloader\n\t0017  Re:Type\n\t0018  Re:Type USB Hub\n\t0019  WhiteFox (SAM4S) Bootloader\n\t001a  WhiteFox (SAM4S) - Vanilla\n\t001b  WhiteFox (SAM4S) - ISO\n\t001c  WhiteFox (SAM4S) - Aria\n\t001d  WhiteFox (SAM4S) - Winkeyless\n\t001e  WhiteFox (SAM4S) - True Fox\n\t001f  WhiteFox (SAM4S) - Jack of All Trades\n30a4  Blues Wireless\n\t0001  Notecard\n30c2  UNPARALLEL Innovation, Lda\n\t1388  SPL Meter\n30c9  Luxvisions Innotech Limited\n30ee  Fujitsu Connected Technologies Limited\n\t1001  F-01L\n30f2  Varex Imaging\n3111  Hiperscan GmbH\n\t0000  SGS-NT Microspectrometer\n3112  Meteca SA\n\t0001  MBC-WB01 (CDC-ACM)\n\t0002  MBC-WB01 (Bootloader)\n\t0003  ABC (CDC ACM)\n\t0004  ABC (Bootloader)\n3125  Eagletron\n\t0001  TrackerPod Camera Stand\n3136  Navini Networks\n3145  SafeLogic Inc.\n3147  Tanvas, Inc.\n316c  SigmaSense, LLC\n316d  Purism, SPC\n\t4c4b  Librem Key\n316e  SPECINFOSYSTEMS\n\t0001  DIAMOND token\n3171  8086 Consultancy\n\t0011  ClusterCTRL DA\n\t0012  ClusterCTRL pHAT\n\t0013  ClusterCTRL A+6\n\t0014  ClusterCTRL Triple\n\t0015  ClusterCTRL Single\n3176  Whanam Electronics Co., Ltd\n3195  Link Instruments\n\tf190  MSO-19\n\tf280  MSO-28\n\tf281  MSO-28\n3197  Katusha\n\t1001  M151\n\t1002  M250\n\t1003  P130\n\t1004  M130\n\t1101  P247\n\t1102  M247\n\t1103  M348\n31c9  BeiJing LanXum Computer Technology Co., Ltd.\n\t1001  Printer\n\t1301  Black and White Laser Printer\n\t1501  LaserPrint GA50 series\n3200  Alcatel-Lucent Enterprise\n\t2100  ALE 8058s\n\t2101  ALE 8068s\n\t2102  8078s\n3219  Smak Tecnologia e Automacao LTDA\n\t0044  SKO44 Optical Keyboard\n321c  Premio, Inc.\n324c  CUPRIS Ltd.\n326d  Agile Display Solutions Co., Ltd\n\t0001  Avocor USB Camera\n3275  VidzMedia Pte Ltd\n\t4fb1  MonsterTV P2H\n3293  Unhuman Inc.\n32b3  TEXA\n\td1a6  TXT Multihub\n\td1a7  TXT Multihub\n3310  MUDITA Sp. z o.o.\n\t0100  Pure\n\t0101  Pure tethering\n\t0300  Harmony\n3333  InLine\n\t3333  2 port KVM switch model 60652K\n3334  AEI\n\t1701  Fast Ethernet\n3340  Yakumo\n\t043a  Mio A701 DigiWalker PPCPhone\n\t0e3a  Pocket PC 300 GPS SL / Typhoon MyGuide 3500\n\ta0a3  deltaX 5 BT (D) PDA\n\tffff  Mio DigiWalker Sync\n3344  Leaguer Microelectronics (LME)\n\t3744  OEM PC Remote\n3384  System76\n\t0000  Thelio Io (thelio-io)\n\t0001  Launch Configurable Keyboard (launch_1)\n348f  ISY\n\t2322  Wireless Presenter\n3504  Micro Star\n\tf110  Security Key\n3538  Power Quotient International Co., Ltd\n\t0001  Travel Flash\n\t0015  Mass Storge Device\n\t0022  Hi-Speed Mass Storage Device\n\t0042  Cool Drive U339 Flash Disk\n\t0054  Flash Drive (2GB)\n\t0901  Traveling Disk U273 (4GB)\n3579  DIVA\n\t6901  Media Reader\n357d  Sharkoon\n\t7788  JMicron JMS567 ATA/ATAPI Bridge\n3636  InVibro\n3752  Arculus Holdings, LLC\n\t0001  AuthentiKey\n3767  Fanatec\n\t0101  Speedster 3 Forceshock Wheel\n3838  WEM\n\t0001  5-in-1 Card Reader\n\t1031  2.4G Wireless Mouse\n3923  National Instruments Corp.\n\t12c0  DAQPad-6020E\n\t12d0  DAQPad-6507\n\t12e0  NI 4350\n\t12f0  NI 5102\n\t1750  DAQPad-6508\n\t17b0  USB-ISA-Bridge\n\t1820  DAQPad-6020E (68 pin I/O)\n\t1830  DAQPad-6020E (BNC)\n\t1f00  DAQPad-6024E\n\t1f10  DAQPad-6024E\n\t1f20  DAQPad-6025E\n\t1f30  DAQPad-6025E\n\t1f40  DAQPad-6036E\n\t1f50  DAQPad-6036E\n\t2f80  DAQPad-6052E\n\t2f90  DAQPad-6052E\n\t702a  GPIB-USB-B\n\t702b  GPIB-USB-B Initialization\n\t703c  USB-485 RS485 Cable\n\t709b  GPIB-USB-HS\n\t7166  USB-8451\n\t716e  USB-8451 Firmware Loader\n\t717a  USB-6008\n\t717b  USB-6009\n\t71d6  USB-6008 OEM\n\t71d7  USB-6009 OEM\n\t71d8  USB-6009 OEM\n\t7254  NI MIO (data acquisition card) firmware updater\n\t729e  USB-6251 (OEM) data acquisition card\n\t7346  USB-6229\n\t755b  myDAQ\n\t76af  USB-6000\n\t76b0  USB-6000 OEM\n\t76bf  USB-6001\n\t76c0  USB-6001 OEM\n\t76c4  USB-6002\n\t76c5  USB-6002 OEM\n\t76c6  USB-6003\n\t76c7  USB-6003 OEM\n40bb  I-O Data\n\t0a09  USB2.0-SCSI Bridge USB2-SC\n4101  i-rocks\n\t1301  IR-2510 usb phone\n4102  iRiver, Ltd.\n\t1001  iFP-100 series mp3 player\n\t1003  iFP-300 series mp3 player\n\t1005  iFP-500 series mp3 player\n\t1007  iFP-700 series mp3/ogg vorbis player\n\t1008  iFP-800 series mp3/ogg vorbis player\n\t100a  iFP-1000 series mp3/ogg vorbis player\n\t1014  T20 series mp3/ogg vorbis player (ums firmware)\n\t1019  T30\n\t1034  T60\n\t1040  M1Player\n\t1041  E100 (ums)\n\t1101  iFP-100 series mp3 player (ums firmware)\n\t1103  iFP-300 series mp3 player (ums firmware)\n\t1105  iFP-500 series mp3 player (ums firmware)\n\t1113  T10 (alternate)\n\t1117  T10\n\t1119  T30 series mp3/ogg/wma player\n\t1141  E100 (mtp)\n\t2002  H10 6GB\n\t2101  H10 20GB (mtp)\n\t2102  H10 5GB (mtp)\n\t2105  H10 5/6GB (mtp)\n413c  Dell Computer Corp.\n\t0000  DRAC 5 Virtual Keyboard and Mouse\n\t0001  DRAC 5 Virtual Media\n\t0058  Port Replicator\n\t1001  Keyboard Hub\n\t1002  Keyboard Hub\n\t1003  Keyboard Hub\n\t1005  Multimedia Pro Keyboard Hub\n\t2001  Keyboard HID Support\n\t2002  SK-8125 Keyboard\n\t2003  Keyboard SK-8115\n\t2005  RT7D50 Keyboard\n\t2010  Keyboard\n\t2011  Multimedia Pro Keyboard\n\t2100  SK-3106 Keyboard\n\t2101  SK-3205 SmartCard Reader Keyboard\n\t2105  Model L100 Keyboard\n\t2106  QuietKey Keyboard\n\t2107  KB212-B Quiet Key Keyboard\n\t2113  KB216 Wired Keyboard\n\t2134  Hub of E-Port Replicator\n\t21d7  Dell Wireless 5560 HSPA+ Mobile Broadband Modem\n\t2500  DRAC4 Remote Access Card\n\t2501  Keyboard and mouse dongle\n\t2513  internal USB Hub of E-Port Replicator\n\t3010  Optical Wheel Mouse\n\t3012  Optical Wheel Mouse\n\t3016  Optical 5-Button Wheel Mouse\n\t301a  Dell MS116 Optical Mouse\n\t301b  Universal Bluetooth Receiver\n\t3200  Mouse\n\t4001  Axim X5\n\t4002  Axim X3\n\t4003  Axim X30\n\t4004  Axim Sync\n\t4005  Axim Sync\n\t4006  Axim Sync\n\t4007  Axim Sync\n\t4008  Axim Sync\n\t4009  Axim Sync\n\t4011  Axim X51v\n\t5103  AIO Printer A940\n\t5105  AIO Printer A920\n\t5107  AIO Printer A960\n\t5109  Photo AIO Printer 922\n\t5110  Photo AIO Printer 962\n\t5111  Photo AIO Printer 942\n\t5112  Photo AIO Printer 924\n\t5113  Photo AIO Printer 944\n\t5114  Photo AIO Printer 964\n\t5115  Photo AIO Printer 926\n\t5116  AIO Printer 946\n\t5117  Photo AIO Printer 966\n\t5118  AIO 810\n\t5124  Laser MFP 1815\n\t5128  Photo AIO 928\n\t5133  968 AIO Printer\n\t5200  Laser Printer\n\t5202  Printing Support\n\t5203  Printing Support\n\t5210  Printing Support\n\t5211  1110 Laser Printer\n\t5220  Laser MFP 1600n\n\t5225  Printing Support\n\t5226  Printing Support\n\t5228  Laser Printer 1720dn\n\t5300  Laser Printer\n\t5400  Laser Printer\n\t5401  Laser Printer\n\t5404  1250c Color Printer\n\t5513  WLA3310 Wireless Adapter [Intersil ISL3887]\n\t5534  Hub of E-Port Replicator\n\t5601  Laser Printer 3100cn\n\t5602  Laser Printer 3000cn\n\t5607  MFP Color Laser Printer 3115cn\n\t5631  Laser Printer 5100cn\n\t564a  C1765 series Multifunction Color LaserPrinter, Scanner & Copier\n\t5905  Printing Support\n\t8000  BC02 Bluetooth Adapter\n\t8010  TrueMobile Bluetooth Module in\n\t8100  TrueMobile 1180 802.11b Adapter [Intersil PRISM 3]\n\t8102  TrueMobile 1300 802.11g Wireless Adapter [Intersil ISL3880]\n\t8103  Wireless 350 Bluetooth\n\t8104  Wireless 1450 Dual-band (802.11a/b/g) Adapter [Intersil ISL3887]\n\t8105  U2 in HID - Driver\n\t8106  Wireless 350 Bluetooth Internal Card in\n\t8110  Wireless 3xx Bluetooth Internal Card\n\t8111  Wireless 3xx Bluetooth Internal Card in\n\t8114  Wireless 5700 Mobile Broadband (CDMA EV-DO) Minicard Modem\n\t8115  Wireless 5500 Mobile Broadband (3G HSDPA) Minicard Modem\n\t8116  Wireless 5505 Mobile Broadband (3G HSDPA) Minicard Modem\n\t8117  Wireless 5700 Mobile Broadband (CDMA EV-DO) Expresscard Modem\n\t8118  Wireless 5510 Mobile Broadband (3G HSDPA) Expresscard Status Port\n\t8120  Bluetooth adapter\n\t8121  Eastfold in HID\n\t8122  Eastfold in DFU\n\t8123  eHome Infrared Receiver\n\t8124  eHome Infrared Receiver\n\t8126  Wireless 355 Bluetooth\n\t8127  Wireless 355 Module with Bluetooth 2.0 + EDR Technology.\n\t8128  Wireless 5700-Sprint Mobile Broadband (CDMA EV-DO) Mini-Card Status Port\n\t8129  Wireless 5700-Telus Mobile Broadband (CDMA EV-DO) Mini-Card Status Port\n\t8131  Wireless 360 Bluetooth 2.0 + EDR module.\n\t8133  Wireless 5720 VZW Mobile Broadband (EVDO Rev-A) Minicard GPS Port\n\t8134  Wireless 5720 Sprint Mobile Broadband (EVDO Rev-A) Minicard Status Port\n\t8135  Wireless 5720 TELUS Mobile Broadband (EVDO Rev-A) Minicard Diagnostics Port\n\t8136  Wireless 5520 Cingular Mobile Broadband (3G HSDPA) Minicard Diagnostics Port\n\t8137  Wireless 5520 Voda L Mobile Broadband (3G HSDPA) Minicard Status Port\n\t8138  Wireless 5520 Voda I Mobile Broadband (3G HSDPA) Minicard EAP-SIM Port\n\t8140  Wireless 360 Bluetooth\n\t8142  Mobile 360 in DFU\n\t8143  Broadcom BCM20702A0 Bluetooth\n\t8147  F3507g Mobile Broadband Module\n\t8156  Wireless 370 Bluetooth Mini-card\n\t8157  Integrated Keyboard\n\t8158  Integrated Touchpad / Trackstick\n\t8160  Wireless 365 Bluetooth\n\t8161  Integrated Keyboard\n\t8162  Integrated Touchpad [Synaptics]\n\t8171  Gobi Wireless Modem (QDL mode)\n\t8172  Gobi Wireless Modem\n\t8183  F3607gw Mobile Broadband Module\n\t8184  F3607gw v2 Mobile Broadband Module\n\t8185  Gobi 2000 Wireless Modem (QDL mode)\n\t8186  Gobi 2000 Wireless Modem\n\t8187  DW375 Bluetooth Module\n\t818e  DW5560 miniPCIe HSPA+ Mobile Broadband Modem\n\t8197  BCM20702A0 Bluetooth Module\n\t81a0  Wireless 5808 Mobile Broadband (Sierra Wireless MC7355 Mini PCIE, 4G UMTS,HSDPA,HSPA+,LTE,1xRTT,EVDO Rev A,GSM,GPRS)\n\t81a3  Hub of E-Port Replicator\n\t81a8  Wireless 5808 Mobile Broadband (Sierra Wireless Mini PCIE, 4G UMTS,HSDPA,HSPA+,LTE,1xRTT,EVDO Rev A,GSM,GPRS)\n\t8501  Bluetooth Adapter\n\t9001  ATA Bridge\n\t9009  Portable Device\n\t9500  USB CP210x UART Bridge Controller [DW700]\n\ta001  Hub\n\ta005  Internal 2.0 Hub\n\ta101  Internal Dual SD Card module\n\ta102  iDRAC Virtual NIC\n\ta503  AC511 Sound Bar\n\ta700  Hub (in 1905FP LCD Monitor)\n\tb007  Streak 5 Android Tablet\n4146  USBest Technology\n\t9281  Iomega Micro Mini 128MB Flash Drive\n\tba01  Intuix Flash Drive\n4168  Targus\n\t1010  Wireless Compact Laser Mouse\n4242  USB Design by Example\n\t4201  Buttons and Lights HID device\n\t4220  Echo 1 Camera\n4255  GoPro\n\t1000  9FF2 [Digital Photo Display]\n\t2000  HD2-14 [Hero 2 Camera]\n4317  Broadcom Corp.\n\t0700  U.S. Robotics USR5426 802.11g Adapter\n\t0701  U.S. Robotics USR5425 Wireless MAXg Adapter\n\t0711  Belkin F5D7051 v3000 802.11g\n\t0720  Dynex DX-BUSB\n\t0721  Dynex DX-EBUSB\n4348  WinChipHead\n\t5523  USB->RS 232 adapter with Prolific PL 2303 chipset\n\t5537  13.56Mhz RFID Card Reader and Writer\n\t5584  CH34x printer adapter cable\n4572  Shuttle, Inc.\n\t4572  Shuttle PN31 Remote\n4586  Panram\n\t1026  Crystal Bar Flash Drive\n4670  EMS Production\n\t9394  Game Cube USB Memory Adaptor 64M\n46f4  QEMU\n4752  Miditech\n\t0011  Midistart-2\n4757  GW Instek\n\t2009  PEL-2000 Series Electronic Load (CDC)\n\t2010  PEL-2000 Series Electronic Load (CDC)\n4766  Aceeca\n\t0001  MEZ1000 RDA\n4855  Memorex\n\t7288  Ultra Traveldrive 160G 2.5\" HDD\n4971  SimpleTech\n\t1004  Hitachi LifeStudio Desk (3.5\" HDD) [w/o flash key]\n\t1013  Touro Desk Pro\n\t1015  Touro Desk 3.0\n\t8001  G-Tech G-DRIVE Mobile\n\tcb01  SP-U25/120G\n\tcd15  Simple Drive Mini (2.5\" HDD)\n\tce07  SimpleDrive (3.5\" HDD)\n\tce12  FV-U35\n\tce17  1TB SimpleDrive II USB External Hard Drive\n\tce18  (re)Drive\n\tce21  JMicron JM20329 SATA Bridge [eg. HITACHI SimpleDrive mini]\n\tce22  Hitachi SimpleTough (3.5\" HDD)\n4d46  Musical Fidelity\n\t0001  V-Link\n\t0002  V-DAC II\n5032  Grandtec\n\t0bb8  Grandtec USB1.1 DVB-T (cold)\n\t0bb9  Grandtec USB1.1 DVB-T (warm)\n\t0fa0  Grandtec USB1.1 DVB-T (cold)\n\t0fa1  Grandtec USB1.1 DVB-T (warm)\n50c2  Averatec (?)\n\t4013  WLAN Adapter\n5131  MSR\n\t2007  MSR-101U Mini HID magnetic card reader\n5173  Sweex\n\t1809  ZD1211\n5219  I-Tetra\n\t1001  Cetus CDC Device\n5332  Clearly Superior Technologies, Inc.\n\t1300  CST2545-5W (L-Trac)\n5345  Owon\n\t1234  PDS6062T Oscilloscope\n534c  SatoshiLabs\n\t0001  Bitcoin Wallet [TREZOR]\n\t0002  Bitcoin Wallet [TREZOR v2]\n534d  MacroSilicon\n\t0021  MS210x Video Grabber [EasierCAP]\n\t6021  VGA Display Adapter\n5354  Meyer Instruments (MIS)\n\t0017  PAXcam2\n544d  Transmeta Corp.\n5543  UC-Logic Technology Corp.\n\t0002  SuperPen WP3325U Tablet\n\t0003  Tablet WP4030U\n\t0004  Tablet WP5540U\n\t0005  Tablet WP8060U\n\t0041  Genius PenSketch 6x8 Tablet\n\t0042  Tablet PF1209\n\t004a  XP-Pen Artist 10S tablet\n\t004d  Tablet Monitor MSP19U\n\t0064  Aiptek HyperPen 10000U\n\t3031  Graphics tablet [DrawImage G3, Ugee G3]\n5555  Epiphan Systems Inc.\n\t1110  VGA2USB\n\t1120  KVM2USB\n\t2222  DVI2USB\n\t3333  VGA2USB Pro\n\t3337  KVM2USB Pro\n\t3340  VGA2USB LR\n\t3344  KVM2USB LR\n\t3411  DVI2USB Solo\n\t3422  DVI2USB Duo\n\t3500  DVI2USB3\n\t3501  DVI2USB3 Rev3\n\t3510  DVI2USB3_ET\n\t3520  SDI2USB3\n55aa  OnSpec Electronic, Inc.\n\t0015  Hard Drive\n\t0102  SuperDisk\n\t0103  IDE Hard Drive\n\t0201  DDI to Reader-19\n\t1234  ATAPI Bridge\n\ta103  Sandisk SDDR-55 SmartMedia Card Reader\n\tb000  USB to CompactFlash Card Reader\n\tb004  OnSpec MMC/SD Reader/Writer\n\tb00b  USB to Memory Stick Card Reader\n\tb00c  USB to SmartMedia Card Reader\n\tb012  Mitsumi FA402M 8-in-2 Card Reader\n\tb200  Compact Flash Reader\n\tb204  MMC/ SD Reader\n\tb207  Memory Stick Reader\n5654  Gotview\n\tca42  MasterHD 3\n5656  Uni-Trend Group Limited\n\t0832  UT2000/UT3000 Digital Storage Oscilloscope\n595a  IRTOUCHSYSTEMS Co. Ltd.\n\t0001  Touchscreen\n5986  Bison Electronics Inc.\n\t0100  Acer Orbicam\n\t0101  USB2.0 Camera\n\t0102  Acer Crystal Eye Webcam\n\t0105  Acer Crystal Eye Webcam\n\t0137  HP Webcam\n\t0141  BisonCam, NB Pro\n\t0149  HP Webcam-101\n\t014c  MSI Integrated Webcam\n\t01a6  Lenovo Integrated Webcam\n\t01a7  Lenovo Integrated Webcam\n\t01a9  Lenovo Integrated Webcam\n\t0200  Acer OrbiCam\n\t0202  Fujitsu Webcam\n\t0203  BisonCam NB Pro 1300\n\t0205  Lenovo EasyCamera\n\t0217  Integrated Webcam\n\t0241  BisonCam, NB Pro\n\t0268  SunplusIT INC. Integrated Camera\n\t026a  Integrated Camera\n\t0292  Lenovo Integrated Webcam\n\t0294  Lenovo Integrated Webcam\n\t0295  Lenovo Integrated Webcam\n\t0299  Lenovo Integrated Webcam\n\t029c  Lenovo EasyCamera\n\t02ac  HP TrueVision HD Webcam\n\t02d0  Lenovo Integrated Webcam [R5U877]\n\t02d2  ThinkPad Integrated Camera\n\t02d5  Integrated Camera\n\t03b3  Lenovo Integrated Webcam\n\t03d0  Lenovo Integrated Webcam [R5U877]\n\t0400  BisonCam, NB Pro\n\t0535  Lenovo EasyCamera integrated webcam\n\t055a  Lenovo Integrated Webcam\n\t0652  Lenovo EasyCamera\n\t0670  Lenovo EasyCamera\n\t0671  Lenovo EasyCamera\n\t0706  ThinkPad P50 Integrated Camera\n\t2113  SunplusIT Integrated Camera\n\ta002  Lenovo EasyCamera Integrated Webcam\n59e3  Nonolith Labs\n5a57  Zinwell\n\t0260  RT2570\n\t0280  802.11a/b/g/n USB Wireless LAN Card\n\t0282  802.11b/g/n USB Wireless LAN Card\n\t0283  802.11b/g/n USB Wireless LAN Card\n\t0284  802.11a/b/g/n USB Wireless LAN Card\n\t0290  ZW-N290 802.11n [Realtek RTL8192U]\n\t5257  Metronic 495257 wifi 802.11ng\n6000  Beholder International Ltd.\n\t0001  Trident TVBOX Video Grabber\n\tdec0  TV Wander\n\tdec1  TV Voyage\n601a  Ingenic Semiconductor Ltd.\n\t4740  XBurst Jz4740 boot mode\n\t4760  JZ4760 Boot Device\n6022  Xektek\n\t0500  SuperPro Universal Device Programmer\n6189  Sitecom\n\t182d  LN-029 10/100 Ethernet Adapter\n\t2068  USB to serial cable (v2)\n6244  LightingSoft AG\n\t0101  Intelligent Usb Dmx Interface SIUDI5A\n\t0201  Intelligent Usb Dmx Interface SIUDI5C\n\t0300  Intelligent Usb Dmx Interface SIUDI6 Firmware download\n\t0301  Intelligent Usb Dmx Interface SIUDI6C\n\t0302  Intelligent Usb Dmx Interface SIUDI6A\n\t0303  Intelligent Usb Dmx Interface SIUDI6D\n\t0400  Touch Sensitive Intelligent Control Keypad STICK1A\n\t0401  Touch Sensitive Intelligent Control Keypad STICK1A\n\t0410  Intelligent Usb Dmx Interface SIUDI7 Firmware Download\n\t0411  Intelligent Usb Dmx Interface SIUDI7A\n\t0420  Intelligent Usb Dmx Interface SIUDI8A Firmware Download\n\t0421  Intelligent Usb Dmx Interface SIUDI8A\n\t0430  Intelligent Usb Dmx Interface SIUDI8C Firmware Download\n\t0431  Intelligent Usb Dmx Interface SIUDI8C\n\t0440  Intelligent Usb Dmx Interface SIUDI9A Firmware Download\n\t0441  Intelligent Usb Dmx Interface SIUDI9A\n\t0450  Intelligent Usb Dmx Interface SIUDI9C Firmware Download\n\t0451  Intelligent Usb Dmx Interface SIUDI9C\n\t0460  Touch Sensitive Intelligent Control Keypad STICK2 Firmware download\n\t0461  Touch Sensitive Intelligent Control Keypad STICK2\n\t0470  Touch Sensitive Intelligent Control Keypad STICK1B Firmware download\n\t0471  Touch Sensitive Intelligent Control Keypad STICK1B\n\t0480  Touch Sensitive Intelligent Control Keypad STICK3 Firmware download\n\t0481  Touch Sensitive Intelligent Control Keypad STICK3\n\t0490  Intelligent Usb Dmx Interface SIUDI9D Firmware Download\n\t0491  Intelligent Usb Dmx Interface SIUDI9D\n\t0500  Touch Sensitive Intelligent Control Keypad STICK2B Firmware download\n\t0501  Touch Sensitive Intelligent Control Keypad STICK2B\n\t0520  Touch Sensitive Intelligent Control Keypad (STICK2C Firmware download, 32/64bits\n\t0521  Touch Sensitive Intelligent Control Keypad (STICK2C, 32/64bits)\n\t0540  Sunlite Universal Smart Handy Interface (SUSHI1A Firmware download, 32/64bits)\n\t0541  Sunlite Universal Smart Handy Interface (SUSHI1A, 32/64bits)\n\t0570  Touch Sensitive Intelligent Control Keypad (STICK4A Firmware download, 32/64bits)\n\t0571  Touch Sensitive Intelligent Control Keypad (STICK4A, 32/64bits)\n\t0580  Touch Sensitive Intelligent Control Keypad (STICK5A Firmware download, 32/64bits)\n\t0581  Touch Sensitive Intelligent Control Keypad (STICK5A, 32/64bits)\n\t0590  Intelligent Dmx Interface (SIUDI9S Firmware Download, 32/64bits)\n\t0591  Intelligent Dmx Interface (SIUDI9S, 32/64bits)\n\t0600  Intelligent Dmx Interface (SIUDI9M Firmware Download, 32/64bits)\n\t0601  Intelligent Dmx Interface (SIUDI9M, 32/64bits)\n\t0610  Intelligent Dmx Interface SIUDI10A Firmware Download\n\t0611  Intelligent Dmx Interface SIUDI10A\n6253  TwinHan Technology Co., Ltd\n\t0100  Ir reciver f. remote control\n636c  CoreLogic, Inc.\n6472  Sony Corp.\n\t01c8  PlayStation Portable [Mass Storage]\n6547  Arkmicro Technologies Inc.\n\t0232  ARK3116 Serial\n6557  Emtec\n\t5500  Mass Storage Device\n\t8005  Car Key\n6615  IRTOUCHSYSTEMS Co. Ltd.\n\t0001  Touchscreen\n\t0020  IRTOUCH InfraRed TouchScreen\n\t0081  TouchScreen\n6666  Prototype product Vendor ID\n\t0667  WiseGroup Smart Joy PSX, PS-PC Smart JoyPad\n\t1c40  TELEMIC 802.15.4 Sensor node (Bootloader)\n\t1c41  TELEMIC 802.15.4 Sensor node\n\t2667  JCOP BlueZ Smartcard reader\n\t8802  SmartJoy Dual Plus PS2 converter\n\t8804  WiseGroup SuperJoy Box 5\n6677  WiseGroup, Ltd.\n\t8802  SmartJoy Dual Plus PS2 converter\n\t8811  Deluxe Dance Mat\n675d  Humanscale\n\t062a  Switch Mouse\n6891  3Com\n\ta727  3CRUSB10075 802.11bg [ZyDAS ZD1211]\n695c  Opera1\n\t3829  Opera1 DVB-S (warm state)\n6993  Yealink Network Technology Co., Ltd.\n\tb001  VoIP Phone\n6a75  Shanghai Jujo Electronics Co., Ltd\n7104  CME (Central Music Co.)\n\t2202  UF5/UF6/UF7/UF8 MIDI Master Keyboard\n726c  StackFoundry LLC\n\t2149  EntropyKing Random Number Generator\n7302  Solinftec\n\t0001  HUB 4X232\n734c  TBS Technologies China\n\t5920  Q-Box II DVB-S2 HD\n\t5928  Q-Box II DVB-S2 HD\n7373  Beijing STONE Technology Co. Ltd.\n\t5740  Intelligent TFT-LCD Module\n7392  Edimax Technology Co., Ltd\n\t7711  EW-7711UTn nLite Wireless Adapter [Ralink RT3070]\n\t7717  EW-7717UN 802.11n Wireless Adapter [Ralink RT2770]\n\t7718  EW-7718UN 802.11n Wireless Adapter [Ralink RT2870]\n\t7722  EW-7722UTn 802.11n Wireless Adapter [Ralink RT3072]\n\t7733  EW-7733UnD 802.11abgn 3x3:3 [Ralink RT3573]\n\t7811  EW-7811Un 802.11n Wireless Adapter [Realtek RTL8188CUS]\n\t7822  EW-7612UAn V2 802.11n Wireless Adapter [Realtek RTL8192CU]\n\ta611  EW-7611ULB 802.11b/g/n and Bluetooth 4.0 Adapter\n\ta711  EW-7711MAC 802.11ac Wireless Adapter\n\ta811  EW-7811UTC 802.11ac Wireless Adapter\n\tb711  EW-7722UAC 802.11a/b/g/n/ac (2x2) Wireless Adapter [MediaTek MT7612U]\n\tb822  EW-7822ULC 802.11ac Wireless Adapter [Realtek RTL8812AU]\n73d8  Progeny Dental Equipment Specialists\n\t0104  VetPro DR, Size 1\n\t0105  VetPro DR, Size 2\n7669  Venable Instruments\n\t350c  Model 350c, Frequency Response Analyzer\n\t5140  Model 5140, Frequency Response Analyzer\n\t6305  Model 6305, Frequency Response Analyzer\n\t6320  Model 6320, Frequency Response Analyzer\n\t6340  Model 6340, Frequency Response Analyzer\n\t7405  Model 7405, Frequency Response Analyzer\n\t7420  Model 7420, Frequency Response Analyzer\n\t7440  Model 7440, Frequency Response Analyzer\n\t8805  Model 8805, Frequency Response Analyzer\n\t8820  Model 8820, Frequency Response Analyzer\n\t8840  Model 8840, Frequency Response Analyzer\n7825  Other World Computing\n\ta2a4  External SATA Hard Drive Adapter cable PA023U3\n\tb0b3  miniStack MAX\n8070  ACCES I/O Products, Inc.\n\t8003  USB-DIO-96\n\t8070  USB-AO16-16A\n8086  Intel Corp.\n\t0001  AnyPoint (TM) Home Network 1.6 Mbps Wireless Adapter\n\t0044  CPU DRAM Controller\n\t0046  HD Graphics\n\t0100  Personal Audio Player 3000\n\t0101  Personal Audio Player 3000\n\t0110  Easy PC Camera\n\t0120  PC Camera CS120\n\t0180  WiMAX Connection 2400m\n\t0181  WiMAX Connection 2400m\n\t0182  WiMAX Connection 2400m\n\t0186  WiMAX Connection 2400m\n\t0188  WiMAX Connection 2400m\n\t0189  Centrino Advanced-N 6230 Bluetooth adapter\n\t0200  AnyPoint(TM) Wireless II Network 11Mbps Adapter [Atmel AT76C503A]\n\t0431  Pro Video PC Camera\n\t0510  Digital Movie Creator\n\t0630  Pocket PC Camera\n\t0780  CS780 Microphone Input\n\t07d3  BLOB boot loader firmware\n\t07dc  Bluetooth 4.0* Smart Ready (low energy)\n\t0a66  RealSense 3D Camera (Front F200)\n\t0aa5  RealSense SR300\n\t0ad2  RealSense D410\n\t0ad3  RealSense D415\n\t0b07  RealSense D435\n\t0b64  RealSense L515\n\t0dad  Cherry MiniatureCard Keyboard\n\t1010  AnyPoint(TM) Home Network 10 Mbps Phoneline Adapter\n\t110a  Bluetooth Controller from (Ericsson P4A)\n\t110b  Bluetooth Controller from (Intel/CSR)\n\t1110  PRO/Wireless LAN Module\n\t1111  PRO/Wireless 2011B 802.11b Adapter [Intersil PRISM 2.5]\n\t1122  Integrated Hub\n\t1134  Hollister Mobile Monitor\n\t1139  In-Target Probe (ITP)\n\t1234  Prototype Reader/Writer\n\t1403  WiMAX Connection 2400m\n\t1405  WiMAX Connection 2400m\n\t1406  WiMAX Connection 2400m\n\t2448  82801 PCI Bridge\n\t3100  PRO/DSL 3220 Modem - WAN\n\t3101  PRO/DSL 3220 Modem\n\t3240  AnyPoint® 3240 Modem - WAN\n\t3241  AnyPoint® 3240 Modem\n\t8602  Miniature Card Slot\n\t8c26  8 Series/C220 Series  EHCI #1\n\t8c2d  8 Series/C220 Series EHCI #2\n\t8c31  eXtensible Host Controller\n\t9303  8x930Hx Hub\n\t9500  CE 9500 DVB-T\n\t9890  82930 Test Board\n\ta36d  Host Controller\n\tbeef  SCM Miniature Card Reader/Writer\n\tc013  Wireless HID Station\n\tdead  Galileo\n\tf001  XScale PXA27x Bulverde flash\n\tf1a5  Z-U130 [Value Solid State Drive]\n8087  Intel Corp.\n\t0020  Integrated Rate Matching Hub\n\t0024  Integrated Rate Matching Hub\n\t0025  Wireless-AC 9260 Bluetooth Adapter\n\t0026  AX201 Bluetooth\n\t0029  AX200 Bluetooth\n\t0032  AX210 Bluetooth\n\t0033  AX211 Bluetooth\n\t0036  BE200 Bluetooth\n\t0716  Modem Flashloader\n\t07da  Centrino Bluetooth Wireless Transceiver\n\t07db  Atom C2000 Root Hub\n\t07dc  Bluetooth wireless interface\n\t07eb  Oaktrail tablet\n\t0a2a  Bluetooth wireless interface\n\t0a2b  Bluetooth wireless interface\n\t0a9e  Edison\n\t0aa7  Wireless-AC 3168 Bluetooth\n\t0aaa  Bluetooth 9460/9560 Jefferson Peak (JfP)\n\t0fff  Intel Android Bootloader Interface\n\t8000  Integrated Rate Matching Hub\n\t8001  Integrated Hub\n\t8002  8 channel internal hub\n\t8008  Integrated Rate Matching Hub\n\t800a  Hub\n80ee  VirtualBox\n\t0021  USB Tablet\n\t0022  multitouch tablet\n8282  Keio\n\t3201  Retro Adapter\n\t3301  Retro Adapter Mouse\n8301  Hapurs\n\t0089  HPBT05R 2.4 G Mini Wireless Touchpad Keyboard\n8341  EGO Systems, Inc.\n\t2000  Flashdisk\n8564  Transcend Information, Inc.\n\t1000  JetFlash\n\t4000  microSD/SD/CF UHS-II Card Reader [RDF8, RDF9]\n\t6000  digital photo frame PF830\n\t6002  digital photo frame PF830\n\t7000  StoreJet 25H3\n8644  Intenso GmbG\n\t8003  Micro Line\n\t800b  Micro Line (4GB)\n8e06  CH Products, Inc.\n\tf700  DT225 Trackball\n8ea3  Doosl\n\ta02c  Wireless Presenter Receiver\n9016  Sitecom\n\t182d  WL-022 802.11b Adapter\n9022  TeVii Technology Ltd.\n\td630  DVB-S S630\n\td650  DVB-S2 S650\n\td660  DVB-S2 S660\n9148  GeoLab, Ltd\n# All of GeoLab's devices share the same ID 0004.\n\t0004  R3 Compatible Device\n9516  Studiologic\n9710  MosChip Semiconductor\n\t7703  MCS7703 Serial Port Adapter\n\t7705  MCS7705 Parallel port adapter\n\t7715  MCS7715 Parallel and serial port adapter\n\t7717  MCS7717 3-port hub with serial and parallel adapter\n\t7720  MCS7720 Dual serial port adapter\n\t7730  MCS7730 10/100 Mbps Ethernet adapter\n\t7780  MCS7780 4Mbps Fast IrDA Adapter\n\t7784  MCS7784 115.2Kb IrDA Adapter\n\t7810  MCS7810 Serial Port Adapter\n\t7820  MCS7820 Dual Serial Port Adapter\n\t7830  MCS7830 10/100 Mbps Ethernet adapter\n\t7832  MCS7832 10/100 Mbps Ethernet adapter\n\t7840  MCS7820/MCS7840 2/4 port serial adapter\n\t9990  MCS9990 PCIe Host Controller\n9849  Bestmedia CD Recordable GmbH & Co. KG\n\t0701  Platinum MyDrive HP\n9886  Astro Gaming\n\t0015  A50\n9999  Odeon\n\t0001  JAF Mobile Phone Flasher Interface\n99fa  Grandtec\n\t8988  V.cap Camera Device\n9ac4  J. Westhues\n\t4b8f  ProxMark-3 RFID Instrument\n9e88  Marvell Semiconductor, Inc.\n\t9e8f  Plug Computer Basic [SheevaPlug]\na014  Insignia (Best Buy)\n\tb014  Desktop Microphone NS-PAUM50\na108  Ingenic Semiconductor Co.,Ltd\n\t1000  X1000\n\t4775  JZ4775 Boot Device\na128  AnMo Electronics Corp. / Dino-Lite (?)\n\t0610  Dino-Lite Digital Microscope (SN9C201 + HV7131R)\n\t0611  Dino-Lite Digital Microscope (SN9C201 + HV7131R)\n\t0612  Dino-Lite Digital Microscope (SN9C120 + HV7131R)\n\t0613  Dino-Lite Digital Microscope (SN9C201 + HV7131R)\n\t0614  Dino-Lite Digital Microscope (SN9C201 + MI1310/MT9M111)\n\t0615  Dino-Lite Digital Microscope (SN9C201 + MI1310/MT9M111)\n\t0616  Dino-Lite Digital Microscope (SN9C120 + HV7131R)\n\t0617  Dino-Lite Digital Microscope (SN9C201 + MI1310/MT9M111)\n\t0618  Dino-Lite Digital Microscope (SN9C201 + HV7131R)\na168  AnMo Electronics Corporation\n\t0610  Dino-Lite Digital Microscope\n\t0611  Dino-Lite Digital Microscope\n\t0613  Dino-Lite Digital Microscope\n\t0614  Dino-Lite Pro Digital Microscope\n\t0615  Dino-Lite Pro Digital Microscope\n\t0617  Dino-Lite Pro Digital Microscope\n\t0618  Dino-Lite Digital Microscope\na466  Haikou Xingong Electronics Co.,Ltd\n\t0a53  TL866II Plus Device Programmer [MiniPRO]\na600  ASIX s.r.o.\n\t5500  zuban H2OPS - GPS for canoeing\n\ta000  SIGMA Logic Analyzer\n\ta002  EMUSB interface pro MU Beta\n\tc000  MREL Data Trap II\n\tc001  VUTS DMU4\n\tc002  Electrone MASH\n\tc005  MREL HTU HandiTrap cable\n\tc006  JRC COmeter\n\te110  OK1ZIA Davac 4.x\n\te112  OK1ZIA Antenna rotator\n\te113  OK1ZIA GPIO\n\te114  OK1ZIA HD&Keyb\na727  3Com\n\t6893  3CRUSB20075 OfficeConnect Wireless 108Mbps 11g Adapter [Atheros AR5523]\n\t6895  AR5523\n\t6897  AR5523\na88a  Clas Ohlsson\n\t3003  PCFree Multimedia Remote Control PC\naaaa  MXT\n\t8815  microSD CardReader\n\t8816  microSD CardReader\nab12  aplic\n\t34cd  JMICRON JMS578 SATA 6Gb/s bridge\nabcd  LogiLink\n\t1234  UDisk flash drive\n\t6104  PCCloneEX Lite+ SATA docking station [QP0017]\n\tcdee  Petcam\nb58e  Blue Microphones\n\t9e84  Yeti Stereo Microphone\nba77  Clockmaker\n\t7147  Agterbosch\nc216  Card Device Expert Co., LTD\n\t0180  MSR90 MagStripe reader\nc251  Keil Software, Inc.\n\t1705  MCB2300\n\t2710  ULink\n\t2723  ULink-ME\nc502  AGPTek\n\t0029  Rocker\ncace  CACE Technologies Inc.\n\t0002  AirPCAP Classic 802.11 packet capture adapter\n\t0300  AirPcap NX [Atheros AR9170+AR9104]\ncd12  SMART TECHNOLOGY INDUSTRIAL LTD.\nd208  Ultimarc\n\t0310  Mini-PAC Arcade Control Interface\nd209  Ultimarc\n\t0301  I-PAC Arcade Control Interface\n\t0501  Ultra-Stik Ultimarc Ultra-Stik Player 1\n\t1571  A-PAC Arcade Control Interface\nd904  LogiLink\n\t0003  Laser Mouse (ID0009A)\ne2b7  Jie Li\n\t0811  CD002\n\t0812  CD005 MP3 Player\ne4e4  Xorcom Ltd.\n\t1130  Astribank series\n\t1131  Astribank series\n\t1132  Astribank series\n\t1140  Astribank series\n\t1141  Astribank series\n\t1142  Astribank series\n\t1150  Astribank series\n\t1151  Astribank series\n\t1152  Astribank series\n\t1160  Astribank 2 series\n\t1161  Astribank 2 series\n\t1162  Astribank 2 series\neb03  MakingThings\n\t0920  Make Controller Kit\neb1a  eMPIA Technology, Inc.\n\t17de  KWorld V-Stream XPERT DTV - DVB-T USB cold\n\t17df  KWorld V-Stream XPERT DTV - DVB-T USB warm\n\t2571  M035 Compact Web Cam\n\t2710  SilverCrest Webcam\n\t2750  ECS Elitegroup G220 integrated Webcam\n\t2761  EeePC 701 integrated Webcam\n\t2776  Combined audio and video input device\n\t2800  EM2800 Video Capture\n\t2801  EM2801 Video Capture\n\t2820  EM2820 Video Capture\n\t2821  EM2820 Video Capture\n\t2840  EM2840 Video Capture\n\t2841  EM2840 Video Capture\n\t2861  EasyCAP DC60+ [EM2861]\n\t2863  Video Grabber\n\t2870  Pinnacle PCTV Stick\n\t2881  EM2881 Video Controller\n\t50a3  Gadmei UTV380 TV Box\n\t50a6  Gadmei UTV330 TV Box\n\t5166  video grabber 28282\n\t5184  VIDBOX NW06 [EM28281]\n\t8179  Terratec Cinergy T2 Stick HD\n\te305  KWorld PlusTV Analog Stick\n\te355  KWorld DVB-T 355U Digital TV Dongle\neb2a  KWorld\nef18  SMART TECHNOLOGY INDUSTRIAL LTD.\nf003  Hewlett Packard\n\t6002  PhotoSmart C500\nf007  Teslong\n\ta999  Endoscope Camera\n\tb999  Otoscope Camera\nf182  Leap Motion\n\t0003  Controller\nf3f0  CCT, Inc\n\t0740  multi-function device\n\t1340  multi-function printer\n\t1440  printer device\n\t1921  printer\nf4ec  Atten Electronics / Siglent Technologies\n\tee38  Digital Storage Oscilloscope\nf4ed  Shenzhen Siglent Co., Ltd.\n\tee37  SDG1010 Waveform Generator\n\tee3a  SDG1010 Waveform Generator (TMC mode)\nf766  Hama\n\t0001  PC-Gamepad \"Greystorm\"\nfa11  DyingLight\n\t5afe  DyingLight\nfc08  Conrad Electronic SE\n\t0101  MIDI Cable UA0037\nff00  Power Delivery\nffee  FNK Tech\n\t0100  Card Reader Controller RTS5101/RTS5111/RTS5116\n\n# List of known device classes, subclasses and protocols\n\n# Syntax:\n# C class  class_name\n#\tsubclass  subclass_name\t\t\t<-- single tab\n#\t\tprotocol  protocol_name\t\t<-- two tabs\n\nC 00  (Defined at Interface level)\nC 01  Audio\n\t01  Control Device\n\t02  Streaming\n\t03  MIDI Streaming\nC 02  Communications\n\t01  Direct Line\n\t02  Abstract (modem)\n\t\t00  None\n\t\t01  AT-commands (v.25ter)\n\t\t02  AT-commands (PCCA101)\n\t\t03  AT-commands (PCCA101 + wakeup)\n\t\t04  AT-commands (GSM)\n\t\t05  AT-commands (3G)\n\t\t06  AT-commands (CDMA)\n\t\tfe  Defined by command set descriptor\n\t\tff  Vendor Specific (MSFT RNDIS?)\n\t03  Telephone\n\t04  Multi-Channel\n\t05  CAPI Control\n\t06  Ethernet Networking\n\t07  ATM Networking\n\t08  Wireless Handset Control\n\t09  Device Management\n\t0a  Mobile Direct Line\n\t0b  OBEX\n\t0c  Ethernet Emulation\n\t\t07  Ethernet Emulation (EEM)\nC 03  Human Interface Device\n\t00  No Subclass\n\t\t00  None\n\t\t01  Keyboard\n\t\t02  Mouse\n\t01  Boot Interface Subclass\n\t\t00  None\n\t\t01  Keyboard\n\t\t02  Mouse\nC 05  Physical Interface Device\nC 06  Imaging\n\t01  Still Image Capture\n\t\t01  Picture Transfer Protocol (PIMA 15470)\nC 07  Printer\n\t01  Printer\n\t\t00  Reserved/Undefined\n\t\t01  Unidirectional\n\t\t02  Bidirectional\n\t\t03  IEEE 1284.4 compatible bidirectional\n\t\tff  Vendor Specific\nC 08  Mass Storage\n\t01  RBC (typically Flash)\n\t\t00  Control/Bulk/Interrupt\n\t\t01  Control/Bulk\n\t\t50  Bulk-Only\n\t02  SFF-8020i, MMC-2 (ATAPI)\n\t03  QIC-157\n\t04  Floppy (UFI)\n\t\t00  Control/Bulk/Interrupt\n\t\t01  Control/Bulk\n\t\t50  Bulk-Only\n\t05  SFF-8070i\n\t06  SCSI\n\t\t00  Control/Bulk/Interrupt\n\t\t01  Control/Bulk\n\t\t50  Bulk-Only\nC 09  Hub\n\t00  Unused\n\t\t00  Full speed (or root) hub\n\t\t01  Single TT\n\t\t02  TT per port\nC 0a  CDC Data\n\t00  Unused\n\t\t30  I.430 ISDN BRI\n\t\t31  HDLC\n\t\t32  Transparent\n\t\t50  Q.921M\n\t\t51  Q.921\n\t\t52  Q.921TM\n\t\t90  V.42bis\n\t\t91  Q.932 EuroISDN\n\t\t92  V.120 V.24 rate ISDN\n\t\t93  CAPI 2.0\n\t\tfd  Host Based Driver\n\t\tfe  CDC PUF\n\t\tff  Vendor specific\nC 0b  Chip/SmartCard\nC 0d  Content Security\nC 0e  Video\n\t00  Undefined\n\t01  Video Control\n\t02  Video Streaming\n\t03  Video Interface Collection\nC 0f  Personal Healthcare\nC 10  Audio/Video\n\t01  AVData Control\n\t02  AVData Video Stream\n\t03  AVData Audio Stream\nC 11  Billboard\nC 12  Type-C Bridge\nC 13  Bulk Display\nC 14  MCTCP over USB\n\t00  MCTCP Management\n\t\t01  MCTCP 1.x\n\t\t02  MCTCP 2.x\n\t01  MCTCP Host\n\t\t01  MCTCP 1.x\n\t\t02  MCTCP 2.x\nC 3c  I3C\nC 58  Xbox\n\t42  Controller\nC dc  Diagnostic\n\t01  Reprogrammable Diagnostics\n\t\t01  USB2 Compliance\nC e0  Wireless\n\t01  Radio Frequency\n\t\t01  Bluetooth\n\t\t02  Ultra WideBand Radio Control\n\t\t03  RNDIS\n\t02  Wireless USB Wire Adapter\n\t\t01  Host Wire Adapter Control/Data Streaming\n\t\t02  Device Wire Adapter Control/Data Streaming\n\t\t03  Device Wire Adapter Isochronous Streaming\nC ef  Miscellaneous Device\n\t01  ?\n\t\t01  Microsoft ActiveSync\n\t\t02  Palm Sync\n\t02  ?\n\t\t01  Interface Association\n\t\t02  Wire Adapter Multifunction Peripheral\n\t03  ?\n\t\t01  Cable Based Association\n\t05  USB3 Vision\nC fe  Application Specific Interface\n\t01  Device Firmware Update\n\t02  IRDA Bridge\n\t03  Test and Measurement\n\t\t01  TMC\n\t\t02  USB488\nC ff  Vendor Specific Class\n\tff  Vendor Specific Subclass\n\t\tff  Vendor Specific Protocol\n\n# List of Audio Class Terminal Types\n\n# Syntax:\n# AT terminal_type  terminal_type_name\n\nAT 0100  USB Undefined\nAT 0101  USB Streaming\nAT 01ff  USB Vendor Specific\nAT 0200  Input Undefined\nAT 0201  Microphone\nAT 0202  Desktop Microphone\nAT 0203  Personal Microphone\nAT 0204  Omni-directional Microphone\nAT 0205  Microphone Array\nAT 0206  Processing Microphone Array\nAT 0300  Output Undefined\nAT 0301  Speaker\nAT 0302  Headphones\nAT 0303  Head Mounted Display Audio\nAT 0304  Desktop Speaker\nAT 0305  Room Speaker\nAT 0306  Communication Speaker\nAT 0307  Low Frequency Effects Speaker\nAT 0400  Bidirectional Undefined\nAT 0401  Handset\nAT 0402  Headset\nAT 0403  Speakerphone, no echo reduction\nAT 0404  Echo-suppressing speakerphone\nAT 0405  Echo-canceling speakerphone\nAT 0500  Telephony Undefined\nAT 0501  Phone line\nAT 0502  Telephone\nAT 0503  Down Line Phone\nAT 0600  External Undefined\nAT 0601  Analog Connector\nAT 0602  Digital Audio Interface\nAT 0603  Line Connector\nAT 0604  Legacy Audio Connector\nAT 0605  SPDIF interface\nAT 0606  1394 DA stream\nAT 0607  1394 DV stream soundtrack\nAT 0700  Embedded Undefined\nAT 0701  Level Calibration Noise Source\nAT 0702  Equalization Noise\nAT 0703  CD Player\nAT 0704  DAT\nAT 0705  DCC\nAT 0706  MiniDisc\nAT 0707  Analog Tape\nAT 0708  Phonograph\nAT 0709  VCR Audio\nAT 070a  Video Disc Audio\nAT 070b  DVD Audio\nAT 070c  TV Tuner Audio\nAT 070d  Satellite Receiver Audio\nAT 070e  Cable Tuner Audio\nAT 070f  DSS Audio\nAT 0710  Radio Receiver\nAT 0711  Radio Transmitter\nAT 0712  Multitrack Recorder\nAT 0713  Synthesizer\n\n# List of HID Descriptor Types\n\n# Syntax:\n# HID descriptor_type  descriptor_type_name\n\nHID 21  HID\nHID 22  Report\nHID 23  Physical\n\n# List of HID Descriptor Item Types\n# Note: 2 bits LSB encode data length following\n\n# Syntax:\n# R item_type  item_type_name\n\nR 04  Usage Page\nR 08  Usage\nR 14  Logical Minimum\nR 18  Usage Minimum\nR 24  Logical Maximum\nR 28  Usage Maximum\nR 34  Physical Minimum\nR 38  Designator Index\nR 44  Physical Maximum\nR 48  Designator Minimum\nR 54  Unit Exponent\nR 58  Designator Maximum\nR 64  Unit\nR 74  Report Size\nR 78  String Index\nR 80  Input\nR 84  Report ID\nR 88  String Minimum\nR 90  Output\nR 94  Report Count\nR 98  String Maximum\nR a0  Collection\nR a4  Push\nR a8  Delimiter\nR b0  Feature\nR b4  Pop\nR c0  End Collection\n\n# List of Physical Descriptor Bias Types\n\n# Syntax:\n# BIAS item_type  item_type_name\n\nBIAS 0  Not Applicable\nBIAS 1  Right Hand\nBIAS 2  Left Hand\nBIAS 3  Both Hands\nBIAS 4  Either Hand\n\n# List of Physical Descriptor Item Types\n\n# Syntax:\n# PHY item_type  item_type_name\n\nPHY 00  None\nPHY 01  Hand\nPHY 02  Eyeball\nPHY 03  Eyebrow\nPHY 04  Eyelid\nPHY 05  Ear\nPHY 06  Nose\nPHY 07  Mouth\nPHY 08  Upper Lip\nPHY 09  Lower Lip\nPHY 0a  Jaw\nPHY 0b  Neck\nPHY 0c  Upper Arm\nPHY 0d  Elbow\nPHY 0e  Forearm\nPHY 0f  Wrist\nPHY 10  Palm\nPHY 11  Thumb\nPHY 12  Index Finger\nPHY 13  Middle Finger\nPHY 14  Ring Finger\nPHY 15  Little Finger\nPHY 16  Head\nPHY 17  Shoulder\nPHY 18  Hip\nPHY 19  Waist\nPHY 1a  Thigh\nPHY 1b  Knee\nPHY 1c  calf\nPHY 1d  Ankle\nPHY 1e  Foot\nPHY 1f  Heel\nPHY 20  Ball of Foot\nPHY 21  Big Toe\nPHY 22  Second Toe\nPHY 23  Third Toe\nPHY 24  Fourth Toe\nPHY 25  Fifth Toe\nPHY 26  Brow\nPHY 27  Cheek\n\n# List of HID Usages\n\n# Syntax:\n# HUT hi  _usage_page  hid_usage_page_name\n#\thid_usage  hid_usage_name\n\nHUT 00  Undefined\nHUT 01  Generic Desktop Controls\n\t000  Undefined\n\t001  Pointer\n\t002  Mouse\n\t004  Joystick\n\t005  Gamepad\n\t006  Keyboard\n\t007  Keypad\n\t008  Multi-Axis Controller\n\t030  Direction-X\n\t031  Direction-Y\n\t032  Direction-Z\n\t033  Rotate-X\n\t034  Rotate-Y\n\t035  Rotate-Z\n\t036  Slider\n\t037  Dial\n\t038  Wheel\n\t039  Hat Switch\n\t03a  Counted Buffer\n\t03b  Byte Count\n\t03c  Motion Wakeup\n\t03d  Start\n\t03e  Select\n\t040  Vector-X\n\t041  Vector-Y\n\t042  Vector-Z\n\t043  Vector-X relative Body\n\t044  Vector-Y relative Body\n\t045  Vector-Z relative Body\n\t046  Vector\n\t080  System Control\n\t081  System Power Down\n\t082  System Sleep\n\t083  System Wake Up\n\t084  System Context Menu\n\t085  System Main Menu\n\t086  System App Menu\n\t087  System Menu Help\n\t088  System Menu Exit\n\t089  System Menu Select\n\t08a  System Menu Right\n\t08b  System Menu Left\n\t08c  System Menu Up\n\t08d  System Menu Down\n\t090  Direction Pad Up\n\t091  Direction Pad Down\n\t092  Direction Pad Right\n\t093  Direction Pad Left\nHUT 02  Simulation Controls\n\t000  Undefined\n\t001  Flight Simulation Device\n\t002  Automobile Simulation Device\n\t003  Tank Simulation Device\n\t004  Spaceship Simulation Device\n\t005  Submarine Simulation Device\n\t006  Sailing Simulation Device\n\t007  Motorcycle Simulation Device\n\t008  Sports Simulation Device\n\t009  Airplane Simualtion Device\n\t00a  Helicopter Simulation Device\n\t00b  Magic Carpet Simulation Device\n\t00c  Bicycle Simulation Device\n\t020  Flight Control Stick\n\t021  Flight Stick\n\t022  Cyclic Control\n\t023  Cyclic Trim\n\t024  Flight Yoke\n\t025  Track Control\n\t0b0  Aileron\n\t0b1  Aileron Trim\n\t0b2  Anti-Torque Control\n\t0b3  Autopilot Enable\n\t0b4  Chaff Release\n\t0b5  Collective Control\n\t0b6  Dive Break\n\t0b7  Electronic Countermeasures\n\t0b8  Elevator\n\t0b9  Elevator Trim\n\t0ba  Rudder\n\t0bb  Throttle\n\t0bc  Flight COmmunications\n\t0bd  Flare Release\n\t0be  Landing Gear\n\t0bf  Toe Break\n\t0c0  Trigger\n\t0c1  Weapon Arm\n\t0c2  Weapons Select\n\t0c3  Wing Flaps\n\t0c4  Accelerator\n\t0c5  Brake\n\t0c6  Clutch\n\t0c7  Shifter\n\t0c8  Steering\n\t0c9  Turret Direction\n\t0ca  Barrel Elevation\n\t0cb  Drive Plane\n\t0cc  Ballast\n\t0cd  Bicylce Crank\n\t0ce  Handle Bars\n\t0cf  Front Brake\n\t0d0  Rear Brake\nHUT 03  VR Controls\n\t000  Unidentified\n\t001  Belt\n\t002  Body Suit\n\t003  Flexor\n\t004  Glove\n\t005  Head Tracker\n\t006  Head Mounted Display\n\t007  Hand Tracker\n\t008  Oculometer\n\t009  Vest\n\t00a  Animatronic Device\n\t020  Stereo Enable\n\t021  Display Enable\nHUT 04  Sport Controls\n\t000  Unidentified\n\t001  Baseball Bat\n\t002  Golf Club\n\t003  Rowing Machine\n\t004  Treadmill\n\t030  Oar\n\t031  Slope\n\t032  Rate\n\t033  Stick Speed\n\t034  Stick Face Angle\n\t035  Stick Heel/Toe\n\t036  Stick Follow Through\n\t038  Stick Type\n\t039  Stick Height\n\t047  Stick Temp\n\t050  Putter\n\t051  1 Iron\n\t052  2 Iron\n\t053  3 Iron\n\t054  4 Iron\n\t055  5 Iron\n\t056  6 Iron\n\t057  7 Iron\n\t058  8 Iron\n\t059  9 Iron\n\t05a  10 Iron\n\t05b  11 Iron\n\t05c  Sand Wedge\n\t05d  Loft Wedge\n\t05e  Power Wedge\n\t05f  1 Wood\n\t060  3 Wood\n\t061  5 Wood\n\t062  7 Wood\n\t063  9 Wood\nHUT 05  Game Controls\n\t000  Undefined\n\t001  3D Game Controller\n\t002  Pinball Device\n\t003  Gun Device\n\t020  Point Of View\n\t021  Turn Right/Left\n\t022  Pitch Right/Left\n\t023  Roll Forward/Backward\n\t024  Move Right/Left\n\t025  Move Forward/Backward\n\t026  Move Up/Down\n\t027  Lean Right/Left\n\t028  Lean Forward/Backward\n\t029  Height of POV\n\t02a  Flipper\n\t02b  Secondary Flipper\n\t02c  Bump\n\t02d  New Game\n\t02e  Shoot Ball\n\t02f  Player\n\t030  Gun Bolt\n\t031  Gun Clip\n\t032  Gun Selector\n\t033  Gun Single Shot\n\t034  Gun Burst\n\t035  Gun Automatic\n\t036  Gun Safety\n\t037  Gamepad Fire/Jump\n\t038  Gamepad Fun\n\t039  Gamepad Trigger\nHUT 07  Keyboard\n\t000  No Event\n\t001  Keyboard ErrorRollOver\n\t002  Keyboard POSTfail\n\t003  Keyboard Error Undefined\n\t004  A\n\t005  B\n\t006  C\n\t007  D\n\t008  E\n\t009  F\n\t00a  G\n\t00b  H\n\t00c  I\n\t00d  J\n\t00e  K\n\t00f  L\n\t010  M\n\t011  N\n\t012  O\n\t013  P\n\t014  Q\n\t015  R\n\t016  S\n\t017  T\n\t018  U\n\t019  V\n\t01a  W\n\t01b  X\n\t01c  Y\n\t01d  Z\n\t01e  1 and ! (One and Exclamation)\n\t01f  2 and @ (2 and at)\n\t020  3 and # (3 and Hash)\n\t021  4 and $ (4 and Dollar Sign)\n\t022  5 and % (5 and Percent Sign)\n\t023  6 and ^ (6 and circumflex)\n\t024  7 and & (Seven and Ampersand)\n\t025  8 and * (Eight and asterisk)\n\t026  9 and ( (Nine and Parenthesis Left)\n\t027  0 and ) (Zero and Parenthesis Right)\n\t028  Return (Enter)\n\t029  Escape\n\t02a  Delete (Backspace)\n\t02b  Tab\n\t02c  Space Bar\n\t02d  - and _ (Minus and underscore)\n\t02e  = and + (Equal and Plus)\n\t02f  [ and { (Bracket and Braces Left)\n\t030  ] and } (Bracket and Braces Right)\n\t031  \\ and | (Backslash and Bar)\n\t032  # and ~ (Hash and Tilde, Non-US Keyboard near right shift)\n\t033  ; and : (Semicolon and Colon)\n\t034   and \" (Accent Acute and Double Quotes)\n\t035  ` and ~ (Accent Grace and Tilde)\n\t036  , and < (Comma and Less)\n\t037  . and > (Period and Greater)\n\t038  / and ? (Slash and Question Mark)\n\t039  Caps Lock\n\t03a  F1\n\t03b  F2\n\t03c  F3\n\t03d  F4\n\t03e  F5\n\t03f  F6\n\t040  F7\n\t041  F8\n\t042  F9\n\t043  F10\n\t044  F11\n\t045  F12\n\t046  Print Screen\n\t047  Scroll Lock\n\t048  Pause\n\t049  Insert\n\t04a  Home\n\t04b  Page Up\n\t04c  Delete Forward (without Changing Position)\n\t04d  End\n\t04e  Page Down\n\t04f  Right Arrow\n\t050  Left Arrow\n\t051  Down Arrow\n\t052  Up Arrow\n\t053  Num Lock and Clear\n\t054  Keypad / (Division Sign)\n\t055  Keypad * (Multiplication Sign)\n\t056  Keypad - (Subtraction Sign)\n\t057  Keypad + (Addition Sign)\n\t058  Keypad Enter\n\t059  Keypad 1 and END\n\t05a  Keypad 2 and Down Arrow\n\t05b  Keypad 3 and Page Down\n\t05c  Keypad 4 and Left Arrow\n\t05d  Keypad 5 (Tactilei Raised)\n\t05f  Keypad 6 and Right Arrow\n\t060  Keypad 7 and Home\n\t061  Keypad 8 and Up Arrow\n\t062  Keypad 8 and Page Up\n\t063  Keypad . (decimal delimiter) and Delete\n\t064  \\ and | (Backslash and Bar, UK and Non-US Keyboard near left shift)\n\t065  Keyboard Application (Windows Key for Win95 or Compose)\n\t066  Power (not a key)\n\t067  Keypad = (Equal Sign)\n\t068  F13\n\t069  F14\n\t06a  F15\n\t06b  F16\n\t06c  F17\n\t06d  F18\n\t06e  F19\n\t06f  F20\n\t070  F21\n\t071  F22\n\t072  F23\n\t073  F24\n\t074  Execute\n\t075  Help\n\t076  Menu\n\t077  Select\n\t078  Stop\n\t079  Again\n\t07a  Undo\n\t07b  Cut\n\t07c  Copy\n\t07d  Paste\n\t07e  Find\n\t07f  Mute\n\t080  Volume Up\n\t081  Volume Down\n\t082  Locking Caps Lock\n\t083  Locking Num Lock\n\t084  Locking Scroll Lock\n\t085  Keypad Comma\n\t086  Keypad Equal Sign (AS/400)\n\t087  International 1 (PC98)\n\t088  International 2 (PC98)\n\t089  International 3 (PC98)\n\t08a  International 4 (PC98)\n\t08b  International 5 (PC98)\n\t08c  International 6 (PC98)\n\t08d  International 7 (Toggle Single/Double Byte Mode)\n\t08e  International 8\n\t08f  International 9\n\t090  LANG 1 (Hangul/English Toggle, Korea)\n\t091  LANG 2 (Hanja Conversion, Korea)\n\t092  LANG 3 (Katakana, Japan)\n\t093  LANG 4 (Hiragana, Japan)\n\t094  LANG 5 (Zenkaku/Hankaku, Japan)\n\t095  LANG 6\n\t096  LANG 7\n\t097  LANG 8\n\t098  LANG 9\n\t099  Alternate Erase\n\t09a  SysReq/Attention\n\t09b  Cancel\n\t09c  Clear\n\t09d  Prior\n\t09e  Return\n\t09f  Separator\n\t0a0  Out\n\t0a1  Open\n\t0a2  Clear/Again\n\t0a3  CrSel/Props\n\t0a4  ExSel\n\t0e0  Control Left\n\t0e1  Shift Left\n\t0e2  Alt Left\n\t0e3  GUI Left\n\t0e4  Control Right\n\t0e5  Shift Right\n\t0e6  Alt Rigth\n\t0e7  GUI Right\nHUT 08  LEDs\n\t000  Undefined\n\t001  NumLock\n\t002  CapsLock\n\t003  Scroll Lock\n\t004  Compose\n\t005  Kana\n\t006  Power\n\t007  Shift\n\t008  Do not disturb\n\t009  Mute\n\t00a  Tone Enabke\n\t00b  High Cut Filter\n\t00c  Low Cut Filter\n\t00d  Equalizer Enable\n\t00e  Sound Field ON\n\t00f  Surround On\n\t010  Repeat\n\t011  Stereo\n\t012  Sampling Rate Detect\n\t013  Spinning\n\t014  CAV\n\t015  CLV\n\t016  Recording Format Detect\n\t017  Off-Hook\n\t018  Ring\n\t019  Message Waiting\n\t01a  Data Mode\n\t01b  Battery Operation\n\t01c  Battery OK\n\t01d  Battery Low\n\t01e  Speaker\n\t01f  Head Set\n\t020  Hold\n\t021  Microphone\n\t022  Coverage\n\t023  Night Mode\n\t024  Send Calls\n\t025  Call Pickup\n\t026  Conference\n\t027  Stand-by\n\t028  Camera On\n\t029  Camera Off\n\t02a  On-Line\n\t02b  Off-Line\n\t02c  Busy\n\t02d  Ready\n\t02e  Paper-Out\n\t02f  Paper-Jam\n\t030  Remote\n\t031  Forward\n\t032  Reverse\n\t033  Stop\n\t034  Rewind\n\t035  Fast Forward\n\t036  Play\n\t037  Pause\n\t038  Record\n\t039  Error\n\t03a  Usage Selected Indicator\n\t03b  Usage In Use Indicator\n\t03c  Usage Multi Indicator\n\t03d  Indicator On\n\t03e  Indicator Flash\n\t03f  Indicator Slow Blink\n\t040  Indicator Fast Blink\n\t041  Indicator Off\n\t042  Flash On Time\n\t043  Slow Blink On Time\n\t044  Slow Blink Off Time\n\t045  Fast Blink On Time\n\t046  Fast Blink Off Time\n\t047  Usage Color Indicator\n\t048  Indicator Red\n\t049  Indicator Green\n\t04a  Indicator Amber\n\t04b  Generic Indicator\n\t04c  System Suspend\n\t04d  External Power Connected\nHUT 09  Buttons\n\t000  No Button Pressed\n\t001  Button 1 (Primary)\n\t002  Button 2 (Secondary)\n\t003  Button 3 (Tertiary)\n\t004  Button 4\n\t005  Button 5\nHUT 0a  Ordinal\n\t001  Instance 1\n\t002  Instance 2\n\t003  Instance 3\nHUT 0b  Telephony\n\t000  Unassigned\n\t001  Phone\n\t002  Answering Machine\n\t003  Message Controls\n\t004  Handset\n\t005  Headset\n\t006  Telephony Key Pad\n\t007  Programmable Button\n\t020  Hook Switch\n\t021  Flash\n\t022  Feature\n\t023  Hold\n\t024  Redial\n\t025  Transfer\n\t026  Drop\n\t027  Park\n\t028  Forward Calls\n\t029  Alternate Function\n\t02a  Line\n\t02b  Speaker Phone\n\t02c  Conference\n\t02d  Ring Enable\n\t02e  Ring Select\n\t02f  Phone Mute\n\t030  Caller ID\n\t050  Speed Dial\n\t051  Store Number\n\t052  Recall Number\n\t053  Phone Directory\n\t070  Voice Mail\n\t071  Screen Calls\n\t072  Do Not Disturb\n\t073  Message\n\t074  Answer On/Offf\n\t090  Inside Dial Tone\n\t091  Outside Dial Tone\n\t092  Inside Ring Tone\n\t093  Outside Ring Tone\n\t094  Priority Ring Tone\n\t095  Inside Ringback\n\t096  Priority Ringback\n\t097  Line Busy Tone\n\t098  Recorder Tone\n\t099  Call Waiting Tone\n\t09a  Confirmation Tone 1\n\t09b  Confirmation Tone 2\n\t09c  Tones Off\n\t09d  Outside Ringback\n\t0b0  Key 1\n\t0b1  Key 2\n\t0b3  Key 3\n\t0b4  Key 4\n\t0b5  Key 5\n\t0b6  Key 6\n\t0b7  Key 7\n\t0b8  Key 8\n\t0b9  Key 9\n\t0ba  Key Star\n\t0bb  Key Pound\n\t0bc  Key A\n\t0bd  Key B\n\t0be  Key C\n\t0bf  Key D\nHUT 0c  Consumer\n\t000  Unassigned\n\t001  Consumer Control\n\t002  Numeric Key Pad\n\t003  Programmable Buttons\n\t020  +10\n\t021  +100\n\t022  AM/PM\n\t030  Power\n\t031  Reset\n\t032  Sleep\n\t033  Sleep After\n\t034  Sleep Mode\n\t035  Illumination\n\t036  Function Buttons\n\t040  Menu\n\t041  Menu Pick\n\t042  Menu Up\n\t043  Menu Down\n\t044  Menu Left\n\t045  Menu Right\n\t046  Menu Escape\n\t047  Menu Value Increase\n\t048  Menu Value Decrease\n\t060  Data on Screen\n\t061  Closed Caption\n\t062  Closed Caption Select\n\t063  VCR/TV\n\t064  Broadcast Mode\n\t065  Snapshot\n\t066  Still\n\t080  Selection\n\t081  Assign Selection\n\t082  Mode Step\n\t083  Recall Last\n\t084  Enter Channel\n\t085  Order Movie\n\t086  Channel\n\t087  Media Selection\n\t088  Media Select Computer\n\t089  Media Select TV\n\t08a  Media Select WWW\n\t08b  Media Select DVD\n\t08c  Media Select Telephone\n\t08d  Media Select Program Guide\n\t08e  Media Select Video Phone\n\t08f  Media Select Games\n\t090  Media Select Messages\n\t091  Media Select CD\n\t092  Media Select VCR\n\t093  Media Select Tuner\n\t094  Quit\n\t095  Help\n\t096  Media Select Tape\n\t097  Media Select Cable\n\t098  Media Select Satellite\n\t099  Media Select Security\n\t09a  Media Select Home\n\t09b  Media Select Call\n\t09c  Channel Increment\n\t09d  Channel Decrement\n\t09e  Media Select SAP\n\t0a0  VCR Plus\n\t0a1  Once\n\t0a2  Daily\n\t0a3  Weekly\n\t0a4  Monthly\n\t0b0  Play\n\t0b1  Pause\n\t0b2  Record\n\t0b3  Fast Forward\n\t0b4  Rewind\n\t0b5  Scan Next Track\n\t0b6  Scan Previous Track\n\t0b7  Stop\n\t0b8  Eject\n\t0b9  Random Play\n\t0ba  Select Disc\n\t0bb  Enter Disc\n\t0bc  Repeat\n\t0bd  Tracking\n\t0be  Track Normal\n\t0bf  Slow Tracking\n\t0c0  Frame Forward\n\t0c1  Frame Back\n\t0c2  Mark\n\t0c3  Clear Mark\n\t0c4  Repeat from Mark\n\t0c5  Return to Mark\n\t0c6  Search Mark Forward\n\t0c7  Search Mark Backward\n\t0c8  Counter Reset\n\t0c9  Show Counter\n\t0ca  Tracking Increment\n\t0cb  Tracking Decrement\n\t0cc  Stop/Eject\n\t0cd  Play/Pause\n\t0ce  Play/Skip\n\t0e0  Volume\n\t0e1  Balance\n\t0e2  Mute\n\t0e3  Bass\n\t0e4  Treble\n\t0e5  Bass Boost\n\t0e6  Surround Mode\n\t0e7  Loudness\n\t0e8  MPX\n\t0e9  Volume Increment\n\t0ea  Volume Decrement\n\t0f0  Speed Select\n\t0f1  Playback Speed\n\t0f2  Standard Play\n\t0f3  Long Play\n\t0f4  Extended Play\n\t0f5  Slow\n\t100  Fan Enable\n\t101  Fan Speed\n\t102  Light Enable\n\t103  Light Illumination Level\n\t104  Climate Control Enable\n\t105  Room Temperature\n\t106  Security Enable\n\t107  Fire Alarm\n\t108  Police Alarm\n\t150  Balance Right\n\t151  Balance Left\n\t152  Bass Increment\n\t153  Bass Decrement\n\t154  Treble Increment\n\t155  Treble Decrement\n\t160  Speaker System\n\t161  Channel Left\n\t162  Channel Right\n\t163  Channel Center\n\t164  Channel Front\n\t165  Channel Center Front\n\t166  Channel Side\n\t167  Channel Surround\n\t168  Channel Low Frequency Enhancement\n\t169  Channel Top\n\t16a  Channel Unknown\n\t170  Sub-Channel\n\t171  Sub-Channel Increment\n\t172  Sub-Channel Decrement\n\t173  Alternative Audio Increment\n\t174  Alternative Audio Decrement\n\t180  Application Launch Buttons\n\t181  AL Launch Button Configuration Tool\n\t182  AL Launch Button Configuration\n\t183  AL Consumer Control Configuration\n\t184  AL Word Processor\n\t185  AL Text Editor\n\t186  AL Spreadsheet\n\t187  AL Graphics Editor\n\t188  AL Presentation App\n\t189  AL Database App\n\t18a  AL Email Reader\n\t18b  AL Newsreader\n\t18c  AL Voicemail\n\t18d  AL Contacts/Address Book\n\t18e  AL Calendar/Schedule\n\t18f  AL Task/Project Manager\n\t190  AL Log/Jounal/Timecard\n\t191  AL Checkbook/Finance\n\t192  AL Calculator\n\t193  AL A/V Capture/Playback\n\t194  AL Local Machine Browser\n\t195  AL LAN/Wan Browser\n\t196  AL Internet Browser\n\t197  AL Remote Networking/ISP Connect\n\t198  AL Network Conference\n\t199  AL Network Chat\n\t19a  AL Telephony/Dialer\n\t19b  AL Logon\n\t19c  AL Logoff\n\t19d  AL Logon/Logoff\n\t19e  AL Terminal Local/Screensaver\n\t19f  AL Control Panel\n\t1a0  AL Command Line Processor/Run\n\t1a1  AL Process/Task Manager\n\t1a2  AL Select Task/Application\n\t1a3  AL Next Task/Application\n\t1a4  AL Previous Task/Application\n\t1a5  AL Preemptive Halt Task/Application\n\t200  Generic GUI Application Controls\n\t201  AC New\n\t202  AC Open\n\t203  AC CLose\n\t204  AC Exit\n\t205  AC Maximize\n\t206  AC Minimize\n\t207  AC Save\n\t208  AC Print\n\t209  AC Properties\n\t21a  AC Undo\n\t21b  AC Copy\n\t21c  AC Cut\n\t21d  AC Paste\n\t21e  AC Select All\n\t21f  AC Find\n\t220  AC Find and Replace\n\t221  AC Search\n\t222  AC Go To\n\t223  AC Home\n\t224  AC Back\n\t225  AC Forward\n\t226  AC Stop\n\t227  AC Refresh\n\t228  AC Previous Link\n\t229  AC Next Link\n\t22b  AC History\n\t22c  AC Subscriptions\n\t22d  AC Zoom In\n\t22e  AC Zoom Out\n\t22f  AC Zoom\n\t230  AC Full Screen View\n\t231  AC Normal View\n\t232  AC View Toggle\n\t233  AC Scroll Up\n\t234  AC Scroll Down\n\t235  AC Scroll\n\t236  AC Pan Left\n\t237  AC Pan Right\n\t238  AC Pan\n\t239  AC New Window\n\t23a  AC Tile Horizontally\n\t23b  AC Tile Vertically\n\t23c  AC Format\nHUT 0d  Digitizer\n\t000  Undefined\n\t001  Digitizer\n\t002  Pen\n\t003  Light Pen\n\t004  Touch Screen\n\t005  Touch Pad\n\t006  White Board\n\t007  Coordinate Measuring Machine\n\t008  3D Digitizer\n\t009  Stereo Plotter\n\t00a  Articulated Arm\n\t00b  Armature\n\t00c  Multiple Point Digitizer\n\t00d  Free Space Wand\n\t020  Stylus\n\t021  Puck\n\t022  Finger\n\t030  Tip Pressure\n\t031  Barrel Pressure\n\t032  In Range\n\t033  Touch\n\t034  Untouch\n\t035  Tap\n\t036  Quality\n\t037  Data Valid\n\t038  Transducer Index\n\t039  Tablet Function Keys\n\t03a  Program Change Keys\n\t03b  Battery Strength\n\t03c  Invert\n\t03d  X Tilt\n\t03e  Y Tilt\n\t03f  Azimuth\n\t040  Altitude\n\t041  Twist\n\t042  Tip Switch\n\t043  Secondary Tip Switch\n\t044  Barrel Switch\n\t045  Eraser\n\t046  Tablet Pick\n\t047  Confidence\n\t048  Width\n\t049  Height\n\t051  Contact ID\n\t052  Input Mode\n\t053  Device Index\n\t054  Contact Count\n\t055  Maximum Contact Number\nHUT 0f  PID Page\n\t000  Undefined\n\t001  Physical Interface Device\n\t020  Normal\n\t021  Set Effect Report\n\t022  Effect Block Index\n\t023  Parameter Block Offset\n\t024  ROM Flag\n\t025  Effect Type\n\t026  ET Constant Force\n\t027  ET Ramp\n\t028  ET Custom Force Data\n\t030  ET Square\n\t031  ET Sine\n\t032  ET Triangle\n\t033  ET Sawtooth Up\n\t034  ET Sawtooth Down\n\t040  ET Spring\n\t041  ET Damper\n\t042  ET Inertia\n\t043  ET Friction\n\t050  Duration\n\t051  Sample Period\n\t052  Gain\n\t053  Trigger Button\n\t054  Trigger Repeat Interval\n\t055  Axes Enable\n\t056  Direction Enable\n\t057  Direction\n\t058  Type Specific Block Offset\n\t059  Block Type\n\t05A  Set Envelope Report\n\t05B  Attack Level\n\t05C  Attack Time\n\t05D  Fade Level\n\t05E  Fade Time\n\t05F  Set Condition Report\n\t060  CP Offset\n\t061  Positive Coefficient\n\t062  Negative Coefficient\n\t063  Positive Saturation\n\t064  Negative Saturation\n\t065  Dead Band\n\t066  Download Force Sample\n\t067  Isoch Custom Force Enable\n\t068  Custom Force Data Report\n\t069  Custom Force Data\n\t06A  Custom Force Vendor Defined Data\n\t06B  Set Custom Force Report\n\t06C  Custom Force Data Offset\n\t06D  Sample Count\n\t06E  Set Periodic Report\n\t06F  Offset\n\t070  Magnitude\n\t071  Phase\n\t072  Period\n\t073  Set Constant Force Report\n\t074  Set Ramp Force Report\n\t075  Ramp Start\n\t076  Ramp End\n\t077  Effect Operation Report\n\t078  Effect Operation\n\t079  Op Effect Start\n\t07A  Op Effect Start Solo\n\t07B  Op Effect Stop\n\t07C  Loop Count\n\t07D  Device Gain Report\n\t07E  Device Gain\n\t07F  PID Pool Report\n\t080  RAM Pool Size\n\t081  ROM Pool Size\n\t082  ROM Effect Block Count\n\t083  Simultaneous Effects Max\n\t084  Pool Alignment\n\t085  PID Pool Move Report\n\t086  Move Source\n\t087  Move Destination\n\t088  Move Length\n\t089  PID Block Load Report\n\t08B  Block Load Status\n\t08C  Block Load Success\n\t08D  Block Load Full\n\t08E  Block Load Error\n\t08F  Block Handle\n\t090  PID Block Free Report\n\t091  Type Specific Block Handle\n\t092  PID State Report\n\t094  Effect Playing\n\t095  PID Device Control Report\n\t096  PID Device Control\n\t097  DC Enable Actuators\n\t098  DC Disable Actuators\n\t099  DC Stop All Effects\n\t09A  DC Device Reset\n\t09B  DC Device Pause\n\t09C  DC Device Continue\n\t09F  Device Paused\n\t0A0  Actuators Enabled\n\t0A4  Safety Switch\n\t0A5  Actuator Override Switch\n\t0A6  Actuator Power\n\t0A7  Start Delay\n\t0A8  Parameter Block Size\n\t0A9  Device Managed Pool\n\t0AA  Shared Parameter Blocks\n\t0AB  Create New Effect Report\n\t0AC  RAM Pool Available\nHUT 10  Unicode\nHUT 14  Alphanumeric Display\n\t000  Undefined\n\t001  Alphanumeric Display\n\t020  Display Attributes Report\n\t021  ASCII Character Set\n\t022  Data Read Back\n\t023  Font Read Back\n\t024  Display Control Report\n\t025  Clear Display\n\t026  Display Enable\n\t027  Screen Saver Delay\n\t028  Screen Saver Enable\n\t029  Vertical Scroll\n\t02a  Horizontal Scroll\n\t02b  Character Report\n\t02c  Display Data\n\t02d  Display Status\n\t02e  Stat Not Ready\n\t02f  Stat Ready\n\t030  Err Not a loadable Character\n\t031  Err Font Data Cannot Be Read\n\t032  Cursur Position Report\n\t033  Row\n\t034  Column\n\t035  Rows\n\t036  Columns\n\t037  Cursor Pixel Positioning\n\t038  Cursor Mode\n\t039  Cursor Enable\n\t03a  Cursor Blink\n\t03b  Font Report\n\t03c  Font Data\n\t03d  Character Width\n\t03e  Character Height\n\t03f  Character Spacing Horizontal\n\t040  Character Spacing Vertical\n\t041  Unicode Character Set\nHUT 80  USB Monitor\n\t001  Monitor Control\n\t002  EDID Information\n\t003  VDIF Information\n\t004  VESA Version\nHUT 81  USB Monitor Enumerated Values\nHUT 82  Monitor VESA Virtual Controls\n\t001  Degauss\n\t010  Brightness\n\t012  Contrast\n\t016  Red Video Gain\n\t018  Green Video Gain\n\t01a  Blue Video Gain\n\t01c  Focus\n\t020  Horizontal Position\n\t022  Horizontal Size\n\t024  Horizontal Pincushion\n\t026  Horizontal Pincushion Balance\n\t028  Horizontal Misconvergence\n\t02a  Horizontal Linearity\n\t02c  Horizontal Linearity Balance\n\t030  Vertical Position\n\t032  Vertical Size\n\t034  Vertical Pincushion\n\t036  Vertical Pincushion Balance\n\t038  Vertical Misconvergence\n\t03a  Vertical Linearity\n\t03c  Vertical Linearity Balance\n\t040  Parallelogram Balance (Key Distortion)\n\t042  Trapezoidal Distortion (Key)\n\t044  Tilt (Rotation)\n\t046  Top Corner Distortion Control\n\t048  Top Corner Distortion Balance\n\t04a  Bottom Corner Distortion Control\n\t04c  Bottom Corner Distortion Balance\n\t056  Horizontal Moire\n\t058  Vertical Moire\n\t05e  Input Level Select\n\t060  Input Source Select\n\t06c  Red Video Black Level\n\t06e  Green Video Black Level\n\t070  Blue Video Black Level\n\t0a2  Auto Size Center\n\t0a4  Polarity Horizontal Sychronization\n\t0a6  Polarity Vertical Synchronization\n\t0aa  Screen Orientation\n\t0ac  Horizontal Frequency in Hz\n\t0ae  Vertical Frequency in 0.1 Hz\n\t0b0  Settings\n\t0ca  On Screen Display (OSD)\n\t0d4  Stereo Mode\nHUT 84  Power Device Page\n\t000  Undefined\n\t001  iName\n\t002  Present Status\n\t003  Changed Status\n\t004  UPS\n\t005  Power Supply\n\t010  Battery System\n\t011  Battery System ID\n\t012  Battery\n\t013  Battery ID\n\t014  Charger\n\t015  Charger ID\n\t016  Power Converter\n\t017  Power Converter ID\n\t018  Outlet System\n\t019  Outlet System ID\n\t01a  Input\n\t01b  Input ID\n\t01c  Output\n\t01d  Output ID\n\t01e  Flow\n\t01f  Flow ID\n\t020  Outlet\n\t021  Outlet ID\n\t022  Gang\n\t023  Gang ID\n\t024  Power Summary\n\t025  Power Summary ID\n\t030  Voltage\n\t031  Current\n\t032  Frequency\n\t033  Apparent Power\n\t034  Active Power\n\t035  Percent Load\n\t036  Temperature\n\t037  Humidity\n\t038  Bad Count\n\t040  Config Voltage\n\t041  Config Current\n\t042  Config Frequency\n\t043  Config Apparent Power\n\t044  Config Active Power\n\t045  Config Percent Load\n\t046  Config Temperature\n\t047  Config Humidity\n\t050  Switch On Control\n\t051  Switch Off Control\n\t052  Toggle Control\n\t053  Low Voltage Transfer\n\t054  High Voltage Transfer\n\t055  Delay Before Reboot\n\t056  Delay Before Startup\n\t057  Delay Before Shutdown\n\t058  Test\n\t059  Module Reset\n\t05a  Audible Alarm Control\n\t060  Present\n\t061  Good\n\t062  Internal Failure\n\t063  Voltage out of range\n\t064  Frequency out of range\n\t065  Overload\n\t066  Over Charged\n\t067  Over Temperature\n\t068  Shutdown Requested\n\t069  Shutdown  Imminent\n\t06a  Reserved\n\t06b  Switch On/Off\n\t06c  Switchable\n\t06d  Used\n\t06e  Boost\n\t06f  Buck\n\t070  Initialized\n\t071  Tested\n\t072  Awaiting Power\n\t073  Communication Lost\n\t0fd  iManufacturer\n\t0fe  iProduct\n\t0ff  iSerialNumber\nHUT 85  Battery System Page\n\t000  Undefined\n\t001  SMB Battery Mode\n\t002  SMB Battery Status\n\t003  SMB Alarm Warning\n\t004  SMB Charger Mode\n\t005  SMB Charger Status\n\t006  SMB Charger Spec Info\n\t007  SMB Selector State\n\t008  SMB Selector Presets\n\t009  SMB Selector Info\n\t010  Optional Mfg. Function 1\n\t011  Optional Mfg. Function 2\n\t012  Optional Mfg. Function 3\n\t013  Optional Mfg. Function 4\n\t014  Optional Mfg. Function 5\n\t015  Connection to SMBus\n\t016  Output Connection\n\t017  Charger Connection\n\t018  Battery Insertion\n\t019  Use Next\n\t01a  OK to use\n\t01b  Battery  Supported\n\t01c  SelectorRevision\n\t01d  Charging Indicator\n\t028  Manufacturer Access\n\t029  Remaining Capacity Limit\n\t02a  Remaining Time Limit\n\t02b  At Rate\n\t02c  Capacity Mode\n\t02d  Broadcast To Charger\n\t02e  Primary Battery\n\t02f  Charge Controller\n\t040  Terminate Charge\n\t041  Terminate Discharge\n\t042  Below Remaining Capacity Limit\n\t043  Remaining Time Limit Expired\n\t044  Charging\n\t045  Discharging\n\t046  Fully Charged\n\t047  Fully Discharged\n\t048  Conditioning Flag\n\t049  At Rate OK\n\t04a  SMB Error Code\n\t04b  Need Replacement\n\t060  At Rate Time To Full\n\t061  At Rate Time To Empty\n\t062  Average Current\n\t063  Max Error\n\t064  Relative State Of Charge\n\t065  Absolute State Of Charge\n\t066  Remaining Capacity\n\t067  Full Charge Capacity\n\t068  Run Time To Empty\n\t069  Average Time To Empty\n\t06a  Average Time To Full\n\t06b  Cycle Count\n\t080  Batt. Pack Model Level\n\t081  Internal Charge Controller\n\t082  Primary Battery Support\n\t083  Design Capacity\n\t084  Specification Info\n\t085  Manufacturer Date\n\t086  Serial Number\n\t087  iManufacturerName\n\t088  iDeviceName\n\t089  iDeviceChemistry\n\t08a  Manufacturer Data\n\t08b  Rechargeable\n\t08c  Warning Capacity Limit\n\t08d  Capacity Granularity 1\n\t08e  Capacity Granularity 2\n\t08f  iOEMInformation\n\t0c0  Inhibit Charge\n\t0c1  Enable Polling\n\t0c2  Reset To Zero\n\t0d0  AC Present\n\t0d1  Battery Present\n\t0d2  Power Fail\n\t0d3  Alarm Inhibited\n\t0d4  Thermistor Under Range\n\t0d5  Thermistor Hot\n\t0d6  Thermistor Cold\n\t0d7  Thermistor Over Range\n\t0d8  Voltage Out Of Range\n\t0d9  Current Out Of Range\n\t0da  Current Not Regulated\n\t0db  Voltage Not Regulated\n\t0dc  Master Mode\n\t0f0  Charger Selector Support\n\t0f1  Charger Spec\n\t0f2  Level 2\n\t0f3  Level 3\nHUT 86  Power Pages\nHUT 87  Power Pages\nHUT 8c  Bar Code Scanner Page (POS)\nHUT 8d  Scale Page (POS)\nHUT 90  Camera Control Page\nHUT 91  Arcade Control Page\nHUT f0  Cash Device\n\t0f1  Cash Drawer\n\t0f2  Cash Drawer Number\n\t0f3  Cash Drawer Set\n\t0f4  Cash Drawer Status\nHUT ff  Vendor Specific\n\n# List of Languages\n\n# Syntax:\n# L language_id  language_name\n#\tdialect_id  dialect_name\n\nL 0001  Arabic\n\t01  Saudi Arabia\n\t02  Iraq\n\t03  Egypt\n\t04  Libya\n\t05  Algeria\n\t06  Morocco\n\t07  Tunesia\n\t08  Oman\n\t09  Yemen\n\t0a  Syria\n\t0b  Jordan\n\t0c  Lebanon\n\t0d  Kuwait\n\t0e  U.A.E\n\t0f  Bahrain\n\t10  Qatar\nL 0002  Bulgarian\nL 0003  Catalan\nL 0004  Chinese\n\t01  Traditional\n\t02  Simplified\n\t03  Hongkong SAR, PRC\n\t04  Singapore\n\t05  Macau SAR\nL 0005  Czech\nL 0006  Danish\nL 0007  German\n\t01  German\n\t02  Swiss\n\t03  Austrian\n\t04  Luxembourg\n\t05  Liechtenstein\nL 0008  Greek\nL 0009  English\n\t01  US\n\t02  UK\n\t03  Australian\n\t04  Canadian\n\t05  New Zealand\n\t06  Ireland\n\t07  South Africa\n\t08  Jamaica\n\t09  Carribean\n\t0a  Belize\n\t0b  Trinidad\n\t0c  Zimbabwe\n\t0d  Philippines\nL 000a  Spanish\n\t01  Castilian\n\t02  Mexican\n\t03  Modern\n\t04  Guatemala\n\t05  Costa Rica\n\t06  Panama\n\t07  Dominican Republic\n\t08  Venzuela\n\t09  Colombia\n\t0a  Peru\n\t0b  Argentina\n\t0c  Ecuador\n\t0d  Chile\n\t0e  Uruguay\n\t0f  Paraguay\n\t10  Bolivia\n\t11  El Salvador\n\t12  Honduras\n\t13  Nicaragua\n\t14  Puerto Rico\nL 000b  Finnish\nL 000c  French\n\t01  French\n\t02  Belgian\n\t03  Canadian\n\t04  Swiss\n\t05  Luxembourg\n\t06  Monaco\nL 000d  Hebrew\nL 000e  Hungarian\nL 000f  Idelandic\nL 0010  Italian\n\t01  Italian\n\t02  Swiss\nL 0011  Japanese\nL 0012  Korean\n\t01  Korean\nL 0013  Dutch\n\t01  Dutch\n\t02  Belgian\nL 0014  Norwegian\n\t01  Bokmal\n\t02  Nynorsk\nL 0015  Polish\nL 0016  Portuguese\n\t01  Portuguese\n\t02  Brazilian\nL 0017  forgotten\nL 0018  Romanian\nL 0019  Russian\nL 001a  Serbian\n\t01  Croatian\n\t02  Latin\n\t03  Cyrillic\nL 001b  Slovak\nL 001c  Albanian\nL 001d  Swedish\n\t01  Swedish\n\t02  Finland\nL 001e  Thai\nL 001f  Turkish\nL 0020  Urdu\n\t01  Pakistan\n\t02  India\nL 0021  Indonesian\nL 0022  Ukrainian\nL 0023  Belarusian\nL 0024  Slovenian\nL 0025  Estonian\nL 0026  Latvian\nL 0027  Lithuanian\n\t01  Lithuanian\nL 0028  forgotten\nL 0029  Farsi\nL 002a  Vietnamese\nL 002b  Armenian\nL 002c  Azeri\n\t01  Cyrillic\n\t02  Latin\nL 002d  Basque\nL 002e  forgotten\nL 002f  Macedonian\nL 0036  Afrikaans\nL 0037  Georgian\nL 0038  Faeroese\nL 0039  Hindi\nL 003e  Malay\n\t01  Malaysia\n\t02  Brunei Darassalam\nL 003f  Kazak\nL 0041  Awahili\nL 0043  Uzbek\n\t01  Latin\n\t02  Cyrillic\nL 0044  Tatar\nL 0045  Bengali\nL 0046  Punjabi\nL 0047  Gujarati\nL 0048  Oriya\nL 0049  Tamil\nL 004a  Telugu\nL 004b  Kannada\nL 004c  Malayalam\nL 004d  Assamese\nL 004e  Marathi\nL 004f  Sanskrit\nL 0057  Konkani\nL 0058  Manipuri\nL 0059  Sindhi\nL 0060  Kashmiri\n\t02  India\nL 0061  Nepali\n\t02  India\n\n# HID Descriptor bCountryCode\n# HID Specification 1.11 (2001-06-27) page 23\n#\n# Syntax:\n# HCC country_code keymap_type\n\nHCC 00  Not supported\nHCC 01  Arabic\nHCC 02  Belgian\nHCC 03  Canadian-Bilingual\nHCC 04  Canadian-French\nHCC 05  Czech Republic\nHCC 06  Danish\nHCC 07  Finnish\nHCC 08  French\nHCC 09  German\nHCC 10  Greek\nHCC 11  Hebrew\nHCC 12  Hungary\nHCC 13  International (ISO)\nHCC 14  Italian\nHCC 15  Japan (Katakana)\nHCC 16  Korean\nHCC 17  Latin American\nHCC 18  Netherlands/Dutch\nHCC 19  Norwegian\nHCC 20  Persian (Farsi)\nHCC 21  Poland\nHCC 22  Portuguese\nHCC 23  Russia\nHCC 24  Slovakia\nHCC 25  Spanish\nHCC 26  Swedish\nHCC 27  Swiss/French\nHCC 28  Swiss/German\nHCC 29  Switzerland\nHCC 30  Taiwan\nHCC 31  Turkish-Q\nHCC 32  UK\nHCC 33  US\nHCC 34  Yugoslavia\nHCC 35  Turkish-F\n\n# List of Video Class Terminal Types\n\n# Syntax:\n# VT terminal_type  terminal_type_name\n\nVT 0100  USB Vendor Specific\nVT 0101  USB Streaming\nVT 0200  Input Vendor Specific\nVT 0201  Camera Sensor\nVT 0202  Sequential Media\nVT 0300  Output Vendor Specific\nVT 0301  Generic Display\nVT 0302  Sequential Media\nVT 0400  External Vendor Specific\nVT 0401  Composite Video\nVT 0402  S-Video\nVT 0403  Component Video\n"
  },
  {
    "path": "electron-builder.json",
    "content": "{\n    \"appId\": \"com.teabox.winboat\",\n    \"productName\": \"WinBoat\",\n    \"directories\": {\n        \"output\": \"dist\"\n    },\n    \"publish\": null,\n    \"nsis\": {\n        \"oneClick\": false,\n        \"perMachine\": false,\n        \"allowToChangeInstallationDirectory\": true,\n        \"shortcutName\": \"WinBoat\"\n    },\n    \"win\": {\n        \"target\": \"nsis\"\n    },\n    \"linux\": {\n        \"icon\": \"icons/winboat_logo.svg\",\n        \"target\": [\"appimage\", \"deb\", \"rpm\", \"tar.bz2\"],\n        \"category\": \"Utility\",\n        \"artifactName\": \"${name}-${version}-${arch}.${ext}\"\n    },\n    \"files\": [\n        {\n            \"from\": \"build/main\",\n            \"to\": \"main\",\n            \"filter\": [\"**/*\"]\n        },\n        {\n            \"from\": \"build/renderer\",\n            \"to\": \"renderer\",\n            \"filter\": [\"**/*\"]\n        },\n        {\n            \"from\": \"src/main/static\",\n            \"to\": \"static\",\n            \"filter\": [\"**/*\"]\n        },\n        \"!build\",\n        \"!dist\",\n        \"!scripts\"\n    ],\n    \"extraResources\": [\n        {\n            \"from\": \"./guest_server\",\n            \"to\": \"guest_server\",\n            \"filter\": [\"**/*\"]\n        },\n        {\n            \"from\": \"./data\",\n            \"to\": \"data\",\n            \"filter\": [\"**/*\"]\n        }\n    ]\n}\n"
  },
  {
    "path": "guest_server/RDPApps.reg",
    "content": "Windows Registry Editor Version 5.00\n\n    ; Disable RemoteApp allowlist so all applications can be used in Remote Desktop sessions\n    [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Terminal Server\\TSAppAllowList]\n    \"fDisabledAllowList\"=dword:00000001\n\n    ; Allow unlisted programs to be run in Remote Desktop sessions\n    [HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows NT\\Terminal Services]\n    \"fAllowUnlistedRemotePrograms\"=dword:00000001\n\n    ; Disable automatic administrator logon at startup\n    [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon]\n    \"AutoAdminLogon\"=\"0\"\n\n    ; Always use the server's keyboard layout, TODO: Investigate\n    [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Keyboard Layout]\n    \"IgnoreRemoteKeyboardLayout\"=dword:00000001\n\n    ; Disable \"Do you want your PC to be discoverable\" prompt after each host system reboot\n    [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Network\\NewNetworkWindowOff]"
  },
  {
    "path": "guest_server/argon2.go",
    "content": "package main\n\nimport (\n\t\"crypto/subtle\"\n\t\"encoding/base64\"\n\t\"errors\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"golang.org/x/crypto/argon2\"\n)\n\ntype Argon2Configuration struct {\n\tHashRaw    []byte\n\tSalt       []byte\n\tTimeCost   uint32\n\tMemoryCost uint32\n\tThreads    uint8\n\tKeyLength  uint32\n}\n\nfunc parseArgon2Hash(encodedHash string) (*Argon2Configuration, error) {\n\tcomponents := strings.Split(encodedHash, \"$\")\n\tif len(components) != 6 {\n\t\treturn nil, errors.New(\"invalid hash format structure\")\n\t}\n\n\t// Validate algorithm identifier\n\tif !strings.HasPrefix(components[1], \"argon2id\") {\n\t\treturn nil, errors.New(\"unsupported algorithm variant\")\n\t}\n\n\t// Extract version information\n\tvar version int\n\tfmt.Sscanf(components[2], \"v=%d\", &version)\n\n\t// Parse configuration parameters\n\tconfig := &Argon2Configuration{}\n\tfmt.Sscanf(components[3], \"m=%d,t=%d,p=%d\",\n\t\t&config.MemoryCost, &config.TimeCost, &config.Threads)\n\n\t// Decode salt component\n\tsalt, err := base64.RawStdEncoding.DecodeString(components[4])\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"salt decoding failed: %w\", err)\n\t}\n\tconfig.Salt = salt\n\n\t// Decode hash component\n\thash, err := base64.RawStdEncoding.DecodeString(components[5])\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"hash decoding failed: %w\", err)\n\t}\n\tconfig.HashRaw = hash\n\tconfig.KeyLength = uint32(len(hash))\n\n\treturn config, nil\n}\n\nfunc verifyPasswordSecure(storedHash, providedPassword string) (bool, error) {\n\t// Parse stored hash parameters\n\tconfig, err := parseArgon2Hash(storedHash)\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"hash parsing failed: %w\", err)\n\t}\n\n\t// Generate hash using identical parameters\n\tcomputedHash := argon2.IDKey(\n\t\t[]byte(providedPassword),\n\t\tconfig.Salt,\n\t\tconfig.TimeCost,\n\t\tconfig.MemoryCost,\n\t\tconfig.Threads,\n\t\tconfig.KeyLength,\n\t)\n\n\t// Perform constant-time comparison to prevent timing attacks\n\tmatch := subtle.ConstantTimeCompare(config.HashRaw, computedHash) == 1\n\treturn match, nil\n}\n"
  },
  {
    "path": "guest_server/go.mod",
    "content": "module winboat-server\n\ngo 1.24.2\n\nrequire (\n\tgithub.com/gorilla/mux v1.8.1\n\tgithub.com/rs/cors v1.11.1\n\tgithub.com/shirou/gopsutil v3.21.11+incompatible\n\tgolang.org/x/crypto v0.43.0\n\tgolang.org/x/sys v0.37.0\n)\n\nrequire (\n\tgithub.com/go-ole/go-ole v1.2.6 // indirect\n\tgithub.com/stretchr/testify v1.10.0 // indirect\n\tgithub.com/tklauser/go-sysconf v0.3.15 // indirect\n\tgithub.com/tklauser/numcpus v0.10.0 // indirect\n\tgithub.com/yusufpapurcu/wmi v1.2.4 // indirect\n)\n"
  },
  {
    "path": "guest_server/go.sum",
    "content": "github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=\ngithub.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=\ngithub.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=\ngithub.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA=\ngithub.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU=\ngithub.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI=\ngithub.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=\ngithub.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=\ngithub.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4=\ngithub.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4=\ngithub.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso=\ngithub.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ=\ngithub.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=\ngithub.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=\ngolang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04=\ngolang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0=\ngolang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=\ngolang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "guest_server/install.bat",
    "content": "@echo off\nset INSTALL_DIR=C:\\Program Files\\WinBoat\nset EXE_PATH=%INSTALL_DIR%\\winboat_guest_server.exe\nset TIME_SYNC_SCRIPT_PATH=%INSTALL_DIR%\\scripts\\time-sync.bat\nset NSSM_PATH=%INSTALL_DIR%\\nssm.exe\nset OEM_DIR=C:\\OEM\n\n:: Registry tweaks\nreg import \"%OEM_DIR%\\RDPApps.reg\"\n\n:: Create install directory if it doesn't exist\nif not exist \"%INSTALL_DIR%\" mkdir \"%INSTALL_DIR%\"\n\n:: Copy files from OEM to install directory\nxcopy \"%OEM_DIR%\\*\" \"%INSTALL_DIR%\\\" /Y /E\n\n:: Install the service with NSSM\n\"%NSSM_PATH%\" install WinBoatGuestServer \"%EXE_PATH%\"\n\"%NSSM_PATH%\" set WinBoatGuestServer Start SERVICE_AUTO_START\n\"%NSSM_PATH%\" set WinBoatGuestServer AppDirectory \"%INSTALL_DIR%\"\n\"%NSSM_PATH%\" set WinBoatGuestServer Description \"WinBoat Guest Server API on port 7148\"\n\"%NSSM_PATH%\" set WinBoatGuestServer ObjectName \"NT AUTHORITY\\SYSTEM\"\n\n:: Add firewall rule for port 7148\nnetsh advfirewall firewall add rule name=\"Allow WinBoat API 7148\" dir=in action=allow protocol=TCP localport=7148\n\n:: Start the service\n\"%NSSM_PATH%\" start WinBoatGuestServer\n\n:: Startup Tasks\nschtasks /create /tn \"TimeSyncTask\" /sc ONSTART /RL HIGHEST /tr \"\\\"%TIME_SYNC_SCRIPT_PATH%\\\"\" /RU SYSTEM"
  },
  {
    "path": "guest_server/main.go",
    "content": "//go:build windows\n// +build windows\n\npackage main\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"io\"\n\t\"log\"\n\t\"net/http\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/gorilla/mux\"\n\t\"github.com/rs/cors\"\n\t\"github.com/shirou/gopsutil/cpu\"\n\t\"github.com/shirou/gopsutil/disk\"\n\t\"github.com/shirou/gopsutil/mem\"\n)\n\nvar (\n\tVersion        = \"0.0.0\"\n\tCommitHash     = \"n/a\"\n\tBuildTimestamp = \"n/a\"\n)\n\nconst AUTHKEY_HASH_REG = \"WinBoatAuthHash\"\nconst AUTHKEY_HASH_OEM_LOCATION = \"C:\\\\OEM\\\\auth.hash\"\n\ntype Metrics struct {\n\tCPU struct {\n\t\tUsage     float64 `json:\"usage\"`     // Percentage, 0-100\n\t\tFrequency uint64  `json:\"frequency\"` // MHz\n\t} `json:\"cpu\"`\n\tRAM struct {\n\t\tUsed       uint64  `json:\"used\"`       // MB\n\t\tTotal      uint64  `json:\"total\"`      // MB\n\t\tPercentage float64 `json:\"percentage\"` // %\n\t} `json:\"ram\"`\n\tDisk struct {\n\t\tUsed       uint64  `json:\"used\"`       // MB\n\t\tTotal      uint64  `json:\"total\"`      // MB\n\t\tPercentage float64 `json:\"percentage\"` // %\n\t} `json:\"disk\"`\n}\n\ntype RDPStatusResponse struct {\n\tRdpConnection bool `json:\"rdpConnected\"`\n}\n\nfunc getApps(w http.ResponseWriter, r *http.Request) {\n\tcmd := exec.Command(\"powershell\", \"-ExecutionPolicy\", \"Bypass\", \"-Command\", \"[Console]::OutputEncoding = [System.Text.Encoding]::UTF8; & '.\\\\scripts\\\\apps.ps1'\")\n\toutput, err := cmd.Output()\n\tif err != nil {\n\t\thttp.Error(w, \"Failed to execute script: \"+err.Error(), http.StatusInternalServerError)\n\t\treturn\n\t}\n\tw.Header().Set(\"Content-Type\", \"application/json; charset=utf-8\")\n\tw.WriteHeader(http.StatusOK)\n\tw.Write(output)\n}\n\nfunc getHealth(w http.ResponseWriter, r *http.Request) {\n\t// Simple health check\n\tresponse := map[string]string{\"status\": \"ok\"}\n\tw.Header().Set(\"Content-Type\", \"application/json\")\n\tw.WriteHeader(http.StatusOK)\n\tjson.NewEncoder(w).Encode(response)\n}\n\nfunc getVersion(w http.ResponseWriter, r *http.Request) {\n\tresponse := map[string]string{\n\t\t\"version\":     Version,\n\t\t\"commit_hash\": CommitHash,\n\t\t\"build_time\":  BuildTimestamp,\n\t}\n\tw.Header().Set(\"Content-Type\", \"application/json\")\n\tw.WriteHeader(http.StatusOK)\n\tjson.NewEncoder(w).Encode(response)\n}\n\nfunc getMetrics(w http.ResponseWriter, r *http.Request) {\n\t// CPU stats\n\tcpuPercent, err := cpu.Percent(time.Second/4, false)\n\tif err != nil {\n\t\thttp.Error(w, \"Failed to get CPU stats: \"+err.Error(), http.StatusInternalServerError)\n\t\treturn\n\t}\n\tcpuInfo, err := cpu.Info()\n\tif err != nil || len(cpuInfo) == 0 {\n\t\thttp.Error(w, \"Failed to get CPU info: \"+err.Error(), http.StatusInternalServerError)\n\t\treturn\n\t}\n\n\t// RAM stats\n\tmemInfo, err := mem.VirtualMemory()\n\tif err != nil {\n\t\thttp.Error(w, \"Failed to get RAM stats: \"+err.Error(), http.StatusInternalServerError)\n\t\treturn\n\t}\n\n\t// Disk stats (using first disk, adjust path if needed)\n\tdiskInfo, err := disk.Usage(\"C:\\\\\")\n\tif err != nil {\n\t\thttp.Error(w, \"Failed to get disk stats: \"+err.Error(), http.StatusInternalServerError)\n\t\treturn\n\t}\n\n\t// Build metrics struct\n\tmetrics := Metrics{}\n\tmetrics.CPU.Usage = cpuPercent[0]              // Total CPU usage\n\tmetrics.CPU.Frequency = uint64(cpuInfo[0].Mhz) // First CPU's frequency\n\tmetrics.RAM.Used = memInfo.Used / 1024 / 1024  // Bytes to MB\n\tmetrics.RAM.Total = memInfo.Total / 1024 / 1024\n\tmetrics.RAM.Percentage = float64(metrics.RAM.Used) / float64(metrics.RAM.Total) * 100\n\tmetrics.Disk.Used = diskInfo.Used / 1024 / 1024\n\tmetrics.Disk.Total = diskInfo.Total / 1024 / 1024\n\tmetrics.Disk.Percentage = diskInfo.UsedPercent\n\n\t// Send it\n\tw.Header().Set(\"Content-Type\", \"application/json\")\n\tw.WriteHeader(http.StatusOK)\n\tjson.NewEncoder(w).Encode(metrics)\n}\n\nfunc getRdpConnectedStatus(w http.ResponseWriter, r *http.Request) {\n\t// Check for RDP Status via quser.exe\n\tcmd := exec.Command(\"quser.exe\")\n\toutput, err := cmd.Output()\n\tif err != nil {\n\t\thttp.Error(w, \"Failed to execute script: \"+err.Error(), http.StatusInternalServerError)\n\t\treturn\n\t}\n\t// Check if the output contains both \"active\" and \"rdp\" todo: Check for VNC Sessions\n\thasRdpSession := strings.Contains(strings.ToLower(string(output)), \"active\") &&\n\t\tstrings.Contains(strings.ToLower(string(output)), \"rdp\")\n\n\tresponse := RDPStatusResponse{\n\t\tRdpConnection: hasRdpSession,\n\t}\n\n\t// Convert the response from guest server to JSON\n\t// Expected output { \"rdp_connected\": \"true\" } if a session is active\n\tjsonResponse, err := json.Marshal(response)\n\tif err != nil {\n\t\thttp.Error(w, \"Failed to marshal JSON response: \"+err.Error(), http.StatusInternalServerError)\n\t\treturn\n\t}\n\n\tw.Header().Set(\"Content-Type\", \"application/json\")\n\tw.WriteHeader(http.StatusOK)\n\tw.Write(jsonResponse)\n}\n\nfunc applyUpdate(w http.ResponseWriter, r *http.Request) {\n\t// Verify password\n\texpectedHash, err := getSecureRegKey(AUTHKEY_HASH_REG)\n\tif err != nil || expectedHash == nil {\n\t\thttp.Error(w, \"Unauthorized: failed to read auth hash\", http.StatusUnauthorized)\n\t\treturn\n\t}\n\n\tpassword := r.FormValue(\"password\")\n\tif password == \"\" {\n\t\thttp.Error(w, \"Unauthorized: password is required\", http.StatusUnauthorized)\n\t\treturn\n\t}\n\n\tisValid, err := verifyPasswordSecure(*expectedHash, password)\n\tif err != nil || !isValid {\n\t\thttp.Error(w, \"Unauthorized: invalid password\", http.StatusUnauthorized)\n\t\treturn\n\t}\n\n\tr.ParseMultipartForm(100 << 20) // Limit upload size to 100MB\n\tvar buf bytes.Buffer\n\n\t// Grab the file\n\tfile, _, err := r.FormFile(\"updateFile\")\n\tif err != nil {\n\t\thttp.Error(w, \"Failed to get update file: \"+err.Error(), http.StatusBadRequest)\n\t\treturn\n\t}\n\n\t// Copy to buffer & close the file\n\tio.Copy(&buf, file)\n\tfile.Close()\n\n\t// Check zip magic bytes\n\tif !(buf.Bytes()[0] == 'P' && buf.Bytes()[1] == 'K' && buf.Bytes()[2] == 3 && buf.Bytes()[3] == 4) {\n\t\thttp.Error(w, \"Uploaded file is not a valid ZIP archive\", http.StatusBadRequest)\n\t\treturn\n\t}\n\n\t// Make temp directory\n\ttmpDir, err := os.MkdirTemp(\"\", \"winboat-update\")\n\tif err != nil {\n\t\thttp.Error(w, \"Failed to create temp directory: \"+err.Error(), http.StatusInternalServerError)\n\t}\n\n\t// Write to temp file\n\tfileName := \"update.zip\"\n\ttmpFilePath := filepath.Join(tmpDir, fileName)\n\terr = os.WriteFile(tmpFilePath, buf.Bytes(), 0644)\n\n\tif err != nil {\n\t\thttp.Error(w, \"Failed to write temp file: \"+err.Error(), http.StatusInternalServerError)\n\t\treturn\n\t}\n\n\t// Get current executable path & directory\n\texePath, err := os.Executable()\n\tif err != nil {\n\t\thttp.Error(w, \"Failed to get executable path: \"+err.Error(), http.StatusInternalServerError)\n\t\treturn\n\t}\n\tappDir := filepath.Dir(exePath)\n\torigScriptPath := filepath.Join(appDir, \"scripts\\\\update.ps1\")\n\tscriptPath := filepath.Join(tmpDir, \"update.ps1\")\n\n\t// Copy the update script to the temp directory\n\tcopyFile(origScriptPath, scriptPath)\n\n\t// Return success & the paths\n\tresponse := map[string]string{\n\t\t\"status\":    \"updating\",\n\t\t\"temp_path\": tmpFilePath,\n\t\t\"filename\":  fileName,\n\t}\n\tw.Header().Set(\"Content-Type\", \"application/json\")\n\tw.WriteHeader(http.StatusOK)\n\tjson.NewEncoder(w).Encode(response)\n\n\t// Create & run the script\n\tcmd := exec.Command(\"cmd\", \"/C\", \"start\", \"/B\", \"powershell\",\n\t\t\"-ExecutionPolicy\", \"Bypass\", \"-File\", scriptPath,\n\t\t\"-AppPath\", appDir,\n\t\t\"-UpdateFilePath\", tmpFilePath,\n\t\t\"-ServiceName\", \"WinBoatGuestServer\")\n\n\tcmd.Stdout = nil\n\tcmd.Stderr = nil\n\tcmd.Stdin = nil\n\n\t// The script will take care of the rest, including stopping this service\n\tcmd.Start()\n\n}\n\nfunc getIcon(w http.ResponseWriter, r *http.Request) {\n\tpath := r.PostFormValue(\"path\")\n\tif path == \"\" {\n\t\thttp.Error(w, \"path is required\", http.StatusBadRequest)\n\t\treturn\n\t}\n\n\tcmd := exec.Command(\"powershell\", \"-ExecutionPolicy\", \"Bypass\", \"-File\", \"scripts\\\\get-icon.ps1\", \"-path\", path)\n\toutput, err := cmd.Output()\n\tif err != nil {\n\t\thttp.Error(w, \"Failed to execute script: \"+err.Error(), http.StatusInternalServerError)\n\t\treturn\n\t}\n\n\tw.Header().Set(\"Content-Type\", \"text/plain\")\n\tw.WriteHeader(http.StatusOK)\n\tw.Write(output)\n}\n\nfunc setAuthHash(w http.ResponseWriter, r *http.Request) {\n\t// If there's an existing hash, reject\n\texistingHash, err := getSecureRegKey(AUTHKEY_HASH_REG)\n\tif err != nil {\n\t\thttp.Error(w, \"Failed to read existing auth hash: \"+err.Error(), http.StatusInternalServerError)\n\t\treturn\n\t}\n\tif existingHash != nil {\n\t\thttp.Error(w, \"Auth hash already set\", http.StatusBadRequest)\n\t\treturn\n\t}\n\n\t// Get auth hash from POST body\n\tauthHash := r.PostFormValue(\"authHash\")\n\tif authHash == \"\" {\n\t\thttp.Error(w, \"authHash is required\", http.StatusBadRequest)\n\t\treturn\n\t}\n\n\t// Store it securely\n\terr = setSecureRegKey(AUTHKEY_HASH_REG, authHash)\n\tif err != nil {\n\t\thttp.Error(w, \"Failed to store auth hash: \"+err.Error(), http.StatusInternalServerError)\n\t\treturn\n\t}\n\n\t// Success\n\tw.Header().Set(\"Content-Type\", \"application/json\")\n\tw.WriteHeader(http.StatusOK)\n\tresponse := map[string]string{\"status\": \"ok\"}\n\tjson.NewEncoder(w).Encode(response)\n}\n\nfunc main() {\n\t// Try to initialize auth key hash if not present\n\texistingHash, err := getSecureRegKey(AUTHKEY_HASH_REG)\n\tif err != nil {\n\t\tlog.Println(\"Warning: failed to read auth hash from registry:\", err)\n\t}\n\n\t// Hash not found in registry\n\tif existingHash == nil {\n\t\t// Check OEM location and try to read from there\n\t\toemHashBytes, err := os.ReadFile(AUTHKEY_HASH_OEM_LOCATION)\n\t\tif err != nil {\n\t\t\tlog.Println(\"Auth hash not found in registry or OEM location.\")\n\t\t} else {\n\t\t\toemHash := string(bytes.TrimSpace(oemHashBytes))\n\t\t\terr = setSecureRegKey(AUTHKEY_HASH_REG, oemHash)\n\t\t\tif err != nil {\n\t\t\t\tlog.Println(\"Failed to initialize auth hash from OEM location:\", err)\n\t\t\t} else {\n\t\t\t\tlog.Println(\"Initialized auth hash from OEM location.\")\n\t\t\t}\n\t\t}\n\t}\n\n\t// Setup routes\n\tr := mux.NewRouter()\n\tr.HandleFunc(\"/apps\", getApps).Methods(\"GET\")\n\tr.HandleFunc(\"/health\", getHealth).Methods(\"GET\")\n\tr.HandleFunc(\"/version\", getVersion).Methods(\"GET\")\n\tr.HandleFunc(\"/metrics\", getMetrics).Methods(\"GET\")\n\tr.HandleFunc(\"/rdp/status\", getRdpConnectedStatus).Methods(\"GET\")\n\tr.HandleFunc(\"/update\", applyUpdate).Methods(\"POST\")\n\tr.HandleFunc(\"/get-icon\", getIcon).Methods(\"POST\")\n\tr.HandleFunc(\"/auth/set-hash\", setAuthHash).Methods(\"POST\")\n\thandler := cors.Default().Handler(r)\n\n\tlog.Println(\"Starting WinBoat Guest Server on :7148...\")\n\tif err := http.ListenAndServe(\":7148\", handler); err != nil {\n\t\tlog.Fatal(\"Server failed: \", err)\n\t}\n}\n"
  },
  {
    "path": "guest_server/nssm.sha1.txt",
    "content": "f280858dcfefabc1a9a006a57f6b266a5d1fde8e"
  },
  {
    "path": "guest_server/scripts/apps.ps1",
    "content": "#Requires -Version 5.1\n#Requires -RunAsAdministrator\n\n#------------------------------------------------------------------------------\n# WinBoat Application Discovery Script\n#\n# Purpose: Detects installed applications (System, Registry, Start Menu,\n#          UWP, Chocolatey, Scoop) within a Windows KVM guest and outputs\n#          them as a JSON list for the WinBoat host.\n#------------------------------------------------------------------------------\n\n# --- Setup ---\n# Load System.Drawing for icon extraction, suppress errors if already loaded\nAdd-Type -AssemblyName System.Drawing -ErrorAction SilentlyContinue\n\n# Default fallback icon (32x32 transparent PNG) if extraction fails\n$defaultIconBase64 = \"iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAAXNSR0IB2cksfwAAAAlwSFlzAAALEwAACxMBAJqcGAAAASZQTFRFAAAA+vr65ubm4uLkhYmLvL7A7u7w+/r729vb4eHjFYPbFoTa5eXnGIbcG4jc+fn7Gofc7+/x7OzuF4Xb+fn54uLiC37Z5OTmEIHaIIjcEYHbDoDZFIPcJ43fHYjd9fX28PDy3d3fI4rd3d3dHojc19fXttTsJIve2dnZDX/YCn3Y09PTjL/p5+fnh7zo2traJYzfIYjdE4Pb6urrW6Tf9PT1Ioneir7otNPsCX3Zhbvn+Pj5YKfhJYfWMo7a39/gKIzeKo7eMI3ZNJDcXqbg4eHhuNTsB3zYIoncBXvZLIrXIYjbLJDgt7m6ubu+YqjiKYvYvr6+tba3rs/sz8/P1+byJonXv7/DiImLxsbGjo6Ra6reurq6io6QkJKVw8PD0tLSycnJq1DGywAAAGJ0Uk5TAP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+BVJDaAAABY0lEQVR4nM2RaVOCUBSGr1CBgFZimppgoGnKopZSaYGmRpravq///0904IqOM9j00WeGT+9ztgtCS8Dzyh98fL6i2+HqQoaj0RPSzQNgzZc4F4wgvUuoqkr1er094MjlIeBCwRdFua9CqURQ51cty7Lykj0YCIIibnlEkS4TgCuky3nbTmSFsCKSHuso96N/Ox1aacjrlYQQ3gjNCYV7UlUJ6szCeRZyXmlkNjEZEPSuLIMAuYTreVYROQ8Y8SLTNAhlCdfzLMsaIhfHgEAT7pLtvFTH9QxTNWrmLsaEDu8558y2ZOP5LLNTNUQyiCFnHaRZnjTmzryhnR36FSdnIU9up7RGxAOuKJjOFX2vHvKU5jPiepbvxzR3BIffwROc++AAJy9qjQxQwz9rIjyGeN6tj8VACEyZCqfQn3H7F48vTvwEdlIP+aWvMNkPcl8h8DYeN5vNTqdzCNz5CIv4h7AE/AKcwUFbShJywQAAAABJRU5ErkJggg==\"\n\n# Define common system paths\n$systemRoot = $env:SystemRoot\n$system32Path = Join-Path -Path $systemRoot -ChildPath \"System32\"\n\n\n# --- Helper Functions ---\n\n# Adds spaces to CamelCase or PascalCase strings (e.g., \"VisualStudio\" -> \"Visual Studio\")\nfunction Add-SpacesToCamelCase {\n    param([string]$InputString)\n\n    # Skip if null, already contains whitespace, is only numbers, or too short to need spacing\n    if ($null -eq $InputString -or $InputString -match '\\s' -or $InputString -match '^\\d+$' -or $InputString.Length -lt 3) {\n        return $InputString\n    }\n\n    try {\n        # Regex patterns:\n        # 1. (?<=[a-z])(?=[A-Z])   : Lowercase followed by Uppercase\n        # 2. (?<=[A-Z])(?=[A-Z][a-z]) : Uppercase followed by Uppercase+Lowercase (handles acronyms like \"MSPaint\")\n        # 3. (?<=[a-zA-Z])(?=[0-9])  : Letter followed by Digit\n        $pattern = '((?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|(?<=[a-zA-Z])(?=[0-9]))'\n        $spaced = $InputString -replace $pattern, ' '\n        return $spaced.Trim()\n    } catch {\n        # Return original string if regex fails for any reason\n        return $InputString\n    }\n}\n\n# Extracts an application's associated icon as a 32x32 PNG Base64 string.\nfunction Get-ApplicationIcon {\n    param ([string]$targetPath)\n\n    # Pre-check: Ensure System.Drawing is loaded and path is a valid file\n    if (-not [System.Drawing.Icon] -or -not (Test-Path -LiteralPath $targetPath -PathType Leaf -ErrorAction SilentlyContinue)) {\n        return $defaultIconBase64\n    }\n\n    try {\n        $icon = [System.Drawing.Icon]::ExtractAssociatedIcon($targetPath)\n        if ($null -eq $icon) { throw \"ExtractAssociatedIcon returned null for $targetPath\" }\n\n        # Get best available bitmap from icon\n        $bmp = $icon.ToBitmap()\n\n        # Resize to a standard 32x32 using high quality interpolation\n        $resizedBmp = New-Object System.Drawing.Bitmap(32, 32)\n        $graphics = [System.Drawing.Graphics]::FromImage($resizedBmp)\n        $graphics.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::HighQualityBicubic\n        $graphics.DrawImage($bmp, 0, 0, 32, 32)\n\n        # Save as PNG to memory stream\n        $stream = New-Object System.IO.MemoryStream\n        $resizedBmp.Save($stream, [System.Drawing.Imaging.ImageFormat]::Png)\n        $base64 = [Convert]::ToBase64String($stream.ToArray())\n\n        # Clean up GDI+ resources\n        $stream.Dispose()\n        $graphics.Dispose()\n        $resizedBmp.Dispose()\n        $bmp.Dispose()\n        $icon.Dispose()\n\n        return $base64\n    } catch {\n        # Fallback on any error during extraction/conversion\n        return $defaultIconBase64\n    }\n}\n\n# Gets the application name using a priority order:\n# 1. Target EXE FileDescription\n# 2. LNK file name (often the user-facing name)\n# 3. Target file name\nfunction Get-ApplicationName {\n    param (\n        [string]$targetPath,\n        [string]$lnkPath = $null\n    )\n\n    $appName = $null\n\n    # Priority 1: Target Executable's FileDescription\n    if ($targetPath -and $targetPath.EndsWith('.exe', [System.StringComparison]::OrdinalIgnoreCase) -and (Test-Path $targetPath -PathType Leaf)) {\n        try {\n            $desc = (Get-Item $targetPath).VersionInfo.FileDescription\n            # Only use description if it's not empty/whitespace\n            if ($desc -and $desc.Trim()) {\n                $appName = $desc.Trim() -replace '\\s+', ' ' # Normalize whitespace\n            }\n        } catch { } # Ignore errors reading version info\n    }\n\n    # Priority 2: LNK Filename (BaseName without extension), attempt spacing\n    if (-not $appName -and $lnkPath -and (Test-Path $lnkPath -PathType Leaf)) {\n        $appName = Add-SpacesToCamelCase -InputString ([System.IO.Path]::GetFileNameWithoutExtension($lnkPath))\n    }\n\n    # Priority 3: Target Filename (BaseName without extension), attempt spacing\n    if (-not $appName -and $targetPath -and (Test-Path $targetPath -PathType Leaf)) {\n        $appName = Add-SpacesToCamelCase -InputString ([System.IO.Path]::GetFileNameWithoutExtension($targetPath))\n    }\n\n    # Final Cleanup: Remove common registered/trademark symbols and trim whitespace\n    if ($appName) {\n        # TODO: This breaks on CJK systems because of UTF-8, check out https://github.com/TibixDev/winboat/issues/40\n        # Original line in Base64:\n        # JGFwcE5hbWUgPSAkYXBwTmFtZSAtcmVwbGFjZSAnKD9pKVxzKlwoclwpfFwodG1cKXzCqXzCrnzihKInLCAnJw==\n        $appName = $appName.Trim()\n    }\n\n    return $appName\n}\n\nfunction Get-PrettifyName {\n    param (\n        [string]$Name\n    )\n\n    if ($Name -match '\\.([^\\.]+)$') {\n        $ProductName = $Matches[1]\n    } else {\n        # If no period is found, use the whole name.\n        $ProductName = $Name\n    }\n    \n    $PrettyName = ($ProductName -creplace  '([A-Z\\W_]|\\d+)(?<![a-z])',' $&').trim()\n\n    return $PrettyName\n}\n\n# Gets the display name for a UWP app.\nfunction Get-UWPApplicationName {\n    param (\n        $app # The AppxPackage object\n    )\n    # UWP properties are usually the best source\n    if ($app.DisplayName) { \n        return $app.DisplayName.Trim()\n        #Write-Host($app)\n    }\n    if ($app.Name) { \n        return Get-PrettifyName -Name $app.Name\n    } # Often the package name, less ideal but a fallback\n\n    return $null # Failed to get a name\n}\n\nfunction Get-ParseUWP {\n    param ([string]$instLoc) # InstallLocation from Get-AppxPackage\n\n    $manifestPath = Join-Path -Path $instLoc -ChildPath \"AppxManifest.xml\"\n    if (-not (Test-Path $manifestPath -PathType Leaf)) {\n        return $null # Manifest doesn't exist or isn't a file\n    }\n\n    $xmlContent = Get-Content $manifestPath -Raw -Encoding Default -ErrorAction Stop\n    \n    $appId = \"App\" # Default, as it works for most packages.\n    if ($xmlContent -match '<Application[^>]*Id\\s*=\\s*\"([^\"]+)\"') {\n        $appId = $Matches[1]\n    }\n\n    $logoMatch = [regex]::Match($xmlContent, '<Properties.*?>.*?<Logo>(.*?)</Logo>.*?</Properties>', [System.Text.RegularExpressions.RegexOptions]::Singleline)\n    if ($logoMatch.Success) {\n        $logo = $logoMatch.Groups[1].Value\n    }\n\n    return $logo, $appId\n}\n\nfunction Get-UWPBase64Logo {\n    param([string]$logo, [string]$instLoc)\n\n    $logoPath = Join-Path -Path $instLoc -ChildPath $logo\n\n    if (-not (Test-Path $logoPath)) {\n        # if base file not exist, attempt to find scaled version.\n        $scaledVersions = @(\"scale-100\", \"scale-200\", \"scale-400\")\n        foreach ($scale in $scaledVersions) {\n            $scaledLogoPath = $logoPath -replace '\\.png$', \".$scale.png\"\n            if (Test-Path $scaledLogoPath) {\n                $logoPath = $scaledLogoPath\n                break\n            }\n        }\n\n        # null if no valid file found.\n        if (-not (Test-Path $logoPath)) {\n            return $null\n        }\n    }\n\n    try {\n        $image = [System.Drawing.Image]::FromFile($logoPath)\n\n        # resize to 32x32\n        $resizedBmp = New-Object System.Drawing.Bitmap(32, 32)\n        $graphics = [System.Drawing.Graphics]::FromImage($resizedBmp)\n        $graphics.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::HighQualityBicubic\n        $graphics.DrawImage($image, 0, 0, 32, 32)\n\n        # Save as PNG to memory stream\n        $stream = New-Object System.IO.MemoryStream\n        $resizedBmp.Save($stream, [System.Drawing.Imaging.ImageFormat]::Png)\n\n        $base64 = [Convert]::ToBase64String($stream.ToArray())\n\n        # Clean up\n        $stream.Dispose()\n        $graphics.Dispose()\n        $resizedBmp.Dispose()\n        $image.Dispose()\n\n        return $base64\n    } catch {\n        return $null\n    }\n}\n\n# --- Main Application Logic ---\n\n# Use efficient List and HashSet for collection and deduplication\n$apps = [System.Collections.Generic.List[PSCustomObject]]::new()\n# Store normalized (lowercase) full paths for case-insensitive duplicate checking\n$addedPaths = [System.Collections.Generic.HashSet[string]]::new([System.StringComparer]::OrdinalIgnoreCase)\n\n# Helper function to validate and add an app to the list if it's unique\nfunction Add-AppToListIfValid {\n    param(\n        [string]$Name,\n        [string]$InputPath, # The path discovered (can be relative or contain variables)\n        [string]$Source,     # Source type (e.g., 'system', 'winreg', 'startmenu')\n\n        [string]$logoBase64,  # Optional base64 logo, mainly for UWP logo discover system\n        [string]$launchArg # optional arg\n    )\n\n    $resolved = $null\n    $fullPath = $null\n    $normalizedPathKey = $null\n\n    # Step 1, handle UWP app.\n    if ($Source -eq \"uwp\") {\n        if (-not $launchArg) {\n            return # launching UWP app requires Arg\n        }\n        \n        $normalizedPathKey = $InputPath.ToLowerInvariant() + $launchArg.ToLowerInvariant()\n        if ($addedPaths.Contains($normalizedPathKey)) {\n            return # Already added this app\n        }\n\n        $icon = $null\n        if ($logoBase64) {\n            $icon = $logoBase64\n        }\n\n        # UWP object\n        $apps.Add([PSCustomObject]@{\n            Name   = $Name\n            Path   = $InputPath\n            Args   = $launchArg\n            Icon   = $icon\n            Source = 'uwp'\n        })\n        $addedPaths.Add($normalizedPathKey) | Out-Null\n        return\n    }\n\n    # 2. Resolve and Validate Path Other\n    try {\n        $resolved = Resolve-Path -Path $InputPath -ErrorAction SilentlyContinue\n    } catch { return } # Ignore if path resolution throws error\n\n    # Ensure resolved path exists and is a file (Leaf)\n    if ($resolved -and (Test-Path -LiteralPath $resolved.ProviderPath -PathType Leaf)) {\n        $fullPath = $resolved.ProviderPath\n        # Create a consistent key for the HashSet (lowercase)\n        $normalizedPathKey = $fullPath.ToLowerInvariant()\n    } else {\n        return # Skip if path doesn't resolve to a valid file\n    }\n\n    # 3. Validate Name (Basic Check)\n    if (-not $Name -or $Name.Trim().Length -eq 0 -or $Name -like 'Microsoft? Windows? Operating System*') {\n        return # Skip if name is empty, invalid, or generic OS name\n    }\n\n    # 4. Check for Duplicates using normalized path\n    if ($addedPaths.Contains($normalizedPathKey)) {\n        return # Skip if this exact executable path has already been added\n    }\n\n    # 5. Get Icon\n    $icon = Get-ApplicationIcon -targetPath $fullPath\n\n    # 6. Add the Application Object (matching WinApp type)\n    $apps.Add([PSCustomObject]@{\n        Name   = $Name\n        Path   = $fullPath # Use the resolved, non-normalized path for output\n        Args    = \"\"\n        Icon   = $icon\n        Source = $Source\n    })\n\n    # 7. Mark Path as Added\n    $addedPaths.Add($normalizedPathKey) | Out-Null\n}\n\n\n# --- Application Discovery Sections ---\n\n# 1. Hardcoded Common System Tools\n$systemTools = @(\n    @{N = \"Task Manager\"; P = Join-Path $system32Path \"Taskmgr.exe\"},\n    @{N = \"Control Panel\"; P = Join-Path $system32Path \"control.exe\"},\n    @{N = \"File Explorer\"; P = Join-Path $env:WINDIR \"explorer.exe\"},\n    @{N = \"Command Prompt\"; P = Join-Path $system32Path \"cmd.exe\"},\n    @{N = \"PowerShell\"; P = Join-Path $system32Path \"WindowsPowerShell\\v1.0\\powershell.exe\"},\n    @{N = \"Notepad\"; P = Join-Path $system32Path \"notepad.exe\"},\n    @{N = \"Paint\"; P = Join-Path $system32Path \"mspaint.exe\"},\n    @{N = \"Registry Editor\"; P = Join-Path $env:WINDIR \"regedit.exe\"},\n    @{N = \"Services\"; P = Join-Path $system32Path \"services.msc\"},\n    @{N = \"Device Manager\"; P = Join-Path $system32Path \"devmgmt.msc\"},\n    @{N = \"Computer Management\"; P = Join-Path $system32Path \"compmgmt.msc\"},\n    @{N = \"Disk Management\"; P = Join-Path $system32Path \"diskmgmt.msc\"},\n    @{N = \"Snipping Tool\"; P = Join-Path $system32Path \"SnippingTool.exe\"}, # Legacy version\n    @{N = \"Calculator\"; P = Join-Path $system32Path \"win32calc.exe\"},    # Legacy version\n    @{N = \"Remote Desktop Connection\"; P = Join-Path $system32Path \"mstsc.exe\"}\n)\nforeach ($tool in $systemTools) {\n    # Use the predefined name 'N' for system tools\n    Add-AppToListIfValid -Name $tool.N -InputPath $tool.P -Source \"system\"\n}\n\n\n# 2. Windows Registry (App Paths - HKLM & HKCU)\ntry {\n    $regRoots = \"HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\",\n                \"HKCU:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\"\n\n    # Get properties from all matching keys under both roots\n    $regEntries = foreach ($regRoot in $regRoots) {\n        if (Test-Path $regRoot) {\n            Get-ItemProperty \"$regRoot\\*\" -ErrorAction SilentlyContinue\n        }\n    }\n\n    # Process each found registry entry\n    foreach ($entry in $regEntries) {\n        $keyName = $entry.PSChildName # e.g., msedge.exe, devenv.exe\n        $pathValue = $null\n\n        # Check if the (default) value exists and is not empty\n        if ($entry.PSObject.Properties['(default)'] -and $entry.'(default)') {\n            try {\n                # Expand environment variables and remove surrounding quotes\n                $pathValue = $ExecutionContext.InvokeCommand.ExpandString($entry.'(default)'.Trim('\"'))\n            } catch { } # Ignore errors expanding variables\n        }\n\n        if ($pathValue) {\n            # Get name using standard function (tries FileDescription first)\n            $appName = Get-ApplicationName -targetPath $pathValue\n            # Fallback: If Get-ApplicationName fails, use the spaced registry key name\n            if (-not $appName) {\n                $appName = Add-SpacesToCamelCase -InputString ([System.IO.Path]::GetFileNameWithoutExtension($keyName))\n            }\n            # Add if name is valid\n            if ($appName) {\n                Add-AppToListIfValid -Name $appName -InputPath $pathValue -Source \"winreg\"\n            }\n        }\n    }\n} catch { } # Ignore errors during registry scan\n\n\n# 3. Start Menu Shortcuts (All Users + All User Profiles)\n$startMenuPaths = @()\n\n# Add global Start Menu path\n$startMenuPaths += \"C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\"\n\n# Add Start Menu paths for all user profiles (when running as SYSTEM)\ntry {\n    $usersPath = \"C:\\Users\"\n    if (Test-Path $usersPath -PathType Container) {\n        Get-ChildItem $usersPath -Directory -ErrorAction SilentlyContinue | \n            Where-Object { $_.Name -ne \"Public\" -and $_.Name -ne \"All Users\" -and $_.Name -ne \"Default\" -and $_.Name -ne \"Default User\" } |\n            ForEach-Object {\n                $userStartMenuPath = Join-Path $_.FullName \"AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\"\n                if (Test-Path $userStartMenuPath -PathType Container) {\n                    $startMenuPaths += $userStartMenuPath\n                }\n            }\n    }\n} catch {\n    # Fallback: If C:\\Users scan fails, try WMI approach\n    try {\n        Get-WmiObject Win32_UserProfile -ErrorAction SilentlyContinue | \n            Where-Object { -not $_.Special -and $_.LocalPath -and $_.LocalPath -notlike \"*\\Public\" -and $_.LocalPath -notlike \"*\\Default*\" } | \n            ForEach-Object {\n                $userStartMenuPath = Join-Path $_.LocalPath \"AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\"\n                if (Test-Path $userStartMenuPath -PathType Container) {\n                    $startMenuPaths += $userStartMenuPath\n                }\n            }\n    } catch { } # If both methods fail, just use global path\n}\n\n# Collect .lnk files from all valid Start Menu directories\n$lnkFiles = @()\nforeach ($startMenuPath in $startMenuPaths) {\n    if (Test-Path $startMenuPath -PathType Container) {\n        try {\n            $pathLnkFiles = Get-ChildItem -Path $startMenuPath -Recurse -Filter *.lnk -File -ErrorAction SilentlyContinue\n            if ($pathLnkFiles) {\n                $lnkFiles += $pathLnkFiles\n            }\n        } catch { } # Ignore errors for individual paths\n    }\n}\n\nif ($lnkFiles) {\n    try {\n        # Use strict mode for COM object for better error catching\n        $shell = New-Object -ComObject WScript.Shell -Strict\n        try {\n            foreach ($lnk in $lnkFiles) {\n                $target = $null\n                $appName = $null\n\n                    # Parse the shortcut file\n                    try {\n                        $link = $shell.CreateShortcut($lnk.FullName)\n                        $rawTarget = $link.TargetPath\n                        # Resolve path if contains environment variables\n                        if ($rawTarget) {\n                            $target = try { $ExecutionContext.InvokeCommand.ExpandString($rawTarget) } catch { $rawTarget }\n                            \n                            # Handle case where SYSTEM user resolves paths to SYSTEM profile instead of actual user\n                            $systemProfilePath = \"C:\\WINDOWS\\system32\\config\\systemprofile\"\n                            if ($target -like \"$systemProfilePath*\") {\n                                # Extract the relative path after the profile directory\n                                $relativePath = $target -replace [regex]::Escape($systemProfilePath), \"\"\n                                \n                                # Try to find this app in actual user profiles\n                                $userBasePath = Split-Path (Split-Path $lnk.FullName) # Get user's start menu base path\n                                if ($userBasePath -like \"*\\Users\\*\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\") {\n                                    # Extract username from the path\n                                    if ($userBasePath -match \"\\\\Users\\\\([^\\\\]+)\\\\\") {\n                                        $userName = $matches[1]\n                                        $userTarget = \"C:\\Users\\$userName$relativePath\"\n                                        if (Test-Path $userTarget -PathType Leaf) {\n                                            $target = $userTarget\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    } catch { continue } # Skip malformed or unreadable shortcuts\n\n                # Skip if no target or looks like an uninstaller\n                if (-not $target -or $target -like '*uninstall*' -or $target -like '*unins000*') {\n                    continue\n                }\n\n                # Get name using standard function (FileDesc > LNK Name > Target Name)\n                $appName = Get-ApplicationName -targetPath $target -lnkPath $lnk.FullName\n\n                # Refinement: If target is NOT an exe and name defaulted to target filename, prefer LNK filename\n                if ($target -notlike '*.exe' -and $appName -eq (Add-SpacesToCamelCase ([System.IO.Path]::GetFileNameWithoutExtension($target))) ) {\n                    $lnkNameOnly = Add-SpacesToCamelCase -InputString ([System.IO.Path]::GetFileNameWithoutExtension($lnk.FullName))\n                    if ($lnkNameOnly -ne $appName) { $appName = $lnkNameOnly }\n                }\n\n                # Add if name is valid\n                if ($appName) {\n                    Add-AppToListIfValid -Name $appName -InputPath $target -Source \"startmenu\"\n                }\n            }\n        } finally {\n            # Ensure COM object is released\n            if ($shell) {\n                [System.Runtime.InteropServices.Marshal]::ReleaseComObject($shell) | Out-Null\n                Remove-Variable shell -ErrorAction SilentlyContinue # Clean up variable\n                [System.GC]::Collect()\n                [System.GC]::WaitForPendingFinalizers()\n            }\n        }\n    } catch { } # Ignore errors during Start Menu scan\n}\n\n\n# 4. UWP Apps\nif (Get-Command Get-AppxPackage -AllUsers -ErrorAction SilentlyContinue) {\n    try {\n        Get-AppxPackage -AllUsers -ErrorAction SilentlyContinue |\n            Where-Object {\n                $_.IsFramework -eq $false -and\n                $_.IsResourcePackage -eq $false -and\n                $_.SignatureKind -ne 'System' -and       # Exclude core system packages\n                $_.SignatureKind -ne 'Developer' -and     # Exclude \"developer\" packages\n                $_.InstallLocation                       # Must have an install location\n            } |\n            ForEach-Object {\n                $app = $_\n                $pathValue = \"explorer.exe\"\n\n                # Attempt to find logo and executable using Appxmanifest.xml\n                $logo, $appId = Get-ParseUWP -instLoc $app.InstallLocation\n                $launchArgs = \"shell:AppsFolder\\\" + $app.PackageFamilyName + '!' + $appId\n\n                if ($appId) { # check if we have appId\n                    # Get the best display name (UWP properties preferred)\n                    $name = Get-UWPApplicationName -exePath $exePath -app $app\n                    if ($name) {\n                        $base64 = Get-UWPBase64Logo -logo $logo -instLoc $app.InstallLocation\n                        Add-AppToListIfValid -Name $name -InputPath $pathValue -Source \"uwp\" -logoBase64 $base64 -launchArg $launchArgs\n                    }\n                }\n            }\n    } catch { } # Ignore errors during UWP scan\n}\n\n\n# 5. Chocolatey Installed Apps (via Shims)\n$chocoDir = \"C:\\ProgramData\\chocolatey\\bin\"\nif (Test-Path $chocoDir -PathType Container) {\n    try {\n        Get-ChildItem -Path $chocoDir -Filter *.exe -File -ErrorAction SilentlyContinue |\n            ForEach-Object {\n                $shim = $_\n                $exePath = $null\n                $name = $null\n\n                # Resolve shim target using Get-Command\n                try {\n                    $cmdInfo = Get-Command $shim.FullName -ErrorAction SilentlyContinue\n                    # Ensure it resolved to a different path (not the shim itself)\n                    if ($cmdInfo -and $cmdInfo.Source -ne $shim.FullName) {\n                        $exePath = $cmdInfo.Source\n                    }\n                } catch { } # Ignore resolution errors\n\n                if ($exePath) { # Path must resolve\n                    # Get name (FileDesc preferred)\n                    $name = Get-ApplicationName -targetPath $exePath\n                    # Fallback to spaced shim name if needed\n                    if (-not $name) { $name = Add-SpacesToCamelCase -InputString $shim.BaseName }\n\n                    if ($name) {\n                        Add-AppToListIfValid -Name $name -InputPath $exePath -Source \"choco\"\n                    }\n                }\n            }\n    } catch { } # Ignore errors during Choco scan\n}\n\n\n# 6. Scoop Installed Apps (via Shims)\n# Check both common user and global scoop shim paths\n$scoopDir = @(\n    Join-Path $env:USERPROFILE \"scoop\\shims\"\n    \"C:\\ProgramData\\scoop\\shims\"\n) | Where-Object { Test-Path $_ -PathType Container } | Select-Object -First 1\n\nif ($scoopDir) {\n    try {\n        Get-ChildItem -Path $scoopDir -File -ErrorAction SilentlyContinue |\n            Where-Object { $_.Name -ne 'scoop.ps1' } | # Exclude scoop runner itself\n            ForEach-Object {\n                $shim = $_\n                $exePath = $null\n                $name = $null\n\n                # Attempt to resolve target using Get-Command first\n                try {\n                    $cmdInfo = Get-Command $shim.FullName -ErrorAction SilentlyContinue\n                    if ($cmdInfo -and $cmdInfo.Source -ne $shim.FullName) {\n                        $exePath = $cmdInfo.Source\n                    }\n                } catch { } # Ignore resolution errors\n\n                # Fallback: Very basic content scan for text-based shims if Get-Command fails\n                if (-not $exePath -and $shim.Extension -in '.cmd', '.ps1', '') {\n                    try {\n                        # Read first 5 lines, look for \"path/to/something.exe\" pattern\n                        $content = Get-Content $shim.FullName -Raw -TotalCount 5 -ErrorAction SilentlyContinue\n                        if ($content -match '(?<=\")([^\"]+?\\.exe)(?=\")') {\n                            $relativePath = $Matches[1] -replace '%~dp0', $shim.DirectoryName\n                            $exePath = try { (Resolve-Path $relativePath -ErrorAction SilentlyContinue).Path } catch {}\n                        }\n                    } catch {}\n                }\n\n                if ($exePath) { # Path must resolve\n                    # Get name (FileDesc preferred)\n                    $name = Get-ApplicationName -targetPath $exePath\n                    # Fallback to spaced shim name\n                    if (-not $name) { $name = Add-SpacesToCamelCase -InputString $shim.BaseName }\n\n                    if ($name) {\n                        Add-AppToListIfValid -Name $name -InputPath $exePath -Source \"scoop\"\n                    }\n                }\n            }\n    } catch { } # Ignore errors during Scoop scan\n}\n\n\n# --- Final Output ---\n\n# Convert the final list of application objects to a compressed JSON string.\n# This is the only output sent to the standard output stream.\n\n$apps | ConvertTo-Json -Depth 5 -Compress\n\n\n"
  },
  {
    "path": "guest_server/scripts/get-icon.ps1",
    "content": "#Requires -Version 5.1\n\n# WinBoat - Icon Extraction Helper\n#\n# Usage:\n#   powershell -ExecutionPolicy Bypass -File icon.ps1 \"C:\\Path\\To\\Something.exe\"\n#   powershell -ExecutionPolicy Bypass -File icon.ps1 \"C:\\Path\\To\\Shortcut.lnk\" -Size 48\n#\n# Output:\n#   Writes a Base64-encoded PNG of the associated icon to stdout.\n#   If extraction fails, outputs a small transparent PNG as fallback.\n\nparam(\n    [Parameter(Mandatory = $true, Position = 0)]\n    [string]$Path,\n\n    [Parameter(Mandatory = $false)]\n    [ValidateRange(16, 512)]\n    [int]$Size = 128\n)\n\n# Suppress non-terminating errors to keep stdout clean (only base64 should be printed)\n$ErrorActionPreference = 'SilentlyContinue'\n\n# Load System.Drawing for icon extraction/conversion\nAdd-Type -AssemblyName System.Drawing -ErrorAction SilentlyContinue\n\n# Default transparent 256x256 PNG as Base64 (used if extraction fails)\n$defaultIconBase64 = \"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAMAAABrrFhUAAABiVBMVEUAAABzc3N5eXl0dHR5dnN5dnN4eHV5d3V6eHR5d3V6eHR5d3R5d3R5d3R5d3R5d3R5d3R5d3R5d3R5d3R5d3QGabwGar0Ha70Ha74HbL4HbL8Hbb8HbcAIbsAIbsEIb8EIcMIJccIJccMJcsMJcsQJc8QKc8UKdMUKdMYKdcYKdscLdscLd8cLd8gLeMgLeMkLeckMecoMesoMessMe8sMe8wMfMwNfMwNfcwNfc0Nfs0Nfs4Nf84Of88OgM8OgNAOgdAOgdEOgtEPgtEPg9IPhNIPhNMPhdMQhdQQhtQQhtUQh9UQh9YRiNYRidcRitcRitgSi9gSi9kSjNkSjNoSjdoSjdsTjtsTj9wed8IeeMMfecMpmd4qmd8qmt94rdl5d3R5rtp8end+wep/weqHhYOMi4iOjIqPjYqPjYuWlpbAv77BwL7Cwb/CwcDDwsHEw8LExMTPz87Q0M/S0dDX19bY19bk5OPl5eTx8PDx8fHz8/Lz8/P09PP09vj09/n4+Pj6+vr///+Z/ULnAAAAFXRSTlMAFBUWUlRVgYKDhM3Oz9Dw8fLz9P7FJ1F0AAAAAWJLR0SCi7P/RAAAAtFJREFUeNrt2s1qE1EYxvGZTGfSIEYKQhYigqtcSN2IVi/BO2z9WHotomIXorQS05JkpplmalyIbmrz2ff3h1C6aJnzz/O85+S0SQIAAAAAAAAAAAAAAG476eyVtbPiebiVvx1fTC6uBBR3XgR9918PyyRLiu5B1Pj3P5fTNOve9vd/b/Y6/cfXhqNBqx01/1e8LFo7sTeBnegC8vRV8HNAKyEg+BC4KkK3k4dbeTkaTOYC8vu7EcdfXnwrf1Wguxsz/e278xnQidr/zlxAHlVAYRcggAACCCCAAAIIIIAAAgggICZ//1ng6zV+uvfnt9Mv5WTpT5y3H7QW9cCLTsDx2fLXn5TD4+UmoPf/v2xcryS1o4U98KITMFlNbUtDcKkVuAE1Ac4BBKiABEiABEiABEhAzPuA9QjYoPuA21GB3rYtoWcGEGAbJIAAM0ACCFABAlSAABVY633AerjZA0uA+wDboF3ADFABJ0EzwAwwA8wAAgxBM0ACknD/H+AcsMiP1+sR0DMDCLANEqACBKiABEgAASpAgAq4D7jmJ0cVWPDH6627DzADnAPMABUgwAzwWcAQNAPMADPADDADtvM+QAU25z5AAgiwCxCgAgSoAAEEmAESIAEERLwPMAPcB5gBBJgBBKiABEiABEiABEgAASoQ7z7ADIh+H2AGqAABBJgBBKgAASpAgApIgARIgARIgAQQoAIEqEAkAfureeYnG1uBfDUdKDZWwKOnk/dLX/5+8XBjBWSPk74hSAABBBBAAAEEEEAAAVsjoIy6+MlcQBVVQDUXcBZVwPB3AuqY66+bBGSf+rMkdEIKODlPkqNWY2EQsgTDpgHVTiNg+n28l0bL/8lw2uyAWf1xdotVj0ejNI1zJqhGp4PzZvIdnqdJfu9Z2FPQux9VlkzLD/2g6z/8WSVN9VtF1j4It/o342pSJwAAAAAAAAAAAAAAIACXIfSz2zOYD54AAAAASUVORK5CYII=\"\n\nfunction Write-FallbackBase64 {\n    Write-Output $defaultIconBase64\n}\n\nfunction Resolve-LnkTargetPath {\n    param([string]$lnkPath)\n\n    if (-not (Test-Path -LiteralPath $lnkPath -PathType Leaf)) { return $null }\n    try {\n        $shell = New-Object -ComObject WScript.Shell -Strict\n        try {\n            $shortcut = $shell.CreateShortcut($lnkPath)\n            if ($shortcut -and $shortcut.IconLocation) {\n                # IconLocation can be \"path,index\"; prefer the icon file path if present\n                $iconSpec = $shortcut.IconLocation\n                $iconPath = $iconSpec.Split(',')[0]\n                if ($iconPath -and (Test-Path -LiteralPath $iconPath -PathType Leaf)) {\n                    return $iconPath\n                }\n            }\n            if ($shortcut -and $shortcut.TargetPath) {\n                return $shortcut.TargetPath\n            }\n        } finally {\n            if ($shell) { [System.Runtime.InteropServices.Marshal]::ReleaseComObject($shell) | Out-Null }\n        }\n    } catch { }\n    return $null\n}\n\nfunction Get-IconBase64FromFile {\n    param(\n        [string]$filePath,\n        [int]$size\n    )\n\n    if (-not [System.Drawing.Icon]) { return $null }\n\n    try {\n        # Handle .ico files explicitly for best fidelity\n        $ext = [System.IO.Path]::GetExtension($filePath)\n        if ($ext -and $ext.Equals('.ico', [System.StringComparison]::OrdinalIgnoreCase)) {\n            $ico = New-Object System.Drawing.Icon($filePath)\n        } else {\n            $ico = [System.Drawing.Icon]::ExtractAssociatedIcon($filePath)\n        }\n        if ($null -eq $ico) { return $null }\n\n        $bmp = $ico.ToBitmap()\n        $resizedBmp = New-Object System.Drawing.Bitmap($size, $size)\n        $graphics = [System.Drawing.Graphics]::FromImage($resizedBmp)\n        $graphics.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::HighQualityBicubic\n        $graphics.DrawImage($bmp, 0, 0, $size, $size)\n\n        $stream = New-Object System.IO.MemoryStream\n        $resizedBmp.Save($stream, [System.Drawing.Imaging.ImageFormat]::Png)\n        $base64 = [Convert]::ToBase64String($stream.ToArray())\n\n        $stream.Dispose()\n        $graphics.Dispose()\n        $resizedBmp.Dispose()\n        $bmp.Dispose()\n        $ico.Dispose()\n\n        return $base64\n    } catch {\n        return $null\n    }\n}\n\n# Expand environment variables if any (e.g., %WINDIR%) without introducing noise\n$expandedPath = try { $ExecutionContext.InvokeCommand.ExpandString($Path) } catch { $Path }\n\n# Resolve .lnk shortcuts first if the given path ends with .lnk\n$candidatePath = $expandedPath\nif ($candidatePath -like '*.lnk') {\n    $lnkTarget = Resolve-LnkTargetPath -lnkPath $candidatePath\n    if ($lnkTarget) { $candidatePath = $lnkTarget }\n}\n\n# Resolve to a filesystem path if possible\n$resolvedPath = try { (Resolve-Path -LiteralPath $candidatePath -ErrorAction SilentlyContinue).ProviderPath } catch { $null }\nif (-not $resolvedPath) { $resolvedPath = $candidatePath }\n\n# Ensure target exists and is a file\nif (-not (Test-Path -LiteralPath $resolvedPath -PathType Leaf)) {\n    Write-FallbackBase64\n    exit 0\n}\n\n$result = Get-IconBase64FromFile -filePath $resolvedPath -size $Size\nif ($result) {\n    Write-Output $result\n} else {\n    Write-FallbackBase64\n}\n\nexit 0"
  },
  {
    "path": "guest_server/scripts/time-sync.bat",
    "content": "@echo off\nnet stop w32time\nnet start w32time\nw32tm /resync"
  },
  {
    "path": "guest_server/scripts/update.ps1",
    "content": "param(\n    [Parameter(Mandatory=$true)]\n    [string]$AppPath,\n    \n    [Parameter(Mandatory=$true)]\n    [string]$UpdateFilePath,\n    \n    [string]$ServiceName = \"WinBoatGuestServer\",\n    \n    [int]$InitialDelay = 2,\n    [int]$StopTimeout = 30\n)\n\n# Suppress non-log output\n$ProgressPreference = 'SilentlyContinue'\n$VerbosePreference = 'SilentlyContinue'\n$DebugPreference = 'SilentlyContinue'\n$WarningPreference = 'SilentlyContinue'\n$InformationPreference = 'SilentlyContinue'\n$ErrorActionPreference = 'SilentlyContinue'\n\n# Set up logging to temp folder\n$TempDir = Split-Path $UpdateFilePath -Parent\n$LogFile = Join-Path $TempDir \"logs.txt\"\n\nfunction Write-Log {\n    param([string]$Message, [string]$Level = \"INFO\")\n    $timestamp = Get-Date -Format \"yyyy-MM-dd HH:mm:ss\"\n    $logMessage = \"[$timestamp] [$Level] $Message\"\n    \n    # Use Write-Output instead of Write-Host for better compatibility\n    Write-Output $logMessage\n    \n    # Log to temp folder\n    try {\n        Add-Content -Path $LogFile -Value $logMessage -Encoding UTF8\n    } catch {\n        Write-Output \"Failed to write to log file: $($_.Exception.Message)\"\n    }\n}\n\ntry {\n    Write-Log \"Update script started\"\n    Write-Log \"App Path: $AppPath\"\n    Write-Log \"Update File: $UpdateFilePath\"\n    Write-Log \"Service Name: $ServiceName\"\n    Write-Log \"Log File: $LogFile\"\n    Write-Log \"Temp Directory: $TempDir\"\n    \n    # Initial delay to let Go app finish its response and exit gracefully\n    Write-Log \"Waiting $InitialDelay seconds for app to finish...\"\n    Start-Sleep -Seconds $InitialDelay\n    \n    # Validate inputs\n    if (-not (Test-Path $AppPath)) {\n        throw \"Application path does not exist: $AppPath\"\n    }\n    \n    if (-not (Test-Path $UpdateFilePath)) {\n        throw \"Update file does not exist: $UpdateFilePath\"\n    }\n    \n    # Check if running as administrator\n    if (-not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {\n        throw \"Script must be run as Administrator to manage services\"\n    }\n    \n    # Get service\n    $service = Get-Service -Name $ServiceName -ErrorAction SilentlyContinue\n    if (-not $service) {\n        throw \"Service '$ServiceName' not found\"\n    }\n    \n    Write-Log \"Current service status: $($service.Status)\"\n    \n    # Force stop the service (the Go app should have already exited, but make sure)\n    if ($service.Status -ne \"Stopped\") {\n        Write-Log \"Force stopping service '$ServiceName'...\"\n        Stop-Service -Name $ServiceName -Force -ErrorAction SilentlyContinue\n        \n        # Wait for it to actually stop\n        $elapsed = 0\n        do {\n            Start-Sleep -Seconds 1\n            $elapsed++\n            $service = Get-Service -Name $ServiceName\n            if ($elapsed % 5 -eq 0) {\n                Write-Log \"Waiting for service to stop... ($elapsed seconds)\"\n            }\n        } while ($service.Status -ne \"Stopped\" -and $elapsed -lt $StopTimeout)\n        \n        if ($service.Status -ne \"Stopped\") {\n            Write-Log \"Service didn't stop gracefully, continuing anyway...\" -Level \"WARN\"\n        } else {\n            Write-Log \"Service stopped\"\n        }\n    }\n    \n    # Extra delay to ensure all file handles are released\n    Write-Log \"Waiting for file handles to release...\"\n    Start-Sleep -Seconds 3\n    \n    # Create backup in a more appropriate location\n    $backupDir = \"$env:PROGRAMDATA\\WinBoat\\Backups\"\n    if (-not (Test-Path $backupDir)) {\n        Write-Log \"Creating backup directory: $backupDir\"\n        New-Item -ItemType Directory -Path $backupDir -Force | Out-Null\n    }\n    \n    $timestamp = Get-Date -Format 'yyyyMMdd-HHmmss'\n    $backupPath = Join-Path $backupDir \"backup-$timestamp\"\n    Write-Log \"Creating backup: $backupPath\"\n    Copy-Item -Path $AppPath -Destination $backupPath -Recurse -Force\n    \n    # Clean up old backups (keep only last 5)\n    try {\n        $oldBackups = Get-ChildItem -Path $backupDir -Directory | \n                     Where-Object { $_.Name -like \"backup-*\" } | \n                     Sort-Object CreationTime -Descending | \n                     Select-Object -Skip 5\n        \n        if ($oldBackups) {\n            Write-Log \"Cleaning up $($oldBackups.Count) old backup(s)\"\n            $oldBackups | ForEach-Object {\n                Write-Log \"Removing old backup: $($_.Name)\"\n                Remove-Item $_.FullName -Recurse -Force -ErrorAction SilentlyContinue\n            }\n        }\n    } catch {\n        Write-Log \"Failed to clean up old backups: $($_.Exception.Message)\" -Level \"WARN\"\n    }\n    \n    # Clean the application directory (but keep the directory itself)\n    Write-Log \"Cleaning application directory...\"\n    try {\n        Get-ChildItem -Path $AppPath -Force | ForEach-Object {\n            Write-Log \"Removing: $($_.Name)\"\n            if ($_.PSIsContainer) {\n                Remove-Item $_.FullName -Recurse -Force\n            } else {\n                Remove-Item $_.FullName -Force\n            }\n        }\n        Write-Log \"Application directory cleaned\"\n    } catch {\n        Write-Log \"Warning: Some files could not be removed: $($_.Exception.Message)\" -Level \"WARN\"\n        # Continue anyway - the -Force flag on Expand-Archive should overwrite\n    }\n    \n    # Add Defender exclusions for app path and update folder\n    $UpdateFolder = Split-Path -Path $UpdateFilePath -Parent\n    Write-Log \"Adding Defender exclusions for app path and update folder...\"\n    Write-Log \"Excluding app path: $AppPath\"\n    Write-Log \"Excluding update folder: $UpdateFolder\"\n    Add-MpPreference -ExclusionPath $AppPath\n    Add-MpPreference -ExclusionPath $UpdateFolder\n\n    # Extract update\n    Write-Log \"Extracting update files to clean directory...\"\n    Expand-Archive -Path $UpdateFilePath -DestinationPath $AppPath -Force\n    Write-Log \"Files extracted successfully\"\n    \n    # Start service\n    Write-Log \"Starting service '$ServiceName'...\"\n    Start-Service -Name $ServiceName\n    \n    # Brief check\n    Start-Sleep -Seconds 3\n    $service = Get-Service -Name $ServiceName\n    Write-Log \"Service status after start: $($service.Status)\"\n    \n    # Cleanup update file but keep temp directory and logs\n    Write-Log \"Cleaning up update file...\"\n    Remove-Item $UpdateFilePath -Force -ErrorAction SilentlyContinue\n    \n    Write-Log \"Update completed successfully!\" -Level \"SUCCESS\"\n    Write-Log \"Backup created at: $backupPath\"\n    Write-Log \"Temp directory preserved for debugging: $TempDir\"\n    Write-Log \"Log file location: $LogFile\"\n    \n} catch {\n    Write-Log \"Update failed: $($_.Exception.Message)\" -Level \"ERROR\"\n    Write-Log \"Stack trace: $($_.Exception.StackTrace)\" -Level \"ERROR\"\n    \n    # Try to start the service anyway\n    try {\n        Write-Log \"Attempting to start service after failure...\" -Level \"WARN\"\n        Start-Service -Name $ServiceName -ErrorAction SilentlyContinue\n        $service = Get-Service -Name $ServiceName\n        Write-Log \"Service status after recovery attempt: $($service.Status)\" -Level \"WARN\"\n    } catch {\n        Write-Log \"Failed to start service: $($_.Exception.Message)\" -Level \"ERROR\"\n    }\n    \n    Write-Log \"Update process completed with errors. Check log file: $LogFile\" -Level \"ERROR\"\n    exit 1\n}"
  },
  {
    "path": "guest_server/securekey.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"unsafe\"\n\n\t\"golang.org/x/sys/windows\"\n\t\"golang.org/x/sys/windows/registry\"\n)\n\nvar (\n\tadvapi32                  = windows.NewLazySystemDLL(\"advapi32.dll\")\n\tprocSetNamedSecurityInfoW = advapi32.NewProc(\"SetNamedSecurityInfoW\")\n\tprocSetEntriesInAclW      = advapi32.NewProc(\"SetEntriesInAclW\")\n)\n\nconst (\n\t// Using a protected location under HKLM\n\tbaseRegistryPath = `SOFTWARE\\WinBoatSecureStore`\n)\n\n// setSecureRegKey stores a value that only SYSTEM can modify\n// Must be run as NT AUTHORITY\\SYSTEM\nfunc setSecureRegKey(k string, v string) error {\n\t// Open/Create the registry key first with default permissions\n\tkey, _, err := registry.CreateKey(registry.LOCAL_MACHINE, baseRegistryPath, registry.ALL_ACCESS)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to create registry key: %w\", err)\n\t}\n\tdefer key.Close()\n\n\t// Write the value\n\tif err := key.SetStringValue(k, v); err != nil {\n\t\treturn fmt.Errorf(\"failed to set registry value: %w\", err)\n\t}\n\n\t// Now lock it down - get SYSTEM SID\n\tsystemSID, err := windows.StringToSid(\"S-1-5-18\")\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to get SYSTEM SID: %w\", err)\n\t}\n\n\t// Get Administrators SID\n\tadminsSID, err := windows.StringToSid(\"S-1-5-32-544\")\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to get Administrators SID: %w\", err)\n\t}\n\n\t// Get Everyone SID\n\teveryoneSID, err := windows.StringToSid(\"S-1-1-0\")\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to get Everyone SID: %w\", err)\n\t}\n\n\t// Create ACL:\n\t// 1. SYSTEM gets FULL CONTROL (KEY_ALL_ACCESS)\n\t// 2. Everyone gets READ (KEY_READ) - so your service can read it back\n\t// 3. Admins explicitly DENIED write access\n\texplicitAccess := []windows.EXPLICIT_ACCESS{\n\t\t{\n\t\t\tAccessPermissions: windows.KEY_ALL_ACCESS,\n\t\t\tAccessMode:        windows.GRANT_ACCESS,\n\t\t\tInheritance:       windows.CONTAINER_INHERIT_ACE | windows.OBJECT_INHERIT_ACE,\n\t\t\tTrustee: windows.TRUSTEE{\n\t\t\t\tTrusteeForm:  windows.TRUSTEE_IS_SID,\n\t\t\t\tTrusteeType:  windows.TRUSTEE_IS_WELL_KNOWN_GROUP,\n\t\t\t\tTrusteeValue: windows.TrusteeValueFromSID(systemSID),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tAccessPermissions: windows.KEY_READ,\n\t\t\tAccessMode:        windows.GRANT_ACCESS,\n\t\t\tInheritance:       windows.CONTAINER_INHERIT_ACE | windows.OBJECT_INHERIT_ACE,\n\t\t\tTrustee: windows.TRUSTEE{\n\t\t\t\tTrusteeForm:  windows.TRUSTEE_IS_SID,\n\t\t\t\tTrusteeType:  windows.TRUSTEE_IS_WELL_KNOWN_GROUP,\n\t\t\t\tTrusteeValue: windows.TrusteeValueFromSID(everyoneSID),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tAccessPermissions: windows.KEY_WRITE | windows.KEY_SET_VALUE | windows.DELETE | windows.WRITE_DAC | windows.WRITE_OWNER,\n\t\t\tAccessMode:        windows.DENY_ACCESS,\n\t\t\tInheritance:       windows.CONTAINER_INHERIT_ACE | windows.OBJECT_INHERIT_ACE,\n\t\t\tTrustee: windows.TRUSTEE{\n\t\t\t\tTrusteeForm:  windows.TRUSTEE_IS_SID,\n\t\t\t\tTrusteeType:  windows.TRUSTEE_IS_GROUP,\n\t\t\t\tTrusteeValue: windows.TrusteeValueFromSID(adminsSID),\n\t\t\t},\n\t\t},\n\t}\n\n\tvar acl *windows.ACL\n\tret, _, err := procSetEntriesInAclW.Call(\n\t\tuintptr(len(explicitAccess)),\n\t\tuintptr(unsafe.Pointer(&explicitAccess[0])),\n\t\t0, // oldAcl is nil\n\t\tuintptr(unsafe.Pointer(&acl)),\n\t)\n\tif ret != 0 {\n\t\treturn fmt.Errorf(\"failed to create ACL: %w\", err)\n\t}\n\tdefer windows.LocalFree(windows.Handle(unsafe.Pointer(acl)))\n\n\t// Apply the security descriptor to the registry key\n\tregPath := `MACHINE\\` + baseRegistryPath\n\tregPathW, err := windows.UTF16PtrFromString(regPath)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to convert path: %w\", err)\n\t}\n\n\tret, _, err = procSetNamedSecurityInfoW.Call(\n\t\tuintptr(unsafe.Pointer(regPathW)),\n\t\tuintptr(windows.SE_REGISTRY_KEY),\n\t\tuintptr(windows.DACL_SECURITY_INFORMATION|windows.OWNER_SECURITY_INFORMATION|windows.PROTECTED_DACL_SECURITY_INFORMATION),\n\t\tuintptr(unsafe.Pointer(systemSID)),\n\t\t0,\n\t\tuintptr(unsafe.Pointer(acl)),\n\t\t0,\n\t)\n\n\tif ret != 0 {\n\t\treturn fmt.Errorf(\"SetNamedSecurityInfoW failed: %w\", err)\n\t}\n\n\treturn nil\n}\n\n// getSecureRegKey retrieves a stored value\n// Returns nil if the key or value doesn't exist\nfunc getSecureRegKey(k string) (*string, error) {\n\tkey, err := registry.OpenKey(registry.LOCAL_MACHINE, baseRegistryPath, registry.QUERY_VALUE)\n\tif err != nil {\n\t\t// Registry key doesn't exist yet\n\t\tif err == registry.ErrNotExist {\n\t\t\treturn nil, nil\n\t\t}\n\t\treturn nil, fmt.Errorf(\"failed to open registry key: %w\", err)\n\t}\n\tdefer key.Close()\n\n\tvalue, _, err := key.GetStringValue(k)\n\tif err != nil {\n\t\t// Value doesn't exist\n\t\tif err == registry.ErrNotExist {\n\t\t\treturn nil, nil\n\t\t}\n\t\treturn nil, fmt.Errorf(\"failed to read registry value: %w\", err)\n\t}\n\n\treturn &value, nil\n}\n"
  },
  {
    "path": "guest_server/util.go",
    "content": "//go:build windows\n// +build windows\n\npackage main\n\nimport (\n\t\"log\"\n\t\"os\"\n)\n\nfunc checkErr(err error) {\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n}\n\n// Copy a file from src to dst\nfunc copyFile(src string, dst string) {\n\tinfo, err := os.Stat(src)\n\tcheckErr(err)\n\n\t// Read all content of src to data, may cause OOM for a large file.\n\tdata, err := os.ReadFile(src)\n\tcheckErr(err)\n\t// Write data to dst\n\terr = os.WriteFile(dst, data, info.Mode())\n\tcheckErr(err)\n}\n"
  },
  {
    "path": "package.json",
    "content": "{\n    \"name\": \"winboat\",\n    \"version\": \"0.9.0\",\n    \"description\": \"Windows for Penguins\",\n    \"type\": \"module\",\n    \"main\": \"main/main.js\",\n    \"engines\": {\n        \"node\": \">=23.6.0\",\n        \"bun\": \">=1.3.0\"\n    },\n    \"scripts\": {\n        \"dev\": \"bun scripts/dev-server.ts\",\n        \"build:gs\": \"bash build-guest-server.sh\",\n        \"build:linux-gs\": \"bash build-guest-server.sh && bun scripts/build.ts && electron-builder --linux\"\n    },\n    \"repository\": \"https://github.com/TibixDev/winboat\",\n    \"author\": {\n        \"name\": \"TibixDev\",\n        \"url\": \"https://github.com/TibixDev\",\n        \"email\": \"staff@winboat.app\"\n    },\n    \"devDependencies\": {\n        \"@types/node-fetch\": \"^2.6.13\",\n        \"@types/turndown\": \"^5.0.6\",\n        \"@vitejs/plugin-vue\": \"^6.0.4\",\n        \"autoprefixer\": \"^10.4.24\",\n        \"chalk\": \"^5.6.2\",\n        \"chokidar\": \"^5.0.0\",\n        \"electron\": \"^40.2.1\",\n        \"electron-builder\": \"^26.7.0\",\n        \"postcss\": \"^8.5.6\",\n        \"prettier\": \"3.8.1\",\n        \"tailwindcss\": \"^3.4.17\",\n        \"typescript\": \"~5.9.3\",\n        \"vite\": \"^7.3.1\",\n        \"vue-tsc\": \"^3.2.4\"\n    },\n    \"dependencies\": {\n        \"@electron/remote\": \"^2.1.3\",\n        \"@iconify/vue\": \"^5.0.0\",\n        \"@vueuse/core\": \"^14.2.0\",\n        \"@vueuse/motion\": \"^3.0.3\",\n        \"apexcharts\": \"^5.3.6\",\n        \"argon2\": \"^0.44.0\",\n        \"check-disk-space\": \"^3.4.0\",\n        \"consola\": \"^3.4.2\",\n        \"electron-store\": \"^11.0.2\",\n        \"form-data\": \"^4.0.5\",\n        \"jimp\": \"^1.6.0\",\n        \"marked\": \"^17.0.1\",\n        \"nanoevents\": \"^9.1.0\",\n        \"node-fetch\": \"2\",\n        \"path-browserify\": \"^1.0.1\",\n        \"turndown\": \"^7.2.2\",\n        \"usb\": \"^2.17.0\",\n        \"vue\": \"^3.5.27\",\n        \"vue-router\": \"^5.0.2\",\n        \"vue3-apexcharts\": \"^1.10.0\",\n        \"xel\": \"^0.40.3\",\n        \"yaml\": \"^2.8.2\"\n    }\n}\n"
  },
  {
    "path": "postcss.config.ts",
    "content": "export default {\n    plugins: {\n        tailwindcss: {},\n        autoprefixer: {},\n    },\n};\n"
  },
  {
    "path": "scripts/build.ts",
    "content": "import Path from \"path\";\nimport Chalk from \"chalk\";\nimport FileSystem from \"fs\";\nimport * as Vite from \"vite\";\nimport compileTs from \"./private/tsc.ts\";\n// ^ Extension can't be omitted because Node expects it\nimport { fileURLToPath } from \"url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = Path.dirname(__filename);\n\nfunction buildRenderer() {\n    return Vite.build({\n        configFile: Path.join(__dirname, \"..\", \"vite.config.ts\"),\n        base: \"./\",\n        mode: \"production\",\n    });\n}\n\nfunction buildMain() {\n    const mainPath = Path.join(__dirname, \"..\", \"src\", \"main\");\n    return compileTs(mainPath);\n}\n\nFileSystem.rmSync(Path.join(__dirname, \"..\", \"build\"), {\n    recursive: true,\n    force: true,\n});\n\nconsole.log(Chalk.blueBright(\"Transpiling renderer & main...\"));\n\nPromise.allSettled([buildRenderer(), buildMain()]).then(() => {\n    console.log(\n        Chalk.greenBright(\"Renderer & main successfully transpiled! (ready to be built with electron-builder)\"),\n    );\n});\n"
  },
  {
    "path": "scripts/dev-server.ts",
    "content": "process.env.NODE_ENV = \"development\";\n\nimport * as Vite from \"vite\";\nimport ChildProcess, { type ChildProcessWithoutNullStreams } from \"child_process\";\nimport Path from \"path\";\nimport Chalk from \"chalk\";\nimport Chokidar from \"chokidar\";\nimport Electron from \"electron\";\nimport compileTs from \"./private/tsc.ts\";\n// ^ Extension needed because no TSConfig in the root\nimport FileSystem from \"fs\";\nimport { EOL } from \"os\";\nimport { fileURLToPath } from \"url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = Path.dirname(__filename);\n\nlet viteServer: Vite.ViteDevServer | null = null;\nlet electronProcess: ChildProcessWithoutNullStreams | null = null;\nlet electronProcessLocker = false;\nlet rendererPort = 0;\n\nasync function startRenderer() {\n    viteServer = await Vite.createServer({\n        configFile: Path.join(__dirname, \"..\", \"vite.config.ts\"),\n        mode: \"development\",\n    });\n\n    return viteServer.listen();\n}\n\nasync function startElectron() {\n    if (electronProcess) {\n        // single instance lock\n        return;\n    }\n\n    try {\n        await compileTs(Path.join(__dirname, \"..\", \"src\", \"main\"));\n    } catch {\n        console.log(Chalk.redBright(\"Could not start Electron because of the above typescript error(s).\"));\n        electronProcessLocker = false;\n        return;\n    }\n\n    const args = [Path.join(__dirname, \"..\", \"build\", \"main\", \"main.js\"), String(rendererPort)];\n\n    electronProcess = ChildProcess.spawn(String(Electron), args);\n    electronProcessLocker = false;\n\n    electronProcess!.stdout.on(\"data\", data => {\n        if (data == EOL) {\n            return;\n        }\n\n        process.stdout.write(Chalk.blueBright(`[electron] `) + Chalk.white(data.toString()));\n    });\n\n    electronProcess!.stderr.on(\"data\", data =>\n        process.stderr.write(Chalk.blueBright(`[electron] `) + Chalk.white(data.toString())),\n    );\n\n    electronProcess!.on(\"exit\", () => stop());\n}\n\nfunction restartElectron() {\n    if (electronProcess) {\n        electronProcess.removeAllListeners(\"exit\");\n        electronProcess.kill();\n        electronProcess = null;\n    }\n\n    if (!electronProcessLocker) {\n        electronProcessLocker = true;\n        startElectron();\n    }\n}\n\nfunction copyStaticFiles() {\n    copy(\"static\");\n}\n\n/*\nThe working dir of Electron is build/main instead of src/main because of TS.\ntsc does not copy static files, so copy them over manually for dev server.\n*/\nfunction copy(path) {\n    FileSystem.cpSync(\n        Path.join(__dirname, \"..\", \"src\", \"main\", path),\n        Path.join(__dirname, \"..\", \"build\", \"main\", path),\n        { recursive: true },\n    );\n}\n\nfunction stop() {\n    viteServer!.close();\n    process.exit();\n}\n\nasync function start() {\n    console.log(`${Chalk.greenBright(\"=======================================\")}`);\n    console.log(`${Chalk.greenBright(\"Starting Electron + Vite Dev Server...\")}`);\n    console.log(`${Chalk.greenBright(\"=======================================\")}`);\n\n    const devServer = await startRenderer();\n    rendererPort = devServer.config.server.port;\n\n    copyStaticFiles();\n    startElectron();\n\n    const path = Path.join(__dirname, \"..\", \"src\", \"main\");\n    Chokidar.watch(path, {\n        cwd: path,\n    }).on(\"change\", path => {\n        console.log(Chalk.blueBright(`[electron] `) + `Change in ${path}. reloading... 🚀`);\n\n        if (path.startsWith(Path.join(\"static\", \"/\"))) {\n            copy(path);\n        }\n\n        restartElectron();\n    });\n}\n\nstart();\n"
  },
  {
    "path": "scripts/private/tsc.ts",
    "content": "import ChildProcess from \"child_process\";\nimport Chalk from \"chalk\";\n\nexport default function compile(directory) {\n    return new Promise<void>((resolve, reject) => {\n        const tscProcess = ChildProcess.exec(\"tsc\", {\n            cwd: directory,\n        });\n\n        tscProcess.stdout!.on(\"data\", data =>\n            process.stdout.write(Chalk.yellowBright(`[tsc] `) + Chalk.white(data.toString())),\n        );\n\n        tscProcess.on(\"exit\", exitCode => {\n            if (exitCode ?? 1 > 0) {\n                reject(exitCode);\n            } else {\n                resolve();\n            }\n        });\n    });\n}\n"
  },
  {
    "path": "src/main/main.ts",
    "content": "import { app, BrowserWindow, ipcMain, session, dialog } from \"electron\";\nimport { join } from \"path\";\nimport { initialize, enable } from \"@electron/remote/main/index.js\";\nimport Store from \"electron-store\";\n\ninitialize();\n\n// Window Constants\nconst WINDOW_MIN_WIDTH = 1280;\nconst WINDOW_MIN_HEIGHT = 800;\n\n// For electron-store Type-Safety\ntype SchemaType = {\n    dimensions: {\n        width: number;\n        height: number;\n    };\n    position: {\n        x: number;\n        y: number;\n    };\n};\n\nconst windowStore = new Store<SchemaType>({\n    schema: {\n        dimensions: {\n            type: \"object\",\n            properties: {\n                width: {\n                    type: \"number\",\n                    default: WINDOW_MIN_WIDTH,\n                },\n                height: {\n                    type: \"number\",\n                    default: WINDOW_MIN_HEIGHT,\n                },\n            },\n            required: [\"width\", \"height\"],\n        },\n        position: {\n            type: \"object\",\n            properties: {\n                x: {\n                    type: \"number\",\n                },\n                y: {\n                    type: \"number\",\n                },\n            },\n            required: [\"x\", \"y\"],\n        },\n    },\n});\n\nlet mainWindow: BrowserWindow | null = null;\n\nfunction createWindow() {\n    if (!app.requestSingleInstanceLock()) {\n        // @ts-ignore property \"window\" is optional, see: [dialog.showMessageBoxSync](https://www.electronjs.org/docs/latest/api/dialog#dialogshowmessageboxsyncwindow-options)\n        dialog.showMessageBoxSync(null, {\n            type: \"error\",\n            buttons: [\"Close\"],\n            title: \"WinBoat\",\n            message: \"An instance of WinBoat is already running.\\n\\tMultiple Instances are not allowed.\",\n        });\n        app.exit();\n    }\n\n    mainWindow = new BrowserWindow({\n        minWidth: WINDOW_MIN_WIDTH,\n        minHeight: WINDOW_MIN_HEIGHT,\n        width: windowStore.get(\"dimensions.width\"),\n        height: windowStore.get(\"dimensions.height\"),\n        x: windowStore.get(\"position.x\"),\n        y: windowStore.get(\"position.y\"),\n        transparent: false,\n        frame: false,\n        webPreferences: {\n            // preload: join(__dirname, 'preload.js'),\n            nodeIntegration: true,\n            contextIsolation: false,\n        },\n    });\n\n    mainWindow.on(\"close\", () => {\n        const bounds = mainWindow?.getBounds();\n\n        windowStore.set(\"dimensions\", {\n            width: bounds?.width,\n            height: bounds?.height,\n        });\n\n        windowStore.set(\"position\", {\n            x: bounds?.x,\n            y: bounds?.y,\n        });\n    });\n\n    enable(mainWindow.webContents);\n\n    if (process.env.NODE_ENV === \"development\") {\n        const rendererPort = process.argv[2];\n        mainWindow.loadURL(`http://localhost:${rendererPort}`);\n    } else {\n        mainWindow.loadFile(join(app.getAppPath(), \"renderer\", \"index.html\"));\n    }\n}\n\napp.whenReady().then(() => {\n    createWindow();\n\n    session.defaultSession.webRequest.onHeadersReceived((details, callback) => {\n        callback({\n            responseHeaders: {\n                ...details.responseHeaders,\n                // 'Content-Security-Policy': ['script-src \\'self\\'']\n                \"Content-Security-Policy\": [\n                    \"script-src 'self' 'unsafe-eval' 'wasm-unsafe-eval' 'unsafe-inline'\",\n                    \"worker-src 'self' blob:\",\n                    \"media-src 'self' blob:\",\n                    \"font-src 'self' 'unsafe-inline' https://fonts.gstatic.com;\",\n                    \"style-src 'self' 'unsafe-inline' https://fonts.googleapis.com\",\n                ],\n            },\n        });\n    });\n\n    app.on(\"activate\", function () {\n        // On macOS it's common to re-create a window in the app when the\n        // dock icon is clicked and there are no other windows open.\n        if (BrowserWindow.getAllWindows().length === 0) {\n            createWindow();\n        }\n    });\n});\n\napp.on(\"window-all-closed\", function () {\n    if (process.platform !== \"darwin\") app.quit();\n});\n\napp.on(\"second-instance\", _ => {\n    if (mainWindow) {\n        mainWindow.focus();\n    }\n});\n\nipcMain.on(\"message\", (_event, message) => {\n    console.log(message);\n});\n"
  },
  {
    "path": "src/main/static/.gitkeep",
    "content": ""
  },
  {
    "path": "src/main/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"target\": \"esnext\",\n        \"module\": \"nodenext\",\n        \"strict\": true,\n        \"esModuleInterop\": true,\n        \"skipLibCheck\": true,\n        \"forceConsistentCasingInFileNames\": true,\n        \"outDir\": \"../../build/main\",\n        \"allowJs\": true,\n        \"noImplicitAny\": false\n    },\n    \"exclude\": [\"static\"]\n}\n"
  },
  {
    "path": "src/renderer/App.vue",
    "content": "<template>\n    <main \n        class=\"overflow-hidden relative w-screen h-screen\"\n        :class=\"{ animationsDisabled: 'disable-animations' }\"\n    >\n        <!-- Decoration -->\n        <div\n            class=\"gradient-ball absolute -z-10 left-0 bottom-0 translate-x-[-50%] translate-y-[50%] w-[90vw] aspect-square opacity-15 blob-anim\"\n        ></div>\n        <div\n            class=\"gradient-ball absolute -z-10 right-0 top-0 translate-x-[50%] translate-y-[-50%] w-[90vw] aspect-square opacity-15 blob-anim\"\n        ></div>\n\n        <!-- Stripes for experimental -->\n        <div\n            v-show=\"wbConfig?.config.experimentalFeatures\"\n            class=\"experimental-stripes absolute top-0 left-0 w-full h-[3rem] pointer-events-none z-[10] opacity-15 grayscale\"\n        ></div>\n\n        <!-- Titlebar -->\n        <x-titlebar\n            @minimize=\"handleMinimize()\"\n            @buttonclick=\"handleTitleBarEvent\"\n            class=\"backdrop-blur-xl bg-neutral-900/50\"\n        >\n            <x-label>WinBoat</x-label>\n        </x-titlebar>\n\n        <!-- Updater -->\n        <dialog ref=\"updateDialog\">\n            <Icon class=\"text-indigo-400 size-12\" icon=\"mdi:cloud-upload\"></Icon>\n            <template v-if=\"manualUpdateRequired\">\n                <h3 class=\"mt-2\">Manual Guest Server Update Required</h3>\n                <div class=\"max-w-[60vw]\">\n                    <strong\n                        >WinBoat has encountered an issue while trying to update the Guest Server automatically. Please\n                        follow the steps below to manually update it:</strong\n                    >\n                    <ol class=\"mt-2 list-decimal list-inside\">\n                        <li>\n                            Use VNC over at\n                            <a @click=\"openAnchorLink\" :href=\"novncURL\" target=\"_blank\" rel=\"noopener noreferrer\">\n                                {{ novncURL }}\n                            </a>\n                            to access Windows\n                        </li>\n                        <li>Press Win + R or search for <code>Run</code>, type in <code>services.msc</code></li>\n                        <li>Stop the <code>WinBoatGuestServer</code> service by right clicking and pressing \"Stop\"</li>\n                        <li>\n                            Download the new Guest Server from\n                            <a\n                                @click=\"openAnchorLink\"\n                                href=\"https://github.com/TibixDev/winboat/releases\"\n                                target=\"_blank\"\n                                rel=\"noopener noreferrer\"\n                            >\n                                https://github.com/TibixDev/winboat/releases\n                            </a>\n                            , you should pick version <strong>{{ appVer }}</strong>\n                        </li>\n                        <li>Navigate to <code>C:\\Program Files\\WinBoat</code> and delete the contents</li>\n                        <li>Extract the freshly downloaded zip into the same folder</li>\n                        <li>\n                            Start the <code>WinBoatGuestServer</code> service by right clicking and pressing \"Start\"\n                        </li>\n                        <li>If you were using VNC, log out of Windows and close it</li>\n                        <li>Restart WinBoat</li>\n                    </ol>\n                    <p>We're sorry for the inconvenience. 😟</p>\n                </div>\n            </template>\n\n            <template v-else>\n                <h3 class=\"mt-2\" v-if=\"winboat?.isUpdatingGuestServer.value\">Updating Guest Server</h3>\n                <h3 class=\"mt-2\" v-else>Guest Server update successful!</h3>\n                <p v-if=\"winboat?.isUpdatingGuestServer.value\" class=\"max-w-[40vw]\">\n                    The guest is currently running an outdated version of the WinBoat Guest Server. Please wait while we\n                    update it to the current version.\n                </p>\n                <p v-else class=\"max-w-[40vw]\">\n                    The WinBoat Guest Server has been updated successfully! You can now close this dialog and continue\n                    using the application.\n                </p>\n            </template>\n            <footer v-if=\"!manualUpdateRequired\">\n                <x-progressbar v-if=\"winboat?.isUpdatingGuestServer.value\" class=\"my-4\"></x-progressbar>\n                <x-button v-else id=\"close-button\" @click=\"updateDialog!.close()\" toggled>\n                    <x-label>Close</x-label>\n                </x-button>\n            </footer>\n        </dialog>\n\n        <!-- UI / SetupUI -->\n        <div\n            v-if=\"!['SetupUI', 'Migration'].includes($route.name?.toString() || '')\"\n            class=\"flex flex-row h-[calc(100vh-2rem)]\"\n        >\n            <x-nav class=\"flex flex-col flex-none gap-0.5 w-72 backdrop-blur-xl bg-gray-500/10 backdrop-contrast-90\">\n                <div\n                    v-if=\"winboat?.rdpConnected.value\"\n                    class=\"w-full bg-gradient-to-r from-indigo-500 via-indigo-400 to-blue-500 text-white !mt-0 py-1 shadow-md shadow-indigo-500/50 transition-all duration-300 hover:brightness-105 flex flex-row items-center justify-center gap-2\"\n                >\n                    <Icon class=\"size-5\" icon=\"mdi:remote-desktop\"></Icon>\n                    <span class=\"font-semibold text-center\"> RDP Session Active </span>\n                </div>\n                <div class=\"flex flex-row gap-4 items-center p-4\">\n                    <img\n                        class=\"w-16 rounded-full\"\n                        src=\"https://upload.wikimedia.org/wikipedia/commons/thumb/b/b5/Windows_10_Default_Profile_Picture.svg/2048px-Windows_10_Default_Profile_Picture.svg.png\"\n                        alt=\"Profile\"\n                    />\n                    <div>\n                        <x-label class=\"text-lg font-semibold\">{{ os.userInfo().username }}</x-label>\n                        <x-label class=\"text-[0.8rem]\">Local Account</x-label>\n                    </div>\n                </div>\n                <RouterLink\n                    v-for=\"route of routes.filter(\n                        (r: RouteRecordRaw) => !['SetupUI', 'Loading', 'Migration'].includes(String(r.name)),\n                    )\"\n                    :to=\"route.path\"\n                    :key=\"route.path\"\n                >\n                    <x-navitem>\n                        <Icon class=\"mr-4 w-5 h-5\" :icon=\"(route.meta!.icon as string)\" />\n                        <x-label>{{ route.name }}</x-label>\n                    </x-navitem>\n                </RouterLink>\n                <div class=\"flex flex-col justify-end items-center p-4 h-full\">\n                    <p class=\"text-xs text-neutral-500\">WinBoat Beta v{{ appVer }} {{ isDev ? \"Dev\" : \"Prod\" }}</p>\n                </div>\n            </x-nav>\n            <div class=\"px-5 flex-grow max-h-[calc(100vh-2rem)] overflow-y-auto py-4\">\n                <div class=\"flex flex-row gap-2 items-center my-6\">\n                    <Icon class=\"w-6 h-6 opacity-60\" icon=\"icon-park-solid:toolkit\"></Icon>\n                    <h1 class=\"my-0 text-2xl font-semibold opacity-60\">WinBoat</h1>\n                    <Icon class=\"w-6 h-6\" icon=\"bitcoin-icons:caret-right-filled\"></Icon>\n                    <Icon class=\"w-6 h-6\" :icon=\"useRoute().meta.icon as string\"></Icon>\n                    <h1 class=\"my-0 text-2xl font-semibold\">\n                        {{ useRoute().name }}\n                    </h1>\n                </div>\n                <router-view v-slot=\"{ Component }\">\n                    <transition mode=\"out-in\" name=\"fade\">\n                        <component :is=\"Component\" />\n                    </transition>\n                </router-view>\n            </div>\n        </div>\n\n        <div v-else class=\"w-full h-[calc(100vh-2rem)]\">\n            <RouterView />\n        </div>\n    </main>\n</template>\n\n<script setup lang=\"ts\">\nimport { RouteRecordRaw, RouterLink, useRoute, useRouter } from \"vue-router\";\nimport { routes } from \"./router\";\nimport { Icon } from \"@iconify/vue\";\nimport { onMounted, ref, useTemplateRef, watch, reactive, computed } from \"vue\";\nimport { isInstalled } from \"./lib/install\";\nimport { Winboat } from \"./lib/winboat\";\nimport { openAnchorLink } from \"./utils/openLink\";\nimport { WinboatConfig } from \"./lib/config\";\nimport { USBManager } from \"./lib/usbmanager\";\nimport { CommonPorts, getActiveHostPort } from \"./lib/containers/common\";\nimport { performAutoMigrations } from \"./lib/migrate\";\nconst { BrowserWindow }: typeof import(\"@electron/remote\") = require(\"@electron/remote\");\nconst os: typeof import(\"os\") = require(\"node:os\");\n\nconst $router = useRouter();\nconst $route = useRoute();\nconst appVer = import.meta.env.VITE_APP_VERSION;\nconst isDev = import.meta.env.DEV;\nlet winboat: Winboat | null;\nlet wbConfig: WinboatConfig | null;\n\nlet updateTimeout: NodeJS.Timeout | null = null;\nconst manualUpdateRequired = ref(false);\nconst MANUAL_UPDATE_TIMEOUT = 60000; // 60 seconds\nconst updateDialog = useTemplateRef(\"updateDialog\");\nconst novncURL = ref(\"\");\n\nconst animationsDisabled = computed(() => wbConfig?.config.disableAnimations);\n\nonMounted(async () => {\n    const winboatInstalled = await isInstalled();\n\n    if (winboatInstalled) {\n        wbConfig = reactive(WinboatConfig.getInstance()); // Instantiate singleton class\n        winboat = Winboat.getInstance(); // Instantiate singleton class\n        USBManager.getInstance(); // Instantiate singleton class\n\n        // Migrations\n        $router.push(\"/migration\");\n        await performAutoMigrations();\n\n        // After migrations, go to home\n        $router.push(\"/home\");\n    } else {\n        console.log(\"Not installed, redirecting to setup...\");\n        $router.push(\"/setup\");\n    }\n\n    // Watch for guest server updates and show dialog\n    watch(\n        () => winboat?.isUpdatingGuestServer.value,\n        isUpdating => {\n            if (isUpdating === true) {\n                novncURL.value = `http://127.0.0.1:${getActiveHostPort(winboat?.containerMgr!, CommonPorts.NOVNC)}`;\n                updateDialog.value!.showModal();\n                // Prepare the timeout to show manual update required after 45 seconds\n                updateTimeout = setTimeout(() => {\n                    manualUpdateRequired.value = true;\n                }, MANUAL_UPDATE_TIMEOUT);\n            } else {\n                // Clear the timeout if the update finished before the timeout\n                if (updateTimeout) {\n                    clearTimeout(updateTimeout);\n                    updateTimeout = null;\n                }\n                manualUpdateRequired.value = false;\n            }\n        },\n    );\n});\n\nfunction handleMinimize() {\n    console.log(\"Minimize\");\n    window.electronAPI.minimizeWindow();\n}\n\nfunction handleTitleBarEvent(e: CustomEvent) {\n    console.log(\"TitleBarEvt\", e);\n    switch (e.detail) {\n        case \"close\":\n            BrowserWindow.getFocusedWindow()!.close();\n            break;\n        case \"maximize\":\n            if (BrowserWindow.getFocusedWindow()!.isMaximized()) {\n                BrowserWindow.getFocusedWindow()!.unmaximize();\n            } else {\n                BrowserWindow.getFocusedWindow()!.maximize();\n            }\n            break;\n        case \"minimize\":\n            BrowserWindow.getFocusedWindow()!.minimize();\n            break;\n    }\n}\n</script>\n\n<style>\ndialog::backdrop {\n    pointer-events: none;\n    backdrop-filter: blur(8px);\n}\n\n.gradient-ball {\n    border-radius: 99999px;\n    background:\n        linear-gradient(197.37deg, #7450db -0.38%, rgba(138, 234, 240, 0) 101.89%),\n        linear-gradient(115.93deg, #3e88f6 4.86%, rgba(62, 180, 246, 0.33) 38.05%, rgba(62, 235, 246, 0) 74.14%),\n        radial-gradient(\n            56.47% 76.87% at 6.92% 7.55%,\n            rgba(62, 136, 246, 0.7) 0%,\n            rgba(62, 158, 246, 0.182) 52.16%,\n            rgba(62, 246, 246, 0) 100%\n        ),\n        linear-gradient(306.53deg, #2ee4e3 19.83%, rgba(46, 228, 227, 0) 97.33%);\n    background-blend-mode: normal, normal, normal, normal, normal, normal;\n    filter: blur(200px);\n}\n\n@keyframes blob {\n    from {\n        filter: hue-rotate(0deg) blur(200px);\n    }\n    to {\n        filter: hue-rotate(45deg) blur(200px);\n    }\n}\n\n.blob-anim {\n    animation: blob 5s linear infinite;\n    animation-direction: alternate-reverse;\n}\n\n.fade-enter-active,\n.fade-leave-active {\n    transition: all 0.2s ease;\n}\n\n.fade-enter-from {\n    opacity: 0;\n}\n\n.fade-leave-to {\n    opacity: 0;\n}\n\n/* Stripes for the top of the window to indicate experimental features enabled */\n.experimental-stripes {\n    background: repeating-linear-gradient(\n        45deg,\n        #ffffff00,\n        #ffffff00 25px,\n        rgb(129 140 248) 25px,\n        rgb(129 140 248) 50px\n    );\n    -webkit-mask-image: -webkit-gradient(linear, left 0%, left bottom, from(rgba(0, 0, 0, 1)), to(rgba(0, 0, 0, 0)));\n}\n\n/* Disable all animations when the setting is enabled */\nbody.disable-animations,\nbody.disable-animations *,\nbody.disable-animations *::before,\nbody.disable-animations *::after {\n    animation: none !important;\n    transition: none !important;\n}\n\n/* Specifically disable Vue transition components */\nbody.disable-animations .fade-enter-active,\nbody.disable-animations .fade-leave-active,\nbody.disable-animations .devices-move,\nbody.disable-animations .devices-enter-active,\nbody.disable-animations .devices-leave-active,\nbody.disable-animations .menu-move,\nbody.disable-animations .menu-enter-active,\nbody.disable-animations .menu-leave-active,\nbody.disable-animations .apps-move,\nbody.disable-animations .apps-enter-active,\nbody.disable-animations .apps-leave-active,\nbody.disable-animations .bounce-enter-active,\nbody.disable-animations .bounce-leave-active,\nbody.disable-animations .bouncedown-enter-active,\nbody.disable-animations .bouncedown-leave-active,\nbody.disable-animations .bounce-in,\nbody.disable-animations .bouncedown-in {\n    transition: none !important;\n    animation: none !important;\n}\n\n/* Disable keyframe animations */\nbody.disable-animations .blob-anim {\n    animation: none !important;\n}\n</style>\n"
  },
  {
    "path": "src/renderer/assets/LICENSE.txt",
    "content": "MIT License\n\nCopyright (c) 2026 TibixDev\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "src/renderer/components/ConfigCard.vue",
    "content": "<template>\n    <x-card\n        class=\"flex flex-row justify-between items-center p-2 py-3 my-0 w-full backdrop-blur-xl backdrop-brightness-150 bg-neutral-800/20\"\n    >\n        <div>\n            <div class=\"flex flex-row gap-2 items-center mb-2\">\n                <Icon class=\"inline-flex text-violet-400 size-8\" :icon=\"props.icon\"></Icon>\n                <h1 class=\"my-0 text-lg font-semibold\">{{ props.title }}</h1>\n            </div>\n            <p class=\"text-neutral-400 text-[0.9rem] !pt-0 !mt-0\">\n                <slot name=\"desc\">{{ props.desc }}</slot>\n            </p>\n        </div>\n        <div class=\"flex flex-row gap-2 justify-center items-center\">\n            <slot v-if=\"props.type === 'custom'\"/>\n            <template v-else-if=\"props.type === 'number'\">\n                <x-button\n                    v-if=\"props.step\"\n                    type=\"button\"\n                    class=\"size-8 !p-0\"\n                    @click=\"() => applyStep(-props.step!)\"\n                >\n                    <Icon icon=\"mdi:minus\" class=\"size-4\"></Icon>\n                    <x-label class=\"sr-only\">Subtract</x-label>\n                </x-button>\n                <x-input\n                    class=\"max-w-16 text-right text-[1.1rem]\"\n                    :min=\"props.min\"\n                    :max=\"props.max\"\n                    :value=\"value\"\n                    v-on:keydown=\"(e: any) => ensureNumericInput(e)\"\n                    @input=\"(e: any) => (value = Number(/^\\d+$/.exec(e.target.value)![0] || props.min))\"\n                    required\n                />\n                <x-button\n                    v-if=\"props.step\"\n                    type=\"button\"\n                    class=\"size-8 !p-0\"\n                    @click=\"() => applyStep(props.step!)\"\n                >\n                    <Icon icon=\"mdi:plus\" class=\"size-4\"></Icon>\n                    <x-label class=\"sr-only\">Add</x-label>\n                </x-button>\n                <p class=\"text-neutral-100\">{{ props.unit }}</p>\n            </template>\n            <template v-else-if=\"props.type === 'dropdown'\">\n                <x-select\n                    class=\"w-20\"\n                    @change=\"(e: any) => (value = e.detail.newValue)\"\n                >\n                    <x-menu>\n                        <x-menuitem v-for=\"(opt, key) in props.options\" :value=\"opt\" :key=\"key\" :toggled=\"value === opt\">\n                            <x-label>{{ opt }}{{ props.unit ?? '' }}</x-label>\n                        </x-menuitem>\n                    </x-menu>\n                </x-select>\n            </template>\n            <template v-else-if=\"props.type === 'switch'\">\n                <x-switch\n                    :toggled=\"value\"\n                    @toggle=\"(_: any) => { $emit('toggle'); (value = !value) }\"\n                    size=\"large\"\n                />\n            </template>\n        </div>\n    </x-card>\n</template>\n\n<script setup lang=\"ts\">\nimport { Icon } from \"@iconify/vue\";\n\ntype PropsType = {\n    /**\n     * The icon displayed in the top-left corner of the card. Only accepts Iconify icon name format.\n     * @example \"fluent:folder-link-32-filled\"\n     */\n    icon: string;\n\n    /**\n     * The title text displayed next to the icon.\n     */\n    title: string;\n\n    /**\n     * The description of the card. It will be displayed as a <p> tag.\n     * In case you need more control over how the description is displayed, use the `desc` slot instead.\n     */\n    desc?: string;\n\n    /**\n     * Specifies the nature of the input value.\n     * - `number`: Shows a numeric input with optional Add/Subtract buttons in case `step` is specified.\n     * - `dropdown`: Shows a dropdown menu with values defined by the `options` prop.\n     * - `switch`: Shows a toggle switch.\n     * - `custom`: Shows the default slot content.\n     */\n    type: \"number\" | \"dropdown\" | \"switch\" | \"custom\";\n    \n    /**\n     * The minimum accepted value in case the `number` type is specified.\n     */\n    min?: number;\n\n    /**\n     * The maximum accepted value in case the `number` type is specified.\n     */\n    max?: number;\n\n    /**\n     * Specifies how much the Add/Subtract buttons change the input value.\n     * Can be omitted, in which case the buttons won't be shown.\n     */\n    step?: number;\n\n    /**\n     * Can be used to append some text after dropdown selections or a number input.\n     */\n    unit?: string;\n\n    /**\n     * Defines dropdown entries in case the `dropdown` type is specified.\n     */\n    options?: any[];\n};\n\nconst props = defineProps<PropsType>();\nconst value = defineModel(\"value\");\n\nfunction ensureNumericInput(e: any) {\n    if (e.metaKey || e.ctrlKey || e.which <= 0 || e.which === 8 || e.key === \"ArrowRight\" || e.key === \"ArrowLeft\") {\n        return;\n    }\n\n    if (!/\\d/.test(e.key)) {\n        e.preventDefault();\n    }\n}\n\nfunction applyStep(step: number) {\n    let tmp = Number.parseInt(value.value as string);\n\n    if (Number.isNaN(tmp)) return;\n\n    tmp += step;\n\n    if(!props.min && !props.max) {\n        value.value = tmp;\n        return;\n    }\n\n    value.value = Math.min(Math.max(props.min ?? Number.MIN_SAFE_INTEGER, tmp), props.max ?? Number.MAX_SAFE_INTEGER);\n}\n</script>"
  },
  {
    "path": "src/renderer/components/WBContextMenu.vue",
    "content": "<!--\n  WBContextMenu - Replacement for broken xel contextmenu component\n  This is a working reimplementation of the xel toolkit's x-contextmenu component\n  which has bugs in the library that prevent proper functionality.\n-->\n<template>\n    <!-- Context menu popup -->\n    <teleport to=\"body\">\n        <div\n            v-if=\"isVisible\"\n            ref=\"menuRef\"\n            class=\"wb-contextmenu-menu\"\n            :style=\"menuStyle\"\n            @click.stop=\"handleMenuClick\"\n        >\n            <slot></slot>\n        </div>\n    </teleport>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, onUnmounted, nextTick } from \"vue\";\n\ninterface Props {\n    trigger?: \"contextmenu\" | \"click\" | \"none\";\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n    trigger: \"contextmenu\",\n});\n\nconst emit = defineEmits<{\n    show: [];\n    hide: [];\n}>();\n\nconst triggerRef = ref<HTMLElement>();\nconst menuRef = ref<HTMLElement>();\n\nconst isVisible = ref(false);\nconst menuPosition = ref({ x: 0, y: 0 });\n\nconst hasTrigger = computed(() => props.trigger !== \"none\");\n\nconst menuStyle = computed(() => ({\n    left: `${menuPosition.value.x}px`,\n    top: `${menuPosition.value.y}px`,\n}));\n\nconst showMenu = (event: MouseEvent) => {\n    if (props.trigger === \"none\") return;\n\n    event.preventDefault();\n    event.stopPropagation();\n\n    // Position the menu slightly offset from the mouse cursor for better UX\n    menuPosition.value.x = event.clientX + 2;\n    menuPosition.value.y = event.clientY + 2;\n\n    isVisible.value = true;\n    emit(\"show\");\n\n    // prevent layout jump\n    adjustPosition();\n    document.addEventListener(\"click\", hideMenu);\n    document.addEventListener(\"contextmenu\", hideMenu);\n    window.addEventListener(\"scroll\", hideMenu);\n    window.addEventListener(\"resize\", hideMenu);\n\n    // Close on next tick to allow menu to render\n    nextTick(() => {\n        adjustPosition();\n    });\n};\n\nconst handleMenuClick = (event: MouseEvent) => {\n    // Close menu when a menu item is clicked\n    // The @click.stop on the menu div prevents this from firing on menu background clicks\n    const target = event.target as HTMLElement;\n    if (target.closest(\".wb-menuitem\")) {\n        hideMenu();\n    }\n};\n\nconst hideMenu = () => {\n    isVisible.value = false;\n    emit(\"hide\");\n\n    document.removeEventListener(\"click\", hideMenu);\n    document.removeEventListener(\"contextmenu\", hideMenu);\n    window.removeEventListener(\"scroll\", hideMenu);\n    window.removeEventListener(\"resize\", hideMenu);\n};\n\nconst adjustPosition = () => {\n    if (!menuRef.value) return;\n\n    const menuRect = menuRef.value.getBoundingClientRect();\n    const viewportWidth = window.innerWidth;\n    const viewportHeight = window.innerHeight;\n\n    // Adjust horizontal position if menu goes off screen\n    if (menuPosition.value.x + menuRect.width > viewportWidth) {\n        menuPosition.value.x = viewportWidth - menuRect.width - 10;\n    }\n\n    // Adjust vertical position if menu goes off screen\n    if (menuPosition.value.y + menuRect.height > viewportHeight) {\n        menuPosition.value.y = viewportHeight - menuRect.height - 10;\n    }\n\n    // Ensure minimum position\n    menuPosition.value.x = Math.max(10, menuPosition.value.x);\n    menuPosition.value.y = Math.max(10, menuPosition.value.y);\n};\n\n// Expose methods for programmatic control\ndefineExpose({\n    show: showMenu,\n    hide: hideMenu,\n});\n\nonUnmounted(() => {\n    hideMenu();\n});\n</script>\n\n<style scoped>\n.wb-contextmenu-trigger {\n    position: absolute;\n    inset: 0;\n    z-index: 1;\n    cursor: context-menu;\n    pointer-events: auto;\n}\n\n.wb-contextmenu-menu {\n    position: fixed;\n    z-index: 9999;\n    background: var(--x-menu-background, #ffffff);\n    border: 1px solid var(--x-menu-border, #e0e0e0);\n    border-radius: var(--x-menu-border-radius, 4px);\n    box-shadow: var(--x-menu-shadow, 0 4px 12px rgba(0, 0, 0, 0.15));\n    padding: var(--x-menu-padding, 4px 0);\n    min-width: 120px;\n    max-width: 300px;\n    pointer-events: auto;\n}\n\n/* Dark theme support */\n@media (prefers-color-scheme: dark) {\n    .wb-contextmenu-menu {\n        background: var(--x-menu-background-dark, #2a2a2a);\n        border-color: var(--x-menu-border-dark, #404040);\n        box-shadow: var(--x-menu-shadow-dark, 0 4px 12px rgba(0, 0, 0, 0.3));\n    }\n}\n\n/* Match xel theming if available */\n:global(.x-theme-material) .wb-contextmenu-menu {\n    background: var(--x-surface-background, #ffffff);\n    border-color: var(--x-outline-color, #e0e0e0);\n    border-radius: var(--x-border-radius, 4px);\n}\n\n:global(.x-theme-material.x-theme-dark) .wb-contextmenu-menu {\n    background: var(--x-surface-background, #1e1e1e);\n    border-color: var(--x-outline-color, #404040);\n}\n</style>\n"
  },
  {
    "path": "src/renderer/components/WBMenuItem.vue",
    "content": "<!--\n  WBMenuItem - Replacement for broken xel menuitem component\n  This is a working reimplementation of the xel toolkit's x-menuitem component\n  which has bugs in the library that prevent proper functionality.\n-->\n<template>\n    <div\n        class=\"wb-menuitem\"\n        :class=\"{ 'wb-menuitem--disabled': disabled }\"\n        @click=\"handleClick\"\n        @mouseenter=\"isHovered = true\"\n        @mouseleave=\"isHovered = false\"\n    >\n        <slot></slot>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from \"vue\";\n\ninterface Props {\n    disabled?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n    disabled: false,\n});\n\nconst emit = defineEmits<{\n    click: [event: MouseEvent];\n}>();\n\nconst isHovered = ref(false);\n\nconst handleClick = (event: MouseEvent) => {\n    if (props.disabled) return;\n\n    emit(\"click\", event);\n};\n</script>\n\n<style scoped>\n.wb-menuitem {\n    padding: var(--x-menuitem-padding, 8px 16px);\n    cursor: pointer;\n    user-select: none;\n    display: flex;\n    align-items: center;\n    gap: 8px;\n    transition: background-color 0.15s ease;\n    font-size: var(--x-menuitem-font-size, 14px);\n    line-height: 1.4;\n}\n\n.wb-menuitem:hover:not(.wb-menuitem--disabled) {\n    background-color: var(--x-menuitem-hover-background, #f0f0f0);\n}\n\n.wb-menuitem--disabled {\n    cursor: not-allowed;\n    opacity: 0.5;\n}\n\n/* Dark theme support */\n@media (prefers-color-scheme: dark) {\n    .wb-menuitem:hover:not(.wb-menuitem--disabled) {\n        background-color: var(--x-menuitem-hover-background-dark, #404040);\n    }\n}\n\n/* Match xel theming if available */\n:global(.x-theme-material) .wb-menuitem:hover:not(.wb-menuitem--disabled) {\n    background-color: var(--x-surface-variant-background, #f5f5f5);\n}\n\n:global(.x-theme-material.x-theme-dark) .wb-menuitem:hover:not(.wb-menuitem--disabled) {\n    background-color: var(--x-surface-variant-background, #2a2a2a);\n}\n</style>\n"
  },
  {
    "path": "src/renderer/data/appicons.ts",
    "content": "import { InternalApps } from \"../data/internalapps\";\n\nexport const DEFAULT_ICON = \"DEFAULT_ICON\";\n\nexport const AppIcons = {\n    [InternalApps.WINDOWS_DESKTOP]:\n        \"iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFLUlEQVR4nO2WWVMcVRzF+RSZXpgFvw1lWT7mxaoExBgFJHswJIZFxCSCGCPikkVJTIxiojGLWwwxMXH5ArIMAzMBDDAwwLAF61i3+97uf9/uBrofFKrmVp2qefydU797e4qKCqdwCqdwNuSJbHvydGT7ckbZ/gSOPL8M9YUlqC8uQX1pEWrlAtTqBag189B2z0Pbm4e2fw7awTlotbPQDs1Cq5uBdmQG+msz0Otz0Bty0BunoTdNQ2+ehv7GFPSWKehv8hzLQj+eRfEJI2n9xGRpiALLaQd4GYffsQR15yLUlxehVi1AfWUe2q55aHvy0PbloR1g4HMcfNYEP0rAGfTrDJxAHyPAb2VR3Dpppm0SxW+zTAwHLuCCr+Dwa63+KgEXizfm3Gs7oCedwO0TKH6H56SZ8AXKlxEpn0Vk2wgiZY8QqcggsiMDtXpKWp3rclhShYLztR1LtxkL29AM+N1xM6d43hsPWaDc9J3BT839A3GycytQKoddq+uGLmuBeyx9kkNzWCMdjxF9307wAhye+R4py0A+StWQ7TpdvZE7LoOLtf2gOwhw52NEP2D5G9EPzQQuIODZZY1UpN0FalLkkkqrt3gsLoMb0OMSNAf+iOdjljFET4+FKMDgKxeNyxrZmTa0cSi0O+W8pHT149xx4bcAl9fulKAZ8GkTOHqG5yzLaIgCHJ49kWpNFkrVMJTqISi7UlD2sPXH/Vdv5Y77gTM9ZOgzAngU0XNmYp+MIvYpy0iIAhzeeGnEZRW+U2UcqxNdHKp4gZOlz7qBY10jiJ3nuRCigANeXFbhu6SMa3VxOYXjnRK4UOMcgZaAY589MnPRTPACBF49OAFlbwrq/kGotYNQDyWhNY3Zynis7nDcF3zEBr9AgC+xZBD7nOdyJkQBsjyDn8qTS5xfgXq0376oAv4U1YVfTqEKBe+Slr7IoQlw/IsM4l+mzXSnQxQg2qgHkq5nVKvvdSrDVu+QdBGO08Vd4Bk3dHca8a94rgwbCV5AOF+fg1o74C7Q1OuEp5fU0sUHXKx92QOaA8evDiP+tZ3gBawLOw21LmloQxXSWnqt59FSRl5dXE66uBf4FQn6G5YhxK/ZCVzAem2ap40Lq9b3Q2vohdb0lwGvt2dM3+lF5a47VyeqUHCx9lUP6G95rtsJXkA8lS38jTeeSemyCt/Zx4gq0+Why2rg1wg4A74xhMSNFBI37QQv4IKf9IH3UkbShapigUvQ1yXoWykkvrMTvAD7SB3jX9f1wp93uu7QRV6crn3TA/r7QSR+sBO8gAGftZ/KVeG570IZw3VpdQncWvsWAafQPw4i8ZNIMngB6wsrnsp1wRNlhOuyLmJxCzplg1Po20kkfrYTvACFZ0+lF7y4rMJ3L2X8VvcCv02g7ySR6DFT0jMQokC79JHyWl6G91PGtboP+B0buOTuAEp+sRO8AL+01kdKPJUe8HEKT5Whq68H/C6Bvsdzn6U/RAEG3yF9pKjzq8ELZeTV1wK/J6D7UfIrzwMzwQuIS2t9YaWnUtbGD96x+irg9wdc0CUPRfqCF3BcWvH3gL42fvDCd6qMtLon+AMJ+rc+O7+HKUC8t/4e0Hd+PfBUGXl1T/A+BzTLU3+YCV6AqeP1XFrv/Drhxeo9dHWiysN+H+heM3+aCVxAebYZGylFYQpEnmnAltI6I+z3piuwpbQO2Zk8srm88XtzFsht1gJb21Y2ikLqc60rgQto+7qPKFtbV/7P1RUOX9x86XDgAoVTOIVTOEX/xfkXW1DiieUqJZgAAAAASUVORK5CYII=\",\n    [InternalApps.WINDOWS_EXPLORER]:\n        \"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAgsklEQVR42u2de7QcRZ3Hfz03D5OgPOIeZCEhD3JveG4CESUg4qKurxXCIz5ASEQ3keCu/LO6654jnKOreNwV5eUDTUBeCbCA67quq0dWBZRViYBIEh4B3KOeIxoRUCB3eru6u7qrqqu6q6dnbtdMfT8n996Z7p5Oz/yqPvWrqu6eIAxDAgD4SQABAOAvEAAAHgMBAOAxEAAAHgMBAOAxEAAAHgMBAOAxEAAAHgMBAOAxEAAAHgMBAOAxEAAAHgMBAOAxEAAAHgMBAOAxEAAAHgMBAOAxEAAAHgMBAOAxEAAAHgMBAOAxEAAAHgMBAOAxEAAAHgMBAOAxEAAAHgMBAOAxEAAAHgMBAOAxEAAAHgMBAOAxEAAAHgMBAOAxjQUQBIFx3c6NtFf05+To56To54ToZ6+23/AQsSv62Rr93Bb93LpgLe1s+4CAezSuv4MSQFT5L4j+/B2h0veLW6Ofz0QiuL3tAwHu4JwAooq/IPpzS/SzrN2PZmS5PfpZi4wAMJwSQFT5WaX/DqHVHzSse3B+JIFNbR8IaBdnBJC2/PcQKv9UshYS8BuXBMAqP9L+qQcS8BgnBJAO+H2k7Q/DYyABT2ldAI9tCljK/ygh9W8bSMBDXBDAmujPxrY/CBADCXiGCwJgU34nt/1BgAxIwCNcEMDvCOm/a0ACnuCCAHAxgZtcHEng/LYPAgwWCACUsSmSwNq2DwIMDggAVAEJjDAQALABEhhRIABgCyQwgkAAoA6QwIjRvgA2QgDDRBSsTQvfDQmMCq0LYOeXIYAhZNPCcyCBUaB1ATz6JQhgmOhMn0P7veqTNGPPRW0fCjDD7vdwO6W3gwvmvnGXacPWBfDIlRDAsMAq/58fH1X+l8wneupuot1PtX1IQGT6Psnfzqzk8Yx9oxo6jVX+z0QSuED3ktYF8PAXIYBhgFX+/V/NKv88VP5hYub+RLOXMCmwG8SuikSwU1zdvgC+AAG4TmdG0vLP3BOVfygJphPNOZjJgGUDr4kksJWval0AD30eAnAZVvlZy4/KPwKwbGCPI5gElvNMoHUB7PgcBOAqrPIfcMJFUeVnff4fRpX/D20fEmhKIoGtkQCWs6etC2D7FRCAi4xllR8t/8ixxxFMBBcGL33TBe0L4HIIwDXYgN+8v0TlH1nYmMCeK3fR2OyFVDJFaLWrpgLYdhkE4BIs7Z+Pyj/6JF2BtZEANjXZTWMBPHgpBOAKY7zy7zUv7fOj8o80e594K/3Zyaua7KKxAH5+CQTgAnHlP/EiehEqvz/MOWwX7b9u7ya7aC6Az0IAbcPS/gNfi8rvHTMPIDrwg0GTXTQWwAOfgQDahFX+Ba9D5feS6XOJFl7QrgB+djEE0BYs7V/w+k+g8vtKLIAL2xXA/Z+GANqAVf6FrPLvjcrvNeOXtiyAf4UAphqW9i/6K1R+QO0L4L5/gQCmkpfMP4YOOO58Gps+A5UftC+Aez8FAUwFe7zscNp3+Rk0J/pLLzxJ9PRPibp/bPuwQNuMXwYBjBKsbz9rn+RuPdP32JdmzV0UtfqvpBnR47jCP7ud6LlftH2YwBXaFgA9+XUIYJCwFJ+1+M//OvkLgMhE2wLYtgECAKAt2hfAuRAAAG0xcTkEAIC3QAAAeEz7AngfBABAW0xcAQEA4C0QAAAeAwEA4DHtC2A9BABAW0x8DgIAwFsgAAA8pnUBPAgBANAaS1sXwDoIAIC2WPp5CAAAb4EAAPCY9gXwNxAAAG2x9AsQAADeAgEA4DEQAAAe074A3gsBANAWS78IAQDgLRAAAB4DAQDgMe0L4D0QAABtsfTKlgXwcwgAgNY4GAIAwF/aF8A5EAAAbXHwlyAAALwFAgDAYyAAADymfQG8GwIAoC0O/jIE4BpNP1KgJ2hU1EcUCKAZqKx+M/RSgQDqgQoPyhg6IbQvgLXOVylUetALQyGDgzdCABJh/G8A+3TrbYKUwLS4/7U3KPn/WqN1ATzghgAG0co3/myAEwQDaMqdyQ4OaV0Aa1qrJf2qn/l+7HcINUwBpg85sFpUQrJ1Pypx6yI4ZJN/AmhyyLbvV3JC1UdssUsIox610u2wakf2u2qSLbQiA58EUPdQbd5bWLYg0K9DZXaToPCgxmvKtqlZs6dUBD4IoM4h9lTpG/6ftv8v6B91KqXtpv2WwZSIoH0BnD3Qkm97eGXvo2oXNv+HlVjggCnBpmLZVNSqTYLS19rVu4FL4JCrRlMAg674ZfvX7dP+eAbxaQBGncqk27as0gaG7h6zQGB8jQPZwCgKoEnlD43b1thHqRx0/1NAZbqBFHqjl0pTq5KXbB+oITUMJrYugVETQPXhhIVtCnUy0O0r1O5ft43pOKzFVHpwIMZUbENlg6D6JYVdB1XLAuO2QWDYxkoG1UfZdwm0L4Cz+laye+mLh9kvyhrisOQ11RU7NG9XeCCuQwWfSgLzKYDaNTatf1EGhvUl3YN+jD3U4pCrR0MAVYdRWfGVfRS2N7b8hsxAeRD2OcVHt6BI3YoRGB1QTBuCitfWkUE/RNA3CYyCAGpXfiUds634ZZW+qsL30iXA1GB/qNuv1y1XpRAYtw2k5/Lj8oygSiq2x16L1gXws3c12kFPLb/h9XxbMTuQMgVl/CAs7CckZXN528Jz/cGHxiegNjZn8gVKh0BtkQv7UCq5vCv9NgYRFEWjHtqAJXDoV4ZXAE0qv7bih/rXF4Sg2b8+U6juSpiOr+l7941aU3yW+ylL640VWlrPR//0MjCJYEolMKwCqDMPX1Xxi8uTV4UllV5X4Uu7DxbHafPeQO+Y032lope8TldpS2UQiFIIrPepP476XZlKhlEAdVr+Oq2+uizU7S+03FfZMRnPKaj/8fk+TtDLxTc2/X5dq65uZysDVQC9ZgMjKoAz+yqAXiq/ui6UXqPftqrSm7sV5cds+z6BPbYtv7qtjRDUClwUQZL+l2UBrUrg0GuGSwBNKn9ZSy7198ksCVOWUPYa7fGZsoBmnyaoIDAsLKtkpRWV9OtMrzFlA61JYFQE0KTlFyt/3Ypvu7352Hq/bgDUIzDUfuNIfGBfYe1EoM8G+imBkRaA7fn4YWH7ZEDPJINQ2EZ8XdwdUJcJXQJ1u2eDufTLzjL6TWeCngrmxc/B8LNn+ATNCp+kl3a30X7drTQ7ehxXZKECZ5WXipW6WNFzaYhiUF9XPd3YBwm0L4AzrHZQN/Uv9OtLW/3kkbiNrsWXpCHs5/HOSnpk2mvp91Glf/q5Lv3yD7vp6eejv0+9kB0DWwaGh/1ePC17vM/sMZo7e1q8bI+ZnVgIi3Z/i+Z379RLQDivQFqmyQ7KsgHtoKFwjH3pChx67XALwLbfr1Zavr1Y+bUtP2mWhXnF3zbtrbSruw/t+M3z0c9z9OSzk80+D+A0cyMZLHnpzOhnBu3V+S1N7P6qVgS6roG8TbkETF0JcZ/iepWREkCvrb+uf27q75sqv67iP0Nz6Z7pa+mX4Tj97NfP0f2/+hM9P4mOu0/MGAvosJe9iA7ddybtF2yn5S9spDn0pNLSF7OBUgkESRfCOM6gOatxBATwzp4FYNP6a/v1mm2kTICK65LlYdTHX05bo8r/0O+m03cffQYV33OYCI5fOIcO2vsFWhZJYL/uPdQpyQaMmUJQXJ9vp5k6FI6hkQQOvc5xAYSknxoLhQE5cbFF5ef7lCo/F4Ow77zyJ48fH1tJd3fW0g8efzZO+QHgsC7BK+fPpqO7G2n+5J15688rejqloA78SVmCRgLZ8rIswHANc8k4YU7rAri/XAB1Wv+qfr+4nSyIvOVXX8ued6O/T7DKP7aWvv7gH9DPB1rY+MCblr6Yjp7cSPMiCXRUCSiZQGHgUBkP0HUF+j4WcNiQC8Cm9VcH/eRKLld+8XXdbiINNrV357QNqPygEi6Blbsvi6cMVQkweItfJoG6swJDLIB31BZAr62/rt8vrlPFwFp+NuD37ekfodu2TaLyAyuYBE6aGKMTX7gwHhgUJcDodPSZQNl4QK8DgtUCuN5dAQyq9Rcrf74uLKT97O9dMz9Itzx+APr8oBZsTGDV/F/QMc9dFFdMXXfANChY1hXo+4zAKAjAtvXXyUFX+eP0P/r1xNix9NVnz6JvPfR0s/cIvOS1B+1Bb519Nc2bvCOeGZAHBuV036YrMJBuwLAJwJz+qyfzlLXw+srPtuQtP+v/f2PGJ2nTfdMx1Qd6gk0Rrjn8BXrD838fp/281c+6AIF+PKB4/kCzLMBxAbxdP8vX4+h/Wd8/HtQryQx4y8+2Y63/Vb89k37yf39s9v6A1xy5/yw6e59rkiygEwiZgDkLqBoLqJsFlAvghuEUQFX6X9X3Ny1PBED07RkX0JX374nWHzSCZQHvOez3dOLzF0QCoFQAdhLQjQVUDQbW7gYMkwBsWn++TDfyzyp2mJ4FJAqAL+dTf8+Ec+myZz4Wn/ADQFPYCUIb5nyY5gRPJl0BorRLoO/vM1FIaT/ZdwOGUABv66sAqlL88tY/EcAj015Pn3j4LZj2A32BTQt+aPHXaNHub6bdAHkwkFV4hpwFiGcRVncDhJOFtZXdLIDNwyeAfqf//IQf9pdlA//TOY8ueWBxs/cFgMD7D3mYXt29NOkG1BgLqOoGNB4IdFEAvfT/q9J/PsCnTveprT/7ufJPH6f/emxWs/cFgMCb5/+G1sz6aFL5lSwg6w6wDdPrBsq6Ab2MA7grgPsGKwCpopNBAJS0/JOpAC78/RXxZb4A9As2G/ChOeviyj7WSSs4aVp7QQAMXXaQLO/TOMDhrQtgtZUAeh0ArBJAV+gGsCxgcjKkD/zqMtzBB/QVdjehi1+2Iav8vNXvaPv85d0Don4KYMtwC8D27D9RDPx8AFEKbBnLAJgAzv/15RAA6CtMAJ/e91waG+MZwOAEQFSjGzBqAiib/itL/5MMAAIAgyETQFr5mQjUys6nCEknhnQ/phOG0pdljKwA1AuAygTA15kFwDOCPANgf9/+0GebvScANFy/+G+lDKBsHECcJeBTe2XXDSRb5QyRAE5vLIB+DACKXYB3PHxJs/cEgIbrF7+/pAtQbyBQNxPQmwBuHE4B9GsGgA8C8tYfAgCDgguAzwRUCaDqPAGiPkwF+iyAfAYgvwgIAgCDggmA9/+bCoCo/kzAEAtAd5/+fHnhdGBSKr8ghWwGQNiGTwFCAGCQXLf4vLjix1lAUNENINO9A4qnBYun/+YCEJ+JyxTaF8Bp0g4GdhJQyK/1L94LoJgBXNrsPQGgIROAOAgY8LMC28oAbnJfAH05CUgVgHQOgDwLAAGAQaAXQF7ZxVOCqy4ZJoIAsnW2JwFBAKBNqgQgngvgkQBOrS8AoQ8vXtvPv9Cjyx8r6X5BAFwMaRcgF8Blzd4TABquW7RBPg8gKFb0+G5hfFyANF2DQPgSkVQe2feCiCcMab4sRDMsEAng5pYFcG8PAiDDSUDpk67aJTBdCUiKACZTATwCAYD+EwtAGgTMK3TZiUADzQCOGCUB8DP/NN0DCAC0DQSgY0ACENfJlV8ngPxKQAgADApVAHKfv0wARVEQ5esaTQO2L4BTBiSA/LXdsNjvL88ALm/2ngDQcN2ic6VBQDsBFG8N1usVgXoB/BsEAAGAqaBfAiCSMwP+PP4r/H9W3QAIAAIAUwMEoGOgAuD3AlAuAVauDyiOAbgpgI0HrI//Bo1CNrrwYrL2F59r+1C05AKg7JuC5EuCbQYB2Z7k8QHdGED8eDgEsKqPAki2EDMAfsdf+wyAnBXApnnrpOcBVcduFGRhU8RC4ULxNU98vu1D1nLdovc5mAHcAgEMkwACwfYipooeWBigTUlUFR9T+dKXk0QEEED62DsBpE9GVQBXzVuvvRY8eSxvKz9XcoXiSWLG/fQb48Ve2S/hubDAVOGTv3I5OPsJV7sAEECRe0/uswDyeX9GbwK4otl7GhBXz1+XFRxGHvQ8+vI8MH+sF0VQeGDXrWhCWKzlhbs85Y9Dw3J5X1Kso8dnPe5qBrC+oQDUKcB+CODWIReAcC1AVhC4ALgMyCAA7bUA7grgKweuE64YK36ZROGc8ECu0FIhUR4XKr6mQPVCaHjCv6MxWxzKsVW3k7YJ5eXqgO67HhsCAbCK3akQAFuuWU9EkhT4dQHxcuH/Gw4B/LSlDIA0AphMug+uCuCaA9cr15CrZ4QpIiBSCky6ffZLzAL0bX/TLoE2nsIKXeuvv9U7f2352Z8slmc+5mgXYOF6/ZmAykk+U5oB/MXICSCsmAYUBSDfECQRAJsGdLMAcQHw88il6SCSn8fPSk8VVQqO1GXIHhmPRV1jLgVymp4tlSp2qLT6xfgSiUIIpaxPvOBrtAWgGwNIojHEAjipgQDy9fUygDxlzM8DYAIgpwVw7YJ1+stISS0UuszAXOmlMQLN/9trFmBs/bP1xQouLSdDnIVsQOrKpbE8Y6ejXYBYANTHDEA3HpRjJ4DbIICCAB52swtw7cL1mQDEsQCGqfKLLb6u4ssFRnxc0vqXFBnjKL9pQI+KWYDU+pOdBMT7Op7xqJsCT2YBIAAZCMAakwDUqUFTt0Bt8cVxApsLR2wzAbMExMe6G73q+/dlEhDjyG/oAgHwZSMvgF7GAMQpQMMg4MNungdw7cL35d8sG/C7x4ijxEKBSV9TvI98MWtI1xjGAfja9FcoLCgJvbqqOI2nGegrZAF6CYjy6ApxnezyDMBNgWfnAdQSgBzT/o8BtC6AtzqXAbz9ITcFkJxLTpVfK8UIlJZfbPXVbIGjziRky3s83qIEigOCBZEL26rxyrcvZgHifR3f6egszvWLzxUEQIoA5HhNXQbwVQhgWATAChBP/6u+X16X9ovzyUT1BgPrDgSap//kyiz/DSslAAHk8YAABiYAN+8IdP3iDZIA1ELC6GhSxKrKr547IK5X4SmnEB2+phArOYbKKzStuhpLNWbJy5LKLm7Lp/8SAVAkAHfjBwGo/PSvp0gA5sEj6XJgJoAdjmYAB52bfq9cva+UYogCUAsRX8+XiVjfW84iduI2ogTU0X9xm7K4qfd8ZJWfxfCdjo7hsPjZCaD8y0LE2DUXwL9DAEUBONqCHLQhGwSs/51ymspvOGsweRwUlvWCOvIvLquSQC8CiO/n4GoGd5BtBgABkLxsigWw3dECtKQogE5HTvl5F0C6aIj0hUl/yrC54jeZBhRjJT1Pf8kVO42V8NpuN39dIb6qAFwV+BIIoMjWBgJIH0jTgOL9AIQpwfhpt0wA+RjA23a4+c1AN2QZgPjFkmJLb9H6i4WJKJdARUbQBF1lVy/wybIARQCmQb9sCleIIT8PwNUxnBsOOk8+D0DM5Hjs+BQvaQSgxKhUAHxbEWWcJ2ZZ6wJ4S38zAMpbhewx1csA3uZoC3KD2AXoBMVbR1sIoGxKkEiu9NosoOIYdaWheA6A5dRfWB274iCgywJQMwD914MZM4AgkOTclwxg2dcggIIAtjuaASw5T/peOXsB6O8xT6SfGSg8lh7Zx1vd0jTtx7dVT/O1iZ1WAK5mcEvOgwAKOCmAS5q9pwFxw5L3ZwIY62gqNunOLtOP/Kutv3Xl16WWWWzCQq0Xn6qZgJoFaL/pOV3X7ZoFIJ4FmAjA7fhBACKNBaAZA+jm6/JTgUUByP3LfAwgEYHbAqBUAPp54qxASXP/8na8CkvPlYKULCXpSaBfI0Yq/x2qS/O45X+LsdP3+Ysj/up2PH5MBG4LQLwWwEYAmsFbJa5i3IZQAG92LwPY5mgBGjdnAFXfJWeb/tsWJBvKv9Zdjh3fxnYcQJUAj1+cAbgq8PG6GUB17JpnAP8x7AIoywDqCECYBXBcAGNjpGlBxAJTTwClrX9Jyl+F2iXQSaBXAeSXAXMBJPEbDgFQjQxAMwtAoySAe97YcBpQkwHwQhXmt4oqTgMK6aNyNeBqRwWweSIqQIE6jVSe7usuCjL1/+VClPT5e2395dgl+9IKIH2Qx0SMl9rfL8aPyz7vArg7iLt5/Dz5akBd/Pj0LqmVX70HZNU0oEbbumnA5f/ZtgDe0OcMoHkXYPU2N6eRNo/bTyNVZQDVAsjX61AXm4pBdTdAL+UkdiXnAxQyABIE4Hr8yjIA8fyOqkHAPowBLP9G2wJ4fX0BCK2FdBZZuk5/V+C0RdEUKH4nGT6SvNrpAkTybaWl1j4tJNpugSIGSn61LgCxxac8JoXsTZcFCLHmMwAshm4LoCR+qgDKLvcW1ssnc5XHriiAb7YsgJ+8brAZgDr6r6aaaUHLzyQjhzOAc+PWPytARNnNQXTTftlNQ0gjgAYZgKlXUCd2+V81A5CnB7Vf7Cpsx2d5MgFMsgzAzYuB4vjxDM4YPz6Va+6+5fHsQwZw5H+3LYATG2YAQoFI10kZAGkKUGjKAFIBbHfzevLN45pbShlakEwAcZTyvmbWf0yX6/qWHGPrn/0Sg1Q4BcA+fvw5XyeO9pM+ZuUZgOPx02UASoUvG9shvozkmPaUARz57ZYF8OPXWAqgOJBkngbMC11XV+kNZ5Lxc8lXb3fznnJbxtdn5wDYnAnI+5GMsouDiHQDgOaWvk4GUBY/MY7qxT9idlYnfnEGsMPN+G1esl7I4MrjJ39hiCJq0ncJ5PiFdgI46jttC+AECwFkjwxjAEIBEgpNngGUZwFZAWJ/J5kA3Lyt9JbxddThBcim9RdaBr6tNIJMZOhDmgWgbf3z8FRcCyDHr3Dhj7qsTvykQUA347c5it+YTuAdKrT2ncDUreMx6DF+BQHc3rIAfnR8DQHkbYicAeStAqOYAeinkPQZANHpjhagG5kAshRSc/IPUY0MoKoFsSxAJbEqLqufAWizgJL4sXMBVu9wM35bYgHYxa8sAwjS2q6PXx4gq/it+G7bAjiuPwJIJcAzAGl0WS1EpLQyyizA6du+2Ow9DYgbJ96b3xGok14yahpEUmcGArG1UFuTBgWoJFZV8SMpFnn8shh11fgVBwHZzA7LEnj8JuMMzs34bRl/b9oFMMevkz5IBgENcueXBJfET5epabO3Fd9vWQD/e2z9LgBVZwC60WX5nADzLMDpjhagG9MClN0XUJP6dzSthX4AqTwDqNv/L4tfvrwkAzDdFUgRdi4Cffwm40FcN+MXC0AYBOwlfrYZgLW8X35H2wI4pk8ZgLzclCqG6jbZLEBeiE7f/qVm72lA3Dh+jnI5sNrvZ2eQGU786YiFRzP6b9GCEFULQDsOICwzZwBC/KhYyfNZgdAYPz4IuHqHm/HbsuQcZRBQzthIjF8WL/U8D3nqr3EG8PK7WhbA3a/4XfR7L/60VgpJcmXX3lqqMGJcbF26XfHLQchtAYzlXw6qGwSUryJTZwaE9JGodgtSttwUL3VZ0/iJU3/qICCL4242BuBo/LbEAqesG5Bfvm2IlSF+UibXLAPYRUf/cO8m76kPAjj6luj3yfxprUEkcTaAhP6h7hLgdHlX6GeK/crJoRDAu7NzAMSrAY2XjmoLkNKCmLoA+ROJZhmAuQsgxa9UAOrgIGUnBLEMYHc8jfvltkNliN852SCuFD/jmZu9xK9WBnArHX33qibvqbkAfrhiTfR7I3/aawaQrNPNGZuXifcKEAeRTt+xkVzkxiVrpUGkbOBIM42knxnIlxHVb0HKlpvipS5D/IJMArK8Bx8/zbK19IofbWrynhoLgL2h8AdHZt0A7e4s+pB8nZou6gtQfiEJI59GSgrQadvdLEA3TazNWo+sC0AknPsfWBQguZD0XQC6DIBsBVAvfjzTG5r4jYsCr5rG7X/8lAxgV/DKn+zduP72RQB3LftA9PDT7Hn5KHKvLYhuCtA8DXjq9qsavadBcdP42YIATLeO1o8aD3cGYB8/1g04bUTiJ1/H0fcM4PzgmK0XOyEARnjXEfdEf5bFj0sLUPLbXIDkQsTQzyGbZgGITt3mZgG6eeJs6ctBtbMAwhSR9kKggEoKkFy4irGyO87m8ctjyBC/7Vnu++cxjW/mEo8BEJ3maPxuSuPHLwlOum/Jh9qRZmkC5bleEqSsT15pjpWwbGtwzL3Lk8/fFQHcefiC6A+TwF42LQhfJp8LUCw8Nq2IPI0UCWD71Y3e06C4efysuODkXxGuuxy42PozOulVQboCJBaW2vPIGprGj8g+C+DndmSDgFH8Thux+OUxKo+fqICS+O2KfpYHK+/bmXzujgggPpg7D1sW7e87JEwLZuukFiR5pCtA2WNlqk9tMdSpQXEQ6dTtX2n0ngbFzePvks8kK/QNTelkvjz+zElXgGq1IKVUZwDJo/L4laT95Fv8gkJF18VPDI8hflHlD14TrLx/ax4XhwQQH9AdhyyI9smmBpdJy6WZgPzgKwsQyYVFO7BE6d2A0oGkU7Zd0+g9DYqbJ86kaekAEitIhQpOSoHSFKr4Mye1AMmVn2gAAsh+yfGT4iW8vpf45QK4tu1Qabl54oxsDIDHTzwHII+HXfxM6b96WXDK1mi7VcGxD+yUY+WYADjd7y9lA4MfIT47kP0y9yNtChB/01IaqbQgp2xztwBNM7UgpLTyJa2KuJ4/lloQfQHqswAsxwHU9WFJ/KL0n50HcKrD8WMCmDami59cyfkYQPK5N4ofS/kv7Bz34MX6WDkqAE73exNrosM8KfpfToiinsuAii0IX1eo8BXTS9IYQPR3laMF6JbxM7I+5Jh4/3/taL+hVck+99otSCMBiMtt4sfg07R14sfGAE5xNAPoJX5qRbcZAIwe7Ioe3x49uK3zqm2bymPluADaYMXH72r2pgbEj/7hGPc+LAdB/OyBADSs+Pidjhagle59WA6C+NkDAWhAARpuED97IAANK/75DjcL0D8e696H5SCInz0QgAYUoOEG8bMHAtCw4mPfd7MAffg49z4sB0H87IEANBzlaAH6sYMFyEUQP3sgAA1Hfex7jhagV7n3YTkI4mcPBKDhqI9+180C9E/Hu/dhOQjiZ0/rAgAADC8QAAAeAwEA4DEQAAAeAwEA4DEQAAAeAwEA4DEQAAAeAwEA4DEQAAAeAwEA4DEQAAAeAwEA4DEQAAAeAwEA4DEQAAAeAwEA4DEQAAAeAwEA4DEQAAAeAwEA4DEQAAAeAwEA4DEQAAAeAwEA4DEQAAAeAwEA4DEQAAAeAwEA4DEQAAAeAwEA4DEQAAAeAwEA4DEQAAAeAwEA4DH/D5oMWA4prblPAAAAAElFTkSuQmCC\",\n    [InternalApps.NOVNC_BROWSER]:\n        \"AAABAAEAQEAAAAEAIAAoQgAAFgAAACgAAABAAAAAgAAAAAEAIAAAAAAAAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODg4zDExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/ODg4/0FBQf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSc8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MjIy/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9GRkYhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAQxMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/OTk5/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSYkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJiQAAAAAAAAAAAAAAAAAAAAAyMjL+MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/QEBA/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9LS0siAAAAAAAAAAAxMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/QEBA/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/wAAAAAAAAAAMTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf8AAAAAAAAAADExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJzjo6OowxMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/QkJC/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf80NDT7MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/MjIy/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/z8/P/9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf9ISEj/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zQ0NP9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/NjY2/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTMz/wD///8A////ANDQ/wAAAP8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/wD///8A////AAAA/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/HWpq/wD///8A////AAAA/zExMf8xMzP/APr6/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAP9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/wbj4/8A////AP///wD///8ACAj/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8A////AP///wAAAP8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/KUtL/wD///8A////AP///wAAAP8xMTH/AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAD/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/wH39/8A////AP///wD///8A////AP///wAAAP8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/AP///wD///8AAAD/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/wD///8A////AP///wD///8AAAD/MTEx/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8A////AP///wD///8A+/v/AP///wD///8AAAD/JCQk/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/wD///8A////AAAA/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/wD8/P8A////AP///wD///8A////AAAA/zExMf8A////AP///wAAAP8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/0lJSf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8ffHz/AP///wD///8JExP/MTEx/wD///8A////AP///wAAAP8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8A////AP///wAAAP8xMTH/MTEx/zExMf8xMTH/MTEx/wD///8A////AP///wK1tf8A////AP///wAAAP8xMTH/AP///wD///8AAAD/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf9ERET/SUlJ/0lJSf9JSUn/SUlJ/0lJSf9JSUn/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/AP///wD///8A////MTEx/zExMf8A////AP///wD///8Ac3P/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/AP///wD///8AAAD/MTEx/zExMf8xMTH/MTEx/w+env8A////AP///wDd3f8xMTH/AP///wD///8AAAD/MTEx/wD///8A////AAAA/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/0lJSf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/AP///wD///8A////AJSU/zExMf8xMTH/MTEx/wD///8A////AP///wAAAP8xMTH/MTEx/zExMf8xMTH/MTEx/wD///8A////AAAA/zExMf8xMTH/MTEx/wD///8A////AP///wD///8xMTH/MTEx/wD///8A////AAAA/zExMf8A////AP///wAAAP8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8yMjL/SUlJ/0lJSf9JSUn/SUlJ/0lJSf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/wD///8A////AP///yAgIP8xMTH/MTEx/zExMf8akpL/AP///wD///8AAAD/CQkJ/zExMf8xMTH/MTEx/zExMf8A////AP///wAAAP8xMTH/MTEx/y84OP8A////AP///wD///8sLy//MTEx/zExMf8A////AP///wAAAP8xMTH/AP///wD///8AAAD/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/0lJSf9JSUn/SUlJ/0lJSf9JSUn/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/wbj4/8A////AP///yoqKv8xMTH/MTEx/zExMf8xMTH/MTEx/wD///8A////AP///wAICP8xMTH/MTEx/zExMf8xMTH/AP///wD///8AAAD/MTEx/wD8/P8A////AP///wD///8xMTH/MTEx/zExMf8xMTH/AP///wD///8AAAD/MTEx/wD///8A////AAAA/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf9JSUn/SUlJ/0lJSf9JSUn/SUlJ/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/y4+Pv8A////AP///wD///8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8B+vr/AP///wD///8A7u7/Kysr/zExMf8xMTH/MTEx/wD///8A////AAAA/zExMf8A////AP///wD///8IeHj/MTEx/zExMf8xMTH/MTEx/wD///8A////AAAA/zExMf8A////AP///wAAAP8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/PDw8/0lJSf9JSUn/SUlJ/0lJSf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8A////AP///wD///8LEhL/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/wfi4v8A////AP///wAAAP8kJCT/MTEx/zExMf8A////AP///wCPj/8A////AP///wD///8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8A////AP///wAAAP8xMTH/AP///wD///8AAAD/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf9ISEj/SUlJ/0lJSf9JSUn/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/AP///wD///8AyMj/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMjL/AP///wD///8ARUX/AAAA/zExMf8xMTH/AP///wD///8A////AP///wD///8A9/f/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/AP///wD///8AAAD/MTEx/wD///8A////AAAA/y8vL/8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/NjY2/0lJSf9JSUn/SUlJ/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/AP///wD///8A////MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/wD///8A////AP///wBzc/8xMTH/MTEx/wD///8A////AP///wD///8sLy//MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/wD///8A////AAAA/zExMf8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAP8xMTH/MTEx/zExMf9JSUn/SUlJ/0lJSf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/FqGh/wD///8A////AP///zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8bi4v/AP///wD///8A////EhIS/zExMf8A////AP///wD///8A////MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8A////AP///wAAAP8xMTH/AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAD/MTEx/zExMf8xMTH/SUlJ/0lJSf9JSUn/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/wD///8A////AP7+/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/yddXf8A////AP///zExMf8xMTH/AP///wD///8bi4v/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/AP///wD///8xMTH/MTEx/zExMf8qTEz/AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////MTEx/zExMf8xMTH/MTEx/0dHR/9JSUn/SUlJ/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf87Ozv/SUlJ/0lJSf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/0lJSf9JSUn/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf9ERET/SUlJ/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8AAAD/AAAA/wAAAP8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/AAAA/wAAAP8xMTH/MTEx/zExMf8BAQH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8aGhr/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/0lJSf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/AIAA/wCAAP8AAAD/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/AIAA/wCAAP8AgAD/MTEx/zExMf8AfQD/AIAA/wCAAP8AgAD/AIAA/wCAAP8AgAD/AIAA/wCAAP8AgAD/AAAA/x4eHv8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf9JSUn/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/wCAAP8AgAD/AAAA/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/wCAAP8AgAD/AIAA/zExMf8aVxr/AIAA/wCAAP8AgAD/AIAA/wCAAP8AgAD/AIAA/wCAAP8AgAD/AIAA/wCAAP8AAAD/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/SUlJ/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8AgAD/AIAA/wAAAP8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8AgAD/AIAA/wCAAP8xMTH/BHkE/wCAAP8AgAD/AIAA/wCAAP8AgAD/AIAA/wCAAP8AgAD/AIAA/wCAAP8AgAD/AAAA/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/0lJSf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/AIAA/wCAAP8AAAD/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/AIAA/wCAAP8AgAD/MTEx/wCAAP8AgAD/AIAA/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/wCAAP8AgAD/AIAA/wAAAP8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf9JSUn/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/wCAAP8AgAD/AAAA/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/wCAAP8AgAD/AIAA/zExMf8AgAD/AIAA/wCAAP8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8AgAD/AIAA/wCAAP8AAAD/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/SUlJ/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8AgAD/AIAA/wAAAP8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8AgAD/AIAA/wCAAP8xMTH/AIAA/wCAAP8AgAD/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/AIAA/wCAAP8AgAD/AAAA/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/0JCQv8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/AIAA/wCAAP8AAAD/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/AIAA/wCAAP8AgAD/MTEx/wCAAP8AgAD/AIAA/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/wCAAP8AgAD/AIAA/wAAAP8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf88PDz/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/wCAAP8AgAD/AAAA/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/wCAAP8AgAD/AIAA/zExMf8AgAD/AIAA/wCAAP8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8AgAD/AIAA/wCAAP8AAAD/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MjIy/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8AgAD/AIAA/wAAAP8vLy//MTEx/zExMf8xMTH/MTEx/zExMf8AgAD/AIAA/wCAAP8xMTH/AIAA/wCAAP8AgAD/Ly8v/zExMf8xMTH/MTEx/zExMf8xMTH/AIAA/wCAAP8AgAD/AAAA/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/AIAA/wCAAP8AgAD/AIAA/wCAAP8AgAD/AIAA/wCAAP8AgAD/AIAA/wCAAP8AgAD/MTEx/wxtDP8AgAD/AIAA/wCAAP8AgAD/AIAA/wCAAP8AgAD/AIAA/wCAAP8AgAD/AIAA/wMDA/8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/wCAAP8AgAD/AIAA/wCAAP8AgAD/AIAA/wCAAP8AgAD/AIAA/wCAAP8AgAD/AHgA/zExMf8tNy3/AIAA/wCAAP8AgAD/AIAA/wCAAP8AgAD/AIAA/wCAAP8AgAD/AIAA/wB4AP8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8AgAD/AIAA/wCAAP8AgAD/AIAA/wCAAP8AgAD/AIAA/wCAAP8CewL/MTEx/zExMf8xMTH/MTEx/yo7Kv8Icgj/AIAA/wCAAP8AgAD/AIAA/wCAAP8AgAD/AnsC/xdbF/8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zMzM/4xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf80NDT1MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/OTk5LTExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/wAAAAAxMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zg4OMwAAAAAMTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8AAAAAAAAAADIyMv4xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/AAAAAAAAAAAAAAAAOjo6ljExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/AAAAAAAAAAAAAAAAAAAAAAAAAAAxMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/VVVVBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADo6OpExMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjIy/TExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADo6Oiw1NTX1MzMz/jExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf8xMTH/MTEx/zExMf80NDT7Ojo6jAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAH/4AAAAAAAAD+AAAAAAAAAH4AAAAAAAAAPAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAAGAAAAAAAAAAcAAAAAAAAAD4AAAAAAAAAPwAAAAAAAAD/gAAAAAAAAf/wAAAAAAAP8=\",\n    [DEFAULT_ICON]:\n        \"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAMAAABrrFhUAAABiVBMVEUAAABzc3N5eXl0dHR5dnN5dnN4eHV5d3V6eHR5d3V6eHR5d3R5d3R5d3R5d3R5d3R5d3R5d3R5d3R5d3R5d3QGabwGar0Ha70Ha74HbL4HbL8Hbb8HbcAIbsAIbsEIb8EIcMIJccIJccMJcsMJcsQJc8QKc8UKdMUKdMYKdcYKdscLdscLd8cLd8gLeMgLeMkLeckMecoMesoMessMe8sMe8wMfMwNfMwNfcwNfc0Nfs0Nfs4Nf84Of88OgM8OgNAOgdAOgdEOgtEPgtEPg9IPhNIPhNMPhdMQhdQQhtQQhtUQh9UQh9YRiNYRidcRitcRitgSi9gSi9kSjNkSjNoSjdoSjdsTjtsTj9wed8IeeMMfecMpmd4qmd8qmt94rdl5d3R5rtp8end+wep/weqHhYOMi4iOjIqPjYqPjYuWlpbAv77BwL7Cwb/CwcDDwsHEw8LExMTPz87Q0M/S0dDX19bY19bk5OPl5eTx8PDx8fHz8/Lz8/P09PP09vj09/n4+Pj6+vr///+Z/ULnAAAAFXRSTlMAFBUWUlRVgYKDhM3Oz9Dw8fLz9P7FJ1F0AAAAAWJLR0SCi7P/RAAAAtFJREFUeNrt2s1qE1EYxvGZTGfSIEYKQhYigqtcSN2IVi/BO2z9WHotomIXorQS05JkpplmalyIbmrz2ff3h1C6aJnzz/O85+S0SQIAAAAAAAAAAAAAAG476eyVtbPiebiVvx1fTC6uBBR3XgR9918PyyRLiu5B1Pj3P5fTNOve9vd/b/Y6/cfXhqNBqx01/1e8LFo7sTeBnegC8vRV8HNAKyEg+BC4KkK3k4dbeTkaTOYC8vu7EcdfXnwrf1Wguxsz/e278xnQidr/zlxAHlVAYRcggAACCCCAAAIIIIAAAgggICZ//1ng6zV+uvfnt9Mv5WTpT5y3H7QW9cCLTsDx2fLXn5TD4+UmoPf/v2xcryS1o4U98KITMFlNbUtDcKkVuAE1Ac4BBKiABEiABEiABEhAzPuA9QjYoPuA21GB3rYtoWcGEGAbJIAAM0ACCFABAlSAABVY633AerjZA0uA+wDboF3ADFABJ0EzwAwwA8wAAgxBM0ACknD/H+AcsMiP1+sR0DMDCLANEqACBKiABEgAASpAgAq4D7jmJ0cVWPDH6627DzADnAPMABUgwAzwWcAQNAPMADPADDADtvM+QAU25z5AAgiwCxCgAgSoAAEEmAESIAEERLwPMAPcB5gBBJgBBKiABEiABEiABEgAASoQ7z7ADIh+H2AGqAABBJgBBKgAASpAgApIgARIgARIgAQQoAIEqEAkAfureeYnG1uBfDUdKDZWwKOnk/dLX/5+8XBjBWSPk74hSAABBBBAAAEEEEAAAVsjoIy6+MlcQBVVQDUXcBZVwPB3AuqY66+bBGSf+rMkdEIKODlPkqNWY2EQsgTDpgHVTiNg+n28l0bL/8lw2uyAWf1xdotVj0ejNI1zJqhGp4PzZvIdnqdJfu9Z2FPQux9VlkzLD/2g6z/8WSVN9VtF1j4It/o342pSJwAAAAAAAAAAAAAAIACXIfSz2zOYD54AAAAASUVORK5CYII=\",\n};\n"
  },
  {
    "path": "src/renderer/data/docker.ts",
    "content": "import { ComposeConfig } from \"../../types\";\nimport { RESTART_ON_FAILURE } from \"../lib/constants\";\n\nexport const DOCKER_DEFAULT_COMPOSE: ComposeConfig = {\n    name: \"winboat\",\n    volumes: {\n        data: null,\n    },\n    services: {\n        windows: {\n            image: \"ghcr.io/dockur/windows:5.14\",\n            container_name: \"WinBoat\",\n            environment: {\n                VERSION: \"11\",\n                RAM_SIZE: \"4G\",\n                CPU_CORES: \"4\",\n                DISK_SIZE: \"64G\",\n                USERNAME: \"MyWindowsUser\",\n                PASSWORD: \"MyWindowsPassword\",\n                HOME: \"${HOME}\",\n                LANGUAGE: \"English\",\n                USER_PORTS: \"7148\",\n                HOST_PORTS: \"7149\",\n                ARGUMENTS: \"-qmp tcp:0.0.0.0:7149,server,wait=off\",\n            },\n            cap_add: [\"NET_ADMIN\"],\n            privileged: true,\n            ports: [\n                \"127.0.0.1:47270-47279:8006\", // VNC Web Interface\n                \"127.0.0.1:47280-47289:7148\", // Winboat Guest Server API\n                \"127.0.0.1:47290-47299:7149\", // QEMU QMP Port\n                \"127.0.0.1:47300-47309:3389/tcp\", // RDP\n                \"127.0.0.1:47310-47319:3389/udp\", // RDP\n            ],\n            stop_grace_period: \"120s\",\n            restart: RESTART_ON_FAILURE,\n            volumes: [\n                \"data:/storage\",\n                \"${HOME}:/shared\",\n                \"/dev/bus/usb:/dev/bus/usb\", // QEMU Dynamic USB Passthrough\n                \"./oem:/oem\",\n            ],\n            devices: [\"/dev/kvm\"],\n        },\n    },\n};\n"
  },
  {
    "path": "src/renderer/data/internalapps.ts",
    "content": "export const InternalApps = {\n    WINDOWS_DESKTOP: \"WINDOWS_DESKTOP\",\n    WINDOWS_EXPLORER: \"WINDOWS_EXPLORER\",\n    NOVNC_BROWSER: \"NOVNC_BROWSER\",\n};\n"
  },
  {
    "path": "src/renderer/data/podman.ts",
    "content": "import { ComposeConfig } from \"../../types\";\nimport { RESTART_ON_FAILURE } from \"../lib/constants\";\n\nexport const PODMAN_DEFAULT_COMPOSE: ComposeConfig = {\n    name: \"winboat\",\n    volumes: {\n        data: null,\n    },\n    services: {\n        windows: {\n            image: \"ghcr.io/dockur/windows:5.14\",\n            container_name: \"WinBoat\",\n            environment: {\n                VERSION: \"11\",\n                RAM_SIZE: \"4G\",\n                CPU_CORES: \"4\",\n                DISK_SIZE: \"64G\",\n                USERNAME: \"MyWindowsUser\",\n                PASSWORD: \"MyWindowsPassword\",\n                HOME: \"${HOME}\",\n                LANGUAGE: \"English\",\n                NETWORK: \"user\",\n                USER_PORTS: \"7148\",\n                HOST_PORTS: \"7149\",\n                ARGUMENTS: \"-qmp tcp:0.0.0.0:7149,server,wait=off\",\n            },\n            cap_add: [\"NET_ADMIN\"],\n            ports: [\n                \"127.0.0.1::8006\", // VNC Web Interface\n                \"127.0.0.1::7148\", // Winboat Guest Server API\n                \"127.0.0.1::7149\", // QEMU QMP Port\n                \"127.0.0.1::3389/tcp\", // RDP\n                \"127.0.0.1::3389/udp\", // RDP\n            ],\n            stop_grace_period: \"120s\",\n            restart: RESTART_ON_FAILURE,\n            privileged: true,\n            volumes: [\n                \"data:/storage\",\n                \"${HOME}:/shared\",\n                \"./oem:/oem\",\n            ],\n            devices: [\"/dev/kvm\", \"/dev/bus/usb\"],\n        },\n    },\n};\n"
  },
  {
    "path": "src/renderer/directives/autoscroll.ts",
    "content": "// auto-scroll.ts\nimport type { Directive, DirectiveBinding } from \"vue\";\n\ninterface ScrollOptions {\n    behavior?: ScrollBehavior;\n    top?: number;\n    left?: number;\n}\n\ninterface AutoScrollElement extends HTMLElement {\n    _autoScrollObserver?: MutationObserver;\n}\n\nexport const autoScroll: Directive<AutoScrollElement, ScrollOptions> = {\n    mounted(el: AutoScrollElement, binding: DirectiveBinding<ScrollOptions>) {\n        // Store the mutation observer instance on the element\n        el._autoScrollObserver = new MutationObserver(() => {\n            // Get scroll options from binding value or use defaults\n            const options: ScrollOptions = {\n                behavior: \"smooth\",\n                ...binding.value,\n            };\n\n            // Scroll to bottom\n            el.scrollTo({\n                top: el.scrollHeight,\n                ...options,\n            });\n        });\n\n        // Configure the observer to watch for changes\n        const config: MutationObserverInit = {\n            childList: true, // Watch for changes in child elements\n            subtree: true, // Watch all descendants, not just direct children\n            characterData: true, // Watch for changes in text content\n        };\n\n        // Start observing\n        el._autoScrollObserver.observe(el, config);\n\n        // Initial scroll\n        el.scrollTo({\n            top: el.scrollHeight,\n            behavior: binding.value?.behavior ?? \"smooth\",\n        });\n    },\n\n    beforeUnmount(el: AutoScrollElement): void {\n        // Clean up the observer when directive is removed\n        if (el._autoScrollObserver) {\n            el._autoScrollObserver.disconnect();\n            delete el._autoScrollObserver;\n        }\n    },\n\n    // Re-apply when component updates\n    updated(el: AutoScrollElement, binding: DirectiveBinding<ScrollOptions>): void {\n        const options: ScrollOptions = {\n            behavior: \"smooth\",\n            ...binding.value,\n        };\n\n        el.scrollTo({\n            top: el.scrollHeight,\n            ...options,\n        });\n    },\n};\n"
  },
  {
    "path": "src/renderer/index.css",
    "content": "@import url(\"https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300..800;1,300..800&display=swap\");\n@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\nbody {\n    @apply bg-transparent overflow-hidden text-white;\n    font-family: \"Open Sans\", serif;\n    font-optical-sizing: auto;\n    font-weight: 400;\n    font-style: normal;\n}\n\n/* Xel reset, why do they modify default tags anyway...? */\nbody img {\n    display: unset;\n    height: unset;\n    margin: unset;\n    max-width: unset;\n    box-sizing: unset;\n    background: unset;\n    border-width: unset;\n    border-style: unset;\n    border-color: unset;\n    user-select: unset;\n    -webkit-user-modify: unset;\n}\n\n.generic-hover {\n    @apply hover:brightness-90 transition duration-200;\n}\n"
  },
  {
    "path": "src/renderer/index.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.0\" />\n        <title>WinBoat</title>\n        <script src=\"./public/xel/xel.js\" type=\"module\"></script>\n        <meta name=\"xel-theme\" content=\"./xel/themes/fluent-dark.css\" />\n        <meta name=\"xel-icons\" content=\"./xel/icons/fluent.svg\" />\n        <meta name=\"xel-accent-color\" content=\"#A78AF9\" />\n    </head>\n\n    <body>\n        <div id=\"app\"></div>\n        <script type=\"module\" src=\"./main.ts\"></script>\n    </body>\n</html>\n"
  },
  {
    "path": "src/renderer/lib/config.ts",
    "content": "const fs: typeof import(\"fs\") = require(\"node:fs\");\nconst path: typeof import(\"path\") = require(\"node:path\");\nimport { type WinApp } from \"../../types\";\nimport { WINBOAT_DIR } from \"./constants\";\nimport { type PTSerializableDeviceInfo } from \"./usbmanager\";\nimport { ContainerRuntimes } from \"./containers/common\";\nimport { logger } from \"./winboat\";\n\nexport type RdpArg = {\n    original?: string;\n    newArg: string;\n    isReplacement: boolean;\n};\n\nexport class WinboatVersion {\n    public readonly generation: number;\n    public readonly major: number;\n    public readonly minor: number;\n    public readonly alpha: boolean;\n\n    constructor(public readonly versionToken: string) {\n        const versionTags = versionToken.split(\"-\");\n        const versionNumbers = versionTags[0].split(\".\").map(value => {\n            const parsedValue = parseInt(value);\n\n            if(Number.isNaN(parsedValue)) {\n                throw new Error(`Invalid winboat version format: '${versionToken}'`);\n            }\n\n            return parsedValue;\n        });\n\n        this.alpha = !!versionTags[1]?.includes(\"alpha\");\n        this.generation = versionNumbers[0];\n        this.major = versionNumbers[1];\n        this.minor = versionNumbers[2];\n    }\n\n    toString(): string {\n        return this.versionToken;\n    }\n\n    toJSON(): string {\n        return this.toString();\n    }\n}\n\ntype WinboatVersionData = {\n    previous: WinboatVersion,\n    current: WinboatVersion\n}\n\nexport enum MultiMonitorMode {\n    None = \"None\",\n    MultiMon = \"MultiMon\",\n    Span = \"Span\"\n};\n\nexport type WinboatConfigObj = {\n    scale: number;\n    scaleDesktop: number;\n    smartcardEnabled: boolean;\n    rdpMonitoringEnabled: boolean;\n    passedThroughDevices: PTSerializableDeviceInfo[];\n    customApps: WinApp[];\n    experimentalFeatures: boolean;\n    advancedFeatures: boolean;\n    multiMonitor: MultiMonitorMode;\n    rdpArgs: RdpArg[];\n    disableAnimations: boolean;\n    containerRuntime: ContainerRuntimes;\n    versionData: WinboatVersionData;\n    appsSortOrder: string;\n};\n\nconst currentVersion = new WinboatVersion(import.meta.env.VITE_APP_VERSION);\n\nconst defaultConfig: WinboatConfigObj = {\n    scale: 100,\n    scaleDesktop: 100,\n    smartcardEnabled: false,\n    rdpMonitoringEnabled: false,\n    passedThroughDevices: [],\n    customApps: [],\n    experimentalFeatures: false,\n    advancedFeatures: false,\n    multiMonitor: MultiMonitorMode.None,\n    rdpArgs: [],\n    disableAnimations: false,\n    // TODO: Ideally should be podman once we flesh out everything\n    containerRuntime: ContainerRuntimes.DOCKER,\n    versionData: {\n        previous: currentVersion, // As of 0.9.0 this won't exist on the filesystem, so we just set it to the current version\n        current: currentVersion\n    },\n    appsSortOrder: 'name',\n};\n\nexport class WinboatConfig {\n    private static readonly configPath: string = path.join(WINBOAT_DIR, \"winboat.config.json\");\n    private static instance: WinboatConfig | null = null;\n    \n    // Due to us wrapping WinboatConfig in reactive, this can't be private\n    configData: WinboatConfigObj = { ...defaultConfig };\n\n    static getInstance() {\n        WinboatConfig.instance ??= new WinboatConfig();\n        return WinboatConfig.instance;\n    }\n\n    private constructor() {\n        this.configData = WinboatConfig.readConfigObject()!;\n\n        // Set correct versionData\n        if(this.config.versionData.current.versionToken !== currentVersion.versionToken) {\n            this.config.versionData.previous = this.config.versionData.current;\n            this.config.versionData.current = currentVersion;\n\n            logger.info(`Updated version data from '${this.config.versionData.previous.toString()}' to '${currentVersion.toString()}'`);\n        }\n\n        console.log(\"Reading current config\", this.configData);\n    }\n\n    get config(): WinboatConfigObj {\n        // Return a proxy to intercept property sets\n        return new Proxy(this.configData, {\n            get: (target, key) => Reflect.get(target, key),\n            set: (target, key, value: WinboatConfigObj) => {\n                const result = Reflect.set(target, key, value);\n\n                WinboatConfig.writeConfigObject(target);\n                console.info(\"Wrote modified config to disk\");\n\n                return result;\n            },\n        });\n    }\n\n    set config(newConfig: WinboatConfigObj) {\n        this.configData = { ...newConfig };\n        WinboatConfig.writeConfigObject(newConfig);\n        console.info(\"Wrote modified config to disk\");\n    }\n\n    static writeConfigObject(configObj: WinboatConfigObj): void {\n        console.log(\"writing data: \", configObj);\n        fs.writeFileSync(WinboatConfig.configPath, JSON.stringify(configObj, null, 4), \"utf-8\");\n    }\n\n    static readConfigObject(writeDefault = true): WinboatConfigObj | null {\n        if (!fs.existsSync(WinboatConfig.configPath)) {\n            if (!writeDefault) return null;\n            // Also the create the directory because we're not guaranteed to have it\n            if (!fs.existsSync(WINBOAT_DIR)) {\n                fs.mkdirSync(WINBOAT_DIR);\n            }\n\n            fs.writeFileSync(WinboatConfig.configPath, JSON.stringify(defaultConfig, null, 4), \"utf-8\");\n            return { ...defaultConfig };\n        }\n\n        try {\n            const rawConfig = fs.readFileSync(WinboatConfig.configPath, \"utf-8\");\n            const configObjRaw = JSON.parse(rawConfig);\n\n            // Parse winboat version data\n            if(configObjRaw.versionData) {\n                configObjRaw.versionData.current = new WinboatVersion(configObjRaw.versionData.current);\n                configObjRaw.versionData.previous = new WinboatVersion(configObjRaw.versionData.previous);\n            }\n\n            const configObj = configObjRaw as WinboatConfigObj;\n\n            console.log(\"Successfully read the config file\");\n\n            // Some fields might be missing after an update, so we merge them with the default config\n            for (const key in defaultConfig) {\n                let hasMissing = false;\n                if (!(key in configObj)) {\n                    // @ts-expect-error This is valid\n                    configObj[key] = defaultConfig[key];\n                    hasMissing = true;\n                    console.log(\n                        `Added missing config key: ${key} with default value: ${\n                            JSON.stringify(defaultConfig[key as keyof WinboatConfigObj])\n                        }`,\n                    );\n                }\n\n                // If we have any missing keys, we should just write the config back to disk so those new keys are saved\n                // We cannot use this.writeConfig() here since #configData is not populated yet\n                if (hasMissing) {\n                    fs.writeFileSync(WinboatConfig.configPath, JSON.stringify(configObj, null, 4), \"utf-8\");\n                    console.log(\"Wrote updated config with missing keys to disk\");\n                }\n            }\n\n            return { ...configObj };\n        } catch (e) {\n            console.error(\"Config’s borked, outputting the default:\", e);\n            return { ...defaultConfig };\n        }\n    }\n}\n"
  },
  {
    "path": "src/renderer/lib/constants.ts",
    "content": "const os: typeof import(\"os\") = require(\"node:os\");\nconst path: typeof import(\"path\") = require(\"node:path\");\n\n// Should be {home}/.winboat\nexport const WINBOAT_DIR = path.join(os.homedir(), \".winboat\");\nexport const DEFAULT_HOMEBREW_DIR = path.join(os.homedir(), \"../linuxbrew/.linuxbrew/bin\");\n\nexport const WINDOWS_VERSIONS = {\n    \"11\": \"Windows 11 Pro\",\n    \"11l\": \"Windows 11 LTSC 2024\",\n    \"11e\": \"Windows 11 Enterprise\",\n    \"10\": \"Windows 10 Pro\",\n    \"10l\": \"Windows 10 LTSC 2021\",\n    \"10e\": \"Windows 10 Enterprise\",\n    custom: \"Custom Windows\",\n};\n\nexport type WindowsVersionKey = keyof typeof WINDOWS_VERSIONS;\n\nexport const WINDOWS_LANGUAGES = {\n    \"🇦🇪 Arabic\": \"Arabic\",\n    \"🇧🇬 Bulgarian\": \"Bulgarian\",\n    \"🇨🇳 Chinese\": \"Chinese\",\n    \"🇭🇷 Croatian\": \"Croatian\",\n    \"🇨🇿 Czech\": \"Czech\",\n    \"🇩🇰 Danish\": \"Danish\",\n    \"🇳🇱 Dutch\": \"Dutch\",\n    \"🇬🇧 English\": \"English\",\n    \"🇪🇪 Estonian\": \"Estonian\",\n    \"🇫🇮 Finnish\": \"Finnish\",\n    \"🇫🇷 French\": \"French\",\n    \"🇩🇪 German\": \"German\",\n    \"🇬🇷 Greek\": \"Greek\",\n    \"🇮🇱 Hebrew\": \"Hebrew\",\n    \"🇭🇺 Hungarian\": \"Hungarian\",\n    \"🇮🇹 Italian\": \"Italian\",\n    \"🇯🇵 Japanese\": \"Japanese\",\n    \"🇰🇷 Korean\": \"Korean\",\n    \"🇱🇻 Latvian\": \"Latvian\",\n    \"🇱🇹 Lithuanian\": \"Lithuanian\",\n    \"🇳🇴 Norwegian\": \"Norwegian\",\n    \"🇵🇱 Polish\": \"Polish\",\n    \"🇵🇹 Portuguese\": \"Portuguese\",\n    \"🇷🇴 Romanian\": \"Romanian\",\n    \"🇷🇺 Russian\": \"Russian\",\n    \"🇷🇸 Serbian\": \"Serbian\",\n    \"🇸🇰 Slovak\": \"Slovak\",\n    \"🇸🇮 Slovenian\": \"Slovenian\",\n    \"🇪🇸 Spanish\": \"Spanish\",\n    \"🇸🇪 Swedish\": \"Swedish\",\n    \"🇹🇭 Thai\": \"Thai\",\n    \"🇹🇷 Turkish\": \"Turkish\",\n    \"🇺🇦 Ukrainian\": \"Ukrainian\",\n};\n\n// Ports\nexport const GUEST_RDP_PORT = 3389;\nexport const GUEST_QMP_PORT = 7149;\nexport const DEFAULT_HOST_QMP_PORT = 8149;\n\n// USB\nexport const USB_CLASS_IMAGING = 6;\nexport const USB_INTERFACE_MTP = 5;\nexport const USB_VID_BLACKLIST = [\n    // Linux Foundation VID\n    \"1d6b:\",\n];\n\n// Docker Restart Policies\nexport const RESTART_UNLESS_STOPPED = \"unless-stopped\";\nexport const RESTART_ON_FAILURE = \"on-failure\";\nexport const RESTART_ALWAYS = \"always\";\nexport const RESTART_NO = \"no\";\n"
  },
  {
    "path": "src/renderer/lib/containers/common.ts",
    "content": "import { PortEntryProtocol } from \"../../../types\";\nimport { ContainerManager } from \"./container\";\nimport { DockerContainer, DockerSpecs } from \"./docker\";\nimport { PodmanContainer, PodmanSpecs } from \"./podman\";\n\n// For convenience\nexport { type DockerSpecs } from \"./docker\";\nexport { type PodmanSpecs } from \"./podman\";\nexport { ContainerStatus } from \"./container\";\n\nexport enum ContainerRuntimes {\n    DOCKER = \"Docker\",\n    PODMAN = \"Podman\",\n}\n\n// NOTE: These are container port values, and should be used as such\nexport enum CommonPorts {\n    RDP = 3389,\n    NOVNC = 8006,\n    API = 7148,\n    QMP = 7149,\n}\n\nexport const ContainerImplementations = {\n    [ContainerRuntimes.DOCKER]: DockerContainer,\n    [ContainerRuntimes.PODMAN]: PodmanContainer,\n} as const satisfies Record<ContainerRuntimes, any>; // this makes it so ContainerImplementations has to map ContainerRuntimes to something exhaustively\n\ntype ContainerSpecMap = {\n    [ContainerRuntimes.DOCKER]: DockerSpecs;\n    [ContainerRuntimes.PODMAN]: PodmanSpecs;\n};\n\nexport type ContainerSpecs = ContainerSpecMap[ContainerRuntimes];\n\nexport async function getContainerSpecs<T extends ContainerRuntimes>(type: T): Promise<ContainerSpecMap[T]> {\n    return (await ContainerImplementations[type]._getSpecs()) as ContainerSpecMap[T];\n}\n\nexport function createContainer<T extends ContainerRuntimes>(\n    type: T,\n    ...params: ConstructorParameters<(typeof ContainerImplementations)[T]>\n) {\n    return new ContainerImplementations[type](...(params as []));\n}\n\nexport function getActiveHostPort(\n    container: ContainerManager,\n    port: CommonPorts,\n    protocol: PortEntryProtocol = \"tcp\",\n): number | undefined {\n    return container.cachedPortMappings?.find(\n        mapping => typeof mapping.container === \"number\" && mapping.container === port && mapping.protocol === protocol,\n    )?.host as number;\n}\n"
  },
  {
    "path": "src/renderer/lib/containers/container.ts",
    "content": "import { ComposeConfig } from \"../../../types\";\nimport { WINBOAT_DIR } from \"../constants\";\nimport { createLogger } from \"../../utils/log\";\nimport { ComposePortEntry } from \"../../utils/port\";\n\nconst path: typeof import(\"node:path\") = require(\"node:path\");\n\nexport const containerLogger = createLogger(path.join(WINBOAT_DIR, \"container.log\"));\n\nexport type ComposeDirection = \"up\" | \"down\";\nexport type ComposeArguments = \"--no-start\";\nexport type ContainerAction = \"start\" | \"stop\" | \"pause\" | \"unpause\" | \"restart\";\n\nexport abstract class ContainerManager {\n    abstract readonly defaultCompose: ComposeConfig;\n    abstract readonly composeFilePath: string;\n    abstract readonly executableAlias: string;\n\n    abstract cachedPortMappings: ComposePortEntry[] | null;\n\n    abstract writeCompose(compose: ComposeConfig): void;\n    abstract compose(direction: ComposeDirection, extraArgs?: ComposeArguments[]): Promise<void>;\n    abstract container(action: ContainerAction): Promise<void>;\n    abstract port(): Promise<ComposePortEntry[]>;\n    abstract remove(): Promise<void>;\n    abstract getStatus(): Promise<ContainerStatus>;\n    abstract exists(): Promise<boolean>;\n\n    abstract get containerName(): string;\n\n    // static \"abstract\" function\n    static async _getSpecs(): Promise<any> {\n        throw new Error(\"Can't get specs of abstract class ContainerManager\");\n    }\n}\n\nexport enum ContainerStatus {\n    CREATED = \"Created\", // unused\n    RUNNING = \"Running\",\n    PAUSED = \"Paused\",\n    EXITED = \"Exited\",\n    UNKNOWN = \"Unknown\",\n}\n"
  },
  {
    "path": "src/renderer/lib/containers/docker.ts",
    "content": "import { ComposeConfig } from \"../../../types\";\nimport { DOCKER_DEFAULT_COMPOSE } from \"../../data/docker\";\nimport { capitalizeFirstLetter } from \"../../utils/capitalize\";\nimport { ComposePortEntry } from \"../../utils/port\";\nimport { WINBOAT_DIR } from \"../constants\";\nimport {\n    ComposeArguments,\n    ComposeDirection,\n    ContainerAction,\n    containerLogger,\n    ContainerManager,\n    ContainerStatus,\n} from \"./container\";\nimport YAML from \"yaml\";\nimport { execFileAsync, stringifyExecFile } from \"../exec-helper\";\n\nconst path: typeof import(\"node:path\") = require(\"node:path\");\nconst fs: typeof import(\"node:fs\") = require(\"node:fs\");\n\nexport type DockerSpecs = {\n    dockerInstalled: boolean;\n    dockerComposeInstalled: boolean;\n    dockerIsRunning: boolean;\n    dockerIsInUserGroups: boolean;\n};\n\nexport class DockerContainer extends ContainerManager {\n    defaultCompose = DOCKER_DEFAULT_COMPOSE;\n    composeFilePath = path.join(WINBOAT_DIR, \"docker-compose.yml\"); // TODO: If/when we support multiple VM's we need to put this in the constructor\n    executableAlias = \"docker\";\n\n    cachedPortMappings: ComposePortEntry[] | null = null;\n\n    constructor() {\n        super();\n    }\n\n    writeCompose(compose: ComposeConfig): void {\n        const composeContent = YAML.stringify(compose, { nullStr: \"\" });\n        fs.writeFileSync(this.composeFilePath, composeContent, { encoding: \"utf-8\" });\n\n        containerLogger.info(`Wrote to compose file at: ${this.composeFilePath}`);\n        containerLogger.info(`Compose file content: ${JSON.stringify(composeContent, null, 2)}`);\n    }\n\n    async compose(direction: ComposeDirection, extraArgs: ComposeArguments[] = []): Promise<void> {\n        const args = [\"compose\", \"-f\", this.composeFilePath, direction, ...extraArgs];\n\n        if (direction === \"up\") {\n            // Run compose in detached mode if we are running compose up\n            args.push(\"-d\");\n        }\n\n        try {\n            const { stderr } = await execFileAsync(this.executableAlias, args);\n            if (stderr) {\n                containerLogger.error(stderr);\n            }\n        } catch (e) {\n            containerLogger.error(`Failed to run compose command '${stringifyExecFile(this.executableAlias, args)}'`);\n            containerLogger.error(e);\n            throw e;\n        }\n    }\n\n    async container(action: ContainerAction): Promise<void> {\n        const args = [\"container\", action, this.containerName];\n        try {\n            const { stdout } = await execFileAsync(this.executableAlias, args);\n            containerLogger.info(`Container action '${action}' response: '${stdout}'`);\n        } catch (e) {\n            containerLogger.error(`Failed to run container action '${stringifyExecFile(this.executableAlias, args)}'`);\n            containerLogger.error(e);\n            throw e;\n        }\n    }\n\n    async port(): Promise<ComposePortEntry[]> {\n        const args = [\"port\", this.containerName];\n        const ret = [];\n\n        try {\n            const { stdout } = await execFileAsync(this.executableAlias, args);\n\n            for (const line of stdout.trim().split(\"\\n\")) {\n                const parts = line.split(\"->\").map(part => part.trim());\n                const hostPart = parts[1];\n                const containerPart = parts[0];\n\n                ret.push(new ComposePortEntry(`${hostPart}:${containerPart}`));\n            }\n        } catch (e) {\n            containerLogger.error(`Failed to run container action '${stringifyExecFile(this.executableAlias, args)}'`);\n            containerLogger.error(e);\n            throw e;\n        }\n\n        containerLogger.info(\"Docker container active port mappings: \", JSON.stringify(ret));\n        this.cachedPortMappings = ret;\n        return ret;\n    }\n\n    async remove(): Promise<void> {\n        const args = [\"rm\", this.containerName];\n\n        try {\n            await execFileAsync(this.executableAlias, args);\n        } catch (e) {\n            containerLogger.error(`Failed to remove container '${this.containerName}'`);\n            containerLogger.error(e);\n        }\n    }\n\n    async getStatus(): Promise<ContainerStatus> {\n        const statusMap = {\n            created: ContainerStatus.CREATED,\n            restarting: ContainerStatus.UNKNOWN,\n            removing: ContainerStatus.UNKNOWN,\n            running: ContainerStatus.RUNNING,\n            paused: ContainerStatus.PAUSED,\n            exited: ContainerStatus.EXITED,\n            dead: ContainerStatus.UNKNOWN,\n        } as const;\n        const args = [\"inspect\", \"--format={{.State.Status}}\", this.containerName];\n        try {\n            const { stdout } = await execFileAsync(this.executableAlias, args);\n            const status = stdout.trim() as keyof typeof statusMap;\n            return statusMap[status];\n        } catch (e) {\n            containerLogger.error(`Failed to get status of docker container ${e}'`);\n            return ContainerStatus.UNKNOWN;\n        }\n    }\n\n    async exists(): Promise<boolean> {\n        const args = [\"ps\", \"-a\", \"--filter\", `name=${this.containerName}`, \"--format\", \"{{.Names}}\"];\n        try {\n            const { stdout: exists } = await execFileAsync(this.executableAlias, args);\n            return exists.includes(\"WinBoat\");\n        } catch (e) {\n            containerLogger.error(\n                `Failed to get container status, is ${capitalizeFirstLetter(this.executableAlias)} installed?`,\n            );\n            containerLogger.error(e);\n            return false;\n        }\n    }\n\n    get containerName(): string {\n        return this.defaultCompose.services.windows.container_name; // TODO: investigate whether we should use the compose on disk\n    }\n\n    static override async _getSpecs(): Promise<DockerSpecs> {\n        let specs: DockerSpecs = {\n            dockerInstalled: false,\n            dockerComposeInstalled: false,\n            dockerIsRunning: false,\n            dockerIsInUserGroups: false,\n        };\n\n        try {\n            const { stdout: dockerOutput } = await execFileAsync(\"docker\", [\"--version\"]);\n            specs.dockerInstalled = !!dockerOutput;\n        } catch (e) {\n            console.error(\"Error checking for Docker installation:\", e);\n        }\n\n        // Docker Compose plugin check with version validation\n        try {\n            const { stdout: dockerComposeOutput } = await execFileAsync(\"docker\", [\"compose\", \"version\"]);\n            if (dockerComposeOutput) {\n                // Example output: \"Docker Compose version v2.35.1\"\n                // Example output 2: \"Docker Compose version 2.36.2\"\n                const versionMatch = /(\\d+\\.\\d+\\.\\d+)/.exec(dockerComposeOutput);\n                if (versionMatch) {\n                    const majorVersion = Number.parseInt(versionMatch[1].split(\".\")[0], 10);\n                    specs.dockerComposeInstalled = majorVersion >= 2;\n                } else {\n                    specs.dockerComposeInstalled = false; // No valid version found\n                }\n            } else {\n                specs.dockerComposeInstalled = false; // No output, plugin not installed\n            }\n        } catch (e) {\n            console.error(\"Error checking Docker Compose version:\", e);\n        }\n\n        // Docker is running check\n        try {\n            const { stdout: dockerOutput } = await execFileAsync(\"docker\", [\"ps\"]);\n            specs.dockerIsRunning = !!dockerOutput;\n        } catch (e) {\n            console.error(\"Error checking if Docker is running:\", e);\n        }\n\n        // Docker user group check\n        try {\n            const { stdout: userGroups } = await execFileAsync(\"id\", [\"-Gn\"]);\n            specs.dockerIsInUserGroups = userGroups.split(/\\s+/).includes(\"docker\");\n        } catch (e) {\n            console.error(\"Error checking user groups for docker:\", e);\n        }\n\n        return specs;\n    }\n}\n"
  },
  {
    "path": "src/renderer/lib/containers/podman.ts",
    "content": "import { ComposeConfig } from \"../../../types\";\nimport { PODMAN_DEFAULT_COMPOSE } from \"../../data/podman\";\nimport { WINBOAT_DIR } from \"../constants\";\nimport {\n    ComposeArguments,\n    ComposeDirection,\n    ContainerAction,\n    containerLogger,\n    ContainerManager,\n    ContainerStatus,\n} from \"./container\";\nimport YAML from \"yaml\";\nimport { capitalizeFirstLetter } from \"../../utils/capitalize\";\nimport { ComposePortEntry } from \"../../utils/port\";\nimport { concatEnv, execFileAsync, stringifyExecFile } from \"../exec-helper\";\n\nconst path: typeof import(\"node:path\") = require(\"node:path\");\nconst fs: typeof import(\"node:fs\") = require(\"node:fs\");\nconst process: typeof import(\"process\") = require(\"node:process\");\n\nexport type PodmanSpecs = {\n    podmanInstalled: boolean;\n    podmanComposeInstalled: boolean;\n};\n\nexport enum PodmanAPIStatus {\n    AVAILABLE = \"Available\",\n    UNAVAILABLE = \"Unavailable\",\n}\n\ntype PodmanInfo = {\n    host: {\n        remoteSocket: {\n            exists: boolean;\n            path: string;\n        };\n        [Key: string]: any;\n    };\n    plugins: object;\n    registries: {\n        search: string[];\n    };\n    store: object;\n    version: object;\n};\n\nconst COMPOSE_ENV_VARS = { PODMAN_COMPOSE_PROVIDER: \"podman-compose\", PODMAN_COMPOSE_WARNING_LOGS: \"false\" };\n\nexport class PodmanContainer extends ContainerManager {\n    defaultCompose = PODMAN_DEFAULT_COMPOSE;\n    composeFilePath = path.join(WINBOAT_DIR, \"podman-compose.yml\");\n    executableAlias = \"podman\";\n\n    cachedPortMappings: ComposePortEntry[] | null = null;\n\n    constructor() {\n        super();\n    }\n\n    writeCompose(compose: ComposeConfig): void {\n        const composeContent = YAML.stringify(compose, { nullStr: \"\" });\n        fs.writeFileSync(this.composeFilePath, composeContent, { encoding: \"utf-8\" });\n\n        containerLogger.info(`Wrote to compose file at: ${this.composeFilePath}`);\n        containerLogger.info(`Compose file content: ${JSON.stringify(composeContent, null, 2)}`);\n    }\n\n    async compose(direction: ComposeDirection, extraArgs: ComposeArguments[] = []): Promise<void> {\n        const args = [\"compose\", \"-f\", this.composeFilePath, direction, ...extraArgs];\n\n        if (direction === \"up\") {\n            // Run compose in detached mode if we are running compose up\n            args.push(\"-d\");\n        }\n\n        try {\n            const { stderr } = await execFileAsync(this.executableAlias, args, {\n                env: concatEnv(process.env as { [key: string]: string }, COMPOSE_ENV_VARS),\n            });\n            if (stderr) {\n                containerLogger.error(stderr);\n            }\n        } catch (e) {\n            containerLogger.error(`Failed to run compose command '${stringifyExecFile(this.executableAlias, args)}'`);\n            containerLogger.error(e);\n            throw e;\n        }\n    }\n\n    async container(action: ContainerAction): Promise<void> {\n        const args = [\"container\", action, this.containerName];\n        try {\n            const { stdout } = await execFileAsync(this.executableAlias, args);\n            containerLogger.info(`Container action '${action}' response: '${stdout}'`);\n        } catch (e) {\n            containerLogger.error(`Failed to run container action '${stringifyExecFile(this.executableAlias, args)}'`);\n            containerLogger.error(e);\n            throw e;\n        }\n    }\n\n    async port(): Promise<ComposePortEntry[]> {\n        const args = [\"port\", this.containerName];\n        const ret = [];\n\n        try {\n            const { stdout } = await execFileAsync(this.executableAlias, args);\n\n            for (const line of stdout.trim().split(\"\\n\")) {\n                const parts = line.split(\"->\").map(part => part.trim());\n                const hostPart = parts[1];\n                const containerPart = parts[0];\n\n                ret.push(new ComposePortEntry(`${hostPart}:${containerPart}`));\n            }\n        } catch (e) {\n            containerLogger.error(`Failed to run container action '${stringifyExecFile(this.executableAlias, args)}'`);\n            containerLogger.error(e);\n            throw e;\n        }\n\n        containerLogger.info(\"Podman container active port mappings: \", JSON.stringify(ret));\n        this.cachedPortMappings = ret;\n        return ret;\n    }\n\n    async remove(): Promise<void> {\n        const args = [\"rm\", this.containerName];\n\n        try {\n            await execFileAsync(this.executableAlias, args);\n        } catch (e) {\n            containerLogger.error(`Failed to remove container '${this.containerName}'`);\n            containerLogger.error(e);\n        }\n    }\n\n    async getStatus(): Promise<ContainerStatus> {\n        const statusMap = {\n            created: ContainerStatus.CREATED,\n            restarting: ContainerStatus.UNKNOWN,\n            initialized: ContainerStatus.UNKNOWN,\n            removing: ContainerStatus.UNKNOWN,\n            stopping: ContainerStatus.EXITED,\n            stopped: ContainerStatus.EXITED,\n            running: ContainerStatus.RUNNING,\n            paused: ContainerStatus.PAUSED,\n            exited: ContainerStatus.EXITED,\n            dead: ContainerStatus.UNKNOWN,\n        } as const;\n        const args = [\"inspect\", \"--format={{.State.Status}}\", this.containerName];\n\n        try {\n            const { stdout } = await execFileAsync(this.executableAlias, args);\n            const status = stdout.trim() as keyof typeof statusMap;\n            return statusMap[status];\n        } catch (e) {\n            containerLogger.error(`Failed to get status of podman container ${e}'`);\n            return ContainerStatus.UNKNOWN;\n        }\n    }\n\n    async exists(): Promise<boolean> {\n        const args = [\"ps\", \"-a\", \"--filter\", `name=${this.containerName}`, \"--format\", \"{{.Names}}\"];\n        try {\n            const { stdout: exists } = await execFileAsync(this.executableAlias, args);\n            return exists.includes(this.containerName);\n        } catch (e) {\n            containerLogger.error(\n                `Failed to get container status, is ${capitalizeFirstLetter(this.executableAlias)} installed?`,\n            );\n            containerLogger.error(e);\n            return false;\n        }\n    }\n\n    get containerName(): string {\n        return this.defaultCompose.services.windows.container_name; // TODO: investigate whether we should use the compose on disk\n    }\n\n    static override async _getSpecs(): Promise<PodmanSpecs> {\n        let specs: PodmanSpecs = {\n            podmanInstalled: false,\n            podmanComposeInstalled: false,\n        };\n\n        try {\n            const { stdout: podmanOutput } = await execFileAsync(\"podman\", [\"--version\"]);\n            specs.podmanInstalled = !!podmanOutput;\n        } catch (e) {\n            containerLogger.error(\"Error checking podman version\");\n            containerLogger.error(e);\n        }\n\n        try {\n            const { stdout: podmanComposeOutput } = await execFileAsync(\"podman\", [\"compose\", \"--version\"], {\n                env: concatEnv(process.env as { [key: string]: string }, COMPOSE_ENV_VARS),\n            });\n            specs.podmanComposeInstalled = !!podmanComposeOutput;\n        } catch (e) {\n            containerLogger.error(\"Error checking podman compose version\");\n            containerLogger.error(e);\n        }\n\n        return specs;\n    }\n}\n"
  },
  {
    "path": "src/renderer/lib/exec-helper.ts",
    "content": "const { execFile }: typeof import(\"child_process\") = require(\"node:child_process\");\nconst { promisify }: typeof import(\"util\") = require(\"node:util\");\n\nexport type ExecFileAsyncError = {\n    cmd: string;\n    code: number;\n    killed: boolean;\n    signal?: string | number;\n    stderr: string;\n    stdout: string;\n    message: string;\n    stack: string;\n};\n\nexport const execFileAsync = promisify(execFile);\n\nexport function stringifyExecFile(file: string, args: string[]): string {\n    let result = `${file}`;\n    for (const arg of args) {\n        result += `  ${escapeString(arg)}`;\n    }\n    return result;\n}\n\nfunction escapeString(str: string): string {\n    let fixed_string = \"\";\n    let index = 0;\n    let safe = /^[a-zA-Z0-9,._+:@%/-]$/;\n    while (index < str.length) {\n        let char = str[index];\n        if (safe.exec(char) == null) {\n            fixed_string += \"\\\\\";\n        }\n        fixed_string += char;\n        index++;\n    }\n    return fixed_string;\n}\n\ntype EnvMap = {\n    [key: string]: string;\n};\n\nexport function concatEnv(a: EnvMap, b?: EnvMap) {\n    if (b !== undefined) {\n        for (const key of Object.keys(b)) {\n            a[key] = b[key];\n        }\n    }\n    return a;\n}\n"
  },
  {
    "path": "src/renderer/lib/install.ts",
    "content": "import { type InstallConfiguration } from \"../../types\";\nimport { WINBOAT_DIR } from \"./constants\";\nimport { createLogger } from \"../utils/log\";\nimport { createNanoEvents, type Emitter } from \"nanoevents\";\nimport { Winboat } from \"./winboat\";\nimport { ContainerManager } from \"./containers/container\";\nimport { WinboatConfig } from \"./config\";\nimport { CommonPorts, createContainer, getActiveHostPort } from \"./containers/common\";\n\nconst fs: typeof import(\"fs\") = require(\"fs\");\nconst path: typeof import(\"path\") = require(\"path\");\nconst nodeFetch: typeof import(\"node-fetch\").default = require(\"node-fetch\");\nconst remote: typeof import(\"@electron/remote\") = require(\"@electron/remote\");\nconst argon2: typeof import(\"argon2\") = require(\"argon2\");\nconst logger = createLogger(path.join(WINBOAT_DIR, \"install.log\"));\n\nexport enum InstallStates {\n    IDLE = \"Preparing\",\n    CREATING_COMPOSE_FILE = \"Creating Compose File\",\n    CREATING_OEM = \"Creating OEM Assets\",\n    STARTING_CONTAINER = \"Starting Container\",\n    MONITORING_PREINSTALL = \"Monitoring Preinstall\",\n    INSTALLING_WINDOWS = \"Installing Windows\",\n    COMPLETED = \"Completed\",\n    INSTALL_ERROR = \"Install Error\",\n};\n\ninterface InstallEvents {\n    stateChanged: (state: InstallStates) => void;\n    preinstallMsg: (msg: string) => void;\n    error: (error: Error) => void;\n    vncPortChanged: (port: number) => void;\n}\n\nexport class InstallManager {\n    conf: InstallConfiguration;\n    emitter: Emitter<InstallEvents>;\n    state: InstallStates;\n    preinstallMsg: string;\n    container: ContainerManager;\n\n    constructor(conf: InstallConfiguration) {\n        this.conf = conf;\n        this.state = InstallStates.IDLE;\n        this.preinstallMsg = \"\";\n        this.emitter = createNanoEvents<InstallEvents>();\n        this.container = createContainer(conf.container);\n    }\n\n    changeState(newState: InstallStates) {\n        this.state = newState;\n        this.emitter.emit(\"stateChanged\", newState);\n        logger.info(`New state: \"${newState}\"`);\n    }\n\n    setPreinstallMsg(msg: string) {\n        if (msg === this.preinstallMsg) return;\n        this.preinstallMsg = msg;\n        this.emitter.emit(\"preinstallMsg\", msg);\n        logger.info(`Preinstall: \"${msg}\"`);\n    }\n\n    sleep(ms: number) {\n        return new Promise(resolve => setTimeout(resolve, ms));\n    }\n\n    async createComposeFile() {\n        this.changeState(InstallStates.CREATING_COMPOSE_FILE);\n\n        // Ensure the .winboat directory exists\n        if (!fs.existsSync(WINBOAT_DIR)) {\n            fs.mkdirSync(WINBOAT_DIR);\n            logger.info(`Created WinBoat directory: ${WINBOAT_DIR}`);\n        }\n\n        // Ensure the installation directory exists\n        if (!fs.existsSync(this.conf.installFolder)) {\n            fs.mkdirSync(this.conf.installFolder, { recursive: true });\n            logger.info(`Created installation directory: ${this.conf.installFolder}`);\n        }\n\n        // Configure the compose file\n        const composeContent = this.container.defaultCompose;\n\n        composeContent.services.windows.environment.RAM_SIZE = `${this.conf.ramGB}G`;\n        composeContent.services.windows.environment.CPU_CORES = `${this.conf.cpuCores}`;\n        composeContent.services.windows.environment.DISK_SIZE = `${this.conf.diskSpaceGB}G`;\n        composeContent.services.windows.environment.VERSION = this.conf.windowsVersion;\n        composeContent.services.windows.environment.LANGUAGE = this.conf.windowsLanguage;\n        composeContent.services.windows.environment.USERNAME = this.conf.username;\n        composeContent.services.windows.environment.PASSWORD = this.conf.password;\n\n        // Boot image mapping\n        if (this.conf.customIsoPath) {\n            composeContent.services.windows.volumes.push(`${this.conf.customIsoPath}:/boot.iso`);\n        }\n\n        // Storage folder mapping\n        const storageFolderIdx = composeContent.services.windows.volumes.findIndex(vol => vol.includes(\"/storage\"));\n        \n        if (storageFolderIdx === -1) {\n            logger.warn(\"No /storage volume found in compose template, adding one...\");\n            composeContent.services.windows.volumes.push(`${this.conf.installFolder}:/storage`);\n        } else {\n            composeContent.services.windows.volumes[storageFolderIdx] = `${this.conf.installFolder}:/storage`;\n        }\n\n        // Shared folder mapping\n        const sharedFolderIdx = composeContent.services.windows.volumes.findIndex(vol => vol.includes(\"/shared\"));\n        \n        if (!this.conf.sharedFolderPath) {\n            // Remove shared folder if not enabled\n            if (sharedFolderIdx !== -1) {\n                composeContent.services.windows.volumes.splice(sharedFolderIdx, 1);\n                logger.info(\"Removed shared folder as per user configuration\");\n            }\n        } else {\n            // Add or update shared folder\n            const volumeStr = `${this.conf.sharedFolderPath}:/shared`;\n            \n            if (sharedFolderIdx === -1) {\n                composeContent.services.windows.volumes.push(volumeStr);\n                logger.info(`Added shared folder: ${this.conf.sharedFolderPath}`);\n            } else {\n                composeContent.services.windows.volumes[sharedFolderIdx] = volumeStr;\n                logger.info(`Updated shared folder to: ${this.conf.sharedFolderPath}`);\n            }\n        }\n\n        // Write the compose file\n        this.container.writeCompose(composeContent);\n    }\n\n    async createOEMAssets() {\n        this.changeState(InstallStates.CREATING_OEM);\n        logger.info(\"Creating OEM assets\");\n\n        const oemPath = path.join(WINBOAT_DIR, \"oem\"); // Fixed the path separator\n\n        // Create OEM directory if it doesn’t exist\n        if (!fs.existsSync(oemPath)) {\n            fs.mkdirSync(oemPath, { recursive: true });\n            logger.info(`Created OEM directory: ${oemPath}`);\n        }\n\n        // Determine the source path based on whether the app is bundled\n        const appPath = remote.app.isPackaged\n            ? path.join(process.resourcesPath, \"guest_server\") // For packaged app\n            : path.join(remote.app.getAppPath(), \"..\", \"..\", \"guest_server\"); // For dev mode\n\n        logger.info(`Guest server source path: ${appPath}`);\n\n        // Check if the source directory exists\n        if (!fs.existsSync(appPath)) {\n            const error = new Error(`Guest server directory not found at: ${appPath}`);\n            logger.error(error.message);\n            throw error;\n        }\n\n        const copyRecursive = (src: string, dest: string) => {\n            const stats = fs.statSync(src);\n\n            if (stats.isDirectory()) {\n                // Create directory if it doesn't exist\n                if (!fs.existsSync(dest)) {\n                    fs.mkdirSync(dest, { recursive: true });\n                }\n\n                // Copy all contents\n                fs.readdirSync(src).forEach(entry => {\n                    const srcPath = path.join(src, entry);\n                    const destPath = path.join(dest, entry);\n                    copyRecursive(srcPath, destPath);\n                });\n\n                logger.info(`Copied directory ${src} to ${dest}`);\n            } else {\n                // Copy file\n                fs.copyFileSync(src, dest);\n                logger.info(`Copied file ${src} to ${dest}`);\n            }\n        };\n\n        // Copy all files from guest_server to oemPath\n        try {\n            fs.readdirSync(appPath).forEach(entry => {\n                const srcPath = path.join(appPath, entry);\n                const destPath = path.join(oemPath, entry);\n                copyRecursive(srcPath, destPath);\n            });\n            logger.info(\"OEM assets created successfully\");\n        } catch (error) {\n            logger.error(`Failed to copy OEM assets: ${error}`);\n            throw error;\n        }\n\n        // Create password hash file in oemPath\n        try {\n            const hash = await argon2.hash(this.conf.password);\n            fs.writeFileSync(path.join(oemPath, \"auth.hash\"), hash, { encoding: \"utf8\" });\n        } catch (error) {\n            logger.error(`Failed to create password hash: ${error}`);\n            throw error;\n        }\n    }\n\n    async startContainer() {\n        this.changeState(InstallStates.STARTING_CONTAINER);\n        logger.info(\"Starting container...\");\n\n        // Start the container\n        await this.container.compose(\"up\");\n\n        // Cache ports\n        await this.container.port();\n\n        // emit vnc port event\n        this.emitter.emit(\"vncPortChanged\", getActiveHostPort(this.container, CommonPorts.NOVNC)!);\n\n        logger.info(\"Container started successfully.\");\n    }\n\n    async monitorContainerPreinstall() {\n        // Sleep a bit to make sure the webserver is up in the container\n        await this.sleep(3000);\n\n        this.changeState(InstallStates.MONITORING_PREINSTALL);\n        logger.info(\"Starting preinstall monitoring...\");\n\n        const re = new RegExp(/>([^<]+)</);\n        while (true) {\n            try {\n                const vncHostPort = getActiveHostPort(this.container, CommonPorts.NOVNC)!;\n                const response = await nodeFetch(`http://127.0.0.1:${vncHostPort}/msg.html`, {\n                    signal: AbortSignal.timeout(500),\n                });\n\n                if (response.status === 404) {\n                    logger.info(\"Received 404, preinstall completed\");\n                    return; // Exit the method when we get 404\n                }\n\n                const message = await response.text();\n                const messageFormatted = re.exec(message)?.[1] || message;\n                this.setPreinstallMsg(messageFormatted);\n            } catch (error) {\n                if (error instanceof Error && error.message.includes(\"404\")) {\n                    logger.info(\"Received 404, preinstall completed\");\n                    return; // Exit the method when fetch throws 404\n                }\n\n                logger.error(`Error monitoring container: ${error}`);\n                throw error;\n            }\n\n            // Wait 500ms before next check\n            await this.sleep(500);\n        }\n    }\n\n    async monitorAPIHealth() {\n        this.changeState(InstallStates.INSTALLING_WINDOWS);\n        logger.info(\"Waiting for WinBoat Guest Server to wrap up installation...\");\n\n        let attempts = 0;\n\n        while (true) {\n            const start = performance.now();\n\n            try {\n                const apiHostPort = getActiveHostPort(this.container, CommonPorts.API)!;\n                const res = await nodeFetch(`http://127.0.0.1:${apiHostPort}/health`, {\n                    signal: AbortSignal.timeout(5000),\n                });\n\n                if (res.status === 200) {\n                    logger.info(\"WinBoat Guest Server is up and healthy!\");\n                    this.changeState(InstallStates.COMPLETED);\n\n                    const compose = Winboat.readCompose(this.container.composeFilePath);\n                    const filteredVolumes = compose.services.windows.volumes.filter(\n                        volume => !volume.endsWith(\"/boot.iso\"),\n                    );\n\n                    if (compose.services.windows.volumes.length !== filteredVolumes.length) {\n                        compose.services.windows.volumes = filteredVolumes;\n                        this.container.writeCompose(compose);\n                    }\n\n                    return;\n                }\n\n                logger.log(`API request status: ${res.status}`);\n            } catch (error) {\n                // We can ignore the AbortError resulting from the timeout\n                if (!(error instanceof nodeFetch.AbortError)) {\n                    logger.error(error);\n                }\n            }\n\n            if (++attempts % 12 === 0) {\n                logger.info(`API not responding yet, still waiting after ${(attempts * 5) / 60} minutes...`);\n            }\n\n            await this.sleep(5000 - (performance.now() - start));\n        }\n    }\n\n    async install() {\n        logger.info(\"Starting installation...\");\n\n        try {\n            await this.createComposeFile();\n            await this.createOEMAssets();\n            await this.startContainer();\n            await this.monitorContainerPreinstall();\n            await this.monitorAPIHealth();\n        } catch (e) {\n            this.changeState(InstallStates.INSTALL_ERROR);\n            logger.error(\"Errors encountered, could not complete the installation steps.\");\n            logger.error(e);\n            return;\n        }\n        this.changeState(InstallStates.COMPLETED);\n\n        logger.info(\"Installation completed successfully.\");\n    }\n}\n\nexport async function isInstalled(): Promise<boolean> {\n    // Check if a winboat container exists\n    const config = WinboatConfig.readConfigObject(false);\n\n    if (!config) return false;\n\n    const containerRuntime = createContainer(config.containerRuntime);\n\n    return await containerRuntime.exists();\n}\n"
  },
  {
    "path": "src/renderer/lib/migrate.ts",
    "content": "import { createLogger } from \"../utils/log\";\nimport { ComposePortMapper, Range } from \"../utils/port\";\nimport { WinboatConfig } from \"./config\";\nimport { WINBOAT_DIR } from \"./constants\";\nimport { CommonPorts, createContainer } from \"./containers/common\";\nimport { ContainerManager } from \"./containers/container\";\nimport { Winboat } from \"./winboat\";\n\nconst path: typeof import(\"path\") = require(\"path\");\nconst logger = createLogger(path.join(WINBOAT_DIR, \"migrations.log\"));\n\n/**\n * This function performs the necessary automatic migrations\n * when updating to newer versions of WinBoat\n */\nexport async function performAutoMigrations(): Promise<void> {\n    logger.info(\"[performAutoMigrations]: Starting automatic migrations\");\n\n    const wbConfig = WinboatConfig.getInstance(); // Get WinboatConfig instance\n    const containerManager = createContainer(wbConfig.config.containerRuntime);\n    const composeMapper = new ComposePortMapper(Winboat.readCompose(containerManager.composeFilePath))\n    \n    try {\n        // In case of a version prior to 0.9.0, the NoVNC port will be set to the default 8006\n        // which is how we know we need to perform the migration, because from 0.9.0 we can rely\n        // on the stored version strings\n        const novncMapping = composeMapper.getShortPortMapping(CommonPorts.NOVNC);\n        console.log(composeMapper);\n        if (!Range.isRange(novncMapping!.host) && novncMapping!.host === CommonPorts.NOVNC) {\n            await migrateComposePorts_Pre090(containerManager);\n        }\n    }\n    catch (e: any) {\n        logger.error(\"[performAutoMigrations]: Automatic migrations failed\");\n        logger.error(e.message ?? e);\n        return;\n    }\n\n    logger.info(\"[performAutoMigrations]: Finished automatic migrations\");\n}\n\n/**\n * Perform compose port migrations for pre-0.9.0 installations\n */\nasync function migrateComposePorts_Pre090(containerManager: ContainerManager): Promise<void> {\n    logger.info(\"[migrateComposePorts_Pre090]: Performing migrations for 0.9.0\");\n\n    // Compose migration\n    if (await containerManager.exists()) {\n        logger.info(\"[migrateComposePorts_Pre090]: Composing down current WinBoat container\");\n        await containerManager.compose(\"down\");\n    }\n\n    const currentCompose = Winboat.readCompose(containerManager.composeFilePath);\n    const defaultCompose = containerManager.defaultCompose;\n\n    currentCompose.services.windows.ports = defaultCompose.services.windows.ports;\n    currentCompose.services.windows.image = defaultCompose.services.windows.image;\n    currentCompose.services.windows.environment[\"USER_PORTS\"] = defaultCompose.services.windows.environment[\"USER_PORTS\"];\n\n    containerManager.writeCompose(currentCompose);\n\n    logger.info(\"[migrateComposePorts_Pre090]: Composing up WinBoat container\");\n    await containerManager.compose(\"up\", [\"--no-start\"]);\n}"
  },
  {
    "path": "src/renderer/lib/qmp.ts",
    "content": "import { WINBOAT_DIR } from \"./constants\";\nimport { createLogger } from \"../utils/log\";\nconst path: typeof import(\"path\") = require(\"node:path\");\nimport { type Socket } from \"net\";\nimport { assert } from \"@vueuse/core\";\nconst { createConnection }: typeof import(\"net\") = require(\"node:net\");\n\nconst logger = createLogger(path.join(WINBOAT_DIR, \"qmp.log\"));\n\ntype QMPStatus = \"Connected\" | \"Closed\";\n\ntype QMPGreeting = {\n    QMP: {\n        version: {\n            qemu: {\n                micro: string;\n                minor: string;\n                major: string;\n            };\n            package: string;\n        };\n        capabilities: any[];\n    };\n};\n\ntype QMPCommandInfo = {\n    name: string;\n};\n\ntype QMPStatusInfo = {\n    running: boolean;\n    status: string;\n};\n\ntype QMPObjectPropertyInfo = {\n    name: string;\n    type: \"u8\" | \"u16\" | \"bool\" | \"str\" | \"double\" | string;\n    description?: string;\n    \"default-value\"?: string;\n};\n\ntype QMPBlockInfo = {\n    device: string;\n    qdev?: string;\n    type: string;\n    removable: boolean;\n    locked: boolean;\n    tray_open?: boolean;\n    io_status?: object;\n    inserted?: object;\n};\n\ntype QMPError = {\n    error: object;\n};\n\ntype QMPReturn<T> = T extends never ? never : { return: T } | QMPError;\n\ntype QMPCommandWithArgs = \"human-monitor-command\" | \"device_add\" | \"device_del\" | \"device-list-properties\";\ntype QMPCommandNoArgs = \"qmp_capabilities\" | \"query-commands\" | \"query-status\" | \"query-block\";\ntype QMPCommand = QMPCommandWithArgs | QMPCommandNoArgs;\n\ntype QMPArgumentProps = {\n    \"command-line\": string;\n    driver: string;\n    id: string;\n    vendorid: number;\n    productid: number;\n    hostbus: number;\n    hostaddr: number;\n    hostdevice: string;\n    typename: string;\n};\n\ntype QMPArgument<T extends keyof QMPArgumentProps> =\n    | {\n          [Prop in T]?: QMPArgumentProps[Prop];\n      }\n    | \"none\";\n\ntype QMPCommandExpectedArgument<T extends QMPCommand> = T extends \"human-monitor-command\"\n    ? QMPArgument<\"command-line\">\n    : T extends \"device_add\"\n      ? QMPArgument<\"driver\" | \"id\" | \"productid\" | \"vendorid\" | \"hostbus\" | \"hostaddr\" | \"hostdevice\">\n      : T extends \"device_del\"\n        ? QMPArgument<\"id\">\n        : T extends \"device-list-properties\"\n          ? QMPArgument<\"typename\">\n          : never;\n\n// TODO: determine return type of device_add and device_del\nexport type QMPResponse<T extends QMPCommand> = QMPReturn<\n    T extends \"qmp_capabilities\"\n        ? QMPGreeting\n        : T extends \"query-commands\"\n          ? QMPCommandInfo[]\n          : T extends \"query-status\"\n            ? QMPStatusInfo\n            : T extends \"human-monitor-command\"\n              ? string\n              : T extends \"device_add\"\n                ? object\n                : T extends \"device_del\"\n                  ? string // TODO: change this\n                  : T extends \"device-list-properties\"\n                    ? QMPObjectPropertyInfo[]\n                    : T extends \"query-block\"\n                      ? QMPBlockInfo[]\n                      : never\n>;\n\nexport class QMPManager {\n    private static readonly IS_ALIVE_TIMEOUT = 2000;\n    qmpSocket: Socket;\n\n    /**\n     * Please use {@link QMPManager.createConnection} instead.\n     */\n    constructor(socket: Socket) {\n        this.qmpSocket = socket;\n    }\n\n    /**\n     * Creates a new {@link QMPManager} instance, returning a promise that resolves after the socket successfully connected\n     *\n     * May block if there is another connection taking up the socket, so be careful!\n     *\n     * @param host - The hostname of the qmp connection (e.g. 0.0.0.0, 127.0.0.1)\n     * @param port - The port of the qmp connection (e.g. 6969, 420)\n     *\n     */\n    static async createConnection(host: string, port: number): Promise<QMPManager> {\n        return new Promise((resolve, reject) => {\n            const socket = createConnection({ host, port }, () => {\n                socket.once(\"error\", reject);\n                socket.once(\"data\", data => {\n                    try {\n                        const response = JSON.parse(data.toString());\n\n                        if (\"QMP\" in response) {\n                            return resolve(new QMPManager(socket));\n                        }\n\n                        reject(new Error(`Invalid QMP response: ${data.toString()}`));\n                    } catch (e) {\n                        logger.error(e);\n                        logger.error(`QMP request 'data.toString()': ${data.toString()}`);\n                        reject(e);\n                    }\n                });\n            });\n        });\n    }\n\n    /**\n     * Executes the QMP command specified by `command`.\n     *\n     * Optionally, you can specify an argument for given command if it requires one.\n     *\n     * @param command\n     *\n     */\n    async executeCommand<C extends QMPCommandNoArgs>(command: C): Promise<QMPResponse<C>>;\n    async executeCommand<C extends QMPCommandWithArgs>(\n        command: C,\n        qmpArgument: QMPCommandExpectedArgument<C>,\n    ): Promise<QMPResponse<C>>;\n    async executeCommand<C extends QMPCommand>(\n        command: C,\n        qmpArgument?: QMPCommandExpectedArgument<C>,\n    ): Promise<QMPResponse<C>> {\n        const message = {\n            execute: command,\n            ...(qmpArgument && { arguments: qmpArgument }),\n        };\n\n        return new Promise<QMPResponse<C>>((resolve, reject) => {\n            this.qmpSocket.write(JSON.stringify(message), err => {\n                if (err) {\n                    logger.error(err);\n                    reject(err);\n                }\n\n                // This callback processes data received from the QMP socket\n                const receiveData = (data: Buffer) => {\n                    try {\n                        const parsedData = JSON.parse(data.toString());\n                        if (\"event\" in parsedData) return; // In case we get notified of an event (for example NETDEV_STREAM_CONNECTED), we ignore it\n\n                        // We remove our callback from the data event when we get the response\n                        this.qmpSocket.off(\"data\", receiveData);\n                        resolve(JSON.parse(data.toString()));\n                    } catch (e) {\n                        logger.error(e);\n                        logger.error(`QMP request 'data.toString()': ${data.toString()}`);\n                        reject(e);\n                    }\n                };\n\n                // We can't do 'qmpSocket.once', since we may get an event notice in between sending the command and receiving the response.\n                this.qmpSocket.on(\"data\", receiveData);\n            });\n        });\n    }\n\n    /**\n     * Checks whether the socket is still alive, then queries the status of the QMP connection.\n     *\n     * @returns True if the socket is alive and if the QMP command `query-status` returned without errors.\n     *\n     */\n    async isAlive(): Promise<boolean> {\n        return new Promise(async (resolve, _) => {\n            if (this.qmpSocket.closed || this.qmpSocket.destroyed) {\n                return resolve(false);\n            }\n\n            const tm = setTimeout(_ => {\n                logger.warn(\"Querying status of QMP connection timed out.\");\n                resolve(false);\n            }, QMPManager.IS_ALIVE_TIMEOUT);\n\n            this.executeCommand(\"query-status\")\n                .then(response => {\n                    assert(\"return\" in response);\n                    clearTimeout(tm);\n                    resolve(true);\n                })\n                .catch(e => {\n                    logger.error(`There was an error querying status of QMP connection`);\n                    logger.error(e);\n                })\n                .finally(() => {\n                    clearTimeout(tm);\n                    resolve(false);\n                });\n        });\n    }\n\n    private static handleError(e: unknown, msg?: string) {}\n}\n"
  },
  {
    "path": "src/renderer/lib/specs.ts",
    "content": "import { getFreeRDP } from \"../utils/getFreeRDP\";\nimport { ContainerSpecs } from \"./containers/common\";\nconst fs: typeof import(\"fs\") = require(\"node:fs\");\nconst { exec }: typeof import(\"child_process\") = require(\"node:child_process\");\nconst { promisify }: typeof import(\"util\") = require(\"node:util\");\nconst execAsync = promisify(exec);\n\nexport function satisfiesPrequisites(specs: Specs, containerSpecs?: ContainerSpecs) {\n    return (\n        containerSpecs &&\n        Object.values(containerSpecs).every(x => x) &&\n        specs.freeRDP3Installed &&\n        specs.kvmEnabled &&\n        specs.ramGB >= 4 &&\n        specs.cpuCores >= 2\n    );\n}\n\nexport const defaultSpecs: Specs = {\n    cpuCores: 0,\n    ramGB: 0,\n    kvmEnabled: false,\n    freeRDP3Installed: false,\n};\n\nexport async function getSpecs() {\n    const specs: Specs = { ...defaultSpecs };\n\n    // Physical CPU cores check\n    try {\n        const res = (await execAsync('lscpu -p | egrep -v \"^#\" | sort -u -t, -k 2,4 | wc -l')).stdout;\n        specs.cpuCores = Number.parseInt(res.trim(), 10);\n    } catch (e) {\n        console.error(\"Error getting CPU cores:\", e);\n    }\n\n    // TODO: These commands might silently fail\n    // But if they do, it means something wasn't right to begin with\n    try {\n        const memoryInfo = await getMemoryInfo();\n        specs.ramGB = memoryInfo.totalGB;\n    } catch (e) {\n        console.error(\"Error reading /proc/meminfo:\", e);\n    }\n\n    // KVM check\n    try {\n        const cpuInfo = fs.readFileSync(\"/proc/cpuinfo\", \"utf8\");\n        if ((cpuInfo.includes(\"vmx\") || cpuInfo.includes(\"svm\")) && fs.existsSync(\"/dev/kvm\")) {\n            specs.kvmEnabled = true;\n        }\n    } catch (e) {\n        console.error(\"Error reading /proc/cpuinfo or checking /dev/kvm:\", e);\n    }\n\n    // FreeRDP 3.x.x check (including Flatpak)\n    try {\n        const freeRDPBin = await getFreeRDP();\n        specs.freeRDP3Installed = !!freeRDPBin;\n    } catch (e) {\n        console.error(\"Error checking FreeRDP 3.x.x installation (most likely not installed):\", e);\n    }\n\n    console.log(\"Specs:\", specs);\n    return specs;\n}\n\nexport type MemoryInfo = {\n    totalGB: number;\n    availableGB: number;\n};\n\nexport async function getMemoryInfo() {\n    try {\n        const memoryInfo: MemoryInfo = {\n            totalGB: 0,\n            availableGB: 0,\n        };\n        const memInfo = fs.readFileSync(\"/proc/meminfo\", \"utf8\");\n        const totalMemLine = memInfo.split(\"\\n\").find(line => line.startsWith(\"MemTotal\"));\n        const availableMemLine = memInfo.split(\"\\n\").find(line => line.startsWith(\"MemAvailable\"));\n        if (totalMemLine) {\n            memoryInfo.totalGB = Math.round((Number.parseInt(totalMemLine.split(/\\s+/)[1]) / 1024 / 1024) * 100) / 100;\n        }\n\n        if (availableMemLine) {\n            memoryInfo.availableGB =\n                Math.round((Number.parseInt(availableMemLine.split(/\\s+/)[1]) / 1024 / 1024) * 100) / 100;\n        }\n\n        return memoryInfo;\n    } catch (e) {\n        console.error(\"Error reading /proc/meminfo:\", e);\n        throw e;\n    }\n}\n"
  },
  {
    "path": "src/renderer/lib/usbmanager.ts",
    "content": "import { type Device } from \"usb\";\nimport { type Ref, ref, watch } from \"vue\";\nimport { logger, Winboat } from \"./winboat\";\nimport { WinboatConfig } from \"./config\";\nimport { assert } from \"@vueuse/core\";\n\nconst { usb, getDeviceList }: typeof import(\"usb\") = require(\"usb\");\nconst fs: typeof import(\"node:fs\") = require(\"node:fs\");\nconst { execFileSync }: typeof import(\"node:child_process\") = require(\"node:child_process\");\nconst remote: typeof import(\"@electron/remote\") = require(\"@electron/remote\");\nconst path: typeof import(\"node:path\") = require(\"node:path\");\n\ntype LinuxDeviceDatabase = Record<string, { name: string; devices: Record<string, string> }>;\n\ntype DeviceStrings = {\n    // Manufacturer or Vendor string\n    manufacturer: string | null;\n    // Product string\n    product: string | null;\n};\n\nexport type PTSerializableDeviceInfo = {\n    // USB Vendor ID\n    vendorId: number;\n    // USB Product ID;\n    productId: number;\n} & DeviceStrings;\n\ntype VidPidHex = {\n    // USB Vendor ID in hex\n    vendorIdHex: string;\n    // USB Product ID in hex\n    productIdHex: string;\n};\n\nexport class USBManager {\n    private static instance: USBManager | null = null;\n    // Current list of USB devices\n    devices: Ref<Device[]> = ref([]);\n    // Current list of passed-through USB devices\n    ptDevices: Ref<PTSerializableDeviceInfo[]> = ref([]);\n    // ^^ To be kept in sync with WinboatConfig.config.passedThroughDevices\n\n    readonly #linuxDeviceDatabase: LinuxDeviceDatabase = {};\n    readonly #deviceStringCache: Map<string, DeviceStrings> = new Map<string, DeviceStrings>();\n    readonly #mtpDeviceCache: Map<string, boolean> = new Map<string, boolean>();\n    readonly #winboat: Winboat = Winboat.getInstance();\n    readonly #wbConfig: WinboatConfig = WinboatConfig.getInstance();\n\n    static getInstance() {\n        USBManager.instance ??= new USBManager();\n        return USBManager.instance;\n    }\n\n    private constructor() {\n        this.#linuxDeviceDatabase = readLinuxDeviceDatabase();\n        this.devices.value = getDeviceList();\n        // Pre-cache existing devices, otherwise on detach we won't have any info about them\n        // if they are not in the database\n        this.devices.value.forEach(d => this.stringifyDevice(d));\n        this.ptDevices.value = this.#wbConfig.config.passedThroughDevices;\n        this.#setupDeviceUpdateListeners();\n        this.#setupGuestListener();\n    }\n\n    /**\n     * Sets up listeners for USB device attach and detach events\n     */\n    #setupDeviceUpdateListeners() {\n        usb.on(\"attach\", async (device: Device) => {\n            this.devices.value = getDeviceList();\n            logger.info(`USB device attached: ${this.stringifyDevice(device)}`);\n            if (\n                this.#winboat.isOnline.value &&\n                this.isDeviceInPassthroughList(device) &&\n                !(await this.#QMPCheckIfDeviceExists(\n                    device.deviceDescriptor.idVendor,\n                    device.deviceDescriptor.idProduct,\n                ))\n            ) {\n                logger.info(`Device is in passthrough list, adding to VM: ${this.stringifyDevice(device)}`);\n                await this.#QMPAddDevice(device);\n            }\n        });\n\n        usb.on(\"detach\", async (device: Device) => {\n            this.devices.value = getDeviceList();\n\n            // Remove from MTP cache\n            const { vendorIdHex, productIdHex } = this.getDeviceVidPidHex(device);\n            const cacheKey = `${vendorIdHex}:${productIdHex}`;\n            this.#mtpDeviceCache.delete(cacheKey);\n\n            logger.info(`USB device detached: ${this.stringifyDevice(device)}`);\n            if (\n                this.#winboat.isOnline.value &&\n                this.isDeviceInPassthroughList(device) &&\n                (await this.#QMPCheckIfDeviceExists(\n                    device.deviceDescriptor.idVendor,\n                    device.deviceDescriptor.idProduct,\n                ))\n            ) {\n                logger.info(`Device is in passthrough list, removing from VM: ${this.stringifyDevice(device)}`);\n                await this.#QMPRemoveDevice(device.deviceDescriptor.idVendor, device.deviceDescriptor.idProduct);\n            }\n        });\n    }\n\n    /**\n     * Sets up the listener responsible for passing through devices in bulk when the guest is online\n     */\n    #setupGuestListener() {\n        // TODO: This should depend on QMP Manager instead, but that approach also has subtle pitfalls\n        // We are not guaranteed at this point to have a QMP Manager\n        watch(this.#winboat.isOnline, async (isOnline: boolean) => {\n            if (!isOnline) return;\n\n            logger.info(\"Guest is online, passing through devices\");\n            // Pass through any devices that are in the passthrough list & connected\n            for (const ptDevice of this.#wbConfig.config.passedThroughDevices) {\n                if (\n                    this.isPTDeviceConnected(ptDevice) &&\n                    !(await this.#QMPCheckIfDeviceExists(ptDevice.vendorId, ptDevice.productId))\n                ) {\n                    logger.info(\n                        `Pass-through device ${this.stringifyPTSerializableDevice(ptDevice)} is connected, adding to VM`,\n                    );\n                    const device = this.devices.value.find(\n                        d =>\n                            d.deviceDescriptor.idVendor === ptDevice.vendorId &&\n                            d.deviceDescriptor.idProduct === ptDevice.productId,\n                    )!;\n                    await this.#QMPAddDevice(device);\n                }\n            }\n        });\n    }\n\n    /**\n     * Turns a USB device into a human-readable string\n     * @param device The USB device to stringify\n     * @returns A human-readable string representing the USB device\n     */\n    stringifyDevice(device: Device): string {\n        const { vendorIdHex, productIdHex } = this.getDeviceVidPidHex(device);\n\n        // Check cache first\n        const cacheKey = `${vendorIdHex}:${productIdHex}`;\n        if (this.#deviceStringCache.has(cacheKey)) {\n            const cached = this.#deviceStringCache.get(cacheKey)!;\n            return `[${vendorIdHex}:${productIdHex}] ${cached.manufacturer || \"Unknown Vendor\"} | ${\n                cached.product || \"Unknown Product\"\n            }`;\n        }\n\n        let vendor = this.#linuxDeviceDatabase[vendorIdHex];\n        let product = vendor?.devices[productIdHex];\n\n        // Many devices are not included in the database, but the device itself may have string descriptors\n        // Unfortunately, we don't seem to have permission to open the devices directly to read the string descriptors\n        // directly through the USB library, so we have to use lsusb as a fallback\n        try {\n            if (!product) {\n                const deviceStrings = getDeviceStringsFromLsusb(vendorIdHex, productIdHex);\n                product = deviceStrings.product!;\n            }\n\n            if (!vendor?.name) {\n                const deviceStrings = getDeviceStringsFromLsusb(vendorIdHex, productIdHex);\n\n                if (deviceStrings.manufacturer) {\n                    vendor = { name: deviceStrings.manufacturer, devices: {} };\n                }\n            }\n        } catch (e) {\n            logger.error(`Error fetching string descriptors for USB device ${vendorIdHex}:${productIdHex}`);\n            logger.error(e);\n        }\n\n        this.#deviceStringCache.set(`${vendorIdHex}:${productIdHex}`, {\n            manufacturer: vendor?.name || null,\n            product: product || null,\n        });\n\n        // Format: [VID:PID] Vendor Name | Product Name\n        return `[${vendorIdHex}:${productIdHex}] ${vendor ? vendor.name : \"Unknown Vendor\"} | ${product || \"Unknown Product\"}`;\n    }\n\n    /**\n     * Converts a pass-through serializable device info object to a human-readable string\n     * @param device The PTSerializableDeviceInfo object to stringify\n     * @returns A human-readable string representing the USB device\n     */\n    stringifyPTSerializableDevice(device: PTSerializableDeviceInfo): string {\n        const { vendorIdHex, productIdHex } = this.getDeviceVidPidHex(device);\n\n        // Format: [VID:PID] Vendor Name | Product Name\n        return `[${vendorIdHex}:${productIdHex}] ${device.manufacturer || \"Unknown Vendor\"} | ${\n            device.product || \"Unknown Product\"\n        }`;\n    }\n\n    /**\n     * Converts a USB device to a pass-through serializable device info object\n     * @param device The USB device to convert\n     * @returns A PTSerializableDeviceInfo object representing the USB device\n     */\n    #convertDeviceToPTSerializable(device: Device): PTSerializableDeviceInfo {\n        const { vendorIdHex, productIdHex } = this.getDeviceVidPidHex(device);\n\n        const deviceStrings = this.#deviceStringCache.get(`${vendorIdHex}:${productIdHex}`);\n\n        if (!deviceStrings) {\n            throw new Error(`Device strings for device ${vendorIdHex}:${productIdHex} not found in cache.\\\n                Make sure to call stringifyDevice() at least once before converting.`);\n        }\n\n        return {\n            vendorId: device.deviceDescriptor.idVendor,\n            productId: device.deviceDescriptor.idProduct,\n            ...this.#deviceStringCache.get(`${vendorIdHex}:${productIdHex}`)!,\n        };\n    }\n\n    /**\n     * Adds a USB device to the passthrough list\n     * @param device The USB device to add\n     */\n    async addDeviceToPassthroughList(device: Device) {\n        const ptDevice = this.#convertDeviceToPTSerializable(device);\n\n        // Avoid duplicates\n        if (\n            this.#wbConfig.config.passedThroughDevices.some(\n                d => d.vendorId === ptDevice.vendorId && d.productId === ptDevice.productId,\n            )\n        ) {\n            throw new Error(\n                `Device \"${ptDevice.manufacturer} | ${ptDevice.product}\" is already in the passthrough list`,\n            );\n        }\n\n        // Push doesn't properly track reactivity, so we use concat instead\n        this.#wbConfig.config.passedThroughDevices = this.#wbConfig.config.passedThroughDevices.concat(ptDevice);\n        this.ptDevices.value = this.#wbConfig.config.passedThroughDevices;\n\n        if (\n            this.#winboat.isOnline.value &&\n            !(await this.#QMPCheckIfDeviceExists(ptDevice.vendorId, ptDevice.productId))\n        ) {\n            await this.#QMPAddDevice(device);\n        }\n\n        logger.info(`Added device \"${ptDevice.manufacturer} | ${ptDevice.product}\" to passthrough list`);\n    }\n\n    /**\n     * Removes a USB device from the passthrough list\n     * @param ptDevice The device's PTSerializableDeviceInfo object to remove\n     */\n    async removeDeviceFromPassthroughList(ptDevice: PTSerializableDeviceInfo) {\n        this.#wbConfig.config.passedThroughDevices = this.#wbConfig.config.passedThroughDevices.filter(\n            d => d.vendorId !== ptDevice.vendorId || d.productId !== ptDevice.productId,\n        );\n        this.ptDevices.value = this.#wbConfig.config.passedThroughDevices;\n\n        if (\n            this.#winboat.isOnline.value &&\n            (await this.#QMPCheckIfDeviceExists(ptDevice.vendorId, ptDevice.productId))\n        ) {\n            await this.#QMPRemoveDevice(ptDevice.vendorId, ptDevice.productId);\n        }\n\n        logger.info(`Removed device \"${ptDevice.manufacturer} | ${ptDevice.product}\" from passthrough list`);\n    }\n\n    /**\n     * Determines if a USB device is in the passthrough list\n     * @param device The USB device to check\n     * @returns A boolean indicating whether the device is in the passthrough list\n     */\n    isDeviceInPassthroughList(device: Device): boolean {\n        const ptDevice = this.#convertDeviceToPTSerializable(device);\n        return this.#wbConfig.config.passedThroughDevices.some(\n            d => d.vendorId === ptDevice.vendorId && d.productId === ptDevice.productId,\n        );\n    }\n\n    /**\n     * Determines if a pass-through device is connected\n     * @param ptDevice The PTSerializableDeviceInfo object to check\n     * @returns A boolean indicating whether the device is connected\n     */\n    isPTDeviceConnected(ptDevice: PTSerializableDeviceInfo): boolean {\n        return this.devices.value.some(\n            d =>\n                d.deviceDescriptor.idVendor === ptDevice.vendorId &&\n                d.deviceDescriptor.idProduct === ptDevice.productId,\n        );\n    }\n\n    /**\n     * Removes all passed through devices from the passthrough list\n     * and the WinBoat configuration object\n     */\n    async removeAllPassthroughDevicesAndConfig() {\n        for (const device of this.ptDevices.value) {\n            await this.removeDeviceFromPassthroughList(device);\n        }\n        this.#wbConfig.config.passedThroughDevices = [];\n        this.ptDevices.value = [];\n    }\n\n    /**\n     * Checks whether a {@link PTSerializableDeviceInfo} object or {@link Device} USB device is an MTP device or not\n     * @param device {@link PTSerializableDeviceInfo} object or {@link Device} USB device\n     */\n    isMTPDevice(device: PTSerializableDeviceInfo): boolean;\n    isMTPDevice(device: Device): boolean;\n    isMTPDevice(device: PTSerializableDeviceInfo | Device) {\n        const { vendorIdHex, productIdHex } = this.getDeviceVidPidHex(device);\n\n        // Check cache first\n        const cacheKey = `${vendorIdHex}:${productIdHex}`;\n        const cacheEntry = this.#mtpDeviceCache.get(cacheKey);\n        if (this.#mtpDeviceCache.get(cacheKey) !== undefined) {\n            return cacheEntry!;\n        }\n\n        // If the device is not a PTSerializableDeviceInfo & not connected\n        if (\"vendorId\" in device && !this.isPTDeviceConnected(device)) {\n            return false;\n        }\n\n        // Lookup MTP\n        const lsusbOutput = execFileSync(\"lsusb\", [\"-vd\", `${vendorIdHex}:${productIdHex}`], { encoding: \"utf8\" });\n        const isMTP = lsusbOutput.includes(\"MTP\");\n\n        // Set cache and return\n        this.#mtpDeviceCache.set(cacheKey, isMTP);\n        return isMTP;\n    }\n\n    /**\n     * Gets the Vendor ID and Product ID of a {@link PTSerializableDeviceInfo} object or {@link Device} USB device\n     * @param device The {@link PTSerializableDeviceInfo} object or {@link Device} USB device to check\n     */\n    getDeviceVidPidHex(device: PTSerializableDeviceInfo | Device): VidPidHex {\n        const ret = { vendorIdHex: \"\", productIdHex: \"\" };\n        if (\"vendorId\" in device) {\n            ret.vendorIdHex = device.vendorId.toString(16).padStart(4, \"0\");\n            ret.productIdHex = device.productId.toString(16).padStart(4, \"0\");\n        } else {\n            ret.vendorIdHex = device.deviceDescriptor.idVendor.toString(16).padStart(4, \"0\");\n            ret.productIdHex = device.deviceDescriptor.idProduct.toString(16).padStart(4, \"0\");\n        }\n\n        return ret;\n    }\n\n    async #QMPCheckIfDeviceExists(vendorId: number, productId: number): Promise<boolean> {\n        let response = null;\n        try {\n            response = await this.#winboat.qmpMgr!.executeCommand(\"human-monitor-command\", {\n                \"command-line\": \"info qtree\",\n            });\n            assert(\"result\" in response);\n\n            // @ts-ignore property \"result\" already exists due to assert\n            return response.return.includes(`usb-host, id \"${vendorId}:${productId}\"`);\n        } catch (e) {\n            logger.error(`There was an error checking whether USB device '${vendorId}:${productId}' exists`);\n            logger.error(e);\n            logger.error(`QMP response: ${JSON.stringify(response)}`);\n        }\n        return false;\n    }\n\n    // TODO: handle hostaddr/hostbus in case of duplicate VID/PID\n    async #QMPAddDevice(device: Device) {\n        let response = null;\n        const vendorid = device.deviceDescriptor.idVendor;\n        const productid = device.deviceDescriptor.idProduct;\n        const deviceBusPath = `/dev/bus/usb/${String(device.busNumber).padStart(3, \"0\")}/${String(\n            device.deviceAddress,\n        ).padStart(3, \"0\")}`;\n\n        if (this.isMTPDevice(device)) {\n            freeMTPDevice(deviceBusPath);\n        }\n\n        try {\n            response = await this.#winboat.qmpMgr!.executeCommand(\"device_add\", {\n                driver: \"usb-host\",\n                id: `${vendorid}:${productid}`, // TODO: get rid of this when we support multiple devices of the same kind\n                vendorid,\n                productid,\n                hostdevice: deviceBusPath,\n            });\n\n            assert(\"result\" in response);\n        } catch (e) {\n            logger.error(`There was an error adding USB device '${vendorid}:${productid}'`);\n            logger.error(e);\n            logger.error(`QMP response: ${JSON.stringify(response)}`);\n        }\n        logger.info(\"QMPAddDevice\", vendorid, productid);\n    }\n\n    async #QMPRemoveDevice(vendorId: number, productId: number) {\n        let response = null;\n        try {\n            response = await this.#winboat.qmpMgr!.executeCommand(\"device_del\", { id: `${vendorId}:${productId}` });\n            assert(\"result\" in response);\n        } catch (e) {\n            logger.error(`There was an error removing USB device '${vendorId}:${productId}'`);\n            logger.error(e);\n            logger.error(`QMP response: ${JSON.stringify(response)}`);\n        }\n        logger.info(\"QMPRemoveDevice\", vendorId, productId);\n    }\n}\n\n/**\n * Reads the Linux USB device database and returns a JSON representation.\n * @returns A JSON object representing the USB device database\n */\nfunction readLinuxDeviceDatabase(): LinuxDeviceDatabase {\n    const LINUX_DEVICE_DATABASE_PATH = \"/usr/share/hwdata/usb.ids\";\n    let dbFilePath = LINUX_DEVICE_DATABASE_PATH;\n\n    // Fallback to static file if the distro doesn't ship with usb.ids\n    if (!fs.existsSync(dbFilePath)) {\n        dbFilePath = remote.app.isPackaged\n            ? path.join(process.resourcesPath, \"data\", \"usb.ids\") // For packaged app\n            : path.join(remote.app.getAppPath(), \"..\", \"..\", \"data\", \"usb.ids\"); // For dev mode\n    }\n\n    logger.info(`Final USB database file path: ${dbFilePath}`);\n\n    const content = fs.readFileSync(dbFilePath, \"utf-8\");\n    const lines = content.split(\"\\n\");\n\n    const vendors: LinuxDeviceDatabase = {};\n    let currentVendor = null;\n\n    const vendorRegex = new RegExp(/^([0-9a-f]{4})\\s+(.+)$/i);\n    const deviceRegex = new RegExp(/^\\t([0-9a-f]{4})\\s+(.+)$/i);\n    for (const line of lines) {\n        if (line.startsWith(\"#\") || line.trim() === \"\") continue;\n\n        if (!line.startsWith(\"\\t\")) {\n            // Vendor line\n            const match = vendorRegex.exec(line);\n            if (match) {\n                currentVendor = match[1].toLowerCase();\n                vendors[currentVendor] = {\n                    name: match[2].trim(),\n                    devices: {},\n                };\n            }\n        } else if (line.startsWith(\"\\t\") && line[1] !== \"\\t\") {\n            // Device line\n            const match = deviceRegex.exec(line);\n            if (match && currentVendor) {\n                vendors[currentVendor].devices[match[1].toLowerCase()] = match[2].trim();\n            }\n        }\n    }\n\n    return vendors;\n}\n\n/**\n * Retrieves the manufacturer and product strings for a USB device using the `lsusb` command.\n * @param vidHex The vendor ID in hexadecimal format (4 characters, e.g. \"1a2b\")\n * @param pidHex The product ID in hexadecimal format (4 characters, e.g. \"1a2b\")\n * @returns An object containing the manufacturer and product strings (nulled fields if not found)\n */\nfunction getDeviceStringsFromLsusb(vidHex: string, pidHex: string): DeviceStrings {\n    try {\n        // Run lsusb -v for the specific device, suppress stderr\n        const lsusbOutput = execFileSync(\"lsusb\", [\"-d\", `${vidHex}:${pidHex}`, \"-v\"], { encoding: \"utf8\" });\n\n        // Parse manufacturer string\n        const manufacturerMatch = new RegExp(/^\\s*iManufacturer\\s+\\d+\\s+(.+)$/m).exec(lsusbOutput);\n        const manufacturer = manufacturerMatch ? manufacturerMatch[1].trim() : null;\n\n        // Parse product string\n        const productMatch = new RegExp(/^\\s*iProduct\\s+\\d+\\s+(.+)$/m).exec(lsusbOutput);\n        const product = productMatch ? productMatch[1].trim() : null;\n\n        return { manufacturer, product };\n    } catch (error) {\n        // lsusb failed (device not found, no permissions, etc.)\n        logger.error(`Failed to get device strings for ${vidHex}:${pidHex}:`, error);\n        return { manufacturer: null, product: null };\n    }\n}\n\n/**\n * Tries to free the MTP device found on `deviceBus`\n * @param deviceBus The device bus to free\n */\nfunction freeMTPDevice(deviceBus: string) {\n    try {\n        const fuserOutput = execFileSync(\"fuser\", [\"-k\", deviceBus], { encoding: \"utf8\" });\n        if (fuserOutput.includes(deviceBus)) {\n            logger.info(`[freeMTPDevice] Freed device at bus ${deviceBus}`);\n        }\n    } catch {\n        logger.info(`[freeMTPDevice] Device at ${deviceBus} either doesn't need freeing or couldn't be freed`);\n    }\n}\n"
  },
  {
    "path": "src/renderer/lib/winboat.ts",
    "content": "import { ref, type Ref } from \"vue\";\nimport { WINBOAT_DIR } from \"./constants\";\nimport type {\n    ComposeConfig,\n    CustomAppCallbacks,\n    GuestServerUpdateResponse,\n    GuestServerVersion,\n    Metrics,\n    WinApp,\n} from \"../../types\";\nimport { createLogger } from \"../utils/log\";\nimport { AppIcons } from \"../data/appicons\";\nimport YAML from \"yaml\";\nimport { InternalApps } from \"../data/internalapps\";\nimport { getFreeRDP } from \"../utils/getFreeRDP\";\nimport { openLink } from \"../utils/openLink\";\nimport { MultiMonitorMode, WinboatConfig } from \"./config\";\nimport { QMPManager } from \"./qmp\";\nimport { assert } from \"@vueuse/core\";\nimport { setIntervalImmediately } from \"../utils/interval\";\nimport { ExecFileAsyncError } from \"./exec-helper\";\nimport { ContainerManager, ContainerStatus } from \"./containers/container\";\nimport { CommonPorts, ContainerRuntimes, createContainer, getActiveHostPort } from \"./containers/common\";\n\nconst nodeFetch: typeof import(\"node-fetch\").default = require(\"node-fetch\");\nconst fs: typeof import(\"fs\") = require(\"node:fs\");\nconst path: typeof import(\"path\") = require(\"node:path\");\nconst process: typeof import(\"process\") = require(\"node:process\");\nconst { promisify }: typeof import(\"util\") = require(\"node:util\");\nconst { exec }: typeof import(\"child_process\") = require(\"node:child_process\");\nconst remote: typeof import(\"@electron/remote\") = require(\"@electron/remote\");\nconst FormData: typeof import(\"form-data\") = require(\"form-data\");\nconst argon2: typeof import(\"argon2\") = require(\"argon2\");\n\nconst execAsync = promisify(exec);\nconst USAGE_PATH = path.join(WINBOAT_DIR, \"appUsage.json\");\nexport const logger = createLogger(path.join(WINBOAT_DIR, \"winboat.log\"));\n\nenum CustomAppCommands {\n    NOVNC_COMMAND = \"NOVNC_COMMAND\",\n}\n\nconst presetApps: WinApp[] = [\n    {\n        Name: \"⚙️ Windows Desktop\",\n        Icon: AppIcons[InternalApps.WINDOWS_DESKTOP],\n        Source: \"internal\",\n        Path: InternalApps.WINDOWS_DESKTOP,\n        Args: \"\",\n        Usage: 0,\n    },\n    {\n        Name: \"⚙️ Windows Explorer\",\n        Icon: AppIcons[InternalApps.WINDOWS_EXPLORER],\n        Source: \"internal\",\n        Path: \"%windir%\\\\explorer.exe\",\n        Args: \"\",\n        Usage: 0,\n    },\n    {\n        Name: \"🖥️ Browser Display\",\n        Icon: AppIcons[InternalApps.NOVNC_BROWSER],\n        Source: \"internal\",\n        Path: CustomAppCommands.NOVNC_COMMAND,\n        Args: \"\",\n        Usage: 0,\n    },\n];\n\n/**\n * The stock RDP args that apply to all app launches by default\n */\nconst stockArgs = [\n    \"/cert:ignore\",\n    \"+clipboard\",\n    \"/sound:sys:pulse\",\n    \"/microphone:sys:pulse\",\n    \"/floatbar\",\n    \"/compression\",\n    \"/sec:tls\",\n];\n\n/**\n * Returns second/original param if first is undefined or null, else first/test param\n */\nconst useOriginalIfUndefinedOrNull = (test: string | undefined, original: string) => {\n    return test ?? original;\n};\n\n/**\n * For specifying custom behavior when launching an app (e.g. novnc)\n * Maps a {@link WinApp.Path} to a callback, which is called in {@link Winboat.launchApp} if specified\n */\nconst customAppCallbacks: CustomAppCallbacks = {\n    [CustomAppCommands.NOVNC_COMMAND]: (ctx: Winboat) => {\n        const novncHostPort = getActiveHostPort(ctx.containerMgr!, CommonPorts.NOVNC);\n        openLink(`http://127.0.0.1:${novncHostPort}`);\n    },\n};\n\nconst QMP_WAIT_MS = 2000;\nconst FETCH_TIMEOUT = 1000;\n\nclass AppManager {\n    appCache: WinApp[] = [];\n    appUsageCache: { [key: string]: number } = {};\n    readonly #wbConfig: WinboatConfig | null = null;\n\n    constructor() {\n        if (!fs.existsSync(USAGE_PATH)) {\n            fs.writeFileSync(USAGE_PATH, \"{}\");\n        }\n\n        this.#wbConfig = WinboatConfig.getInstance();\n    }\n\n    async updateAppCache(apiURL: string, options: { forceRead?: boolean } = {}) {\n        const res = await nodeFetch(`${apiURL}/apps`);\n        const newApps = (await res.json()) as WinApp[];\n        newApps.push(...presetApps, ...this.#wbConfig!.config.customApps);\n\n        if (this.appCache.values.length == newApps.length && !options.forceRead) return;\n\n        for (const appIdx in newApps) {\n            newApps[appIdx].Usage = this.appCache.find(app => app.Name == newApps[appIdx].Name)?.Usage || 0;\n            this.appUsageCache[newApps[appIdx].Name] = newApps[appIdx].Usage;\n        }\n\n        this.appCache = newApps;\n    }\n\n    async getApps(apiURL: string): Promise<WinApp[]> {\n        if (this.appCache.length > 0) {\n            return this.appCache;\n        }\n\n        // Get the usage object that's on the disk\n        const fsUsage = Object.entries(JSON.parse(fs.readFileSync(USAGE_PATH, \"utf-8\"))) as any[];\n        this.appCache = [];\n\n        // Populate appCache with dummy WinApp object containing data from the disk\n        for (const element of fsUsage) {\n            this.appCache.push({\n                ...presetApps[0],\n                Name: element[0],\n                Usage: element[1],\n            });\n        }\n\n        await this.updateAppCache(apiURL, { forceRead: true });\n\n        const appCacheHumanReadable = this.appCache.map(obj => {\n            const res = { ...obj } as any;\n            delete res.Icon;\n            return res;\n        });\n\n        logger.info(`AppCache: ${JSON.stringify(appCacheHumanReadable, null, 4)}`);\n\n        return this.appCache;\n    }\n\n    incrementAppUsage(app: WinApp) {\n        app.Usage!++;\n        this.appUsageCache[app.Name]++;\n    }\n\n    async writeToDisk() {\n        fs.writeFileSync(USAGE_PATH, JSON.stringify(this.appUsageCache));\n    }\n\n    /**\n     * Adds a custom app to WinBoat's application list\n     * @param name Name of the app\n     * @param path Path of the app\n     * @param args Args of the app\n     * @param icon Icon of the app\n     */\n    async addCustomApp(name: string, path: string, args: string, icon: string) {\n        const customWinApp: WinApp = {\n            Name: name,\n            Path: path,\n            Args: args,\n            Icon: icon,\n            Source: \"custom\",\n            Usage: 0,\n        };\n        this.appCache.push(customWinApp);\n        this.appUsageCache[name] = 0;\n        await this.writeToDisk();\n        this.#wbConfig!.config.customApps = this.#wbConfig!.config.customApps.concat(customWinApp);\n    }\n\n    async updateCustomApp(oldName: string, updatedApp: { Name: string; Path: string; Args: string; Icon: string }) {\n        this.appCache = this.appCache.map(app => (app.Name === oldName ? { ...app, ...updatedApp } : app));\n\n        // update appUsage if name changed\n        if (oldName !== updatedApp.Name) {\n            this.appUsageCache[updatedApp.Name] = this.appUsageCache[oldName] ?? 0;\n            delete this.appUsageCache[oldName];\n        }\n\n        // update persisted app config\n        this.#wbConfig!.config.customApps = this.#wbConfig!.config.customApps.map(app =>\n            app.Name == oldName ? { ...app, ...updatedApp } : app,\n        );\n\n        await this.writeToDisk();\n    }\n\n    /**\n     * Removes a custom app from WinBoat's application list\n     * @param app The app to remove\n     */\n    async removeCustomApp(app: WinApp) {\n        this.appCache = this.appCache.filter(a => a.Name !== app.Name);\n        this.appUsageCache = Object.fromEntries(Object.entries(this.appUsageCache).filter(([key]) => key !== app.Name));\n        await this.writeToDisk();\n        this.#wbConfig!.config.customApps = this.#wbConfig!.config.customApps.filter(a => a.Name !== app.Name);\n    }\n}\n\nexport class Winboat {\n    private static instance: Winboat | null = null;\n    // Update Intervals\n    #healthInterval: NodeJS.Timeout | null = null;\n    #metricsInverval: NodeJS.Timeout | null = null;\n    #rdpConnectionStatusInterval: NodeJS.Timeout | null = null;\n    #qmpInterval: NodeJS.Timeout | null = null;\n\n    // Variables\n    isOnline: Ref<boolean> = ref(false);\n    isUpdatingGuestServer: Ref<boolean> = ref(false);\n    containerStatus: Ref<ContainerStatus> = ref(ContainerStatus.EXITED);\n    containerActionLoading: Ref<boolean> = ref(false);\n    rdpConnected: Ref<boolean> = ref(false);\n    metrics: Ref<Metrics> = ref<Metrics>({\n        cpu: {\n            usage: 0,\n            frequency: 0,\n        },\n        ram: {\n            used: 0,\n            total: 0,\n            percentage: 0,\n        },\n        disk: {\n            used: 0,\n            total: 0,\n            percentage: 0,\n        },\n    });\n    readonly #wbConfig: WinboatConfig | null = null;\n    appMgr: AppManager | null = null;\n    qmpMgr: QMPManager | null = null;\n    containerMgr: ContainerManager | null = null;\n\n    static getInstance() {\n        Winboat.instance ??= new Winboat();\n        return Winboat.instance;\n    }\n\n    private constructor() {\n        this.#wbConfig = WinboatConfig.getInstance();\n        this.containerMgr = createContainer(this.#wbConfig.config.containerRuntime);\n\n        // This is a special interval which will never be destroyed\n        setInterval(async () => {\n            const _containerStatus = await this.containerMgr!.getStatus();\n\n            if (_containerStatus !== this.containerStatus.value) {\n                this.containerStatus.value = _containerStatus;\n                logger.info(`Winboat Container state changed to ${_containerStatus}`);\n\n                if (_containerStatus === ContainerStatus.RUNNING) {\n                    await this.containerMgr!.port(); // Cache active port mappings\n                    await this.createAPIIntervals();\n                } else {\n                    await this.destroyAPIIntervals();\n                }\n            }\n        }, 1000);\n\n        this.appMgr = new AppManager();\n    }\n\n    /**\n     * Creates the intervals which rely on the Winboat Guest API.\n     */\n    async createAPIIntervals() {\n        logger.info(\"Creating Winboat API intervals...\");\n        const HEALTH_WAIT_MS = 1000;\n        const METRICS_WAIT_MS = 1000;\n        const RDP_STATUS_WAIT_MS = 1000;\n\n        // *** Health Interval ***\n        // Make sure we don't have any existing intervals\n        if (this.#healthInterval) {\n            clearInterval(this.#healthInterval);\n            this.#healthInterval = null;\n        }\n\n        this.#healthInterval = setInterval(async () => {\n            const _isOnline = await this.getHealth();\n            if (_isOnline !== this.isOnline.value) {\n                this.isOnline.value = _isOnline;\n                logger.info(`Winboat Guest API went ${this.isOnline ? \"online\" : \"offline\"}`);\n\n                if (this.isOnline.value) {\n                    await this.checkVersionAndUpdateGuestServer();\n                }\n            }\n        }, HEALTH_WAIT_MS);\n\n        // *** Metrics Interval ***\n        // Make sure we don't have any existing intervals\n        if (this.#metricsInverval) {\n            clearInterval(this.#metricsInverval);\n            this.#metricsInverval = null;\n        }\n\n        this.#metricsInverval = setInterval(async () => {\n            // If the guest is offline or updating, don't bother checking metrics\n            if (!this.isOnline.value || this.isUpdatingGuestServer.value) return;\n            this.metrics.value = await this.getMetrics();\n        }, METRICS_WAIT_MS);\n\n        // *** RDP Connection Status Interval ***\n        // Make sure we don't have any existing intervals\n        if (this.#rdpConnectionStatusInterval) {\n            clearInterval(this.#rdpConnectionStatusInterval);\n            this.#rdpConnectionStatusInterval = null;\n        }\n\n        this.#rdpConnectionStatusInterval = setInterval(async () => {\n            // If the guest is offline or updating, don't bother checking RDP status\n            if (!this.isOnline.value || this.isUpdatingGuestServer.value) return;\n\n            // If RDP monitoring is disabled, don't check status, just set it to false\n            if (!this.#wbConfig?.config.rdpMonitoringEnabled) {\n                this.rdpConnected.value = false;\n                return;\n            }\n\n            // Check RDP status\n            const _rdpConnected = await this.getRDPConnectedStatus();\n            if (_rdpConnected !== this.rdpConnected.value) {\n                this.rdpConnected.value = _rdpConnected;\n                logger.info(`RDP connection status changed to ${_rdpConnected ? \"connected\" : \"disconnected\"}`);\n            }\n        }, RDP_STATUS_WAIT_MS);\n\n        // *** QMP Interval ***\n        // Make sure we don't have any existing intervals\n        if (this.#qmpInterval) {\n            clearInterval(this.#qmpInterval);\n            this.#qmpInterval = null;\n        }\n\n        // TODO: Remove if statement once this feature gets rolled out.\n        if (this.#wbConfig?.config.experimentalFeatures) {\n            this.createQMPInterval();\n        }\n    }\n\n    /**\n     * Destroys the intervals which rely on the Winboat Guest API.\n     * This is called when the container is in any state other than Running.\n     */\n    async destroyAPIIntervals() {\n        logger.info(\"Destroying Winboat API intervals...\");\n        if (this.#healthInterval) {\n            clearInterval(this.#healthInterval);\n            this.#healthInterval = null;\n            // Side-effect: Set isOnline to false\n            this.isOnline.value = false;\n        }\n\n        if (this.#metricsInverval) {\n            clearInterval(this.#metricsInverval);\n            this.#metricsInverval = null;\n        }\n\n        if (this.#rdpConnectionStatusInterval) {\n            clearInterval(this.#rdpConnectionStatusInterval);\n            this.#rdpConnectionStatusInterval = null;\n            // Side-effect: Set rdpConnected to false\n            this.rdpConnected.value = false;\n        }\n\n        if (this.#qmpInterval) {\n            clearInterval(this.#qmpInterval);\n            this.#qmpInterval = null;\n\n            // Side effect: We must destroy the QMP Manager\n            try {\n                if (this.qmpMgr && (await this.qmpMgr.isAlive())) {\n                    this.qmpMgr.qmpSocket.destroy();\n                }\n                this.qmpMgr = null;\n                logger.info(\"[destroyAPIIntervals] QMP Manager destroyed because container is no longer running\");\n            } catch (e) {\n                logger.error(\"[destroyAPIIntervals] Failed to destroy QMP Manager\");\n                logger.error(e);\n            }\n        }\n    }\n\n    async getHealth() {\n        // If /health returns 200, then the guest is ready\n        try {\n            const res = await nodeFetch(`${this.apiUrl}/health`, { signal: AbortSignal.timeout(FETCH_TIMEOUT) });\n            return res.status === 200;\n        } catch {\n            return false;\n        }\n    }\n\n    async getMetrics() {\n        const res = await nodeFetch(`${this.apiUrl}/metrics`, { signal: AbortSignal.timeout(FETCH_TIMEOUT) });\n        const metrics = (await res.json()) as Metrics;\n        return metrics;\n    }\n\n    async getRDPConnectedStatus() {\n        const res = await nodeFetch(`${this.apiUrl}/rdp/status`, { signal: AbortSignal.timeout(FETCH_TIMEOUT) });\n        const status = (await res.json()) as { rdpConnected: boolean };\n        return status.rdpConnected;\n    }\n\n    static readCompose(composePath: string): ComposeConfig {\n        const composeFile = fs.readFileSync(composePath, \"utf-8\");\n        const composeContents = YAML.parse(composeFile) as ComposeConfig;\n        return composeContents;\n    }\n\n    getCredentials() {\n        const compose = Winboat.readCompose(this.containerMgr!.composeFilePath);\n        return {\n            username: compose.services.windows.environment.USERNAME,\n            password: compose.services.windows.environment.PASSWORD,\n        };\n    }\n\n    async #connectQMPManager() {\n        try {\n            this.qmpMgr = await QMPManager.createConnection(\n                \"127.0.0.1\",\n                getActiveHostPort(this.containerMgr!, CommonPorts.QMP)!,\n            ).catch(e => {\n                logger.error(e);\n                throw e;\n            });\n            const capabilities = await this.qmpMgr.executeCommand(\"qmp_capabilities\");\n            assert(\"return\" in capabilities);\n\n            const commands = await this.qmpMgr.executeCommand(\"query-commands\");\n            // @ts-ignore property \"result\" already exists due to assert\n            assert(commands.return.every(x => \"name\" in x));\n        } catch (e) {\n            logger.error(\"There was an error connecting to QMP\");\n            logger.error(e);\n        }\n    }\n\n    createQMPInterval() {\n        logger.info(\"[createQMPInterval] Creating new QMP Interval\");\n        this.#qmpInterval = setIntervalImmediately(async () => {\n            if (!this.#wbConfig?.config.experimentalFeatures) {\n                clearInterval(this.#qmpInterval!);\n                this.#qmpInterval = null;\n                logger.info(\"[QMPInterval] Destroying self because experimentalFeatures was turned off\");\n            }\n\n            // If QMP already exists and healthy, we're good\n            if (this.qmpMgr && (await this.qmpMgr.isAlive())) return;\n\n            // Otherwise, connect to it since the container is alive but\n            // QMP either doesn't exist or is disconnected\n            await this.#connectQMPManager();\n            logger.info(\"[QMPInterval] Created new QMP Manager\");\n        }, QMP_WAIT_MS);\n    }\n\n    async startContainer() {\n        logger.info(\"Starting WinBoat container...\");\n        this.containerActionLoading.value = true;\n        try {\n            await this.containerMgr!.container(\"start\");\n        } catch (e) {\n            logger.error(\"There was an error performing the container action.\");\n            logger.error(e);\n            throw e;\n        }\n        logger.info(\"Successfully started WinBoat container\");\n        this.containerActionLoading.value = false;\n    }\n\n    async stopContainer() {\n        logger.info(\"Stopping WinBoat container...\");\n        this.containerActionLoading.value = true;\n        await this.containerMgr!.container(\"stop\");\n        logger.info(\"Successfully stopped WinBoat container\");\n        this.containerActionLoading.value = false;\n    }\n\n    async restartContainer() {\n        logger.info(\"Restarting WinBoat container...\");\n        this.containerActionLoading.value = true;\n        try {\n            await this.containerMgr!.container(\"restart\");\n        } catch (e) {\n            logger.error(\"There was an error restarting the container.\");\n            logger.error(e);\n            throw e;\n        }\n        logger.info(\"Successfully restarted WinBoat container\");\n        this.containerActionLoading.value = false;\n    }\n\n    async pauseContainer() {\n        logger.info(\"Pausing WinBoat container...\");\n        this.containerActionLoading.value = true;\n        await this.containerMgr!.container(\"pause\");\n        logger.info(\"Successfully paused WinBoat container\");\n        this.containerActionLoading.value = false;\n    }\n\n    async unpauseContainer() {\n        logger.info(\"Unpausing WinBoat container...\");\n        this.containerActionLoading.value = true;\n        await this.containerMgr!.container(\"unpause\");\n        logger.info(\"Successfully unpaused WinBoat container\");\n        this.containerActionLoading.value = false;\n    }\n\n    // TODO: refactor / possibly remove this\n    /** \n        Replaces the compose file, and and updates the container.\n        @note Use {@link ContainerManager.writeCompose} in case only disk write is needed\n    */\n    async replaceCompose(composeConfig: ComposeConfig) {\n        logger.info(\"Going to replace compose config\");\n        this.containerActionLoading.value = true;\n\n        const composeFilePath = this.containerMgr!.composeFilePath;\n\n        // 0. Stop the current container if it's online\n        if (this.containerStatus.value === ContainerStatus.RUNNING) {\n            await this.stopContainer();\n        }\n\n        // 1. Compose down the current container\n        await this.containerMgr!.compose(\"down\");\n\n        // 2. Create a backup directory if it doesn't exist\n        const backupDir = path.join(WINBOAT_DIR, \"backup\");\n\n        if (!fs.existsSync(backupDir)) {\n            fs.mkdirSync(backupDir);\n            logger.info(`Created compose backup dir: ${backupDir}`);\n        }\n\n        // 3. Move the current compose file to backup\n        const backupFile = `${Date.now()}-${path.basename(this.containerMgr!.composeFilePath)}`;\n        fs.renameSync(composeFilePath, path.join(backupDir, backupFile));\n        logger.info(`Backed up current compose at: ${path.join(backupDir, backupFile)}`);\n\n        // 4. Write new compose file\n        this.containerMgr!.writeCompose(composeConfig);\n        logger.info(`Wrote new compose file to: ${composeFilePath}`);\n\n        // 5. Deploy the container with the new compose file\n        await this.containerMgr!.compose(\"up\");\n\n        logger.info(\"Replace compose config completed, successfully deployed new container\");\n\n        this.containerActionLoading.value = false;\n    }\n\n    async resetWinboat() {\n        console.info(\"Resetting Winboat...\");\n\n        // 1. Stop container\n        await this.stopContainer();\n        console.info(\"Stopped container\");\n\n        // 2. Remove the container\n\n        await this.containerMgr!.remove();\n        console.info(\"Removed container\");\n\n        // 3. Remove the container volume or folder\n        const compose = Winboat.readCompose(this.containerMgr!.composeFilePath);\n        const storage = compose.services.windows.volumes.find(vol => vol.includes(\"/storage\"));\n        if (storage?.startsWith(\"data:\")) {\n            if (this.#wbConfig?.config.containerRuntime !== ContainerRuntimes.DOCKER) {\n                logger.error(\"Volume not supported on podman runtime\");\n            }\n            // In this case we have a volume (legacy)\n            await execAsync(\"docker volume rm winboat_data\");\n            console.info(\"Removed volume\");\n        } else {\n            const storageFolder = storage?.split(\":\").at(0) ?? null;\n            if (storageFolder && fs.existsSync(storageFolder)) {\n                fs.rmSync(storageFolder, { recursive: true, force: true });\n                console.info(`Removed storage folder at ${storageFolder}`);\n            } else {\n                console.warn(\"Storage folder does not exist, skipping removal\");\n            }\n        }\n\n        // 4. Remove WinBoat directory\n        fs.rmSync(WINBOAT_DIR, { recursive: true, force: true });\n        console.info(`Removed ${WINBOAT_DIR}`);\n        console.info(\"So long and thanks for all the fish!\");\n    }\n\n    async launchApp(app: WinApp) {\n        if (!this.isOnline) throw new Error(\"Cannot launch app, Winboat is offline\");\n\n        if (customAppCallbacks[app.Path]) {\n            logger.info(`Found custom app command for '${app.Name}'`);\n            customAppCallbacks[app.Path]!(this);\n            this.appMgr?.incrementAppUsage(app);\n            this.appMgr?.writeToDisk();\n            return;\n        }\n\n        const cleanAppName = app.Name.replaceAll(/[,.'\"]/g, \"\");\n        const { username, password } = this.getCredentials();\n\n        const rdpHostPort = getActiveHostPort(this.containerMgr!, CommonPorts.RDP)!;\n\n        logger.info(`Launching app: ${app.Name} at path ${app.Path}`);\n\n        const freeRDPInstallation = await getFreeRDP();\n\n        logger.info(`Launching app: ${app.Name} at path ${app.Path}`);\n\n        // Arguments specified by user to override stock arguments\n        const replacementArgs = this.#wbConfig?.config.rdpArgs.filter(a => a.isReplacement);\n        // Additional (new) arguments added by user\n        const newArgs = this.#wbConfig?.config.rdpArgs.filter(a => !a.isReplacement).map(v => v.newArg) ?? [];\n        // The stock arguments after any replacements have been made and new arguments have been added\n        const combinedArgs = stockArgs\n            .map(argStr =>\n                useOriginalIfUndefinedOrNull(replacementArgs?.find(r => argStr === r.original?.trim())?.newArg, argStr),\n            )\n            .concat(newArgs);\n        let args = [`/u:${username}`, `/p:${password}`, `/v:127.0.0.1`, `/port:${rdpHostPort}`, ...combinedArgs];\n\n        if (app.Path == InternalApps.WINDOWS_DESKTOP) {\n            args = args.concat([\n                \"+f\",\n                this.#wbConfig?.config.smartcardEnabled ? \"/smartcard\" : \"\",\n                `/scale:${this.#wbConfig?.config.scale ?? 100}`,\n            ]);\n        } else {\n            args = args.concat([\n                this.#wbConfig?.config.multiMonitor === MultiMonitorMode.Span ? \"+span\" : \"\",\n                \"-wallpaper\",\n                this.#wbConfig?.config.multiMonitor === MultiMonitorMode.MultiMon ? \"/multimon\" : \"\",\n                `/scale-desktop:${this.#wbConfig?.config.scaleDesktop ?? 100}`,\n                `/wm-class:winboat-${cleanAppName}`,\n                `/app:program:${app.Path},name:${cleanAppName},cmd:\"${app.Args}\"`,\n            ]);\n        }\n\n        args = args.filter((v, _i, _a) => v.trim() !== \"\");\n\n        this.appMgr?.incrementAppUsage(app);\n        this.appMgr?.writeToDisk();\n\n        if (!freeRDPInstallation) {\n            logger.error(\"No FreeRDP installation found\");\n            return;\n        }\n\n        try {\n            logger.info(`Launch FreeRDP with command:\\n${freeRDPInstallation.stringifyExec(args)}`);\n            await freeRDPInstallation.exec(args);\n        } catch (e) {\n            const execError = e as ExecFileAsyncError;\n            const ERRINFO_RPC_INITIATED_DISCONNECT = 0x00000001;\n            const ERRINFO_LOGOFF_BY_USER = 0x0000000c;\n\n            // TODO: Handle all FreeRDP error codes\n            // https://github.com/FreeRDP/FreeRDP/blob/3fc1c3ce31b5af1098d15603d7b3fe1c93cf77a5/include/freerdp/error.h#L58\n            switch (execError.code) {\n                case ERRINFO_RPC_INITIATED_DISCONNECT: {\n                    logger.info(\"FreeRDP connection already established.\");\n                    logger.info(\"Creating new session..\");\n                    break;\n                }\n                case ERRINFO_LOGOFF_BY_USER: {\n                    logger.info(\"FreeRDP disconnected due to user logging off.\");\n                    break;\n                }\n                default: {\n                    logger.warn(`FreeRDP process returned error code '${execError.code}'`);\n                }\n            }\n        }\n    }\n\n    async checkVersionAndUpdateGuestServer() {\n        // 1. Get the version of the guest server and compare it to the current version\n        const versionRes = await nodeFetch(`${this.apiUrl}/version`);\n        const version = (await versionRes.json()) as GuestServerVersion;\n\n        const appVersion = import.meta.env.VITE_APP_VERSION;\n\n        if (version.version !== appVersion) {\n            logger.info(`New local version of WinBoat Guest Server found: ${appVersion}`);\n            logger.info(`Current version of WinBoat Guest Server: ${version.version}`);\n        }\n\n        // 2. Return early if the version is the same\n        if (version.version === appVersion) {\n            return;\n        }\n\n        // 3. Set update flag & grab winboat_guest_server.zip from Electron assets\n        this.isUpdatingGuestServer.value = true;\n        const zipPath = remote.app.isPackaged\n            ? path.join(process.resourcesPath, \"guest_server\", \"winboat_guest_server.zip\")\n            : path.join(remote.app.getAppPath(), \"..\", \"..\", \"guest_server\", \"winboat_guest_server.zip\");\n\n        logger.info(\"ZIP Path\", zipPath);\n\n        // 4. Send the payload to the guest server\n        // as a multipart/form-data with updateFile and password\n        const formData = new FormData();\n        formData.append(\"updateFile\", fs.createReadStream(zipPath));\n        const { password } = this.getCredentials();\n        formData.append(\"password\", password);\n\n        try {\n            const res = await nodeFetch(`${this.apiUrl}/update`, {\n                method: \"POST\",\n                body: formData as any,\n            });\n            if (res.status !== 200) {\n                const resBody = await res.text();\n                throw new Error(resBody);\n            }\n            const resJson = (await res.json()) as GuestServerUpdateResponse;\n            logger.info(`Update params: ${JSON.stringify(resJson, null, 4)}`);\n            logger.info(\"Successfully sent update payload to guest server\");\n        } catch (e) {\n            logger.error(\"Failed to send update payload to guest server\");\n            logger.error(e);\n            this.isUpdatingGuestServer.value = false;\n            throw e;\n        }\n\n        // 5. Wait about ~3 seconds, then start scanning for health\n        await new Promise(resolve => setTimeout(resolve, 3000));\n        let _isOnline = await this.getHealth();\n        while (!_isOnline) {\n            await new Promise(resolve => setTimeout(resolve, 1000));\n            _isOnline = await this.getHealth();\n        }\n        logger.info(\"Update completed, Winboat Guest Server is online\");\n\n        // 6. [OPTIONAL] Apply authentication hash in case it's not set yet, because\n        // it will be required during future updates\n        try {\n            const { password } = this.getCredentials();\n            const hash = await argon2.hash(password);\n\n            const authFormData = new FormData();\n            authFormData.append(\"authHash\", hash);\n\n            const authRes = await nodeFetch(`${this.apiUrl}/auth/set-hash`, {\n                method: \"POST\",\n                body: authFormData as any,\n            });\n\n            if (authRes.status === 200) {\n                logger.info(\"Successfully set auth hash for existing installation\");\n            } else if (authRes.status === 400) {\n                // Hash already set, this is expected for existing installations that already have it\n                logger.info(\"Auth hash already set, skipping enrollment\");\n            } else {\n                const errorText = await authRes.text();\n                logger.warn(`Unexpected response when setting auth hash: ${authRes.status} - ${errorText}`);\n            }\n        } catch (e) {\n            logger.error(\"Failed to set auth hash (non-critical error)\");\n            logger.error(e);\n        }\n\n        // Done!\n        this.isUpdatingGuestServer.value = false;\n    }\n\n    /**\n     * Whether or not the Winboat singleton has a QMP interval active\n     */\n    get hasQMPInterval() {\n        return this.#qmpInterval !== null;\n    }\n\n    get apiUrl(): string | undefined {\n        const apiPort = getActiveHostPort(this.containerMgr!, CommonPorts.API);\n\n        if (!apiPort) return undefined;\n\n        return `http://127.0.0.1:${apiPort}`;\n    }\n}\n"
  },
  {
    "path": "src/renderer/main.ts",
    "content": "import { createApp } from \"vue\";\nimport App from \"./App.vue\";\nimport { router } from \"./router\";\nimport { MotionPlugin } from \"@vueuse/motion\";\nimport \"./index.css\";\nimport { autoScroll } from \"./directives/autoscroll\";\nimport { DEFAULT_HOMEBREW_DIR } from \"./lib/constants\";\nimport VueApexCharts from \"vue3-apexcharts\";\n\nconst process: typeof import(\"process\") = require(\"node:process\");\n\n/**\n * @note A big chunk of our userbase uses WinBoat under an immutable distro through GearLever.\n * In case it's the flatpak version of GearLever, PATH, and some other environment variables are stripped by default.\n * We include the default homebrew bin directory for exactly this reason.\n * It's not WinBoat's responsibility if the PATH envvar is incomplete, but in this case it affects a lot of users.\n */\nprocess.env.PATH && (process.env.PATH += `:${DEFAULT_HOMEBREW_DIR}`);\n\ncreateApp(App)\n    .directive(\"auto-scroll\", autoScroll)\n    .use(router)\n    .use(MotionPlugin)\n    .use(VueApexCharts as any) // TODO: See https://github.com/apexcharts/vue3-apexcharts/issues/141\n    .mount(\"#app\");\n"
  },
  {
    "path": "src/renderer/public/xel/CHANGELOG.md",
    "content": "\n# CHANGELOG\n\n## 0.36.2 (2025-07-28)\n\n- [Fixed] `<x-menubar>` fails to update correctly on Firefox when using `slot=\"aside\"`\n\n## 0.36.1 (2025-07-16)\n\n- [Fixed] `<x-icon>` does not render shapes with gradient fill\n\n## 0.36.0 (2025-07-12)\n\n- Add `aside` named slot to `<x-menubar>`\n- Switch to \"Midline Horizontal Ellipsis\" char for `<x-menubar>` ellipsis\n- [Fixed] `<x-menubar>` layout fails to update when changing locales\n\n## 0.35.2 (2025-06-22)\n\n- [Fixed] `<x-contextmenu>` stops some pointer events from firing when using touch input method\n\n## 0.35.1 (2025-06-21)\n\n- [Fixed] `event.isPrimary` is not preserved when firing synthesized `lostpointercapture` event\n\n## 0.35.0 (2025-06-17)\n\n- Add `Xel.configStorage` property\n\n## 0.34.7 (2025-06-13)\n\n- Increase the interval time between subsequent menubar updates\n\n## 0.34.6 (2025-06-12)\n\n- [Fixed] Material theme subthemes have incorrect colors unless the subtheme file name starts with \"material\"\n\n## 0.34.5 (2025-06-09)\n\n- [Fixed] `<x-menubar>` fails to update in some edge cases\n\n## 0.34.4 (2025-06-02)\n\n- [Fixed] `<x-menubar>` ellipsis might overflow the window bounds\n\n## 0.34.3 (2025-06-02)\n\n- [Fixed] `<x-colorpicker>` fails to update on initial document load\n\n## 0.34.2 (2025-05-28)\n\n- [Fixed] `<x-menubar>` fails to update in some edge cases\n\n## 0.34.1 (2025-05-28)\n\n- [Fixed] Error thrown when updating `<x-menubar>` with no children\n\n## 0.34.0 (2025-05-28)\n\n- Show ellipsis when top level menubar items can't be fitted on the screen\n- [Fixed] `<x-menubar>` children without submenus should behave like buttons\n\n## 0.33.13 (2025-05-13)\n\n- [Fixed] Menu item labels are cut off on Linux\n\n## 0.33.12 (2025-05-04)\n\n- Don't include packaging scripts in the NPM package\n\n## 0.33.11 (2025-05-04)\n\n- Refactor packaging scripts\n\n## 0.33.10 (2025-04-15)\n\n- [Fixed] `<dialog>` element permanently overrides the `overflow` inline style on `<html>` and `<body>`\n\n## 0.33.9 (2025-04-11)\n\n- Show ellipsis when `<x-numberinput>` value overflow the visible area\n\n## 0.33.8 (2025-03-31)\n\n- [Fixed] Error thrown when attempting to close a disconnected `<x-contextmenu>`\n\n## 0.33.7 (2025-03-22)\n\n- [Fixed] `<x-drawer>` has wrong position on Firefox and Safari\n- [Fixed] Can't expand menus when using touch input method\n\n## 0.33.6 (2025-03-21)\n\n- Highlight top level menu item when its descendant was triggered programmatically\n- [Fixed] `<x-slider>` has incorrect width on WebKit-based browsers\n\n## 0.33.5 (2025-03-19)\n\n- [Fixed] Titlebar color is not properly updated when changing the accent color of Material themes\n\n## 0.33.4 (2025-03-19)\n\n- Simplify slider stylings in Material themes\n- [Fixed] Material themes don't allow gray accent color\n\n## 0.33.3 (2025-03-15)\n\n- [Fixed] `<x-select>` has wrong z-index in some edge cases\n- [Fixed] Error throw when connecting some elements directly to ShadowRoot\n- [Fixed] Scrollbars are not styled on Firefox\n- [Fixed] Color picker popover changes position when switching between tabs on WebKit-based web browsers\n- [Fixed] Error thrown when `<x-numberinput>` loses focus\n- [Fixed] Current text selection should be cleared when `<x-texteditor>` loses focus\n\n## 0.33.2 (2025-03-06)\n\n- Change font size units from \"px\" to \"rem\"\n- [Fixed] `<x-tagsinput>` padding changes when entering values\n\n## 0.33.1 (2025-03-03)\n\n- [Fixed] Nested CSS rules are crashing Safari 18.3\n\n## 0.33.0 (2025-03-02)\n\n- Add `ticks` property to `<x-slider>`\n- Support setting `border-radius` on `<table>` elements\n- [Fixed] Text selection contrast is too low (Fluent Dark theme)\n- [Fixed] `<x-stepper>` inside `<x-numberinput>` is too large (Fluent themes)\n- [Fixed] `<x-drawer>` background is white instead of black (Fluent Dark theme)\n- [Fixed] `<x-numberinput>` placeholder text has wrong color (Adwaita Dark theme)\n\n## 0.32.2 (2025-02-27)\n\n- [Fixed] `<x-nav>` dispatches the \"toggle\" event too early\n- [Fixed] Can't hide `<x-navitem>` elements\n- [Fixed] `<x-pager>.href` does not preserve URL search params\n- [Fixed] `<x-pager>` with only a single page should be hidden\n\n## 0.32.1 (2025-02-19)\n\n- [Fixed] Minified themes are missing some stylings\n\n## 0.32.0 (2025-02-19)\n\n- Add `level` property to `<x-label>`\n- Add special stylings for `<footer>` inside `<x-card>`\n- Add special stylings for `<footer>` inside `<x-popover>`\n- Use Adwaita Sans (Inter) instead of Cantarell fonts\n- [Fixed] Accordion arrow is not updated when `<header>` element height changes\n- [Changed API] Set padding directly on `<x-card>` rather than on its child `<main>` element\n- [Changed API] Set padding directly on `<x-popover>` rather than on its child `<main>` element\n- [Changed API] Set padding directly on `<dialog>` rather than on its child `<main>` element\n- [Changed API] Don't require `<x-accordion>` to have child `<main>` element to be expandable\n- [Changed API] Rename \"graphite\" preset accent color to \"gray\"\n- [Changed API] Rename \"default\" button skin to \"normal\"\n- [Changed API] Changed the default value of \"size\" property on `<x-button>` to \"normal\"\n\n## 0.31.0 (2025-02-15)\n\n- Material and Material Dark themes\n- Add `position` property to `<x-drawer>`\n- Add `maximized` property to `<x-titlebar>`\n- [Fixed] Scroll offset is not preserved when reloading the demo website\n- [Changed API] Remove `vertical` property from `<x-slider>`\n- [Changed API] Remove `buffer` property from `<x-slider>`\n\n## 0.30.0 (2025-02-05)\n\n- Add `<x-titlebar>` element\n- Add `<x-pager>` element\n- Add `<x-avatar>` element\n- Add `<x-drawer>` element\n- [Changed API] Remove support for manual positioning of `<dialog>` elements\n\n## 0.29.0 (2025-02-02)\n\n- Update Fluent theme to match the latest Windows 11 UI guidelines\n- Allow wide gamut accent color\n- Add `<x-nav>` and `<x-navitem>`\n- [Changed API] Rename `selected` property on `<x-tab>` to `toggled`\n- [Changed API] Remove `condensed` property from `<x-numberinput>`\n- [Changed API] Remove `type` property from `<x-throbber>`\n- [Changed API] Remove `circular` and `nav` skins from `<x-button>`\n\n## 0.28.17 (2025-01-01)\n\n- [Fixed] Tooltip position is not updated when dynamically changing the tooltip text\n\n## 0.28.16 (2024-11-14)\n\n- [Fixed] Can't dismiss `<x-tooltip>` after disconnecting and reconnecting the ancestor element\n\n## 0.28.15 (2024-10-26)\n\n- Stop keyboard event propagation when deleting a tag inside `<x-tagsinput>` with backspace key\n\n## 0.28.14 (2024-10-23)\n\n- Make `<x-tagsinput>` look consistent with `<x-input>`\n\n## 0.28.13 (2024-09-24)\n\n- Treat `<x-notification>` with negative timeout value as permanent\n\n## 0.28.12 (2024-09-08)\n\n- Allow `<x-tooltip>` to be placed inside `<x-icon>`\n\n## 0.28.11 (2024-09-08)\n\n- [Fixed] Allow \"unknown\" selector in Fluent localization files\n\n## 0.28.10 (2024-09-01)\n\n- [Fixed] \"none\" is turned into null instead of NaN in dev version of colorjs.io\n\n## 0.28.9 (2024-08-28)\n\n- [Fixed] Breaking changes in the dev version of colorjs.io\n\n## 0.28.8 (2024-08-23)\n\n- [Fixed] `<x-checkbox>` fails to update on WebKit in some edge cases\n\n## 0.28.7 (2024-08-15)\n\n- Allow `<x-tooltip>` to be placed inside `<x-checkbox>`\n\n## 0.28.6 (2024-07-29)\n\n- [Fixed] Incorrect cursor position after changing `<x-texteditor>` value\n\n## 0.28.5 (2024-06-30)\n\n- [Fixed] Disabled `<x-numberinput>` is still editable\n\n## 0.28.4 (2024-06-25)\n\n- [Fixed] `<x-throbber>` animation freezes when changing the \"hidden\" attribute\n- [Fixed] Backspace, arrow up and arrow down keyboard events should not be propagated when `<x-colorinput>` is focused\n\n## 0.28.3 (2024-06-23)\n\n- Handle `<x-menuitem>` click event like native Windows and GNOME apps\n- Automatically select `<x-colorinput>` contents when it receives focus\n- [Fixed] Can't change `<x-colorinput>` value when only a single color space is allowed\n- [Fixed] `<x-numberinput>` does not properly discard invalid values\n\n## 0.28.2 (2024-06-22)\n\n- [Fixed] Incorrect z-index of button tooltips when using dark Fluent theme\n\n## 0.28.1 (2024-06-22)\n\n- [Fixed] Incorrect z-index of button tooltips when using Fluent theme\n\n## 0.28.0 (2024-06-21)\n\n- Add \"expand\" and \"collapse\" events to `<x-menubar>`\n\n## 0.27.1 (2024-05-30)\n\n- Make inner padding of `<x-numberinput>` configurable\n\n## 0.27.0 (2024-05-21)\n\n- [Changed API] Rename `<meta name=\"xel-iconsets\">` to `<meta name=\"xel-icons\">`\n- [Changed API] Rename `Xel.iconsets` to `Xel.icons`\n- [Changed API] Rename `Xel.whenIconsetsReady` to `Xel.whenIconsReady`\n- [Changed API] rename `iconsetschange` event to `iconschange`\n- [Fixed] `<x-contextmenu>` fails to render on WebKit in some edge cases\n\n## 0.26.0 (2024-05-19)\n\n- Add \"sRGB Linear\", \"CIE LCH\", \"OK LCH\", \"CIE LAB\", \"OK LAB\", \"CIE XYZ D65\" and \"CIE XYZ D50\" color spaces to the\n  color picker\n- Add \"Out of gamut\" indicator to the color space select widget\n- Add color picker option to show gamut hints\n- Add color picker option to show channel labels\n\n## 0.25.11 (2024-04-01)\n\n- [Fixed] \"toggle\" event on `<x-radios>` is not documented\n\n## 0.25.10 (2024-03-27)\n\n- [Fixed] Language parameter in blob URLs is ignored\n\n## 0.25.9 (2024-03-25)\n\n- [Fixed] Can't pass full URLs as `<x-message>` arguments\n\n## 0.25.8 (2024-03-16)\n\n- [Fixed] Don't show text selection inside blurred `<x-numberinput>`\n\n## 0.25.7 (2024-03-09)\n\n- [Fixed] Can't close modal popovers on WebKit\n\n## 0.25.6 (2024-03-05)\n\n- [Fixed] Error thrown when unfocusing text inputs on WebKit\n\n## 0.25.5 (2024-02-20)\n\n- [Fixed] Color picker throws errors when clearing localStorage\n\n## 0.25.4 (2024-01-17)\n\n- [Fixed] Button tooltips have incorrect font weight\n\n## 0.25.3 (2024-01-14)\n\n- [Fixed] Wrong cursor image when hovering a tag inside an anchor\n\n## 0.25.2 (2024-01-11)\n\n- [Fixed] Color input widget uses inconsistent value format in sRGB space\n\n## 0.25.1 (2024-01-08)\n\n- [Fixed] `<x-tabs>` are flickering when clicked\n- [Fixed] Can't disable `<x-tab>`\n\n## 0.25.0 (2023-12-31)\n\n- Add option to expand/collapse `<x-accordion>` without animations\n- Add `disabled` property to `<x-accordion>`\n\n## 0.24.5 (2023-12-26)\n\n- [Fixed] `<x-buttons>` element does not handle correctly child `<a>` elements\n\n## 0.24.4 (2023-12-12)\n\n- [Fixed] `<x-input type=\"search\">` is not dispatching `change` event on latest versions of WebKit-based browsers\n\n## 0.24.3 (2023-11-28)\n\n- Simplify dock button stylings\n\n## 0.24.2 (2023-10-29)\n\n- Option to show color values using uppercase hexadecimal notation\n- Make the leading \"#\" char optional when entering hexadecimal color values\n- [Fixed] Popover arrow styles are not updated when changing themes\n\n## 0.24.1 (2023-10-28)\n\n- [Fixed] Can't focus `<x-tagsinput>` on WebKit\n\n## 0.24.0 (2023-10-24)\n\n- Replace `<x-barscolorpicker>`, `<x-rectcolorpicker>` and `<x-wheelcolorpicker>` with unified `<x-colorpicker>`\n- Display P3, Rec. 2020, A98 RGB and ProPhoto wide gamut color spaces support\n- Allow colors to be specified in any valid CSS format\n\n## 0.23.0 (2023-09-24)\n\n- Initial support for Firefox 119\n\n## 0.22.6 (2023-08-28)\n\n- [Fixed] Frozen cursor image when clicking elements with pointer capture\n\n## 0.22.5 (2023-08-28)\n\n- [Fixed] Incorrect cursor image when clicking elements with pointer capture very fast\n\n## 0.22.4 (2023-08-27)\n\n- [Fixed] Handle `pointercancel` events\n\n## 0.22.3 (2023-08-27)\n\n- [Fixed] Pointer is not properly released in some edge cases\n\n## 0.22.2 (2023-08-25)\n\n- [Fixed] \"pointerup\" event is not fired in some edge cases due to Chromium bug #1166044\n\n## 0.22.1 (2023-08-12)\n\n- [Fixed] Enter key from the numeric keypad is not detected correctly\n\n## 0.22.0 (2023-08-12)\n\n- Remove global size setting (`<meta name=\"xel-size\">` tag, `Xel.size` getter/setter and corresponding\n  `sizechange` event)\n- Remove `Element.computedSize`  getter and corresponding attribute\n- Remove support for relative size values (`smaller` and `larger`)\n\n## 0.21.3 (2023-07-19)\n\n- [Fixed] Ring throbber animation is no rendered properly by WebKit\n\n## 0.21.2 (2023-07-12)\n\n- [Fixed] Numeric glyphs inside `<x-numberinput>` have inconsistent width\n\n## 0.21.1 (2023-06-25)\n\n- [Fixed] `<x-slider>` should not be focusable when disabled\n\n## 0.21.0 (2023-06-23)\n\n- Add `disabled` property to color pickers\n\n## 0.20.9 (2023-06-14)\n\n- [Fixed] Outlines shown around focused dialogs\n\n## 0.20.8 (2023-06-09)\n\n- [Fixed] `<x-tagsinput>` leaves a trailing comma\n\n## 0.20.7 (2023-05-25)\n\n- [Fixed] Keyboard shortcuts are not working when `<x-numberinput>` is focused\n- [Fixed] Incorrect selection on Safari after incrementing or decrementing `<x-numberinput>` value\n- [Fixed] Tooltips should not be shown when a button is expanded\n\n## 0.20.6 (2023-05-19)\n\n- [Fixed] Opening a dialog causes layout shift on Safari\n\n## 0.20.5 (2023-05-19)\n\n- [Fixed] Adwaita and Cupertino themes use ugly fonts when on Safari\n\n## 0.20.4 (2023-04-15)\n\n- [Fixed] `<x-colorselect>` fails to open\n\n## 0.20.3 (2023-04-08)\n\n- [Fixed] `<x-popover>` misbehaves when placed inside shadowRoot\n\n## 0.20.2 (2023-04-08)\n\n- [Fixed] `<x-stepper>` stuck after pressing the left and right mouse buttons simultaneously\n\n## 0.20.1 (2023-04-05)\n\n- [Fixed] Automatically close standalone modal `<x-popover>` when user clicks the backdrop\n\n## 0.20.0 (2023-04-01)\n\n- WebKit-based browsers support\n\n## 0.19.3 (2023-03-30)\n\n- Resolve `<x-popover>` geometry after all \"open\" event listeners have been fired\n\n## 0.19.2 (2023-03-23)\n\n- Make `<x-numberinput>` use the step precision if it is bigger than the value precision\n\n## 0.19.1 (2023-03-21)\n\n- [Fixed] Do not animate newly connected switch elements\n\n## 0.19.0 (2023-01-22)\n\n- Add \"os\" message argument\n\n## 0.18.2 (2022-12-23)\n\n- [Fixed] Packaging script is not working on Windows\n\n## 0.18.1 (2022-12-20)\n\n- [Fixed] `<x-numberinput>` does not look and behave consistently with `<x-input>`\n\n## 0.18.0 (2022-12-04)\n\n- Replace `Xel.localesIds` getter with `Xel.locale` which return the resolved locale tag\n\n## 0.17.6 (2022-11-08)\n\n- Add stylings for `::highlight(mark)`\n\n## 0.17.5 (2022-11-01)\n\n- [Fixed] Button tooltip not shown when the button is attached directly to the shadow root\n\n## 0.17.4 (2022-09-22)\n\n- Update dependencies\n\n## 0.17.3 (2022-08-18)\n\n- [Fixed] `<x-tooltip>` is now shown when placed inside `<x-input>`\n\n## 0.17.2 (2022-07-16)\n\n- [Fixed] Opening the context menu multiple times in short intervals causes the app to freeze\n\n## 0.17.1 (2022-07-07)\n\n- [Fixed] Menus containing `<x-message>` elements are positioned incorrectly\n\n## 0.17.0 (2022-06-14)\n\n- Add `Xel.localesIds` getter\n- Add `RELDATETIME` FTL function\n- Add `ellipsis` property/attribute to `<x-message>`\n- [Fixed] Invisible unicode characters added to `<x-message>` args\n\n## 0.16.4 (2022-05-31)\n\n- [Fixed] `setCustomValidity()` does not handle empty string argument correctly\n\n## 0.16.3 (2022-05-30)\n\n- Make default validation messages shorter\n\n## 0.16.2 (2022-05-30)\n\n- [Fixed] Calling `<x-tooltip>.open()` should not throw error when the tooltip is disconnected\n- [Fixed] `<x-texteditor>` tooltip not shown in some edge cases\n\n## 0.16.1 (2022-05-30)\n\n- Make `reportValidity()` return a boolean with validation state\n\n## 0.16.0 (2022-05-30)\n\n- Add `<x-tooltip>` element\n- Change `error` property/method on `<x-input>` and `<x-texteditor>` to a read-only boolean. The new\n  `setCustomValidity()` method should be used for setting custom error messages from now on\n- Rename `validate()` on `<x-input>` and `<x-texteditor>` to `reportValidity()`. The new `beforevalidate` event\n  should be used to provide custom validation logic from now on\n- Remove `required` and `error` property/method on `<x-numberinput>` and `<x-tagsinput>`\n\n## 0.15.0 (2022-05-23)\n\n- Add `autocapitalize` boolean attribute to `<x-message>`\n\n## 0.14.0 (2022-05-05)\n\n- Add `Xel.queryIcon()` and `Xel.queryMessage()` method\n- Make `Xel.iconsetElements` and `Xel.localesBundle` properties private\n- Change x-message API from `<x-message name=\"id\">` to `<x-message href=\"#id\">`\n- Change x-icon API from `<x-icon name=\"id\" iconset=\"path\">` to `<x-icon href=\"path#id\">`\n- [Fixed] `<x-message>` adds extra whitespace when placed inside preformatted text\n\n## 0.13.2 (2022-05-03)\n\n- [Fixed] `<x-message>` fails to render compound messages\n\n## 0.13.1 (2022-05-02)\n\n- [Fixed] `<x-message>` treats numeric arguments as strings\n\n## 0.13.0 (2022-05-01)\n\n- Internationalization and localization support with new `Xel.locales` API and `<x-message>` element\n- Rename `<meta name=\"xel-iconset\">` to `<meta name=\"xel-iconsets\">`\n- Rename `Xel.iconset` to `Xel.iconsets` and make it return an array\n\n## 0.12.0 (2022-04-09)\n\n- Add Adwaita theme\n- Add Adwaita Dark theme\n- Remove Vanilla theme\n\n## 0.11.0 (2022-03-13)\n\n- Remove `<x-doctabs>` and `<x-doctab>`\n\n## 0.10.2 (2022-02-20)\n\n- [Fixed] Click events are not always detected when using macOS 12\n\n## 0.10.1 (2022-01-07)\n\n- Use ES syntax to denote private properties and methods\n\n## 0.10.0 (2022-01-05)\n\n- Remove the custom issue tracker (use GitHub instead)\n- Move all files into a single GitHub repository\n- Update documentation\n\n## 0.9.12 (2021-12-19)\n\n- [Fixed] NPM bundle contains unused files\n\n## 0.9.11 (2021-12-07)\n\n- [Fixed] Incorrect size of `<x-stepper>` inside condensed `<x-numberinput>`\n\n## 0.9.10 (2021-09-24)\n\n- [Fixed] Horizontal scrollbars are misaligned in the Fluent theme\n\n## 0.9.9 (2021-09-24)\n\n- [Fixed] `<x-texteditor>` scrollbars do not inherit default stylings\n\n## 0.9.8 (2021-07-26)\n\n- [Fixed] Do not close the dialog when user clicks the backdrop area of a popover\n\n## 0.9.7 (2021-05-10)\n\n- Update the license\n\n## 0.9.6 (2021-05-02)\n\n- [Fixed] base.css fails to load in some edge cases\n\n## 0.9.5 (2021-04-26)\n\n- [Fixed] Themes with relative URL fail to load\n\n## 0.9.4 (2021-04-26)\n\n- [Portal] [Fixed] Issue descriptions containing template strings fail to render\n\n## 0.9.3 (2021-04-08)\n\n- [Portal] [Fixed] Admin can't close issues\n\n## 0.9.2 (2021-04-08)\n\n- [Portal] [Fixed] Tags are not rendered correctly in the HTML version of the changelog\n\n## 0.9.1 (2021-04-08)\n\n- [Fixed] `<x-numberinput>` value is not set properly when changing focus to `<x-stepper>`\n- [Portal] Add more `<x-doctabs>` examples\n- [Portal] [Fixed] Syntax highlighting is not working with dark themes\n- [Portal] [Fixed] Redirects are not working when using a local Firebase instance\n- [Portal] [Fixed] Whitespace is missing between changelog tags\n- [Portal] [Fixed] Always fetch the changelog from the public GitHub repository\n\n## 0.9.0 (2021-04-06)\n\n- Project rewrite using the latest Web Platform APIs\n"
  },
  {
    "path": "src/renderer/public/xel/LICENSE.md",
    "content": "\n# INTRO\n\nThis document defines the licensing terms for the Xel package distributed on NPM\nand the Xel source code distributed on GitHub.</p>\n\nCupertino theme files (cupertino.css and cupertino-dark.css) are made available\nunder the Xel Cupertino License v1.\n\nMaterial icons (material.svg and material-outlined.svg files) are made available\nunder the Material Icons License v1.\n\nFluent icons (fluent.svg and fluent-outlined.svg files) are made available under\nthe Fluent Icons License v1.\n\nAll other files included in the NPM package and the GitHub source code repository are\nlicensed under the Xel License.\n\nThe full text of each license is provided below.\n\n---\n\n## Xel License\n\n    Copyright © 2016-2025 Jarosław Foksa\n\n    MIT License\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to\n    deal in the Software without restriction, including without limitation the\n    rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n    sell copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in\n    all copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n    IN THE SOFTWARE.\n\n\n---\n\n## Xel Cupertino License v1\n\n    Copyright © 2016-2025 Jarosław Foksa\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n    IN THE SOFTWARE.\n\n    This Software can be used free of charge by any person with the following\n    restriction: The Software must be used and distributed as part of an\n    Application bundle for the Apple macOS operating system. Usage of this\n    software with other operating systems is PROHIBITED.\n\n    Xel authors do not claim any legal rights to the MacOS design language, also\n    known as Human Interface Guidelines, which is owned and controlled by Apple\n    Inc., and is protected by copyright, patent and trademark laws, and various\n    other intellectual property rights. You agree to comply immediately with any\n    requests from Apple Inc. or Xel Authors to stop the usage and/or\n    redistribution of the Software.\n\n    The above permission notice and disclaimer shall be included in all copies\n    or substantial portions of the Software.\n\n---\n\n## Fluent Icons License v1\n\n    Copyright © 2020 Microsoft Corporation\n\n    MIT License\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to\n    deal in the Software without restriction, including without limitation the\n    rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n    sell copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in\n    all copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n    IN THE SOFTWARE.\n\n---\n\n## Material Icons License v1\n\n    Copyright © 2020 Google LLC\n\n    Apache License Version 2.0, January 2004, http://www.apache.org/licenses/\n\n    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n    1. Definitions.\n\n       \"License\" shall mean the terms and conditions for use, reproduction, and\n       distribution as defined by Sections 1 through 9 of this document.\n\n       \"Licensor\" shall mean the copyright owner or entity authorized by the\n       copyright owner that is granting the License.\n\n       \"Legal Entity\" shall mean the union of the acting entity and all other\n       entities that control, are controlled by, or are under common control\n       with that entity. For the purposes of this definition, \"control\" means\n       (i) the power, direct or indirect, to cause the direction or management\n       of such entity, whether by contract or otherwise, or (ii) ownership of\n       fifty percent (50%) or more of the outstanding shares, or (iii)\n       beneficial ownership of such entity.\n\n       \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising\n       permissions granted by this License.\n\n       \"Source\" form shall mean the preferred form for making modifications,\n       including but not limited to software source code, documentation source,\n       and configuration files.\n\n       \"Object\" form shall mean any form resulting from mechanical\n       transformation or translation of a Source form, including but not limited\n       to compiled object code, generated documentation, and conversions to\n       other media types.\n\n       \"Work\" shall mean the work of authorship, whether in Source or Object\n       form, made available under the License, as indicated by a copyright\n       notice that is included in or attached to the work (an example is\n       provided in the Appendix below).\n\n       \"Derivative Works\" shall mean any work, whether in Source or Object form,\n       that is based on (or derived from) the Work and for which the editorial\n       revisions, annotations, elaborations, or other modifications represent,\n       as a whole, an original work of authorship. For the purposes of this\n       License, Derivative Works shall not include works that remain separable\n       from, or merely link (or bind by name) to the interfaces of, the Work and\n       Derivative Works thereof.\n\n       \"Contribution\" shall mean any work of authorship, including the original\n       version of the Work and any modifications or additions to that Work or\n       Derivative Works thereof, that is intentionally submitted to Licensor for\n       inclusion in the Work by the copyright owner or by an individual or Legal\n       Entity authorized to submit on behalf of the copyright owner. For the\n       purposes of this definition, \"submitted\" means any form of electronic,\n       verbal, or written communication sent to the Licensor or its\n       representatives, including but not limited to communication on electronic\n       mailing lists, source code control systems, and issue tracking systems\n       that are managed by, or on behalf of, the Licensor for the purpose of\n       discussing and improving the Work, but excluding communication that is\n       conspicuously marked or otherwise designated in writing by the copyright\n       owner as \"Not a Contribution.\"\n\n       \"Contributor\" shall mean Licensor and any individual or Legal Entity on\n       behalf of whom a Contribution has been received by Licensor and\n       subsequently incorporated within the Work.\n\n    2. Grant of Copyright License. Subject to the terms and conditions of this\n       License, each Contributor hereby grants to You a perpetual, worldwide,\n       non-exclusive, no-charge, royalty-free, irrevocable copyright license to\n       reproduce, prepare Derivative Works of, publicly display, publicly\n       perform, sublicense, and distribute the Work and such Derivative Works in\n       Source or Object form.\n\n    3. Grant of Patent License. Subject to the terms and conditions of this\n       License, each Contributor hereby grants to You a perpetual, worldwide,\n       non-exclusive, no-charge, royalty-free, irrevocable (except as stated in\n       this section) patent license to make, have made, use, offer to sell,\n       sell, import, and otherwise transfer the Work, where such license applies\n       only to those patent claims licensable by such Contributor that are\n       necessarily infringed by their Contribution(s) alone or by combination of\n       their Contribution(s) with the Work to which such Contribution(s) was\n       submitted. If You institute patent litigation against any entity\n       (including a cross-claim or counterclaim in a lawsuit) alleging that the\n       Work or a Contribution incorporated within the Work constitutes direct or\n       contributory patent infringement, then any patent licenses granted to You\n       under this License for that Work shall terminate as of the date such\n       litigation is filed.\n\n    4. Redistribution. You may reproduce and distribute copies of the Work or\n       Derivative Works thereof in any medium, with or without modifications,\n       and in Source or Object form, provided that You meet the following\n       conditions:\n\n       (a) You must give any other recipients of the Work or Derivative Works a\n           copy of this License; and\n\n       (b) You must cause any modified files to carry prominent notices stating\n           that You changed the files; and\n\n       (c) You must retain, in the Source form of any Derivative Works that You\n           distribute, all copyright, patent, trademark, and attribution notices\n           from the Source form of the Work, excluding those notices that do not\n           pertain to any part of the Derivative Works; and\n\n       (d) If the Work includes a \"NOTICE\" text file as part of its\n           distribution, then any Derivative Works that You distribute must\n           include a readable copy of the attribution notices contained within\n           such NOTICE file, excluding those notices that do not pertain to any\n           part of the Derivative Works, in at least one of the following\n           places: within a NOTICE text file distributed as part of the\n           Derivative Works; within the Source form or documentation, if\n           provided along with the Derivative Works; or, within a display\n           generated by the Derivative Works, if and wherever such third-party\n           notices normally appear. The contents of the NOTICE file are for\n           informational purposes only and do not modify the License. You may\n           add Your own attribution notices within Derivative Works that You\n           distribute, alongside or as an addendum to the NOTICE text from the\n           Work, provided that such additional attribution notices cannot be\n           construed as modifying the License.\n\n       You may add Your own copyright statement to Your modifications and may\n       provide additional or different license terms and conditions for use,\n       reproduction, or distribution of Your modifications, or for any such\n       Derivative Works as a whole, provided Your use, reproduction, and\n       distribution of the Work otherwise complies with the conditions stated in\n       this License.\n\n    5. Submission of Contributions. Unless You explicitly state otherwise, any\n       Contribution intentionally submitted for inclusion in the Work by You to\n       the Licensor shall be under the terms and conditions of this License,\n       without any additional terms or conditions. Notwithstanding the above,\n       nothing herein shall supersede or modify the terms of any separate\n       license agreement you may have executed with Licensor regarding such\n       Contributions.\n\n    6. Trademarks. This License does not grant permission to use the trade\n       names, trademarks, service marks, or product names of the Licensor,\n       except as required for reasonable and customary use in describing the\n       origin of the Work and reproducing the content of the NOTICE file.\n\n    7. Disclaimer of Warranty. Unless required by applicable law or agreed to in\n       writing, Licensor provides the Work (and each Contributor provides its\n       Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n       ANY KIND, either express or implied, including, without limitation, any\n       warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or\n       FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for\n       determining the appropriateness of using or redistributing the Work and\n       assume any risks associated with Your exercise of permissions under this\n       License.\n\n    8. Limitation of Liability. In no event and under no legal theory, whether\n       in tort (including negligence), contract, or otherwise, unless required\n       by applicable law (such as deliberate and grossly negligent acts) or\n       agreed to in writing, shall any Contributor be liable to You for damages,\n       including any direct, indirect, special, incidental, or consequential\n       damages of any character arising as a result of this License or out of\n       the use or inability to use the Work (including but not limited to\n       damages for loss of goodwill, work stoppage, computer failure or\n       malfunction, or any and all other commercial damages or losses), even if\n       such Contributor has been advised of the possibility of such damages.\n\n    9. Accepting Warranty or Additional Liability. While redistributing the Work\n       or Derivative Works thereof, You may choose to offer, and charge a fee\n       for, acceptance of support, warranty, indemnity, or other liability\n       obligations and/or rights consistent with this License. However, in\n       accepting such obligations, You may act only on Your own behalf and on\n       Your sole responsibility, not on behalf of any other Contributor, and\n       only if You agree to indemnify, defend, and hold each Contributor\n       harmless for any liability incurred by, or claims asserted against, such\n       Contributor by reason of your accepting any such warranty or additional\n       liability.\n\n    END OF TERMS AND CONDITIONS\n\n    APPENDIX: How to apply the Apache License to your work.\n\n       To apply the Apache License to your work, attach the following\n       boilerplate notice, with the fields enclosed by brackets \"[]\" replaced\n       with your own identifying information. (Don't include the brackets!)  The\n       text should be enclosed in the appropriate comment syntax for the file\n       format. We also recommend that a file or class name and description of\n       purpose be included on the same \"printed page\" as the copyright notice\n       for easier identification within third-party archives.\n\n    Copyright [yyyy] [name of copyright owner]\n\n    Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n    use this file except in compliance with the License. You may obtain a copy\n    of the License at\n\n        http://www.apache.org/licenses/LICENSE-2.0\n\n    Unless required by applicable law or agreed to in writing, software\n    distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n    License for the specific language governing permissions and limitations\n    under the License.\n"
  },
  {
    "path": "src/renderer/public/xel/README.md",
    "content": "\n# Xel ([DEMO](https://xel-toolkit.org))\n\n[![npm downloads](http://img.shields.io/npm/dt/xel.svg)](https://www.npmjs.org/package/xel)\n[![npm version](https://img.shields.io/npm/v/xel.svg)](https://www.npmjs.org/package/xel)\n\nXel is a HTML 5 **widget toolkit** for building native-like **Web**, **Electron** and **Hybrid** apps.\n\nXel follows the Keep It Simple principle and thus is written using plain JS, HTML and CSS. It does not make use of\nany preprocessors or heavy abstraction layers.\n\nSome of the widgets included:\n- Buttons\n- Tabs\n- Sliders\n- Selects\n- Checkboxes\n- Switches\n- Radios\n- Menus\n- Menubars\n- Context menus\n- Text inputs\n- Number inputs\n- Cards\n- Dialogs\n- Drawers\n- Popovers\n- Progressbars\n- Throbbers\n- Swatchs\n- Steppers\n\nVisit [xel-toolkit.org](https://xel-toolkit.org) for a complete list of all supported widgets with demos and\ndocumentation.\n"
  },
  {
    "path": "src/renderer/public/xel/package.json",
    "content": "{\"name\":\"xel\",\"version\":\"0.36.2\",\"type\":\"module\",\"browser\":\"xel.js\",\"description\":\"Widget toolkit for building native-like Web, Electron and Hybrid apps\",\"author\":\"Jarosław Foksa\",\"license\":\"MIT\",\"homepage\":\"https://xel-toolkit.org/\",\"repository\":{\"type\":\"git\",\"url\":\"git+https://github.com/jarek-foksa/xel.git\"},\"bugs\":{\"url\":\"https://github.com/jarek-foksa/xel/issues\"},\"keywords\":[\"widget\",\"toolkit\",\"electron\",\"nwjs\",\"nw.js\",\"macOS\",\"desktop\",\"ui\",\"button\",\"slider\",\"tabs\",\"card\",\"menu\",\"menubar\",\"checkbox\",\"radio\",\"switch\",\"select\",\"dialog\",\"drawer\",\"popover\",\"slider\",\"throbber\"]}"
  },
  {
    "path": "src/renderer/public/xel/themes/adwaita-dark.css",
    "content": ":root{width:100%;height:100%;margin:0;interpolate-size:allow-keywords;font-family:sans-serif;line-height:1.6}body{width:100vw;height:100%;margin:0;overflow-y:overlay}h1{margin:22px 0 16px;box-sizing:border-box;line-height:1;font-size:3.25rem;font-weight:700}h2{margin:18px 0 14px 0;box-sizing:border-box;line-height:1;font-size:2.125rem;font-weight:700}h3{margin:16px 0 12px 0;box-sizing:border-box;line-height:1.2;font-size:1.75rem;font-weight:700}h4{margin:14px 0 10px 0;box-sizing:border-box;line-height:1.1;font-size:1.5rem;font-weight:700}h5{margin:12px 0 8px 0;box-sizing:border-box;line-height:1.1;font-size:1.25rem;font-weight:700}h6{margin:8px 0 5px 0;box-sizing:border-box;line-height:1.1;font-size:1rem;font-weight:700}h1 em, h2 em, h3 em, h4 em, h5 em, h6 em{font-weight:inherit}h1 strong, h2 strong, h3 strong, h4 strong, h5 strong, h6 strong{font-weight:900}p{margin:16px 0}p:last-child{margin-bottom:0}a{font-weight:500}table{width:100%;margin:16px 0;border-collapse:collapse;border-style:hidden;box-shadow:0 0 0 1px var(--border-color)}th{text-align:start;padding:8px 14px;border-spacing:0}td{padding:8px 14px;border-spacing:0}em{font-weight:500}pre, code, var{font-size:0.875rem;font-style:normal;padding:0 4px}pre{margin:14px 0;padding:4px 6px;white-space:pre-wrap;box-sizing:border-box}pre > code{display:block;padding:0;box-sizing:border-box;background-color:transparent;outline-width:0px;line-height:1.3}hr{width:100%;height:1px;min-height:1px;margin:24px 0;box-sizing:border-box;border:none}blockquote{box-sizing:border-box;margin:16px 0;padding:5px 14px;border-left-width:8px;border-left-style:solid}blockquote > blockquote{margin:6px 0}blockquote > p:first-child{margin-top:0}ul, ol{margin:12px 0;padding:0}p + ul{margin:-10px 0 0 0}li > ul, li > ol{margin:0}li{position:relative;margin:0;padding:0}ul li{margin-left:20px}ol li{margin-left:16px}li > p{margin:4px 0}ol > li::marker{font-weight:700}img{display:block;height:auto;margin:14px auto;max-width:100%;user-select:none;box-sizing:border-box;background:var(--checkboard-background);border-width:1px;border-style:solid;border-color:var(--border-color);-webkit-user-select:none;-webkit-user-modify:read-only}img:active{cursor:-webkit-grabbing}[popover]{color:var(--text-color);background-color:var(--foreground-color)}::-webkit-scrollbar{max-width:6px;max-height:6px}::-webkit-scrollbar-corner{display:none}@supports not selector(::-webkit-scrollbar){*{scrollbar-width:thin}}x-card:not(:defined){display:none}x-card > footer{padding:8px 16px;width:calc(100% + 40px);height:calc(100% + 20px);margin-left:-20px;margin-bottom:-16px;box-sizing:border-box;background:lightgrey}x-card > footer:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}x-card > footer:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}x-card > h1:first-child{margin-top:0}x-card > h2:first-child{margin-top:0}x-card > h3:first-child{margin-top:0}x-card > h4:first-child{margin-top:0}x-card > h5:first-child{margin-top:0}x-card > h6:first-child{margin-top:0}x-avatar[size=\"small\"]{width:28px;height:28px}x-avatar[size=\"large\"]{width:54px;height:54px}x-avatar > img{width:100%;height:100%;-webkit-user-drag:none}x-avatar > x-icon{width:55%;height:55%}x-avatar > x-label{font-size:1rem;pointer-events:none}x-avatar[size=\"small\"] > x-label{font-size:0.75rem}x-avatar[size=\"large\"] > x-label{font-size:1.5rem}x-accordion:not(:defined){display:none}x-accordion[size=\"small\"]::part(arrow){width:14px;height:14px}x-accordion[size=\"large\"]::part(arrow){width:18px;height:18px}x-accordion > header{display:flex;align-items:center;box-sizing:border-box;width:100%;padding:7px 0 7px 20px}x-accordion[size=\"small\"] > header{padding-left:18px}x-accordion[size=\"large\"] > header{padding-left:22px}x-accordion > header > x-label:first-child{flex:1}x-accordion > header > *:not(:last-child){margin-right:20px}x-accordion:not([expanded]):not([animating]) > *:not(header){display:none!important}x-icon[size=\"small\"]{width:15px;height:15px}x-icon[size=\"large\"]{width:21px;height:21px}x-icon:not(:defined){display:none}x-label:not(:defined){display:none}x-shortcut:not(:defined){display:none}x-stepper:not(:defined){display:none}x-swatch[size=\"small\"]{width:16px;height:16px}x-swatch[size=\"large\"]{width:20px;height:20px}x-swatch:not(:defined){display:none}x-button{--min-pressed-time: 150ms;}@media (pointer:coarse){x-button{--min-pressed-time: 600ms;}}a:has(x-button){text-decoration:none}x-button[toggled]{z-index:1}x-button[condensed]{padding:2px 7px}x-button[size=\"small\"]{min-height:24px}x-button[size=\"large\"]{min-height:38px}x-buttons[vertical] > x-button{width:100%;justify-content:flex-start}x-button:not(:defined){display:none}x-button > x-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;text-align:center;min-width:1px;pointer-events:none}x-button > x-label ~ x-icon, x-button > x-icon ~ x-label{margin:0 0 0 6px}x-button > x-menu{font-size:0.875rem}x-button[skin=\"normal\"][size=\"small\"] > x-icon{width:14px;height:14px}x-button[skin=\"normal\"][size=\"large\"] > x-icon{width:20px;height:20px}x-button[skin=\"flat\"]{padding:0}x-buttons:not([vertical]) > x-button[skin=\"flat\"]:not(:first-of-type){margin-left:10px}x-buttons:not([vertical]) > x-button[skin=\"flat\"][size=\"small\"]:not(:first-of-type){margin-left:5px}x-buttons[vertical] > x-button[skin=\"flat\"]:not(:first-of-type){margin-top:10px}x-buttons[vertical] > x-button[skin=\"flat\"][size=\"small\"]:not(:first-of-type){margin-top:5px}x-button[skin=\"flat\"] > x-icon{width:26px;height:26px}x-button[skin=\"flat\"][size=\"small\"] > x-icon{width:22px;height:22px}x-button[skin=\"flat\"][size=\"large\"] > x-icon{width:28px;height:28px}x-button[skin=\"recessed\"]{min-height:18px;padding:4px 8px}x-button[skin=\"recessed\"][size=\"small\"]{padding:3px 8px}x-button[skin=\"recessed\"][size=\"large\"]{padding:5px 8px}x-buttons:not([vertical]) > x-button[skin=\"recessed\"] + x-button[skin=\"recessed\"]{margin-left:4px}x-buttons[vertical] > x-button[skin=\"recessed\"] + x-button[skin=\"recessed\"]{margin-top:4px}x-button[skin=\"recessed\"] > x-icon{width:16px;height:16px}x-button[skin=\"recessed\"][size=\"small\"] > x-icon{width:12px;height:12px}x-button[skin=\"recessed\"][size=\"large\"] > x-icon{width:20px;height:20px}x-button[skin=\"dock\"], x-buttons[vertical] > x-button[skin=\"dock\"]{width:38px;height:38px;min-height:38px;padding:0;justify-content:center}x-button[skin=\"dock\"][size=\"small\"], x-buttons[vertical] > x-button[skin=\"dock\"][size=\"small\"]{width:30px;height:30px;min-height:30px}x-button[skin=\"dock\"][size=\"large\"], x-buttons[vertical] > x-button[skin=\"dock\"][size=\"large\"]{width:45px;height:45px;min-height:45px}x-buttons:not([vertical]) > x-button[skin=\"dock\"] + x-button[skin=\"dock\"]{margin-left:-1px}x-buttons[vertical] > x-button[skin=\"dock\"] + x-button[skin=\"dock\"]{margin-top:-1px}x-button[skin=\"dock\"] > x-icon{width:17px;height:17px}x-button[skin=\"dock\"][size=\"small\"] > x-icon{width:14px;height:14px}x-button[skin=\"dock\"][size=\"large\"] > x-icon{width:20px;height:20px}x-buttons[vertical]{flex-flow:column;align-items:flex-start;justify-content:center}x-buttons:not(:defined){display:none}x-tag[size=\"small\"]{height:18px}x-tag[size=\"large\"]{height:30px}x-tag:not(:defined){display:none}x-tag > x-swatch{width:14px;height:14px}x-tag[size=\"small\"] > x-swatch{width:12px;height:12px}x-tag[size=\"large\"] > x-swatch{width:16px;height:16px}x-tag > x-label{font-size:0.75rem}x-tag :not(x-label) + x-label{margin-left:0.25rem}x-tag[size=\"small\"] > x-label{font-size:0.6875rem}x-tag > x-icon{width:15px;height:15px}x-tags{margin-top:-2px;margin-left:-2px}x-tags:not(:defined){display:none}x-tags x-tag{margin:2px}x-tagsinput[size=\"small\"]{padding:0px;gap:0px}x-tagsinput[size=\"small\"] > x-tag{height:22px;transform:scale(0.92)}x-tagsinput[size=\"large\"]{padding:6px;gap:6px}x-tagsinput:focus-within{z-index:10}x-tagsinput:not(:defined){display:none}x-tagsinput > x-label{position:absolute;top:50%;left:8px;transform:translateY(-50%);pointer-events:none}x-tagsinput[size=\"small\"][error]::before{top:27px}x-tagsinput[size=\"large\"][error]::before{top:41px}x-tab[size=\"small\"]{min-height:24px}x-tab[size=\"large\"]{min-height:38px}x-tab:not(:defined){display:none}x-tab x-icon{width:17px;height:17px;min-width:17px;color:inherit}x-tab[size=\"small\"] x-icon{width:15px;height:15px;min-width:15px}x-tab[size=\"large\"] x-icon{width:19px;height:19px;min-width:19px}x-tab x-label{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;line-height:1.2;cursor:inherit;flex:1}x-tab x-icon + x-label{margin-left:6px}x-tab x-box:is([vertical]) x-icon + x-label{margin-left:0px}x-tabs:not(:defined){display:none}x-menu:not(:defined){display:none}x-menu:has(x-menu[opened]){overflow:-webkit-paged-x}x-menu img{margin:0;background:none;border:none}x-menu hr{width:100%;height:1px;margin:4px 0px;box-sizing:border-box}x-menu hr + hr, x-menu hr:last-child{display:none}x-menuitem[size=\"small\"]{min-height:24px}x-menuitem[size=\"large\"]{min-height:38px}x-menuitem:not(:defined){display:none}x-menuitem[highlighted]{color:white;background:var(--accent-color)}x-menuitem img{width:16px;height:16px}x-menuitem x-icon{width:16px;height:16px}x-menuitem x-label{display:block;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:inherit;line-height:1.4}x-menuitem img + x-label, x-menuitem x-swatch + x-label, x-menuitem x-icon + x-label{margin-left:8px}x-menuitem x-shortcut{margin-left:auto}x-menuitem x-label + x-shortcut{margin-left:8px}x-menubar[size=\"small\"]{height:30px}x-menubar[size=\"large\"]{height:42px}x-menubar:not(:defined){display:none}x-menubar > x-menuitem{height:100%;padding:0 11px;min-height:0}x-menubar > x-menuitem[autohidden]{display:none}x-navitem + x-navitem, a:has(x-navitem) + a:has(x-navitem), a:has(x-navitem) + x-navitem, x-navitem + a:has(x-navitem){margin:3px 0}x-nav x-nav > *:first-child{margin-top:3px}x-nav x-nav > *:last-child{margin-bottom:0}x-nav x-nav > *{margin-left:34px!important}x-nav x-nav > *{max-width:calc(100% - 34px)!important}x-nav > a{display:block;text-decoration:none}x-nav x-label{max-width:100%;flex:1 1 0%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:500;font-size:0.9375rem;text-align:start}x-nav x-icon + x-label{margin-left:14px}x-nav[collapsed] x-navitem > x-label{display:none}x-nav x-icon{width:20px;height:20px}x-nav x-label + x-icon{width:18px;height:18px;margin:0 0 0 10px}x-nav[collapsed] x-navitem > x-label + x-icon{display:none}x-nav[collapsed] x-navitem::part(button){padding:0}x-nav[collapsed] x-navitem::part(arrow){display:none}x-contextmenu:not(:defined){display:none}dialog{overflow:hidden;position:fixed;min-width:200px;min-height:100px;max-height:none;margin:auto;padding:20px 24px;box-sizing:border-box;font-size:0.8125rem;line-height:1.6}dialog:focus{outline:none}dialog:not(:defined){display:none}dialog > footer{display:flex;flex-flow:row;justify-content:flex-end;padding:12px 24px;width:calc(100% + 48px);height:calc(100% + 22px);margin-top:10px;margin-left:-24px;margin-bottom:-20px;box-sizing:border-box;background:lightgrey}dialog > footer:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}dialog > footer:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}dialog > footer x-button + x-button{margin-left:8px}dialog h3{font-size:1.125rem;font-weight:700}dialog > *:first-child{margin-top:0}x-popover{padding:12px;overflow:auto}x-popover:has(footer){overflow:hidden}x-popover:not(:defined){display:none}x-popover > footer{padding:12px;width:calc(100% + 24px);height:calc(100% + 12px);margin-left:-12px;margin-bottom:-12px;margin-top:12px;box-sizing:border-box;background:lightgrey}x-popover > footer:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}x-popover > footer:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}x-notification[size=\"small\"]{padding:3px 12px}x-notification[size=\"large\"]{padding:8px 12px}x-notification:not(:defined){display:none}x-notification > p{margin:0}x-checkbox:not(:defined){display:none}x-checkbox + x-checkbox{margin-top:6px}x-checkbox[size=\"small\"]::part(indicator){width:17px;height:17px}x-checkbox[size=\"large\"]::part(indicator){width:21px;height:21px}x-checkbox > x-label{display:block;margin-left:8px;padding:1px 0}x-radio + x-radio{margin-top:6px}x-radio:not(:defined){display:none}x-radio[size=\"small\"]::part(indicator){width:17px;height:17px}x-radio[size=\"large\"]::part(indicator){width:21px;height:21px}x-radio > x-label{margin:0 0 0 8px;padding:1px 0}x-radio[size=\"small\"] > x-label{margin-left:6px}x-radio[size=\"large\"] > x-label{margin-left:10px}x-radios:not(:defined){display:none}x-switch + x-switch{margin-top:12px}x-switch:not(:defined){display:none}x-switch[size=\"large\"]::part(indicator){width:42px;height:20px}x-switch[size=\"small\"]::part(indicator){width:28px;height:12px}x-switch > x-label{margin:0 0 0 8px;padding:1px 0}x-switch[size=\"small\"] > x-label{margin-left:6px}x-switch[size=\"large\"] > x-label{margin-left:10px}x-select[size=\"small\"]{height:24px}x-select[size=\"large\"]{height:38px}x-select:not(:defined){display:none}x-colorselect[size=\"small\"]{width:24px;height:24px}x-colorselect[size=\"large\"]{width:38px;height:38px}x-colorselect:not(:defined){display:none}x-input[size=\"small\"]{height:24px}x-input[size=\"large\"]{height:38px}x-input:not(:defined){display:none}x-input + x-input{margin-top:20px}x-input > x-icon{width:15px;height:15px;min-width:15px;margin:0 0 0 8px}x-input[size=\"small\"] > x-icon{transform:scale(0.8)}x-input[size=\"large\"] > x-icon{transform:scale(1.1)}x-input > x-icon:hover{cursor:default}x-input > x-label{display:none;position:absolute;top:50%;max-width:100%;padding:0 5px 0 5px;transform:translateY(-50%);font-family:inherit;font-size:inherit;line-height:inherit;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;pointer-events:none}x-input[empty] > x-label{display:block}x-input > x-icon + x-label{padding:0 5px 0 29px}x-numberinput[size=\"small\"]{height:24px}x-numberinput[size=\"large\"]{height:38px}x-numberinput:focus{z-index:10}x-numberinput:not(:defined){display:none}x-numberinput > x-label{display:none;position:absolute;top:50%;max-width:100%;padding:0 5px 0 5px;transform:translateY(-50%);font-family:inherit;font-size:inherit;line-height:inherit;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;pointer-events:none}x-numberinput[empty] > x-label{display:block}x-numberinput[size=\"small\"][error]::before{top:27px}x-numberinput[size=\"large\"][error]::before{top:41px}x-texteditor:focus{z-index:10}x-texteditor:not(:defined){display:none}x-texteditor > x-label{display:none;position:absolute;width:100%;top:0;left:0;padding:2px 6px;font-family:inherit;font-size:inherit;line-height:inherit;pointer-events:none}x-texteditor[empty] > x-label{display:block}x-slider:not(:defined){display:none}x-colorpicker:not(:defined){display:none}x-progressbar[size=\"small\"]{height:6px}x-progressbar[size=\"large\"]{height:10px}x-progressbar:not(:defined){display:none}x-throbber[size=\"small\"]{width:26px;height:26px}x-throbber[size=\"large\"]{width:34px;height:34px}x-throbber:not(:defined){display:none}x-titlebar x-icon + x-label{margin-left:6px}:root{color:var(--text-color);background-color:var(--background-color);font-family:\"Adwaita Sans\", \"Inter\", \"Roboto Flex\", \"Roboto\", \"Noto Sans\", \"Helvetica Neue\", \"Arial\", sans-serif;--theme-id:                   \"adwaita-dark\";--preset-accent-colors:       blue     color(srgb 0.21 0.52 0.89),\n                                purple   color(srgb 0.57 0.25 0.67),\n                                pink     color(srgb 0.97 0.31 0.62),\n                                red      color(srgb 0.88 0.11 0.14),\n                                orange   color(srgb 1.00 0.47 0.00),\n                                yellow   color(srgb 0.90 0.65 0.04),\n                                green    color(srgb 0.18 0.76 0.49),\n                                gray     color(srgb 0.60 0.60 0.59);--accent-color:               color(srgb 0.21 0.52 0.89);--light-accent-color:         oklch(from var(--accent-color) calc(l + 0.07) calc(c - 0.02) h);--lighter-accent-color:       oklch(from var(--accent-color) calc(l + 0.17) calc(c - 0.07) h);--dark-accent-color:          oklch(from var(--accent-color) calc(l + 0.04) calc(c + 0.02) h);--darker-accent-color:        oklch(from var(--accent-color) calc(l - 0.15) calc(c - 0.02) h);--background-color:           color(srgb 0.14 0.14 0.14);--foreground-color:           color(srgb 0.21 0.21 0.21);--light-background-color:     color(srgb 0.21 0.21 0.21);--dark-background-color:      color(srgb 0 0 0);--border-color:               color(srgb 0.32 0.32 0.32);--text-color:                 color(srgb 1 1 1 / 0.8);--error-color:                color(srgb 0.77 0.19 0.24);--selection-color:            currentColor;--selection-background-color: oklch(from var(--accent-color) calc(l + 0.05) calc(c - 0.05) h / 0.7);--autofill-background-color:  color(srgb 0.95 0.93 0.89);--titlebar-color:             auto;--autocapitalize:             titlecase;--checkboard-background:      linear-gradient( 45deg, #5b5b5b 25%, #0000   25%)  0px  0px / 10px 10px,\n                                linear-gradient(-45deg, #5b5b5b 25%, #0000   25%)  0px  5px / 10px 10px,\n                                linear-gradient( 45deg, #0000   75%, #5b5b5b 75%)  5px -5px / 10px 10px,\n                                linear-gradient(-45deg, #0000   75%, #5b5b5b 75%) -5px  0px / 10px 10px, #929292;--arrow-right-path-data: M 31 74 L 56 49 L 32 26 C 30 24 30 20 32 18 L 33 17 C 35 15 39 15 42 17 L 70 45 C 72 47 72 51 70 54 C 69 54 69 55 69 55 L 41 83 C 38 85 35 85 32 83 L 31 82 C 29 80 29 76 31 74 Z;--arrow-down-path-data: M 6 30 L 93 30 L 50 76 L 6 30 Z;--checkmark-path-data: M 38 74 L 22 55 C 20 52 20 48 22 46 C 25 44 28 44 31 47 L 44 63 L 68 26 C 71 23 75 21 78 23 C 80 25 81 29 78 33 L 51 74 C 50 76 46 78 45 78 C 44 78 42 78 41 77 C 40 76 39 75 38 74 Z;--mixed-checkmark-path-data: M 13 50 C 13.1 54.5 16.8 57.2 21.3 57.2 L 78.6 57.2 C 83.1 57.2 86.8 54.5 86.9 50 C 86.9 45.4 83.2 42.7 78.6 42.7 L 21.3 42.7 C 16.7 42.7 13 45.4 13 50 Z;--clear-path-data: M 25 16 L 50 41 L 75 16 L 84 25 L 59 50 L 84 75 L 75 84 L 50 59 L 25 84 L 16 75 L 41 50 L 16 25 Z;--plus-path-data: M 58 10 L 58 42 L 90 42 L 90 58 L 58 58 L 58 90 L 42 90 L 42 58 L 10 58 L 10 42 L 42 42 L 42 10 Z;--minus-path-data: M 10 42 H 90 V 58 H 10 V 42 Z;--minimize-path-data: M 20 56 L 80 56 L 80 70 L 20 70 L 20 56 Z;--maximize-path-data: M 20 80 L 20 20 L 80 20 L 80 80 L 20 80 Z M 34 34 L 34 66 L 66 66 L 66 34 L 34 34 Z;--restore-path-data: M 26 74 L 26 26 L 74 26 L 74 74 L 26 74 Z M 40 40 L 40 60 L 60 60 L 60 40 L 40 40 Z;--close-path-data: M 36 26 L 50 40 L 64 26 L 74 36 L 60 50 L 74 64 L 64 74 L 50 60 L 36 74 L 26 64 L 40 50 L 26 36 L 36 26 Z;}h1, h2, h3, h4, h5, h6{color:color(srgb 1 1 1 / 0.92)}a{color:var(--light-accent-color);text-decoration:underline}a:focus{outline-width:2px;outline-style:solid;outline-color:var(--light-accent-color)}a:hover{color:var(--dark-accent-color)}pre, code, var{background-color:color(srgb 1 1 1 / 0.06);font-family:\"Adwaita Mono\", \"Iosevka\", ui-monospace, monospace}pre{border-radius:12px}code, var{border-radius:4px}blockquote{border-color:color(srgb 0.97 0.39 0.4)}mark, ::highlight(mark){color:inherit;background-color:color(srgb 0.9 0.65 0.04)}hr{background-color:var(--border-color)}table{border-radius:8px;border-style:hidden;box-shadow:0 0 0 1px var(--border-color)}th, td{border-width:1px;border-style:solid;border-color:var(--border-color)}::selection{color:var(--selection-color);background-color:var(--selection-background-color)}::-webkit-scrollbar{background-color:transparent}::-webkit-scrollbar:hover{background-color:color(srgb 1 1 1 / 0.08)}::-webkit-scrollbar-thumb:vertical{background-image:linear-gradient( 90deg, transparent 0%, transparent 25%, color(srgb 1 1 1 / 0.25) 25%, color(srgb 1 1 1 / 0.25) 75%, transparent 75%, transparent 100% )}::-webkit-scrollbar-thumb:horizontal{background-image:linear-gradient( 180deg, transparent 0%, transparent 25%, color(srgb 1 1 1 / 0.25) 25%, color(srgb 1 1 1 / 0.25) 75%, transparent 75%, transparent 100% )}::-webkit-scrollbar-thumb:hover{background-color:color(srgb 0.48 0.48 0.48);border-radius:4px}@supports not selector(::-webkit-scrollbar){*{scrollbar-color:color(srgb 1 1 1 / 0.25) transparent}}x-avatar{background-color:color(srgb 1 1 1 / 0.12);border-width:0px;border-radius:999px}x-avatar > x-label{font-weight:700}x-card{background-color:var(--foreground-color);border-width:1px;border-style:solid;border-color:color(srgb 1 1 1 / 0.1);border-radius:12px}x-card > footer{background-color:var(--background-color);border-top-width:1px;border-top-style:solid;border-top-color:var(--border-color)}x-accordion::part(arrow){color:color(srgb 1 1 1 / 0.5);--path-data: var(--arrow-right-path-data);}x-accordion[expanded]::part(arrow){color:var(--light-accent-color)}x-accordion::part(arrow):focus{outline-width:2px;outline-style:solid;outline-color:var(--light-accent-color);outline-offset:-2px}x-accordion > header > x-label{color:color(srgb 1 1 1 / 0.92);font-weight:700}x-tooltip{color:var(--text-color);background-color:var(--dark-background-color);border-color:var(--border-color);border-radius:12px;box-shadow:0px 3px 10px 0px color(srgb 0 0 0 / 0.17)}x-stepper{margin:0;min-width:20px;color:var(--text-color)}x-stepper::part(increment-button){border-top-right-radius:6px}x-stepper::part(decrement-button){border-bottom-right-radius:6px}x-stepper::part(increment-button), x-stepper::part(decrement-button){transform:scale(0.85)}x-stepper::part(increment-button):hover, x-stepper::part(decrement-button):hover{background-color:color(srgb 1 1 1 / 0.2)}x-stepper[pressed=\"increment\"]::part(increment-button), x-stepper[pressed=\"decrement\"]::part(decrement-button){color:var(--text-color);background-color:color(srgb 1 1 1 / 0.3)}x-stepper::part(increment-arrow){--path-data: var(--plus-path-data);}x-stepper::part(decrement-arrow){--path-data: var(--minus-path-data);}x-swatch{border-color:var(--border-color);border-radius:99px}x-button:focus{outline-width:2px;outline-style:solid;outline-color:var(--light-accent-color);outline-offset:-1px}x-button > x-label{font-weight:700}x-button[skin=\"normal\"]{color:var(--text-color);background-color:color(srgb 1 1 1 / 0.12);border-radius:6px}x-button[skin=\"normal\"]:hover{background-color:color(srgb 1 1 1 / 0.18)}x-button[skin=\"normal\"][pressed]{background-color:color(srgb 1 1 1 / 0.28)}x-button[skin=\"normal\"][toggled]{color:color(srgb 1 1 1);background-color:var(--accent-color)}x-button[skin=\"normal\"][toggled][expanded]{background-color:var(--light-accent-color)}x-button[skin=\"normal\"][toggled][pressed]{background-color:var(--light-accent-color)}x-buttons:not([vertical]) > x-button[skin=\"normal\"]:not(:first-of-type){border-left:1px solid color(srgb 1 1 1 / 0.12);border-top-left-radius:0;border-bottom-left-radius:0}x-buttons:not([vertical]) > x-button[skin=\"normal\"]:not(:last-of-type){border-top-right-radius:0;border-bottom-right-radius:0}x-buttons:not([vertical]) > x-button[skin=\"normal\"][pressed]{border-left-color:color(srgb 1 1 1 / 0.12)}x-buttons:not([vertical]) > x-button[skin=\"normal\"][pressed] + x-button[skin=\"normal\"]:not([toggled]){border-left-color:color(srgb 1 1 1 / 0.28)}x-buttons:not([vertical]) > x-button[skin=\"normal\"][toggled],x-buttons:not([vertical]) > x-button[skin=\"normal\"][toggled] + x-button[skin=\"normal\"]{border-left-color:var(--light-accent-color)}x-buttons:not([vertical]) > x-button[skin=\"normal\"][toggled][pressed],x-buttons:not([vertical]) > x-button[skin=\"normal\"][toggled][pressed] + x-button[skin=\"normal\"]{border-left-color:var(--lighter-accent-color)!important}x-buttons[vertical] > x-button[skin=\"normal\"]:not(:first-of-type){border-top-width:1px;border-top-style:solid;border-top-color:color(srgb 1 1 1 / 0.12);border-top-left-radius:0;border-top-right-radius:0}x-buttons[vertical] > x-button[skin=\"normal\"]:not(:last-of-type){border-bottom-left-radius:0;border-bottom-right-radius:0}x-buttons[vertical] > x-button[skin=\"normal\"][pressed]{border-top-color:color(srgb 1 1 1 / 0.12)}x-buttons[vertical] > x-button[skin=\"normal\"][pressed] + x-button[skin=\"normal\"]:not([toggled]){border-top-color:color(srgb 1 1 1 / 0.28)}x-buttons[vertical] > x-button[skin=\"normal\"][toggled],x-buttons[vertical] > x-button[skin=\"normal\"][toggled] + x-button[skin=\"normal\"]{border-top-color:var(--light-accent-color)}x-buttons[vertical] > x-button[skin=\"normal\"][toggled][pressed],x-buttons[vertical] > x-button[skin=\"normal\"][toggled][pressed] + x-button[skin=\"normal\"]{border-top-color:var(--lighter-accent-color)!important}x-button[skin=\"flat\"]{color:var(--text-color)}x-button[skin=\"flat\"][toggled],x-button[skin=\"flat\"][expanded]{color:var(--accent-color)}x-button[skin=\"flat\"][pressed]{color:var(--light-accent-color)}x-button[skin=\"recessed\"]{color:var(--text-color);border-radius:6px}x-button[skin=\"recessed\"]:hover{background-color:color(srgb 1 1 1 / 0.07)}x-button[skin=\"recessed\"][toggled]{color:color(srgb 0 0 0 / 0.95);background-color:color(srgb 1 1 1 / 0.6)}x-button[skin=\"recessed\"][pressed]{color:color(srgb 0 0 0 / 0.95);background-color:color(srgb 1 1 1 / 0.75)}x-button[skin=\"recessed\"] > x-label{font-size:0.75rem;text-align:center}x-button[skin=\"dock\"]{color:var(--text-color);background-color:var(--light-background-color);border-width:1px;border-style:solid;border-color:var(--border-color)}x-button[skin=\"dock\"]:hover{background-color:color(srgb 1 1 1 / 0.18)}x-button[skin=\"dock\"][pressed]{background-color:color(srgb 1 1 1 / 0.28)}x-button[skin=\"dock\"][toggled]{color:color(srgb 1 1 1);background-color:var(--accent-color);border-color:var(--light-accent-color);z-index:1}x-tag{background-color:var(--background-color);border-color:var(--border-color);border-radius:4px}x-tag:active{filter:brightness(0.97)}x-tag:focus{border-color:var(--accent-color);outline-width:2px;outline-style:solid;outline-color:var(--light-accent-color);outline-offset:-1px}x-tag[scoped]::part(main){background-color:var(--background-color)}x-tag[toggled]{color:color(srgb 1 1 1 / 0.8);filter:brightness(1.3)}x-tag[toggled]:active{filter:brightness(0.7)}x-tag::part(remove-button){--path-data: var(--clear-path-data);}x-tag::part(scope){background-color:var(--light-background-color);border-color:var(--border-color)}x-tagsinput{background-color:color(srgb 1 1 1 / 0.12);border-radius:6px}x-tagsinput:focus{outline-width:2px;outline-style:solid;outline-color:var(--light-accent-color);outline-offset:-1px}x-tagsinput[error]{background-color:var(--error-background-color);outline-width:2px;outline-style:solid;outline-color:var(--error-color);outline-offset:-1px;--selection-background-color: oklch(from var(--error-color) l c h / 0.6);}x-tagsinput > x-label{color:color(srgb 0 0 0 / 0.4);font-weight:600}x-tabs{width:100%;justify-content:flex-start;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:var(--border-color)}x-tab{border-bottom-width:4px;border-bottom-style:solid;border-bottom-color:transparent;margin-bottom:-1px}x-tab + x-tab{margin-left:5px}x-tab:hover{background-color:var(--light-background-color);border-color:color(srgb 1 1 1 / 0.1)}x-tab:focus{outline-width:2px;outline-style:solid;outline-color:var(--light-accent-color);outline-offset:-1px}x-tab[toggled]{border-color:var(--accent-color)}x-tab:active{background-color:color(srgb 1 1 1 / 0.12)}x-navitem:focus{outline-width:0}x-navitem::part(button){color:var(--text-color);border-radius:8px}x-navitem[toggled]::part(button){background-color:color(srgb 1 1 1 / 0.12)}x-navitem::part(button):hover{background-color:color(srgb 1 1 1 / 0.08)}x-navitem[toggled]::part(button):hover{background-color:color(srgb 1 1 1 / 0.18)}x-navitem[pressed]::part(button){background-color:color(srgb 1 1 1 / 0.26)}x-navitem:focus::part(button){outline-width:2px;outline-style:solid;outline-color:var(--light-accent-color);outline-offset:-1px}x-navitem::part(arrow){color:var(--light-accent-color);--path-data: var(--arrow-right-path-data);}x-nav x-label + x-icon{color:var(--light-accent-color)}x-menu{padding:3px;color:var(--text-color);background-color:var(--light-background-color);border-width:1px;border-style:solid;border-color:var(--border-color);border-radius:12px;box-shadow:0px 3px 10px 0px color(srgb 0 0 0 / 0.17);--close-transition: 200 opacity cubic-bezier(0.4, 0, 0.2, 1);}x-menu hr{width:calc(100% - 8px);margin:4px 0px 4px 4px}x-menuitem{color:var(--text-color);border-radius:8px;--trigger-effect: none;}x-menuitem:hover, x-menuitem:focus, x-menuitem[expanded]{background-color:color(srgb 1 1 1 / 0.12)}x-menuitem[pressed]{background-color:color(srgb 1 1 1 / 0.18)}x-menuitem::part(checkmark){--path-data: var(--checkmark-path-data);}x-menuitem::part(arrow){color:color(srgb 1 1 1 / 0.4);width:14px;height:14px;--path-data: var(--arrow-right-path-data);}x-menuitem > x-shortcut{color:color(srgb 1 1 1 / 0.3)}x-menuitem:focus > x-swatch, x-menuitem[expanded] > x-swatch{border-color:color(srgb 1 1 1 / 0.8)}x-menubar{padding:0 3px}x-menubar > x-menuitem, x-menubar > x-menuitem[size=\"small\"], x-menubar > x-menuitem[size=\"large\"]{height:calc(100% - 6px)}x-menubar > x-menuitem[highlighted]{color:color(srgb 1 1 1);background-color:var(--accent-color)}dialog{color:inherit;background-color:var(--background-color);border-width:1px;border-style:solid;border-color:var(--border-color);border-radius:8px;box-shadow:0px 4px 22px color(srgb 0 0 0 / 0.3);transition-duration:100ms;transition-timing-function:linear;--transition-type: stretch;}dialog::backdrop{background-color:color(srgb 0 0 0 / 0.3)}dialog > footer{padding-top:6px;padding-bottom:20px;background-color:transparent}dialog > footer > x-button{flex:1}x-pager::part(item){color:var(--text-color);background-color:color(srgb 1 1 1 / 0.12);border-color:transparent;border-radius:6px}x-pager::part(item):hover{background-color:color(srgb 1 1 1 / 0.18)}x-pager::part(item):active{background-color:color(srgb 1 1 1 / 0.28)}x-pager::part(item):focus{outline-width:2px;outline-style:solid;outline-color:var(--light-accent-color);outline-offset:-1px}x-pager::part(toggled-item), x-pager::part(toggled-item):hover{color:color(srgb 1 1 1);background-color:var(--accent-color)}x-popover{color:var(--text-color);background-color:var(--light-background-color);border-width:1px;border-style:solid;border-color:var(--border-color);border-radius:12px;box-shadow:0px 3px 6px color(srgb 0 0 0 / 0.15);--open-transition: none;}x-popover > footer{background-color:var(--background-color);border-top-width:1px;border-top-style:solid;border-top-color:var(--border-color)}x-notification{border-radius:20px;font-weight:600;background-color:color(srgb 0 0 0 / 0.7)}x-notification::selection{color:color(srgb 0 0 0);background-color:color(srgb 1 1 1)}x-checkbox::part(indicator){background-color:color(srgb 1 1 1);border-width:1px;border-style:solid;border-color:var(--border-color);border-radius:6px;--path-data: var(--checkmark-path-data);}x-checkbox[mixed]::part(indicator){--path-data: var(--mixed-checkmark-path-data);}x-checkbox:not([toggled]):active::part(indicator){background-color:color(srgb 0 0 0 / 0.2)}x-checkbox:focus::part(indicator){outline-width:2px;outline-style:solid;outline-color:var(--light-accent-color);outline-offset:1px}x-checkbox[mixed]::part(indicator){color:color(srgb 0 0 0 / 0.4)}x-checkbox[toggled]::part(indicator){color:color(srgb 1 1 1);background-color:var(--accent-color);border-color:var(--accent-color)}x-checkbox[toggled]:active::part(indicator){background-color:var(--darker-accent-color);border-color:var(--darker-accent-color)}x-radio::part(indicator){background-color:color(srgb 1 1 1);border-width:1px;border-style:solid;border-color:var(--border-color)}x-radio:not([toggled]):active::part(indicator){background-color:color(srgb 0 0 0 / 0.2)}x-radio:focus::part(indicator){outline-width:2px;outline-style:solid;outline-color:var(--light-accent-color);outline-offset:1px}x-radio[toggled]::part(indicator){background-color:var(--accent-color);border-color:var(--accent-color)}x-radio[toggled]:active::part(indicator){background-color:var(--darker-accent-color)}x-radio::part(indicator-dot){background-color:color(srgb 1 1 1)}x-radio[toggled]::part(indicator-dot){transform:scale(0.4)}x-radio[mixed]::part(indicator-dot){transform:scale(0.5);border-radius:3px}x-switch::part(indicator-thumb){background-color:color(srgb 1 1 1);box-shadow:0px 0px 0px 2px color(srgb 1 1 1), 0px 1px 3px 2px color(srgb 0 0 0 / 0.38);width:15px;height:15px}x-switch[toggled]::part(indicator-thumb){left:calc(100% - 15px)}x-switch[size=\"small\"]::part(indicator-thumb){width:12px;height:12px}x-switch[size=\"small\"][toggled]::part(indicator-thumb){left:calc(100% - 12px)}x-switch[size=\"large\"]::part(indicator-thumb){width:18px;height:18px;left:1px}x-switch[size=\"large\"][toggled]::part(indicator-thumb){left:calc(100% - 19px)}x-switch::part(indicator-track){height:100%;background-color:color(srgb 1 1 1 / 0.12);box-shadow:0 0 0 4px color(srgb 1 1 1 / 0.12)}x-switch[toggled]::part(indicator-track){background-color:var(--accent-color);box-shadow:0 0 0 4px var(--accent-color)}x-switch:focus::part(indicator-track){outline-width:2px;outline-style:solid;outline-color:var(--light-accent-color);outline-offset:5px}x-select{color:var(--text-color);background-color:color(srgb 1 1 1 / 0.12);border-radius:8px}x-select:hover{background-color:color(srgb 1 1 1 / 0.18)}x-select:focus{outline-width:2px;outline-style:solid;outline-color:var(--light-accent-color);outline-offset:-1px}x-select::part(arrow){margin:0 8px;--path-data: var(--arrow-down-path-data);}x-slider::part(groove-track){background-color:var(--border-color);border-radius:5px}x-slider::part(range-track){background-color:var(--light-accent-color);border-radius:5px}x-slider::part(thumb){background-color:color(srgb 1 1 1);border-radius:99px;box-shadow:0px 2px 4px 0px color(srgb 0 0 0 / 0.1)}x-slider[dragging=\"start\"]::part(start-thumb), x-slider[dragging=\"end\"]::part(end-thumb){background-color:color(srgb 0.8 0.8 0.8)}x-slider::part(thumb):focus{border-color:var(--accent-color);box-shadow:0 0 0px 3px var(--lighter-accent-color)}x-slider::part(tick){background-color:color(srgb 1 1 1 / 0.5)}x-input{background-color:color(srgb 1 1 1 / 0.12);border-radius:6px}x-input:focus{outline-width:2px;outline-style:solid;outline-color:var(--light-accent-color);outline-offset:-1px}x-input[error]{background-color:var(--error-background-color);outline-width:2px;outline-style:solid;outline-color:var(--error-color);outline-offset:-1px;--selection-background-color: oklch(from var(--error-color) l c h / 0.6);}x-input > x-label{color:color(srgb 1 1 1 / 0.4);font-weight:600}x-numberinput{background-color:color(srgb 1 1 1 / 0.12);border-radius:6px}x-numberinput:focus{outline-width:2px;outline-style:solid;outline-color:var(--light-accent-color);outline-offset:-1px}x-numberinput:focus:has(x-stepper){padding-right:20px}x-numberinput[error]{background-color:var(--error-background-color);outline-width:2px;outline-style:solid;outline-color:var(--error-color);outline-offset:-1px;--selection-background-color: oklch(from var(--error-color) l c h / 0.6);}x-numberinput > x-label{color:color(srgb 1 1 1 / 0.4);font-weight:600}x-numberinput > x-stepper{border-left:1px solid var(--border-color)}x-numberinput:focus > x-stepper{display:none}x-texteditor{background-color:color(srgb 1 1 1 / 0.12);border-radius:6px}x-texteditor:focus{outline-width:2px;outline-style:solid;outline-color:var(--light-accent-color);outline-offset:-1px}x-texteditor[error]{background-color:var(--error-background-color);outline-width:2px;outline-style:solid;outline-color:var(--error-color);outline-offset:-1px;--selection-background-color: oklch(from var(--error-color) l c h / 0.6);}x-texteditor > x-label{color:color(srgb 1 1 1 / 0.4);font-weight:600}x-colorinput{background-color:color(srgb 1 1 1 / 0.12);border-radius:6px}x-colorinput:focus{outline-width:2px;outline-style:solid;outline-color:var(--light-accent-color);outline-offset:-1px}x-colorinput[error]{background-color:var(--error-background-color);outline-width:2px;outline-style:solid;outline-color:var(--error-color);outline-offset:-1px;--selection-background-color: oklch(from var(--error-color) l c h / 0.6);}x-colorinput::part(arrow){padding:8px 4px 8px 2px;--path-data: var(--arrow-down-path-data);}x-colorinput[size=\"small\"]::part(arrow){padding:4px 4px 4px 0}x-colorinput > x-label{color:color(srgb 1 1 1 / 0.4);font-weight:600}x-colorpicker::part(slider){border-radius:6px}x-colorselect{border-width:5px;border-style:solid;border-color:color(srgb 0.25 0.25 0.25);border-radius:8px}x-progressbar{background-color:var(--dark-background-color);box-shadow:0px 0px 0px 1px inset var(--border-color);border-radius:5px}x-progressbar::part(bar){background-color:var(--light-accent-color)}x-throbber{color:var(--light-accent-color)}x-titlebar::part(buttons){right:10px;gap:10px}x-titlebar::part(button){width:22px;height:22px;min-width:22px;min-height:22px;color:color(srgb 1 1 1 / 0.8);border-radius:999px}x-titlebar::part(button):hover{background:color(srgb 1 1 1 / 0.15)}x-titlebar::part(button):active{background:color(srgb 1 1 1 / 0.25)}x-titlebar::part(minimize-button){--path-data: var(--minimize-path-data);}x-titlebar::part(maximize-button){--path-data: var(--maximize-path-data);}x-titlebar::part(restore-button){--path-data: var(--restore-path-data);}x-titlebar::part(close-button){--path-data: var(--close-path-data);}x-titlebar::part(icon){width:18px;height:18px}x-titlebar x-label{font-weight:700}\n"
  },
  {
    "path": "src/renderer/public/xel/themes/adwaita.css",
    "content": ":root{width:100%;height:100%;margin:0;interpolate-size:allow-keywords;font-family:sans-serif;line-height:1.6}body{width:100vw;height:100%;margin:0;overflow-y:overlay}h1{margin:22px 0 16px;box-sizing:border-box;line-height:1;font-size:3.25rem;font-weight:700}h2{margin:18px 0 14px 0;box-sizing:border-box;line-height:1;font-size:2.125rem;font-weight:700}h3{margin:16px 0 12px 0;box-sizing:border-box;line-height:1.2;font-size:1.75rem;font-weight:700}h4{margin:14px 0 10px 0;box-sizing:border-box;line-height:1.1;font-size:1.5rem;font-weight:700}h5{margin:12px 0 8px 0;box-sizing:border-box;line-height:1.1;font-size:1.25rem;font-weight:700}h6{margin:8px 0 5px 0;box-sizing:border-box;line-height:1.1;font-size:1rem;font-weight:700}h1 em, h2 em, h3 em, h4 em, h5 em, h6 em{font-weight:inherit}h1 strong, h2 strong, h3 strong, h4 strong, h5 strong, h6 strong{font-weight:900}p{margin:16px 0}p:last-child{margin-bottom:0}a{font-weight:500}table{width:100%;margin:16px 0;border-collapse:collapse;border-style:hidden;box-shadow:0 0 0 1px var(--border-color)}th{text-align:start;padding:8px 14px;border-spacing:0}td{padding:8px 14px;border-spacing:0}em{font-weight:500}pre, code, var{font-size:0.875rem;font-style:normal;padding:0 4px}pre{margin:14px 0;padding:4px 6px;white-space:pre-wrap;box-sizing:border-box}pre > code{display:block;padding:0;box-sizing:border-box;background-color:transparent;outline-width:0px;line-height:1.3}hr{width:100%;height:1px;min-height:1px;margin:24px 0;box-sizing:border-box;border:none}blockquote{box-sizing:border-box;margin:16px 0;padding:5px 14px;border-left-width:8px;border-left-style:solid}blockquote > blockquote{margin:6px 0}blockquote > p:first-child{margin-top:0}ul, ol{margin:12px 0;padding:0}p + ul{margin:-10px 0 0 0}li > ul, li > ol{margin:0}li{position:relative;margin:0;padding:0}ul li{margin-left:20px}ol li{margin-left:16px}li > p{margin:4px 0}ol > li::marker{font-weight:700}img{display:block;height:auto;margin:14px auto;max-width:100%;user-select:none;box-sizing:border-box;background:var(--checkboard-background);border-width:1px;border-style:solid;border-color:var(--border-color);-webkit-user-select:none;-webkit-user-modify:read-only}img:active{cursor:-webkit-grabbing}[popover]{color:var(--text-color);background-color:var(--foreground-color)}::-webkit-scrollbar{max-width:6px;max-height:6px}::-webkit-scrollbar-corner{display:none}@supports not selector(::-webkit-scrollbar){*{scrollbar-width:thin}}x-card:not(:defined){display:none}x-card > footer{padding:8px 16px;width:calc(100% + 40px);height:calc(100% + 20px);margin-left:-20px;margin-bottom:-16px;box-sizing:border-box;background:lightgrey}x-card > footer:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}x-card > footer:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}x-card > h1:first-child{margin-top:0}x-card > h2:first-child{margin-top:0}x-card > h3:first-child{margin-top:0}x-card > h4:first-child{margin-top:0}x-card > h5:first-child{margin-top:0}x-card > h6:first-child{margin-top:0}x-avatar[size=\"small\"]{width:28px;height:28px}x-avatar[size=\"large\"]{width:54px;height:54px}x-avatar > img{width:100%;height:100%;-webkit-user-drag:none}x-avatar > x-icon{width:55%;height:55%}x-avatar > x-label{font-size:1rem;pointer-events:none}x-avatar[size=\"small\"] > x-label{font-size:0.75rem}x-avatar[size=\"large\"] > x-label{font-size:1.5rem}x-accordion:not(:defined){display:none}x-accordion[size=\"small\"]::part(arrow){width:14px;height:14px}x-accordion[size=\"large\"]::part(arrow){width:18px;height:18px}x-accordion > header{display:flex;align-items:center;box-sizing:border-box;width:100%;padding:7px 0 7px 20px}x-accordion[size=\"small\"] > header{padding-left:18px}x-accordion[size=\"large\"] > header{padding-left:22px}x-accordion > header > x-label:first-child{flex:1}x-accordion > header > *:not(:last-child){margin-right:20px}x-accordion:not([expanded]):not([animating]) > *:not(header){display:none!important}x-icon[size=\"small\"]{width:15px;height:15px}x-icon[size=\"large\"]{width:21px;height:21px}x-icon:not(:defined){display:none}x-label:not(:defined){display:none}x-shortcut:not(:defined){display:none}x-stepper:not(:defined){display:none}x-swatch[size=\"small\"]{width:16px;height:16px}x-swatch[size=\"large\"]{width:20px;height:20px}x-swatch:not(:defined){display:none}x-button{--min-pressed-time: 150ms;}@media (pointer:coarse){x-button{--min-pressed-time: 600ms;}}a:has(x-button){text-decoration:none}x-button[toggled]{z-index:1}x-button[condensed]{padding:2px 7px}x-button[size=\"small\"]{min-height:24px}x-button[size=\"large\"]{min-height:38px}x-buttons[vertical] > x-button{width:100%;justify-content:flex-start}x-button:not(:defined){display:none}x-button > x-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;text-align:center;min-width:1px;pointer-events:none}x-button > x-label ~ x-icon, x-button > x-icon ~ x-label{margin:0 0 0 6px}x-button > x-menu{font-size:0.875rem}x-button[skin=\"normal\"][size=\"small\"] > x-icon{width:14px;height:14px}x-button[skin=\"normal\"][size=\"large\"] > x-icon{width:20px;height:20px}x-button[skin=\"flat\"]{padding:0}x-buttons:not([vertical]) > x-button[skin=\"flat\"]:not(:first-of-type){margin-left:10px}x-buttons:not([vertical]) > x-button[skin=\"flat\"][size=\"small\"]:not(:first-of-type){margin-left:5px}x-buttons[vertical] > x-button[skin=\"flat\"]:not(:first-of-type){margin-top:10px}x-buttons[vertical] > x-button[skin=\"flat\"][size=\"small\"]:not(:first-of-type){margin-top:5px}x-button[skin=\"flat\"] > x-icon{width:26px;height:26px}x-button[skin=\"flat\"][size=\"small\"] > x-icon{width:22px;height:22px}x-button[skin=\"flat\"][size=\"large\"] > x-icon{width:28px;height:28px}x-button[skin=\"recessed\"]{min-height:18px;padding:4px 8px}x-button[skin=\"recessed\"][size=\"small\"]{padding:3px 8px}x-button[skin=\"recessed\"][size=\"large\"]{padding:5px 8px}x-buttons:not([vertical]) > x-button[skin=\"recessed\"] + x-button[skin=\"recessed\"]{margin-left:4px}x-buttons[vertical] > x-button[skin=\"recessed\"] + x-button[skin=\"recessed\"]{margin-top:4px}x-button[skin=\"recessed\"] > x-icon{width:16px;height:16px}x-button[skin=\"recessed\"][size=\"small\"] > x-icon{width:12px;height:12px}x-button[skin=\"recessed\"][size=\"large\"] > x-icon{width:20px;height:20px}x-button[skin=\"dock\"], x-buttons[vertical] > x-button[skin=\"dock\"]{width:38px;height:38px;min-height:38px;padding:0;justify-content:center}x-button[skin=\"dock\"][size=\"small\"], x-buttons[vertical] > x-button[skin=\"dock\"][size=\"small\"]{width:30px;height:30px;min-height:30px}x-button[skin=\"dock\"][size=\"large\"], x-buttons[vertical] > x-button[skin=\"dock\"][size=\"large\"]{width:45px;height:45px;min-height:45px}x-buttons:not([vertical]) > x-button[skin=\"dock\"] + x-button[skin=\"dock\"]{margin-left:-1px}x-buttons[vertical] > x-button[skin=\"dock\"] + x-button[skin=\"dock\"]{margin-top:-1px}x-button[skin=\"dock\"] > x-icon{width:17px;height:17px}x-button[skin=\"dock\"][size=\"small\"] > x-icon{width:14px;height:14px}x-button[skin=\"dock\"][size=\"large\"] > x-icon{width:20px;height:20px}x-buttons[vertical]{flex-flow:column;align-items:flex-start;justify-content:center}x-buttons:not(:defined){display:none}x-tag[size=\"small\"]{height:18px}x-tag[size=\"large\"]{height:30px}x-tag:not(:defined){display:none}x-tag > x-swatch{width:14px;height:14px}x-tag[size=\"small\"] > x-swatch{width:12px;height:12px}x-tag[size=\"large\"] > x-swatch{width:16px;height:16px}x-tag > x-label{font-size:0.75rem}x-tag :not(x-label) + x-label{margin-left:0.25rem}x-tag[size=\"small\"] > x-label{font-size:0.6875rem}x-tag > x-icon{width:15px;height:15px}x-tags{margin-top:-2px;margin-left:-2px}x-tags:not(:defined){display:none}x-tags x-tag{margin:2px}x-tagsinput[size=\"small\"]{padding:0px;gap:0px}x-tagsinput[size=\"small\"] > x-tag{height:22px;transform:scale(0.92)}x-tagsinput[size=\"large\"]{padding:6px;gap:6px}x-tagsinput:focus-within{z-index:10}x-tagsinput:not(:defined){display:none}x-tagsinput > x-label{position:absolute;top:50%;left:8px;transform:translateY(-50%);pointer-events:none}x-tagsinput[size=\"small\"][error]::before{top:27px}x-tagsinput[size=\"large\"][error]::before{top:41px}x-tab[size=\"small\"]{min-height:24px}x-tab[size=\"large\"]{min-height:38px}x-tab:not(:defined){display:none}x-tab x-icon{width:17px;height:17px;min-width:17px;color:inherit}x-tab[size=\"small\"] x-icon{width:15px;height:15px;min-width:15px}x-tab[size=\"large\"] x-icon{width:19px;height:19px;min-width:19px}x-tab x-label{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;line-height:1.2;cursor:inherit;flex:1}x-tab x-icon + x-label{margin-left:6px}x-tab x-box:is([vertical]) x-icon + x-label{margin-left:0px}x-tabs:not(:defined){display:none}x-menu:not(:defined){display:none}x-menu:has(x-menu[opened]){overflow:-webkit-paged-x}x-menu img{margin:0;background:none;border:none}x-menu hr{width:100%;height:1px;margin:4px 0px;box-sizing:border-box}x-menu hr + hr, x-menu hr:last-child{display:none}x-menuitem[size=\"small\"]{min-height:24px}x-menuitem[size=\"large\"]{min-height:38px}x-menuitem:not(:defined){display:none}x-menuitem[highlighted]{color:white;background:var(--accent-color)}x-menuitem img{width:16px;height:16px}x-menuitem x-icon{width:16px;height:16px}x-menuitem x-label{display:block;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:inherit;line-height:1.4}x-menuitem img + x-label, x-menuitem x-swatch + x-label, x-menuitem x-icon + x-label{margin-left:8px}x-menuitem x-shortcut{margin-left:auto}x-menuitem x-label + x-shortcut{margin-left:8px}x-menubar[size=\"small\"]{height:30px}x-menubar[size=\"large\"]{height:42px}x-menubar:not(:defined){display:none}x-menubar > x-menuitem{height:100%;padding:0 11px;min-height:0}x-menubar > x-menuitem[autohidden]{display:none}x-navitem + x-navitem, a:has(x-navitem) + a:has(x-navitem), a:has(x-navitem) + x-navitem, x-navitem + a:has(x-navitem){margin:3px 0}x-nav x-nav > *:first-child{margin-top:3px}x-nav x-nav > *:last-child{margin-bottom:0}x-nav x-nav > *{margin-left:34px!important}x-nav x-nav > *{max-width:calc(100% - 34px)!important}x-nav > a{display:block;text-decoration:none}x-nav x-label{max-width:100%;flex:1 1 0%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:500;font-size:0.9375rem;text-align:start}x-nav x-icon + x-label{margin-left:14px}x-nav[collapsed] x-navitem > x-label{display:none}x-nav x-icon{width:20px;height:20px}x-nav x-label + x-icon{width:18px;height:18px;margin:0 0 0 10px}x-nav[collapsed] x-navitem > x-label + x-icon{display:none}x-nav[collapsed] x-navitem::part(button){padding:0}x-nav[collapsed] x-navitem::part(arrow){display:none}x-contextmenu:not(:defined){display:none}dialog{overflow:hidden;position:fixed;min-width:200px;min-height:100px;max-height:none;margin:auto;padding:20px 24px;box-sizing:border-box;font-size:0.8125rem;line-height:1.6}dialog:focus{outline:none}dialog:not(:defined){display:none}dialog > footer{display:flex;flex-flow:row;justify-content:flex-end;padding:12px 24px;width:calc(100% + 48px);height:calc(100% + 22px);margin-top:10px;margin-left:-24px;margin-bottom:-20px;box-sizing:border-box;background:lightgrey}dialog > footer:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}dialog > footer:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}dialog > footer x-button + x-button{margin-left:8px}dialog h3{font-size:1.125rem;font-weight:700}dialog > *:first-child{margin-top:0}x-popover{padding:12px;overflow:auto}x-popover:has(footer){overflow:hidden}x-popover:not(:defined){display:none}x-popover > footer{padding:12px;width:calc(100% + 24px);height:calc(100% + 12px);margin-left:-12px;margin-bottom:-12px;margin-top:12px;box-sizing:border-box;background:lightgrey}x-popover > footer:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}x-popover > footer:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}x-notification[size=\"small\"]{padding:3px 12px}x-notification[size=\"large\"]{padding:8px 12px}x-notification:not(:defined){display:none}x-notification > p{margin:0}x-checkbox:not(:defined){display:none}x-checkbox + x-checkbox{margin-top:6px}x-checkbox[size=\"small\"]::part(indicator){width:17px;height:17px}x-checkbox[size=\"large\"]::part(indicator){width:21px;height:21px}x-checkbox > x-label{display:block;margin-left:8px;padding:1px 0}x-radio + x-radio{margin-top:6px}x-radio:not(:defined){display:none}x-radio[size=\"small\"]::part(indicator){width:17px;height:17px}x-radio[size=\"large\"]::part(indicator){width:21px;height:21px}x-radio > x-label{margin:0 0 0 8px;padding:1px 0}x-radio[size=\"small\"] > x-label{margin-left:6px}x-radio[size=\"large\"] > x-label{margin-left:10px}x-radios:not(:defined){display:none}x-switch + x-switch{margin-top:12px}x-switch:not(:defined){display:none}x-switch[size=\"large\"]::part(indicator){width:42px;height:20px}x-switch[size=\"small\"]::part(indicator){width:28px;height:12px}x-switch > x-label{margin:0 0 0 8px;padding:1px 0}x-switch[size=\"small\"] > x-label{margin-left:6px}x-switch[size=\"large\"] > x-label{margin-left:10px}x-select[size=\"small\"]{height:24px}x-select[size=\"large\"]{height:38px}x-select:not(:defined){display:none}x-colorselect[size=\"small\"]{width:24px;height:24px}x-colorselect[size=\"large\"]{width:38px;height:38px}x-colorselect:not(:defined){display:none}x-input[size=\"small\"]{height:24px}x-input[size=\"large\"]{height:38px}x-input:not(:defined){display:none}x-input + x-input{margin-top:20px}x-input > x-icon{width:15px;height:15px;min-width:15px;margin:0 0 0 8px}x-input[size=\"small\"] > x-icon{transform:scale(0.8)}x-input[size=\"large\"] > x-icon{transform:scale(1.1)}x-input > x-icon:hover{cursor:default}x-input > x-label{display:none;position:absolute;top:50%;max-width:100%;padding:0 5px 0 5px;transform:translateY(-50%);font-family:inherit;font-size:inherit;line-height:inherit;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;pointer-events:none}x-input[empty] > x-label{display:block}x-input > x-icon + x-label{padding:0 5px 0 29px}x-numberinput[size=\"small\"]{height:24px}x-numberinput[size=\"large\"]{height:38px}x-numberinput:focus{z-index:10}x-numberinput:not(:defined){display:none}x-numberinput > x-label{display:none;position:absolute;top:50%;max-width:100%;padding:0 5px 0 5px;transform:translateY(-50%);font-family:inherit;font-size:inherit;line-height:inherit;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;pointer-events:none}x-numberinput[empty] > x-label{display:block}x-numberinput[size=\"small\"][error]::before{top:27px}x-numberinput[size=\"large\"][error]::before{top:41px}x-texteditor:focus{z-index:10}x-texteditor:not(:defined){display:none}x-texteditor > x-label{display:none;position:absolute;width:100%;top:0;left:0;padding:2px 6px;font-family:inherit;font-size:inherit;line-height:inherit;pointer-events:none}x-texteditor[empty] > x-label{display:block}x-slider:not(:defined){display:none}x-colorpicker:not(:defined){display:none}x-progressbar[size=\"small\"]{height:6px}x-progressbar[size=\"large\"]{height:10px}x-progressbar:not(:defined){display:none}x-throbber[size=\"small\"]{width:26px;height:26px}x-throbber[size=\"large\"]{width:34px;height:34px}x-throbber:not(:defined){display:none}x-titlebar x-icon + x-label{margin-left:6px}:root{color:var(--text-color);background-color:var(--background-color);font-family:\"Adwaita Sans\", \"Inter\", \"Roboto Flex\", \"Roboto\", \"Noto Sans\", \"Helvetica Neue\", \"Arial\", sans-serif;--theme-id:                   \"adwaita\";--preset-accent-colors:       blue     color(srgb 0.21 0.52 0.89),\n                                purple   color(srgb 0.57 0.25 0.67),\n                                pink     color(srgb 0.97 0.31 0.62),\n                                red      color(srgb 0.88 0.11 0.14),\n                                orange   color(srgb 1.00 0.47 0.00),\n                                yellow   color(srgb 0.90 0.65 0.04),\n                                green    color(srgb 0.18 0.76 0.49),\n                                gray     color(srgb 0.60 0.60 0.59);--accent-color:               color(srgb 0.21 0.52 0.89);--light-accent-color:         oklch(from var(--accent-color) calc(l + 0.07) calc(c - 0.02) h);--dark-accent-color:          oklch(from var(--accent-color) calc(l + 0.04) calc(c + 0.02) h);--darker-accent-color:        oklch(from var(--accent-color) calc(l - 0.06) c h);--darkest-accent-color:       oklch(from var(--accent-color) calc(l - 0.15) calc(c - 0.02) h);--background-color:           color(srgb 0.96 0.96 0.96);--foreground-color:           color(srgb 0.99 0.99 0.99);--light-background-color:     color(srgb 0.99 0.99 0.99);--dark-background-color:      color(srgb 0.92 0.92 0.92);--border-color:               color(srgb 0.86 0.86 0.86);--dark-border-color:          color(srgb 0.82 0.82 0.82);--text-color:                 color(srgb 0 0 0 / 0.8);--error-color:                color(srgb 0.77 0.19 0.24);--error-background-color:     color(srgb 0.96 0.9 0.9);--selection-color:            currentColor;--selection-background-color: oklch(from var(--accent-color) l c h / 0.2);--autofill-background-color:  color(srgb 0.95 0.93 0.89);--titlebar-color:             auto;--autocapitalize:             titlecase;--checkboard-background:      linear-gradient( 45deg, #dedede 25%, #0000   25%)  0px  0px / 10px 10px,\n                                linear-gradient(-45deg, #dedede 25%, #0000   25%)  0px  5px / 10px 10px,\n                                linear-gradient( 45deg, #0000   75%, #dedede 75%)  5px -5px / 10px 10px,\n                                linear-gradient(-45deg, #0000   75%, #dedede 75%) -5px  0px / 10px 10px, #ffffff;--arrow-right-path-data: M 31 74 L 56 49 L 32 26 C 30 24 30 20 32 18 L 33 17 C 35 15 39 15 42 17 L 70 45 C 72 47 72 51 70 54 C 69 54 69 55 69 55 L 41 83 C 38 85 35 85 32 83 L 31 82 C 29 80 29 76 31 74 Z;--arrow-down-path-data: M 6 30 L 93 30 L 50 76 L 6 30 Z;--checkmark-path-data: M 38 74 L 22 55 C 20 52 20 48 22 46 C 25 44 28 44 31 47 L 44 63 L 68 26 C 71 23 75 21 78 23 C 80 25 81 29 78 33 L 51 74 C 50 76 46 78 45 78 C 44 78 42 78 41 77 C 40 76 39 75 38 74 Z;--mixed-checkmark-path-data: M 13 50 C 13.1 54.5 16.8 57.2 21.3 57.2 L 78.6 57.2 C 83.1 57.2 86.8 54.5 86.9 50 C 86.9 45.4 83.2 42.7 78.6 42.7 L 21.3 42.7 C 16.7 42.7 13 45.4 13 50 Z;--clear-path-data: M 25 16 L 50 41 L 75 16 L 84 25 L 59 50 L 84 75 L 75 84 L 50 59 L 25 84 L 16 75 L 41 50 L 16 25 Z;--plus-path-data: M 58 10 L 58 42 L 90 42 L 90 58 L 58 58 L 58 90 L 42 90 L 42 58 L 10 58 L 10 42 L 42 42 L 42 10 Z;--minus-path-data: M 10 42 H 90 V 58 H 10 V 42 Z;--minimize-path-data: M 20 56 L 80 56 L 80 70 L 20 70 L 20 56 Z;--maximize-path-data: M 20 80 L 20 20 L 80 20 L 80 80 L 20 80 Z M 34 34 L 34 66 L 66 66 L 66 34 L 34 34 Z;--restore-path-data: M 26 74 L 26 26 L 74 26 L 74 74 L 26 74 Z M 40 40 L 40 60 L 60 60 L 60 40 L 40 40 Z;--close-path-data: M 36 26 L 50 40 L 64 26 L 74 36 L 60 50 L 74 64 L 64 74 L 50 60 L 36 74 L 26 64 L 40 50 L 26 36 L 36 26 Z;}h1, h2, h3, h4, h5, h6{color:color(srgb 0 0 0)}a{color:var(--accent-color);text-decoration:underline}a:focus{outline-width:2px;outline-style:solid;outline-color:var(--light-accent-color)}a:hover{color:var(--darkest-accent-color)}pre, code, var{background-color:color(srgb 0 0 0 / 0.02);outline-width:1px;outline-style:solid;outline-color:rgba(0, 0, 0, 0.14);font-family:\"Adwaita Mono\", \"Iosevka\", ui-monospace, monospace}pre{border-radius:12px}code, var{border-radius:4px}blockquote{border-color:color(srgb 0.97 0.39 0.4)}mark, ::highlight(mark){color:inherit;background-color:color(srgb 0.96 0.83 0.18)}hr{background-color:var(--border-color)}table{border-radius:8px;border-style:hidden;box-shadow:0 0 0 1px var(--border-color)}th, td{border-width:1px;border-style:solid;border-color:var(--border-color)}::selection{color:var(--selection-color);background-color:var(--selection-background-color)}::-webkit-scrollbar{background-color:transparent}::-webkit-scrollbar:hover{background-color:color(srgb 0 0 0 / 0.08)}::-webkit-scrollbar-thumb:vertical{background-image:linear-gradient( 90deg, transparent 0%, transparent 25%, color(srgb 0 0 0 / 0.15) 25%, color(srgb 0 0 0 / 0.15) 75%, transparent 75%, transparent 100% )}::-webkit-scrollbar-thumb:horizontal{background-image:linear-gradient( 180deg, transparent 0%, transparent 25%, color(srgb 0 0 0 / 0.15) 25%, color(srgb 0 0 0 / 0.15) 75%, transparent 75%, transparent 100% )}::-webkit-scrollbar-thumb:hover{background-color:color(srgb 0.48 0.48 0.48);border-radius:4px}@supports not selector(::-webkit-scrollbar){*{scrollbar-color:color(srgb 0 0 0 / 0.15) transparent}}x-avatar{background-color:color(srgb 0 0 0 / 0.08);border-width:0px;border-radius:999px}x-avatar > x-label{font-weight:700}x-card{background-color:var(--light-background-color);border-width:1px;border-style:solid;border-color:color(srgb 0 0 0 / 0.14);border-radius:12px}x-accordion::part(arrow){color:color(srgb 0 0 0 / 0.48);--path-data: var(--arrow-right-path-data);}x-accordion[expanded]::part(arrow){color:var(--dark-accent-color)}x-accordion::part(arrow):focus{outline-width:2px;outline-style:solid;outline-color:var(--light-accent-color);outline-offset:-2px}x-accordion > header > x-label{color:color(srgb 0 0 0 / 0.92);font-weight:700}x-tooltip{color:var(--text-color);background-color:var(--dark-background-color);border-color:var(--border-color);border-radius:12px;box-shadow:0px 3px 10px 0px color(srgb 0 0 0 / 0.17)}x-stepper{margin:0;min-width:20px;color:var(--text-color)}x-stepper::part(increment-button){border-top-right-radius:6px}x-stepper::part(decrement-button){border-bottom-right-radius:6px}x-stepper::part(increment-button), x-stepper::part(decrement-button){transform:scale(0.85)}x-stepper::part(increment-button):hover, x-stepper::part(decrement-button):hover{background-color:color(srgb 0 0 0 / 0.07)}x-stepper[pressed=\"increment\"]::part(increment-button), x-stepper[pressed=\"decrement\"]::part(decrement-button){color:var(--text-color);background-color:color(srgb 0 0 0 / 0.12)}x-stepper::part(increment-arrow){--path-data: var(--plus-path-data);}x-stepper::part(decrement-arrow){--path-data: var(--minus-path-data);}x-swatch{border-color:var(--dark-border-color);border-radius:99px}x-button:focus{outline-width:2px;outline-style:solid;outline-color:var(--light-accent-color);outline-offset:-1px}x-button > x-label{font-weight:700}x-button[skin=\"normal\"]{color:var(--text-color);background-color:color(srgb 0 0 0 / 0.08);border-radius:6px}x-button[skin=\"normal\"]:hover{background-color:color(srgb 0 0 0 / 0.12)}x-button[skin=\"normal\"][pressed]{background-color:color(srgb 0 0 0 / 0.2)}x-button[skin=\"normal\"][toggled]{color:color(srgb 1 1 1);background-color:var(--accent-color)}x-button[skin=\"normal\"][toggled][expanded]{background-color:var(--dark-accent-color)}x-button[skin=\"normal\"][toggled][pressed]{background-color:var(--darker-accent-color)}x-buttons:not([vertical]) > x-button[skin=\"normal\"]:not(:first-of-type){border-left:1px solid color(srgb 0 0 0 / 0.12);border-top-left-radius:0;border-bottom-left-radius:0}x-buttons:not([vertical]) > x-button[skin=\"normal\"]:not(:last-of-type){border-top-right-radius:0;border-bottom-right-radius:0}x-buttons:not([vertical]) > x-button[skin=\"normal\"][pressed]{border-left-color:color(srgb 0 0 0 / 0.12)}x-buttons:not([vertical]) > x-button[skin=\"normal\"][pressed] + x-button[skin=\"normal\"]:not([toggled]){border-left-color:color(srgb 0 0 0 / 0.2)}x-buttons:not([vertical]) > x-button[skin=\"normal\"][toggled],x-buttons:not([vertical]) > x-button[skin=\"normal\"][toggled] + x-button[skin=\"normal\"]{border-left-color:var(--darker-accent-color)}x-buttons:not([vertical]) > x-button[skin=\"normal\"][toggled][pressed],x-buttons:not([vertical]) > x-button[skin=\"normal\"][toggled][pressed] + x-button[skin=\"normal\"]{border-left-color:var(--darkest-accent-color)!important}x-buttons[vertical] > x-button[skin=\"normal\"]:not(:first-of-type){border-top-width:1px;border-top-style:solid;border-top-color:color(srgb 0 0 0 / 0.12);border-top-left-radius:0;border-top-right-radius:0}x-buttons[vertical] > x-button[skin=\"normal\"]:not(:last-of-type){border-bottom-left-radius:0;border-bottom-right-radius:0}x-buttons[vertical] > x-button[skin=\"normal\"][pressed]{border-top-color:color(srgb 0 0 0 / 0.12)}x-buttons[vertical] > x-button[skin=\"normal\"][pressed] + x-button[skin=\"normal\"]:not([toggled]){border-top-color:color(srgb 0 0 0 / 0.2)}x-buttons[vertical] > x-button[skin=\"normal\"][toggled],x-buttons[vertical] > x-button[skin=\"normal\"][toggled] + x-button[skin=\"normal\"]{border-top-color:var(--darker-accent-color)}x-buttons[vertical] > x-button[skin=\"normal\"][toggled][pressed],x-buttons[vertical] > x-button[skin=\"normal\"][toggled][pressed] + x-button[skin=\"normal\"]{border-top-color:var(--darkest-accent-color)!important}x-button[skin=\"flat\"]{color:var(--text-color)}x-button[skin=\"flat\"][toggled],x-button[skin=\"flat\"][expanded]{color:var(--accent-color)}x-button[skin=\"flat\"][pressed]{color:var(--dark-accent-color)}x-button[skin=\"recessed\"]{color:var(--text-color);border-radius:6px}x-button[skin=\"recessed\"]:hover{background-color:color(srgb 0 0 0 / 0.07)}x-button[skin=\"recessed\"][toggled]{color:color(srgb 1 1 1 / 0.95);background-color:color(srgb 0 0 0 / 0.42)}x-button[skin=\"recessed\"][pressed]{color:color(srgb 1 1 1 / 0.95);background-color:color(srgb 0 0 0 / 0.6)}x-button[skin=\"recessed\"] > x-label{font-size:0.75rem;text-align:center}x-button[skin=\"dock\"]{color:var(--text-color);background-color:var(--light-background-color);border-width:1px;border-style:solid;border-color:var(--dark-border-color)}x-button[skin=\"dock\"]:hover{background-color:color(srgb 0 0 0 / 0.08)}x-button[skin=\"dock\"][pressed]{background-color:color(srgb 0 0 0 / 0.12)}x-button[skin=\"dock\"][toggled]{color:var(--light-background-color);background-color:var(--accent-color);border-color:var(--darkest-accent-color);z-index:1}x-tag{background-color:var(--light-background-color);border-color:var(--border-color);border-radius:4px}x-tag:active{filter:brightness(0.97)}x-tag:focus{border-color:var(--accent-color);outline-width:2px;outline-style:solid;outline-color:var(--light-accent-color);outline-offset:-1px}x-tag[scoped]::part(main){background-color:var(--light-background-color)}x-tag[toggled]{color:color(srgb 0 0 0 / 0.8);filter:brightness(0.8)}x-tag[toggled]:active{filter:brightness(0.7)}x-tag::part(remove-button){--path-data: var(--clear-path-data);}x-tag::part(scope){background-color:color(srgb 1 1 1);border-color:var(--border-color)}x-tagsinput{background-color:color(srgb 0 0 0 / 0.08);border-radius:6px}x-tagsinput:focus{outline-width:2px;outline-style:solid;outline-color:var(--light-accent-color);outline-offset:-1px}x-tagsinput[error]{background-color:var(--error-background-color);outline-width:2px;outline-style:solid;outline-color:var(--error-color);outline-offset:-1px;--selection-background-color: oklch(from var(--error-color) l c h / 0.2);}x-tagsinput > x-label{color:color(srgb 0 0 0 / 0.4);font-weight:600}x-tabs{width:100%;justify-content:flex-start;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:var(--border-color)}x-tab{border-bottom-width:4px;border-bottom-style:solid;border-bottom-color:transparent;margin-bottom:-1px}x-tab + x-tab{margin-left:5px}x-tab:hover{background-color:var(--dark-background-color);border-color:color(srgb 0 0 0 / 0.1)}x-tab:focus{outline-width:2px;outline-style:solid;outline-color:var(--light-accent-color);outline-offset:-1px}x-tab[toggled]{border-color:var(--accent-color)}x-tab:active{background-color:color(srgb 0 0 0 / 0.12)}x-navitem:focus{outline-width:0}x-navitem::part(button){color:var(--text-color);border-radius:8px}x-navitem[toggled]::part(button){background-color:color(srgb 0 0 0 / 0.08)}x-navitem::part(button):hover{background-color:color(srgb 0 0 0 / 0.04)}x-navitem[toggled]::part(button):hover{background-color:color(srgb 0 0 0 / 0.12)}x-navitem[pressed]::part(button){background-color:color(srgb 0 0 0 / 0.2)}x-navitem:focus::part(button){outline-width:2px;outline-style:solid;outline-color:var(--light-accent-color);outline-offset:-1px}x-navitem::part(arrow){color:var(--accent-color);--path-data: var(--arrow-right-path-data);}x-nav x-label + x-icon{color:var(--accent-color)}x-menu{padding:3px;color:var(--text-color);background-color:color(srgb 1 1 1);border-width:1px;border-style:solid;border-color:var(--border-color);border-radius:12px;box-shadow:0px 3px 10px 0px color(srgb 0 0 0 / 0.17);--close-transition: 200 opacity cubic-bezier(0.4, 0, 0.2, 1);}x-menu hr{width:calc(100% - 8px);margin:4px 0px 4px 4px}x-menuitem{color:var(--text-color);border-radius:8px;--trigger-effect: none;}x-menuitem:hover, x-menuitem:focus, x-menuitem[expanded]{background-color:color(srgb 0 0 0 / 0.08)}x-menuitem[pressed]{background-color:color(srgb 0 0 0 / 0.12)}x-menuitem::part(checkmark){--path-data: var(--checkmark-path-data);}x-menuitem::part(arrow){color:color(srgb 0 0 0 / 0.4);width:14px;height:14px;--path-data: var(--arrow-right-path-data);}x-menuitem > x-shortcut{color:color(srgb 0 0 0 / 0.4)}x-menuitem:focus > x-swatch, x-menuitem[expanded] > x-swatch{border-color:color(srgb 1 1 1 / 0.8)}x-menubar{padding:0 3px}x-menubar > x-menuitem, x-menubar > x-menuitem[size=\"small\"], x-menubar > x-menuitem[size=\"large\"]{height:calc(100% - 6px)}x-menubar > x-menuitem[highlighted]{color:color(srgb 1 1 1);background-color:var(--accent-color)}dialog{color:inherit;background-color:var(--background-color);border-width:1px;border-style:solid;border-color:var(--dark-border-color);border-radius:8px;box-shadow:0px 4px 22px color(srgb 0 0 0 / 0.3);transition-duration:100ms;transition-timing-function:linear;--transition-type: stretch;}dialog::backdrop{background-color:color(srgb 0 0 0 / 0.3)}dialog > footer{padding-top:6px;padding-bottom:20px;background-color:transparent}dialog > footer > x-button{flex:1}x-pager::part(item){color:var(--text-color);background-color:color(srgb 0 0 0 / 0.08);border-color:transparent;border-radius:6px}x-pager::part(item):hover{background-color:color(srgb 0 0 0 / 0.12)}x-pager::part(item):active{background-color:color(srgb 0 0 0 / 0.2)}x-pager::part(item):focus{outline-width:2px;outline-style:solid;outline-color:var(--light-accent-color);outline-offset:-1px}x-pager::part(toggled-item), x-pager::part(toggled-item):hover{color:color(srgb 1 1 1);background-color:var(--accent-color)}x-popover{color:var(--text-color);background-color:var(--light-background-color);border-width:1px;border-style:solid;border-color:var(--dark-border-color);border-radius:12px;box-shadow:0px 3px 6px color(srgb 0 0 0 / 0.15);--open-transition: none;}x-popover > footer{background-color:var(--background-color);border-top-width:1px;border-top-style:solid;border-top-color:var(--border-color)}x-notification{border-radius:20px;font-weight:600;background-color:color(srgb 0 0 0 / 0.7)}x-notification::selection{color:color(srgb 0 0 0);background-color:color(srgb 1 1 1)}x-notification a{color:var(--light-accent-color)}x-checkbox::part(indicator){background-color:color(srgb 1 1 1);border-width:1px;border-style:solid;border-color:var(--dark-border-color);border-radius:6px;--path-data: var(--checkmark-path-data);}x-checkbox[mixed]::part(indicator){--path-data: var(--mixed-checkmark-path-data);}x-checkbox:not([toggled]):active::part(indicator){background-color:color(srgb 0 0 0 / 0.2)}x-checkbox:focus::part(indicator){outline-width:2px;outline-style:solid;outline-color:var(--light-accent-color);outline-offset:1px}x-checkbox[mixed]::part(indicator){color:color(srgb 0 0 0 / 0.3)}x-checkbox[toggled]::part(indicator){color:color(srgb 1 1 1);background-color:var(--accent-color);border-color:var(--accent-color)}x-checkbox[toggled]:active::part(indicator){background-color:var(--darkest-accent-color);border-color:var(--darkest-accent-color)}x-radio::part(indicator){background-color:color(srgb 1 1 1);border-width:1px;border-style:solid;border-color:var(--dark-border-color)}x-radio:not([toggled]):active::part(indicator){background-color:color(srgb 0 0 0 / 0.2)}x-radio:focus::part(indicator){outline-width:2px;outline-style:solid;outline-color:var(--light-accent-color);outline-offset:1px}x-radio[toggled]::part(indicator){background-color:var(--accent-color);border-color:var(--accent-color)}x-radio[toggled]:active::part(indicator){background-color:var(--darkest-accent-color)}x-radio::part(indicator-dot){background-color:color(srgb 1 1 1)}x-radio[toggled]::part(indicator-dot){transform:scale(0.4)}x-radio[mixed]::part(indicator-dot){transform:scale(0.5);border-radius:3px}x-switch::part(indicator-thumb){background-color:color(srgb 1 1 1);box-shadow:0px 0px 0px 2px color(srgb 1 1 1), 0px 1px 3px 2px color(srgb 0 0 0 / 0.38);width:15px;height:15px}x-switch[toggled]::part(indicator-thumb){left:calc(100% - 15px)}x-switch[size=\"small\"]::part(indicator-thumb){width:12px;height:12px}x-switch[size=\"small\"][toggled]::part(indicator-thumb){left:calc(100% - 12px)}x-switch[size=\"large\"]::part(indicator-thumb){width:18px;height:18px;left:1px}x-switch[size=\"large\"][toggled]::part(indicator-thumb){left:calc(100% - 19px)}x-switch::part(indicator-track){height:100%;background-color:color(srgb 0 0 0 / 0.12);box-shadow:0 0 0 4px color(srgb 0 0 0 / 0.12)}x-switch[toggled]::part(indicator-track){background-color:var(--accent-color);box-shadow:0 0 0 4px var(--accent-color)}x-switch:focus::part(indicator-track){outline-width:2px;outline-style:solid;outline-color:var(--light-accent-color);outline-offset:5px}x-select{color:var(--text-color);background-color:color(srgb 0 0 0 / 0.08);border-radius:8px}x-select:hover{background-color:color(srgb 0 0 0 / 0.12)}x-select:focus{outline-width:2px;outline-style:solid;outline-color:var(--light-accent-color);outline-offset:-1px}x-select::part(arrow){margin:0 8px;--path-data: var(--arrow-down-path-data);}x-slider::part(groove-track){background-color:var(--dark-border-color);border-radius:5px}x-slider::part(range-track){background-color:var(--light-accent-color);border-radius:5px}x-slider::part(thumb){background-color:color(srgb 1 1 1);border-radius:99px;box-shadow:0px 2px 4px 0px color(srgb 0 0 0 / 0.1)}x-slider[dragging=\"start\"]::part(start-thumb), x-slider[dragging=\"end\"]::part(end-thumb){background-color:var(--light-background-color)}x-slider::part(thumb):focus{border-color:var(--accent-color);box-shadow:0 0 0px 3px oklch(from var(--accent-color) calc(l + 0.17) calc(c - 0.07) h)}x-slider::part(tick){background-color:color(srgb 0 0 0 / 0.5)}x-input{background-color:color(srgb 0 0 0 / 0.08);border-radius:6px}x-input:focus{outline-width:2px;outline-style:solid;outline-color:var(--light-accent-color);outline-offset:-1px}x-input[error]{background-color:var(--error-background-color);outline-width:2px;outline-style:solid;outline-color:var(--error-color);outline-offset:-1px;--selection-background-color: oklch(from var(--error-color) l c h / 0.2);}x-input > x-label{color:color(srgb 0 0 0 / 0.4);font-weight:600}x-numberinput{background-color:color(srgb 0 0 0 / 0.08);border-radius:6px}x-numberinput:focus{outline-width:2px;outline-style:solid;outline-color:var(--light-accent-color);outline-offset:-1px}x-numberinput:focus:has(x-stepper){padding-right:20px}x-numberinput[error]{background-color:var(--error-background-color);outline-width:2px;outline-style:solid;outline-color:var(--error-color);outline-offset:-1px;--selection-background-color: oklch(from var(--error-color) l c h / 0.2);}x-numberinput > x-label{color:color(srgb 0 0 0 / 0.4);font-weight:600}x-numberinput > x-stepper{border-left:1px solid var(--dark-border-color)}x-numberinput:focus > x-stepper{display:none}x-texteditor{background-color:color(srgb 0 0 0 / 0.08);border-radius:6px}x-texteditor:focus{outline-width:2px;outline-style:solid;outline-color:var(--light-accent-color);outline-offset:-1px}x-texteditor[error]{background-color:var(--error-background-color);outline-width:2px;outline-style:solid;outline-color:var(--error-color);outline-offset:-1px;--selection-background-color: oklch(from var(--error-color) l c h / 0.2);}x-texteditor > x-label{color:color(srgb 0 0 0 / 0.4);font-weight:600}x-colorinput{background-color:color(srgb 0 0 0 / 0.08);border-radius:6px}x-colorinput:focus{outline-width:2px;outline-style:solid;outline-color:var(--light-accent-color);outline-offset:-1px}x-colorinput[error]{background-color:var(--error-background-color);outline-width:2px;outline-style:solid;outline-color:var(--error-color);outline-offset:-1px;--selection-background-color: oklch(from var(--error-color) l c h / 0.2);}x-colorinput::part(arrow){padding:8px 4px 8px 2px;--path-data: var(--arrow-down-path-data);}x-colorinput[size=\"small\"]::part(arrow){padding:4px 4px 4px 0}x-colorinput > x-label{color:color(srgb 0 0 0 / 0.4);font-weight:600}x-colorpicker::part(slider){border-radius:6px}x-colorselect{border-width:5px;border-style:solid;border-color:color(srgb 0.91 0.91 0.91);border-radius:8px}x-progressbar{background-color:var(--dark-background-color);box-shadow:0px 0px 0px 1px inset var(--border-color);border-radius:5px}x-progressbar::part(bar){background-color:var(--light-accent-color)}x-throbber{color:var(--light-accent-color)}x-titlebar::part(buttons){right:10px;gap:10px}x-titlebar::part(button){width:22px;height:22px;min-width:22px;min-height:22px;color:color(srgb 0.37 0.39 0.4);border-radius:999px}x-titlebar::part(button):hover{background:color(srgb 0 0 0 / 0.1)}x-titlebar::part(button):active{background:color(srgb 0 0 0 / 0.2)}x-titlebar::part(minimize-button){--path-data: var(--minimize-path-data);}x-titlebar::part(maximize-button){--path-data: var(--maximize-path-data);}x-titlebar::part(restore-button){--path-data: var(--restore-path-data);}x-titlebar::part(close-button){--path-data: var(--close-path-data);}x-titlebar::part(icon){width:18px;height:18px}x-titlebar x-label{font-weight:700}\n"
  },
  {
    "path": "src/renderer/public/xel/themes/base.css",
    "content": "\n\n/*****************************************************************************************************************/\n\n/**\n * HTML elements\n */\n\n:root {\n  width: 100%;\n  height: 100%;\n  margin: 0;\n  interpolate-size: allow-keywords;\n  font-family: sans-serif;\n  line-height: 1.6;\n}\n\nbody {\n  width: 100vw;\n  height: 100%;\n  margin: 0;\n  overflow-y: overlay;\n}\n\n/* Headings */\n\nh1 {\n  margin: 22px 0 16px;\n  box-sizing: border-box;\n  line-height: 1;\n  font-size: 3.25rem;\n  font-weight: 700;\n}\n\nh2 {\n  margin: 18px 0 14px 0;\n  box-sizing: border-box;\n  line-height: 1;\n  font-size: 2.125rem;\n  font-weight: 700;\n}\n\nh3 {\n  margin: 16px 0 12px 0;\n  box-sizing: border-box;\n  line-height: 1.2;\n  font-size: 1.75rem;\n  font-weight: 700;\n}\n\nh4 {\n  margin: 14px 0 10px 0;\n  box-sizing: border-box;\n  line-height: 1.1;\n  font-size: 1.5rem;\n  font-weight: 700;\n}\n\nh5 {\n  margin: 12px 0 8px 0;\n  box-sizing: border-box;\n  line-height: 1.1;\n  font-size: 1.25rem;\n  font-weight: 700;\n}\n\nh6 {\n  margin: 8px 0 5px 0;\n  box-sizing: border-box;\n  line-height: 1.1;\n  font-size: 1rem;\n  font-weight: 700;\n}\n\nh1 em,\nh2 em,\nh3 em,\nh4 em,\nh5 em,\nh6 em {\n  font-weight: inherit;\n}\nh1 strong,\nh2 strong,\nh3 strong,\nh4 strong,\nh5 strong,\nh6 strong {\n  font-weight: 900;\n}\n\n/* Paragraphs */\n\np {\n  margin: 16px 0;\n}\n\np:last-child {\n  margin-bottom: 0;\n}\n\n/* Links */\n\na {\n  font-weight: 500;\n}\n\n/* Tables */\n\ntable {\n  width: 100%;\n  margin: 16px 0;\n  border-collapse: collapse;\n  /* Needed to make \"border-radius\" property work */\n  border-style: hidden;\n  box-shadow: 0 0 0 1px var(--border-color);\n}\n\nth {\n  text-align: start;\n  padding: 8px 14px;\n  border-spacing: 0;\n}\n\ntd {\n  padding: 8px 14px;\n  border-spacing: 0;\n}\n\n/* Markers */\n\nem {\n  font-weight: 500;\n}\n\n/* Code */\n\npre, code, var {\n  font-size: 0.875rem;\n  font-style: normal;\n  padding: 0 4px;\n}\npre {\n  margin: 14px 0;\n  padding: 4px 6px;\n  white-space: pre-wrap;\n  box-sizing: border-box;\n}\npre > code {\n  display: block;\n  padding: 0;\n  box-sizing: border-box;\n  background-color: transparent;\n  outline-width: 0px;\n  line-height: 1.3;\n}\n\n/* Separators */\n\nhr {\n  width: 100%;\n  height: 1px;\n  min-height: 1px;\n  margin: 24px 0;\n  box-sizing: border-box;\n  border: none;\n}\n\n/* Blockquotes */\n\nblockquote {\n  box-sizing: border-box;\n  margin: 16px 0;\n  padding: 5px 14px;\n  border-left-width: 8px;\n  border-left-style: solid;\n}\nblockquote > blockquote {\n  margin: 6px 0;\n}\n\nblockquote > p:first-child {\n  margin-top: 0;\n}\n\n/* Lists */\n\nul,\nol {\n  margin: 12px 0;\n  padding: 0;\n}\np + ul {\n  margin: -10px 0 0 0;\n}\nli > ul,\nli > ol {\n  margin: 0;\n}\n\nli {\n  position: relative;\n  margin: 0;\n  padding: 0;\n}\nul li {\n  margin-left: 20px;\n}\nol li {\n  margin-left: 16px;\n}\n\nli > p {\n  margin: 4px 0;\n}\n\nol > li::marker {\n  font-weight: 700;\n}\n\n/* Images */\n\nimg {\n  display: block;\n  height: auto;\n  margin: 14px auto;\n  max-width: 100%;\n  user-select: none;\n  box-sizing: border-box;\n  background: var(--checkboard-background);\n  border-width: 1px;\n  border-style: solid;\n  border-color: var(--border-color);\n  -webkit-user-select: none;\n  -webkit-user-modify: read-only;\n}\nimg:active {\n  cursor: -webkit-grabbing;\n}\n\n[popover] {\n  color: var(--text-color);\n  background-color: var(--foreground-color);\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Scrollbar\n */\n\n/* Chromium, WebKit */\n::-webkit-scrollbar {\n  max-width: 6px;\n  max-height: 6px;\n}\n::-webkit-scrollbar-corner {\n  display: none\n}\n\n/* Gecko */\n@supports not selector(::-webkit-scrollbar) {\n  * {\n    scrollbar-width: thin;\n  }\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Card\n */\n\nx-card:not(:defined) {\n  display: none;\n}\n\n/* Footer */\nx-card > footer {\n  padding: 8px 16px;\n  width: calc(100% + 40px);\n  height: calc(100% + 20px);\n  margin-left: -20px;\n  margin-bottom: -16px;\n  box-sizing: border-box;\n  background: lightgrey;\n}\nx-card > footer:first-child {\n  border-top-left-radius: inherit;\n  border-top-right-radius: inherit;\n}\nx-card > footer:last-child {\n  border-bottom-left-radius: inherit;\n  border-bottom-right-radius: inherit;\n}\n\n/* Heading */\nx-card > h1:first-child {\n  margin-top: 0;\n}\nx-card > h2:first-child {\n  margin-top: 0;\n}\nx-card > h3:first-child {\n  margin-top: 0;\n}\nx-card > h4:first-child {\n  margin-top: 0;\n}\nx-card > h5:first-child {\n  margin-top: 0;\n}\nx-card > h6:first-child {\n  margin-top: 0;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Avatar\n */\n\nx-avatar[size=\"small\"] {\n  width: 28px;\n  height: 28px;\n}\nx-avatar[size=\"large\"] {\n  width: 54px;\n  height: 54px;\n}\n\n/* Image */\nx-avatar > img {\n  width: 100%;\n  height: 100%;\n  -webkit-user-drag: none;\n}\n\n/* Placeholder icon */\nx-avatar > x-icon {\n  width: 55%;\n  height: 55%;\n}\n\n/* Placeholder text */\nx-avatar > x-label {\n  font-size: 1rem;\n  pointer-events: none;\n}\nx-avatar[size=\"small\"] > x-label {\n  font-size: 0.75rem;\n}\nx-avatar[size=\"large\"] > x-label {\n  font-size: 1.5rem;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Accordion\n */\n\nx-accordion:not(:defined) {\n  display: none;\n}\n\n/* Arrow */\nx-accordion[size=\"small\"]::part(arrow) {\n  width: 14px;\n  height: 14px;\n}\nx-accordion[size=\"large\"]::part(arrow) {\n  width: 18px;\n  height: 18px;\n}\n\n/* Header */\nx-accordion > header {\n  display: flex;\n  align-items: center;\n  box-sizing: border-box;\n  width: 100%;\n  padding: 7px 0 7px 20px;\n}\nx-accordion[size=\"small\"] > header {\n  padding-left: 18px;\n}\nx-accordion[size=\"large\"] > header {\n  padding-left: 22px;\n}\n\n/* Header label */\nx-accordion > header > x-label:first-child {\n  flex: 1;\n}\nx-accordion > header > *:not(:last-child) {\n  margin-right: 20px;\n}\n\n/* Content */\nx-accordion:not([expanded]):not([animating]) > *:not(header) {\n  display: none !important;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Icon\n */\n\nx-icon[size=\"small\"] {\n  width: 15px;\n  height: 15px;\n}\nx-icon[size=\"large\"] {\n  width: 21px;\n  height: 21px;\n}\nx-icon:not(:defined) {\n  display: none;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Label\n */\n\nx-label:not(:defined) {\n  display: none;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Shortcut\n */\n\nx-shortcut:not(:defined) {\n  display: none;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Stepper\n */\n\nx-stepper:not(:defined) {\n  display: none;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Swatch\n */\n\nx-swatch[size=\"small\"] {\n  width: 16px;\n  height: 16px;\n}\nx-swatch[size=\"large\"] {\n  width: 20px;\n  height: 20px;\n}\nx-swatch:not(:defined) {\n  display: none;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Button\n */\n\nx-button {\n  --min-pressed-time: 150ms;\n}\n@media (pointer:coarse) {\n  x-button {\n    --min-pressed-time: 600ms;\n  }\n}\na:has(x-button) {\n  text-decoration: none;\n}\nx-button[toggled] {\n  z-index: 1;\n}\nx-button[condensed] {\n  padding: 2px 7px;\n}\nx-button[size=\"small\"] {\n  min-height: 24px;\n}\nx-button[size=\"large\"] {\n  min-height: 38px;\n}\nx-buttons[vertical] > x-button {\n  width: 100%;\n  justify-content: flex-start;\n}\nx-button:not(:defined) {\n  display: none;\n}\n\n/* Label */\nx-button > x-label {\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  max-width: 100%;\n  text-align: center;\n  min-width: 1px;\n  pointer-events: none;\n}\nx-button > x-label ~ x-icon,\nx-button > x-icon ~ x-label {\n  margin: 0 0 0 6px;\n}\n\n/* Menu */\nx-button > x-menu {\n  font-size: 0.875rem;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Button (\"normal\" skin)\n */\n\nx-button[skin=\"normal\"][size=\"small\"] > x-icon {\n  width: 14px;\n  height: 14px;\n}\nx-button[skin=\"normal\"][size=\"large\"] > x-icon {\n  width: 20px;\n  height: 20px;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Button (\"flat\" skin)\n */\n\nx-button[skin=\"flat\"] {\n  padding: 0;\n}\nx-buttons:not([vertical]) > x-button[skin=\"flat\"]:not(:first-of-type) {\n  margin-left: 10px;\n}\nx-buttons:not([vertical]) > x-button[skin=\"flat\"][size=\"small\"]:not(:first-of-type) {\n  margin-left: 5px;\n}\nx-buttons[vertical] > x-button[skin=\"flat\"]:not(:first-of-type) {\n  margin-top: 10px;\n}\nx-buttons[vertical] > x-button[skin=\"flat\"][size=\"small\"]:not(:first-of-type) {\n  margin-top: 5px;\n}\n\n/* Icon */\nx-button[skin=\"flat\"] > x-icon {\n  width: 26px;\n  height: 26px;\n}\nx-button[skin=\"flat\"][size=\"small\"] > x-icon {\n  width: 22px;\n  height: 22px;\n}\nx-button[skin=\"flat\"][size=\"large\"] > x-icon {\n  width: 28px;\n  height: 28px;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Button (\"recessed\" skin)\n */\n\nx-button[skin=\"recessed\"] {\n  min-height: 18px;\n  padding: 4px 8px;\n}\nx-button[skin=\"recessed\"][size=\"small\"] {\n  padding: 3px 8px;\n}\nx-button[skin=\"recessed\"][size=\"large\"] {\n  padding: 5px 8px;\n}\n\n/* Horizontal siblings */\nx-buttons:not([vertical]) > x-button[skin=\"recessed\"] + x-button[skin=\"recessed\"] {\n  margin-left: 4px;\n}\n\n/* Vertical siblings */\nx-buttons[vertical] > x-button[skin=\"recessed\"] + x-button[skin=\"recessed\"] {\n  margin-top: 4px;\n}\n\n/* Icon */\nx-button[skin=\"recessed\"] > x-icon {\n  width: 16px;\n  height: 16px;\n}\nx-button[skin=\"recessed\"][size=\"small\"] > x-icon {\n  width: 12px;\n  height: 12px;\n}\nx-button[skin=\"recessed\"][size=\"large\"] > x-icon {\n  width: 20px;\n  height: 20px;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Button (\"dock\" skin)\n */\n\nx-button[skin=\"dock\"],\nx-buttons[vertical] > x-button[skin=\"dock\"] {\n  width: 38px;\n  height: 38px;\n  min-height: 38px;\n  padding: 0;\n  justify-content: center;\n}\nx-button[skin=\"dock\"][size=\"small\"],\nx-buttons[vertical] > x-button[skin=\"dock\"][size=\"small\"] {\n  width: 30px;\n  height: 30px;\n  min-height: 30px;\n}\nx-button[skin=\"dock\"][size=\"large\"],\nx-buttons[vertical] > x-button[skin=\"dock\"][size=\"large\"] {\n  width: 45px;\n  height: 45px;\n  min-height: 45px;\n}\n\n/* Horizontal siblings */\nx-buttons:not([vertical]) > x-button[skin=\"dock\"] + x-button[skin=\"dock\"] {\n  margin-left: -1px;\n}\n\n/* Vertical siblings */\nx-buttons[vertical] > x-button[skin=\"dock\"] + x-button[skin=\"dock\"] {\n  margin-top: -1px;\n}\n\n/* Icon */\nx-button[skin=\"dock\"] > x-icon {\n  width: 17px;\n  height: 17px;\n}\nx-button[skin=\"dock\"][size=\"small\"] > x-icon {\n  width: 14px;\n  height: 14px;\n}\nx-button[skin=\"dock\"][size=\"large\"] > x-icon {\n  width: 20px;\n  height: 20px;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Buttons\n */\n\nx-buttons[vertical] {\n  flex-flow: column;\n  align-items: flex-start;\n  justify-content: center;\n}\nx-buttons:not(:defined) {\n  display: none;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Tag\n */\n\nx-tag[size=\"small\"] {\n  height: 18px;\n}\nx-tag[size=\"large\"] {\n  height: 30px;\n}\nx-tag:not(:defined) {\n  display: none;\n}\n\n/* Swatch */\nx-tag > x-swatch {\n  width: 14px;\n  height: 14px;\n}\nx-tag[size=\"small\"] > x-swatch {\n  width: 12px;\n  height: 12px;\n}\nx-tag[size=\"large\"] > x-swatch {\n  width: 16px;\n  height: 16px;\n}\n\n/* Label */\nx-tag > x-label {\n  font-size: 0.75rem;\n}\nx-tag :not(x-label) + x-label {\n  margin-left: 0.25rem;\n}\nx-tag[size=\"small\"] > x-label {\n  font-size: 0.6875rem;\n}\n\n/* Icon */\nx-tag > x-icon {\n  width: 15px;\n  height: 15px;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Tags\n */\n\nx-tags {\n  margin-top: -2px;\n  margin-left: -2px;\n}\nx-tags:not(:defined) {\n  display: none;\n}\n\n/* Tag */\nx-tags x-tag {\n  margin: 2px;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Tags input\n */\n\nx-tagsinput[size=\"small\"] {\n  padding: 0px;\n  gap: 0px;\n}\nx-tagsinput[size=\"small\"] > x-tag {\n  height: 22px;\n  transform: scale(0.92);\n}\nx-tagsinput[size=\"large\"] {\n  padding: 6px;\n  gap: 6px;\n}\nx-tagsinput:focus-within {\n  z-index: 10;\n}\nx-tagsinput:not(:defined) {\n  display: none;\n}\n\n/* Placeholder */\nx-tagsinput > x-label {\n  position: absolute;\n  top: 50%;\n  left: 8px;\n  transform: translateY(-50%);\n  pointer-events: none;\n}\n\n/* Error message */\nx-tagsinput[size=\"small\"][error]::before {\n  top: 27px;\n}\nx-tagsinput[size=\"large\"][error]::before {\n  top: 41px;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Tab\n */\n\nx-tab[size=\"small\"] {\n  min-height: 24px;\n}\nx-tab[size=\"large\"] {\n  min-height: 38px;\n}\nx-tab:not(:defined) {\n  display: none;\n}\n\n/* Icon */\nx-tab x-icon {\n  width: 17px;\n  height: 17px;\n  min-width: 17px;\n  color: inherit;\n}\nx-tab[size=\"small\"] x-icon {\n  width: 15px;\n  height: 15px;\n  min-width: 15px\n}\nx-tab[size=\"large\"] x-icon {\n  width: 19px;\n  height: 19px;\n  min-width: 19px\n}\n\n/* Label */\nx-tab x-label {\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  line-height: 1.2;\n  cursor: inherit;\n  flex: 1;\n}\nx-tab x-icon + x-label {\n  margin-left: 6px;\n}\nx-tab x-box:is([vertical]) x-icon + x-label {\n  margin-left: 0px;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Tabs\n */\n\nx-tabs:not(:defined) {\n  display: none;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Menu\n */\n\nx-menu:not(:defined) {\n  display: none;\n}\nx-menu:has(x-menu[opened]) {\n  /* @bugfix: Menu fails to render if its ancestor is scrollable (https://bugs.webkit.org/show_bug.cgi?id=160953) */\n  overflow: -webkit-paged-x;\n}\n\n/* Image */\n\nx-menu img {\n  margin: 0;\n  background: none;\n  border: none;\n}\n\n/* Separator */\nx-menu hr {\n  width: 100%;\n  height: 1px;\n  margin: 4px 0px;\n  box-sizing: border-box;\n}\nx-menu hr + hr,\nx-menu hr:last-child {\n  display: none;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Menu item\n */\n\nx-menuitem[size=\"small\"] {\n  min-height: 24px;\n}\nx-menuitem[size=\"large\"] {\n  min-height: 38px;\n}\nx-menuitem:not(:defined) {\n  display: none;\n}\nx-menuitem[highlighted] {\n  color: white;\n  background: var(--accent-color);\n}\n\n/* Image */\nx-menuitem img {\n  width: 16px;\n  height: 16px;\n}\n\n/* Icon */\nx-menuitem x-icon {\n  width: 16px;\n  height: 16px;\n}\n\n/* Label */\nx-menuitem x-label {\n  display: block;\n  flex: 1;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  font-size: inherit;\n  line-height: 1.4;\n}\nx-menuitem img + x-label,\nx-menuitem x-swatch + x-label,\nx-menuitem x-icon + x-label {\n  margin-left: 8px;\n}\n\n/* Shortcut */\nx-menuitem x-shortcut {\n  margin-left: auto;\n}\nx-menuitem x-label + x-shortcut {\n  margin-left: 8px;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Menubar\n */\n\nx-menubar[size=\"small\"] {\n  height: 30px;\n}\nx-menubar[size=\"large\"] {\n  height: 42px;\n}\nx-menubar:not(:defined) {\n  display: none;\n}\n\n/* Menu item */\nx-menubar > x-menuitem {\n  height: 100%;\n  padding: 0 11px;\n  min-height: 0;\n}\nx-menubar > x-menuitem[autohidden] {\n  display: none;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Nav\n */\n\nx-navitem + x-navitem,\na:has(x-navitem) + a:has(x-navitem),\na:has(x-navitem) + x-navitem,\nx-navitem + a:has(x-navitem) {\n  margin: 3px 0;\n}\nx-nav x-nav > *:first-child {\n  margin-top: 3px;\n}\nx-nav x-nav > *:last-child {\n  margin-bottom: 0;\n}\nx-nav x-nav > * {\n  margin-left: 34px !important;\n}\nx-nav x-nav > * {\n  max-width: calc(100% - 34px) !important;\n}\n\n/* Link */\nx-nav > a {\n  display: block;\n  text-decoration: none;\n}\n\n/* Label */\nx-nav x-label {\n  max-width: 100%;\n  flex: 1 1 0%;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  font-weight: 500;\n  font-size: 0.9375rem;\n  text-align: start;\n}\nx-nav x-icon + x-label {\n  margin-left: 14px;\n}\nx-nav[collapsed] x-navitem > x-label {\n  display: none;\n}\n\n/* Primary icon */\nx-nav x-icon {\n  width: 20px;\n  height: 20px;\n}\n\n/* Secondary icon */\nx-nav x-label + x-icon {\n  width: 18px;\n  height: 18px;\n  margin: 0 0 0 10px;\n}\nx-nav[collapsed] x-navitem > x-label + x-icon {\n  display: none;\n}\n\n/* Button */\nx-nav[collapsed] x-navitem::part(button) {\n  padding: 0;\n}\n\n/* Arrow */\nx-nav[collapsed] x-navitem::part(arrow) {\n  display: none;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Context menu\n */\n\nx-contextmenu:not(:defined) {\n  display: none;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Dialog\n */\n\ndialog {\n  overflow: hidden;\n  position: fixed;\n  min-width: 200px;\n  min-height: 100px;\n  max-height: none;\n  margin: auto;\n  padding: 20px 24px;\n  box-sizing: border-box;\n  font-size: 0.8125rem;\n  line-height: 1.6;\n}\ndialog:focus {\n  outline: none;\n}\ndialog:not(:defined) {\n  display: none;\n}\n\n/* Footer */\ndialog > footer {\n  display: flex;\n  flex-flow: row;\n  justify-content: flex-end;\n  padding: 12px 24px;\n  width: calc(100% + 48px);\n  height: calc(100% + 22px);\n  margin-top: 10px;\n  margin-left: -24px;\n  margin-bottom: -20px;\n  box-sizing: border-box;\n  background: lightgrey;\n}\ndialog > footer:first-child {\n  border-top-left-radius: inherit;\n  border-top-right-radius: inherit;\n}\ndialog > footer:last-child {\n  border-bottom-left-radius: inherit;\n  border-bottom-right-radius: inherit;\n}\n\n/* Footer button */\ndialog > footer x-button + x-button {\n  margin-left: 8px;\n}\n\n/* Heading */\ndialog h3 {\n  font-size: 1.125rem;\n  font-weight: 700;\n}\n\ndialog > *:first-child {\n  margin-top: 0;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Popover\n */\n\nx-popover {\n  padding: 12px;\n  overflow: auto;\n}\nx-popover:has(footer) {\n  overflow: hidden;\n}\nx-popover:not(:defined) {\n  display: none;\n}\n\n/* Footer */\nx-popover > footer {\n  padding: 12px;\n  width: calc(100% + 24px);\n  height: calc(100% + 12px);\n  margin-left: -12px;\n  margin-bottom: -12px;\n  margin-top: 12px;\n  box-sizing: border-box;\n  background: lightgrey;\n}\nx-popover > footer:first-child {\n  border-top-left-radius: inherit;\n  border-top-right-radius: inherit;\n}\nx-popover > footer:last-child {\n  border-bottom-left-radius: inherit;\n  border-bottom-right-radius: inherit;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Notification\n */\n\nx-notification[size=\"small\"] {\n  padding: 3px 12px;\n}\nx-notification[size=\"large\"] {\n  padding: 8px 12px;\n}\nx-notification:not(:defined) {\n  display: none;\n}\n\n/* Paragraph */\nx-notification > p {\n  margin: 0;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Checkbox\n */\n\nx-checkbox:not(:defined) {\n  display: none;\n}\nx-checkbox + x-checkbox {\n  margin-top: 6px;\n}\n\n/* Indicator */\nx-checkbox[size=\"small\"]::part(indicator) {\n  width: 17px;\n  height: 17px\n}\nx-checkbox[size=\"large\"]::part(indicator) {\n  width: 21px;\n  height: 21px;\n}\n\n/* Label */\nx-checkbox > x-label {\n  display: block;\n  margin-left: 8px;\n  padding: 1px 0;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Radio\n */\n\nx-radio + x-radio {\n  margin-top: 6px;\n}\nx-radio:not(:defined) {\n  display: none;\n}\n\n/* Indicator */\nx-radio[size=\"small\"]::part(indicator) {\n  width: 17px;\n  height: 17px\n}\nx-radio[size=\"large\"]::part(indicator) {\n  width: 21px;\n  height: 21px;\n}\n\n/* Label */\nx-radio > x-label {\n  margin: 0 0 0 8px;\n  padding: 1px 0;\n}\nx-radio[size=\"small\"] > x-label {\n  margin-left: 6px;\n}\nx-radio[size=\"large\"] > x-label {\n  margin-left: 10px;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Radios\n */\n\nx-radios:not(:defined) {\n  display: none;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Switch\n */\n\nx-switch + x-switch {\n  margin-top: 12px;\n}\nx-switch:not(:defined) {\n  display: none;\n}\n\n/* Indicator */\nx-switch[size=\"large\"]::part(indicator) {\n  width: 42px;\n  height: 20px;\n}\nx-switch[size=\"small\"]::part(indicator) {\n  width: 28px;\n  height: 12px;\n}\n\n/* Label */\nx-switch > x-label {\n  margin: 0 0 0 8px;\n  padding: 1px 0;\n}\nx-switch[size=\"small\"] > x-label {\n  margin-left: 6px;\n}\nx-switch[size=\"large\"] > x-label {\n  margin-left: 10px;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Select\n */\n\nx-select[size=\"small\"] {\n  height: 24px;\n}\nx-select[size=\"large\"] {\n  height: 38px;\n}\nx-select:not(:defined) {\n  display: none;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Color select\n */\n\nx-colorselect[size=\"small\"] {\n  width: 24px;\n  height: 24px;\n}\nx-colorselect[size=\"large\"] {\n  width: 38px;\n  height: 38px;\n}\nx-colorselect:not(:defined) {\n  display: none;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Input\n */\n\nx-input[size=\"small\"] {\n  height: 24px;\n}\nx-input[size=\"large\"] {\n  height: 38px;\n}\nx-input:not(:defined) {\n  display: none;\n}\nx-input + x-input {\n  margin-top: 20px;\n}\n\n/* Icon */\nx-input > x-icon {\n  width: 15px;\n  height: 15px;\n  min-width: 15px;\n  margin: 0 0 0 8px;\n}\nx-input[size=\"small\"] > x-icon {\n  transform: scale(0.8);\n}\nx-input[size=\"large\"] > x-icon {\n  transform: scale(1.1);\n}\nx-input > x-icon:hover {\n  cursor: default;\n}\n\n/* Placeholder */\nx-input > x-label {\n  display: none;\n  position: absolute;\n  top: 50%;\n  max-width: 100%;\n  padding: 0 5px 0 5px;\n  transform: translateY(-50%);\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  pointer-events: none;\n}\nx-input[empty] > x-label {\n  display: block;\n}\nx-input > x-icon + x-label {\n  padding: 0 5px 0 29px;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Number input\n */\n\nx-numberinput[size=\"small\"] {\n  height: 24px;\n}\nx-numberinput[size=\"large\"] {\n  height: 38px;\n}\nx-numberinput:focus {\n  z-index: 10;\n}\nx-numberinput:not(:defined) {\n  display: none;\n}\n\n/* Placeholder */\nx-numberinput > x-label {\n  display: none;\n  position: absolute;\n  top: 50%;\n  max-width: 100%;\n  padding: 0 5px 0 5px;\n  transform: translateY(-50%);\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  pointer-events: none;\n}\nx-numberinput[empty] > x-label {\n  display: block;\n}\n\n/* Error message */\nx-numberinput[size=\"small\"][error]::before {\n  top: 27px;\n}\nx-numberinput[size=\"large\"][error]::before {\n  top: 41px;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Text editor\n */\n\nx-texteditor:focus {\n  z-index: 10;\n}\nx-texteditor:not(:defined) {\n  display: none;\n}\n\n/* Placeholder */\nx-texteditor > x-label {\n  display: none;\n  position: absolute;\n  width: 100%;\n  top: 0;\n  left: 0;\n  padding: 2px 6px;\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n  pointer-events: none;\n}\nx-texteditor[empty] > x-label {\n  display: block;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Slider\n */\n\nx-slider:not(:defined) {\n  display: none;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Color picker\n */\n\nx-colorpicker:not(:defined) {\n  display: none;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Progressbar\n */\n\nx-progressbar[size=\"small\"] {\n  height: 6px;\n}\nx-progressbar[size=\"large\"] {\n  height: 10px;\n}\nx-progressbar:not(:defined) {\n  display: none;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Throbber\n */\n\nx-throbber[size=\"small\"] {\n  width: 26px;\n  height: 26px;\n}\nx-throbber[size=\"large\"] {\n  width: 34px;\n  height: 34px;\n}\nx-throbber:not(:defined) {\n  display: none;\n}\n\n/*****************************************************************************************************************/\n\n/**\n * Titlebar\n */\n\nx-titlebar x-icon + x-label {\n  margin-left: 6px;\n}\n"
  },
  {
    "path": "src/renderer/public/xel/themes/cupertino-dark.css",
    "content": ":root{width:100%;height:100%;margin:0;interpolate-size:allow-keywords;font-family:sans-serif;line-height:1.6}body{width:100vw;height:100%;margin:0;overflow-y:overlay}h1{margin:22px 0 16px;box-sizing:border-box;line-height:1;font-size:3.25rem;font-weight:700}h2{margin:18px 0 14px 0;box-sizing:border-box;line-height:1;font-size:2.125rem;font-weight:700}h3{margin:16px 0 12px 0;box-sizing:border-box;line-height:1.2;font-size:1.75rem;font-weight:700}h4{margin:14px 0 10px 0;box-sizing:border-box;line-height:1.1;font-size:1.5rem;font-weight:700}h5{margin:12px 0 8px 0;box-sizing:border-box;line-height:1.1;font-size:1.25rem;font-weight:700}h6{margin:8px 0 5px 0;box-sizing:border-box;line-height:1.1;font-size:1rem;font-weight:700}h1 em, h2 em, h3 em, h4 em, h5 em, h6 em{font-weight:inherit}h1 strong, h2 strong, h3 strong, h4 strong, h5 strong, h6 strong{font-weight:900}p{margin:16px 0}p:last-child{margin-bottom:0}a{font-weight:500}table{width:100%;margin:16px 0;border-collapse:collapse;border-style:hidden;box-shadow:0 0 0 1px var(--border-color)}th{text-align:start;padding:8px 14px;border-spacing:0}td{padding:8px 14px;border-spacing:0}em{font-weight:500}pre, code, var{font-size:0.875rem;font-style:normal;padding:0 4px}pre{margin:14px 0;padding:4px 6px;white-space:pre-wrap;box-sizing:border-box}pre > code{display:block;padding:0;box-sizing:border-box;background-color:transparent;outline-width:0px;line-height:1.3}hr{width:100%;height:1px;min-height:1px;margin:24px 0;box-sizing:border-box;border:none}blockquote{box-sizing:border-box;margin:16px 0;padding:5px 14px;border-left-width:8px;border-left-style:solid}blockquote > blockquote{margin:6px 0}blockquote > p:first-child{margin-top:0}ul, ol{margin:12px 0;padding:0}p + ul{margin:-10px 0 0 0}li > ul, li > ol{margin:0}li{position:relative;margin:0;padding:0}ul li{margin-left:20px}ol li{margin-left:16px}li > p{margin:4px 0}ol > li::marker{font-weight:700}img{display:block;height:auto;margin:14px auto;max-width:100%;user-select:none;box-sizing:border-box;background:var(--checkboard-background);border-width:1px;border-style:solid;border-color:var(--border-color);-webkit-user-select:none;-webkit-user-modify:read-only}img:active{cursor:-webkit-grabbing}[popover]{color:var(--text-color);background-color:var(--foreground-color)}::-webkit-scrollbar{max-width:6px;max-height:6px}::-webkit-scrollbar-corner{display:none}@supports not selector(::-webkit-scrollbar){*{scrollbar-width:thin}}x-card:not(:defined){display:none}x-card > footer{padding:8px 16px;width:calc(100% + 40px);height:calc(100% + 20px);margin-left:-20px;margin-bottom:-16px;box-sizing:border-box;background:lightgrey}x-card > footer:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}x-card > footer:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}x-card > h1:first-child{margin-top:0}x-card > h2:first-child{margin-top:0}x-card > h3:first-child{margin-top:0}x-card > h4:first-child{margin-top:0}x-card > h5:first-child{margin-top:0}x-card > h6:first-child{margin-top:0}x-avatar[size=\"small\"]{width:28px;height:28px}x-avatar[size=\"large\"]{width:54px;height:54px}x-avatar > img{width:100%;height:100%;-webkit-user-drag:none}x-avatar > x-icon{width:55%;height:55%}x-avatar > x-label{font-size:1rem;pointer-events:none}x-avatar[size=\"small\"] > x-label{font-size:0.75rem}x-avatar[size=\"large\"] > x-label{font-size:1.5rem}x-accordion:not(:defined){display:none}x-accordion[size=\"small\"]::part(arrow){width:14px;height:14px}x-accordion[size=\"large\"]::part(arrow){width:18px;height:18px}x-accordion > header{display:flex;align-items:center;box-sizing:border-box;width:100%;padding:7px 0 7px 20px}x-accordion[size=\"small\"] > header{padding-left:18px}x-accordion[size=\"large\"] > header{padding-left:22px}x-accordion > header > x-label:first-child{flex:1}x-accordion > header > *:not(:last-child){margin-right:20px}x-accordion:not([expanded]):not([animating]) > *:not(header){display:none!important}x-icon[size=\"small\"]{width:15px;height:15px}x-icon[size=\"large\"]{width:21px;height:21px}x-icon:not(:defined){display:none}x-label:not(:defined){display:none}x-shortcut:not(:defined){display:none}x-stepper:not(:defined){display:none}x-swatch[size=\"small\"]{width:16px;height:16px}x-swatch[size=\"large\"]{width:20px;height:20px}x-swatch:not(:defined){display:none}x-button{--min-pressed-time: 150ms;}@media (pointer:coarse){x-button{--min-pressed-time: 600ms;}}a:has(x-button){text-decoration:none}x-button[toggled]{z-index:1}x-button[condensed]{padding:2px 7px}x-button[size=\"small\"]{min-height:24px}x-button[size=\"large\"]{min-height:38px}x-buttons[vertical] > x-button{width:100%;justify-content:flex-start}x-button:not(:defined){display:none}x-button > x-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;text-align:center;min-width:1px;pointer-events:none}x-button > x-label ~ x-icon, x-button > x-icon ~ x-label{margin:0 0 0 6px}x-button > x-menu{font-size:0.875rem}x-button[skin=\"normal\"][size=\"small\"] > x-icon{width:14px;height:14px}x-button[skin=\"normal\"][size=\"large\"] > x-icon{width:20px;height:20px}x-button[skin=\"flat\"]{padding:0}x-buttons:not([vertical]) > x-button[skin=\"flat\"]:not(:first-of-type){margin-left:10px}x-buttons:not([vertical]) > x-button[skin=\"flat\"][size=\"small\"]:not(:first-of-type){margin-left:5px}x-buttons[vertical] > x-button[skin=\"flat\"]:not(:first-of-type){margin-top:10px}x-buttons[vertical] > x-button[skin=\"flat\"][size=\"small\"]:not(:first-of-type){margin-top:5px}x-button[skin=\"flat\"] > x-icon{width:26px;height:26px}x-button[skin=\"flat\"][size=\"small\"] > x-icon{width:22px;height:22px}x-button[skin=\"flat\"][size=\"large\"] > x-icon{width:28px;height:28px}x-button[skin=\"recessed\"]{min-height:18px;padding:4px 8px}x-button[skin=\"recessed\"][size=\"small\"]{padding:3px 8px}x-button[skin=\"recessed\"][size=\"large\"]{padding:5px 8px}x-buttons:not([vertical]) > x-button[skin=\"recessed\"] + x-button[skin=\"recessed\"]{margin-left:4px}x-buttons[vertical] > x-button[skin=\"recessed\"] + x-button[skin=\"recessed\"]{margin-top:4px}x-button[skin=\"recessed\"] > x-icon{width:16px;height:16px}x-button[skin=\"recessed\"][size=\"small\"] > x-icon{width:12px;height:12px}x-button[skin=\"recessed\"][size=\"large\"] > x-icon{width:20px;height:20px}x-button[skin=\"dock\"], x-buttons[vertical] > x-button[skin=\"dock\"]{width:38px;height:38px;min-height:38px;padding:0;justify-content:center}x-button[skin=\"dock\"][size=\"small\"], x-buttons[vertical] > x-button[skin=\"dock\"][size=\"small\"]{width:30px;height:30px;min-height:30px}x-button[skin=\"dock\"][size=\"large\"], x-buttons[vertical] > x-button[skin=\"dock\"][size=\"large\"]{width:45px;height:45px;min-height:45px}x-buttons:not([vertical]) > x-button[skin=\"dock\"] + x-button[skin=\"dock\"]{margin-left:-1px}x-buttons[vertical] > x-button[skin=\"dock\"] + x-button[skin=\"dock\"]{margin-top:-1px}x-button[skin=\"dock\"] > x-icon{width:17px;height:17px}x-button[skin=\"dock\"][size=\"small\"] > x-icon{width:14px;height:14px}x-button[skin=\"dock\"][size=\"large\"] > x-icon{width:20px;height:20px}x-buttons[vertical]{flex-flow:column;align-items:flex-start;justify-content:center}x-buttons:not(:defined){display:none}x-tag[size=\"small\"]{height:18px}x-tag[size=\"large\"]{height:30px}x-tag:not(:defined){display:none}x-tag > x-swatch{width:14px;height:14px}x-tag[size=\"small\"] > x-swatch{width:12px;height:12px}x-tag[size=\"large\"] > x-swatch{width:16px;height:16px}x-tag > x-label{font-size:0.75rem}x-tag :not(x-label) + x-label{margin-left:0.25rem}x-tag[size=\"small\"] > x-label{font-size:0.6875rem}x-tag > x-icon{width:15px;height:15px}x-tags{margin-top:-2px;margin-left:-2px}x-tags:not(:defined){display:none}x-tags x-tag{margin:2px}x-tagsinput[size=\"small\"]{padding:0px;gap:0px}x-tagsinput[size=\"small\"] > x-tag{height:22px;transform:scale(0.92)}x-tagsinput[size=\"large\"]{padding:6px;gap:6px}x-tagsinput:focus-within{z-index:10}x-tagsinput:not(:defined){display:none}x-tagsinput > x-label{position:absolute;top:50%;left:8px;transform:translateY(-50%);pointer-events:none}x-tagsinput[size=\"small\"][error]::before{top:27px}x-tagsinput[size=\"large\"][error]::before{top:41px}x-tab[size=\"small\"]{min-height:24px}x-tab[size=\"large\"]{min-height:38px}x-tab:not(:defined){display:none}x-tab x-icon{width:17px;height:17px;min-width:17px;color:inherit}x-tab[size=\"small\"] x-icon{width:15px;height:15px;min-width:15px}x-tab[size=\"large\"] x-icon{width:19px;height:19px;min-width:19px}x-tab x-label{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;line-height:1.2;cursor:inherit;flex:1}x-tab x-icon + x-label{margin-left:6px}x-tab x-box:is([vertical]) x-icon + x-label{margin-left:0px}x-tabs:not(:defined){display:none}x-menu:not(:defined){display:none}x-menu:has(x-menu[opened]){overflow:-webkit-paged-x}x-menu img{margin:0;background:none;border:none}x-menu hr{width:100%;height:1px;margin:4px 0px;box-sizing:border-box}x-menu hr + hr, x-menu hr:last-child{display:none}x-menuitem[size=\"small\"]{min-height:24px}x-menuitem[size=\"large\"]{min-height:38px}x-menuitem:not(:defined){display:none}x-menuitem[highlighted]{color:white;background:var(--accent-color)}x-menuitem img{width:16px;height:16px}x-menuitem x-icon{width:16px;height:16px}x-menuitem x-label{display:block;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:inherit;line-height:1.4}x-menuitem img + x-label, x-menuitem x-swatch + x-label, x-menuitem x-icon + x-label{margin-left:8px}x-menuitem x-shortcut{margin-left:auto}x-menuitem x-label + x-shortcut{margin-left:8px}x-menubar[size=\"small\"]{height:30px}x-menubar[size=\"large\"]{height:42px}x-menubar:not(:defined){display:none}x-menubar > x-menuitem{height:100%;padding:0 11px;min-height:0}x-menubar > x-menuitem[autohidden]{display:none}x-navitem + x-navitem, a:has(x-navitem) + a:has(x-navitem), a:has(x-navitem) + x-navitem, x-navitem + a:has(x-navitem){margin:3px 0}x-nav x-nav > *:first-child{margin-top:3px}x-nav x-nav > *:last-child{margin-bottom:0}x-nav x-nav > *{margin-left:34px!important}x-nav x-nav > *{max-width:calc(100% - 34px)!important}x-nav > a{display:block;text-decoration:none}x-nav x-label{max-width:100%;flex:1 1 0%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:500;font-size:0.9375rem;text-align:start}x-nav x-icon + x-label{margin-left:14px}x-nav[collapsed] x-navitem > x-label{display:none}x-nav x-icon{width:20px;height:20px}x-nav x-label + x-icon{width:18px;height:18px;margin:0 0 0 10px}x-nav[collapsed] x-navitem > x-label + x-icon{display:none}x-nav[collapsed] x-navitem::part(button){padding:0}x-nav[collapsed] x-navitem::part(arrow){display:none}x-contextmenu:not(:defined){display:none}dialog{overflow:hidden;position:fixed;min-width:200px;min-height:100px;max-height:none;margin:auto;padding:20px 24px;box-sizing:border-box;font-size:0.8125rem;line-height:1.6}dialog:focus{outline:none}dialog:not(:defined){display:none}dialog > footer{display:flex;flex-flow:row;justify-content:flex-end;padding:12px 24px;width:calc(100% + 48px);height:calc(100% + 22px);margin-top:10px;margin-left:-24px;margin-bottom:-20px;box-sizing:border-box;background:lightgrey}dialog > footer:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}dialog > footer:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}dialog > footer x-button + x-button{margin-left:8px}dialog h3{font-size:1.125rem;font-weight:700}dialog > *:first-child{margin-top:0}x-popover{padding:12px;overflow:auto}x-popover:has(footer){overflow:hidden}x-popover:not(:defined){display:none}x-popover > footer{padding:12px;width:calc(100% + 24px);height:calc(100% + 12px);margin-left:-12px;margin-bottom:-12px;margin-top:12px;box-sizing:border-box;background:lightgrey}x-popover > footer:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}x-popover > footer:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}x-notification[size=\"small\"]{padding:3px 12px}x-notification[size=\"large\"]{padding:8px 12px}x-notification:not(:defined){display:none}x-notification > p{margin:0}x-checkbox:not(:defined){display:none}x-checkbox + x-checkbox{margin-top:6px}x-checkbox[size=\"small\"]::part(indicator){width:17px;height:17px}x-checkbox[size=\"large\"]::part(indicator){width:21px;height:21px}x-checkbox > x-label{display:block;margin-left:8px;padding:1px 0}x-radio + x-radio{margin-top:6px}x-radio:not(:defined){display:none}x-radio[size=\"small\"]::part(indicator){width:17px;height:17px}x-radio[size=\"large\"]::part(indicator){width:21px;height:21px}x-radio > x-label{margin:0 0 0 8px;padding:1px 0}x-radio[size=\"small\"] > x-label{margin-left:6px}x-radio[size=\"large\"] > x-label{margin-left:10px}x-radios:not(:defined){display:none}x-switch + x-switch{margin-top:12px}x-switch:not(:defined){display:none}x-switch[size=\"large\"]::part(indicator){width:42px;height:20px}x-switch[size=\"small\"]::part(indicator){width:28px;height:12px}x-switch > x-label{margin:0 0 0 8px;padding:1px 0}x-switch[size=\"small\"] > x-label{margin-left:6px}x-switch[size=\"large\"] > x-label{margin-left:10px}x-select[size=\"small\"]{height:24px}x-select[size=\"large\"]{height:38px}x-select:not(:defined){display:none}x-colorselect[size=\"small\"]{width:24px;height:24px}x-colorselect[size=\"large\"]{width:38px;height:38px}x-colorselect:not(:defined){display:none}x-input[size=\"small\"]{height:24px}x-input[size=\"large\"]{height:38px}x-input:not(:defined){display:none}x-input + x-input{margin-top:20px}x-input > x-icon{width:15px;height:15px;min-width:15px;margin:0 0 0 8px}x-input[size=\"small\"] > x-icon{transform:scale(0.8)}x-input[size=\"large\"] > x-icon{transform:scale(1.1)}x-input > x-icon:hover{cursor:default}x-input > x-label{display:none;position:absolute;top:50%;max-width:100%;padding:0 5px 0 5px;transform:translateY(-50%);font-family:inherit;font-size:inherit;line-height:inherit;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;pointer-events:none}x-input[empty] > x-label{display:block}x-input > x-icon + x-label{padding:0 5px 0 29px}x-numberinput[size=\"small\"]{height:24px}x-numberinput[size=\"large\"]{height:38px}x-numberinput:focus{z-index:10}x-numberinput:not(:defined){display:none}x-numberinput > x-label{display:none;position:absolute;top:50%;max-width:100%;padding:0 5px 0 5px;transform:translateY(-50%);font-family:inherit;font-size:inherit;line-height:inherit;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;pointer-events:none}x-numberinput[empty] > x-label{display:block}x-numberinput[size=\"small\"][error]::before{top:27px}x-numberinput[size=\"large\"][error]::before{top:41px}x-texteditor:focus{z-index:10}x-texteditor:not(:defined){display:none}x-texteditor > x-label{display:none;position:absolute;width:100%;top:0;left:0;padding:2px 6px;font-family:inherit;font-size:inherit;line-height:inherit;pointer-events:none}x-texteditor[empty] > x-label{display:block}x-slider:not(:defined){display:none}x-colorpicker:not(:defined){display:none}x-progressbar[size=\"small\"]{height:6px}x-progressbar[size=\"large\"]{height:10px}x-progressbar:not(:defined){display:none}x-throbber[size=\"small\"]{width:26px;height:26px}x-throbber[size=\"large\"]{width:34px;height:34px}x-throbber:not(:defined){display:none}x-titlebar x-icon + x-label{margin-left:6px}:root{color:var(--text-color);background-color:var(--background-color);font-family:BlinkMacSystemFont, -apple-system, \"Inter\", \"Roboto Flex\", \"Roboto\", \"Noto Sans\", \"Helvetica Neue\", \"Arial\", sans-serif;--theme-id:                   \"cupertino-dark\";--preset-accent-colors:       blue     color(srgb 0.00 0.48 1.00),\n                                purple   color(srgb 0.58 0.24 0.59),\n                                pink     color(srgb 0.97 0.31 0.62),\n                                red      color(srgb 0.88 0.22 0.24),\n                                orange   color(srgb 0.97 0.51 0.11),\n                                yellow   color(srgb 1.00 0.78 0.15),\n                                green    color(srgb 0.38 0.73 0.27),\n                                gray     color(srgb 0.60 0.60 0.60);--accent-color:               color(srgb 0.00 0.48 1.00);--light-accent-color:         oklch(from var(--accent-color) calc(l + 0.10) calc(c + 0.02) h);--lighter-accent-color:       oklch(from var(--accent-color) calc(l + 0.15) c h);--dark-accent-color:          oklch(from var(--accent-color) calc(l - 0.04) calc(c - 0.02) h);--background-color:           color(srgb 0.22 0.22 0.22);--foreground-color:           color(srgb 0.26 0.26 0.26);--light-foreground-color:     color(srgb 0.39 0.39 0.39);--border-color:               color(srgb 1 1 1 / 0.1);--text-color:                 color(srgb 1 1 1 / 0.8);--error-color:                color(srgb 1 0 0);--selection-color:            currentColor;--selection-background-color: oklch(from var(--accent-color) l calc(c - 0.1) h / 0.6);--autofill-background-color:  color(srgb 0.99 1 0.76);--titlebar-color:             auto;--autocapitalize:             titlecase;--checkboard-background:      linear-gradient( 45deg, #5b5b5b 25%, #0000   25%)  0px  0px / 10px 10px,\n                                linear-gradient(-45deg, #5b5b5b 25%, #0000   25%)  0px  5px / 10px 10px,\n                                linear-gradient( 45deg, #0000   75%, #5b5b5b 75%)  5px -5px / 10px 10px,\n                                linear-gradient(-45deg, #0000   75%, #5b5b5b 75%) -5px  0px / 10px 10px, #969696;--arrow-left-path-data: M 65.96 29 C 68.96 26 69.96 21 67.96 19 C 64.96 17 60.96 17 57.96 20 L 33.96 44 C 33.96 44 32.96 45 32.96 45 C 32.96 45 31.96 46 31.96 46 C 30.96 47 30.96 48 30.96 50 C 30.96 52 30.96 53 31.96 54 C 31.96 54 32.96 55 32.96 55 C 32.96 55 33.96 56 33.96 56 L 57.96 80 C 60.96 83 64.96 83 67.96 81 C 69.96 79 68.96 74 65.96 71 L 44.96 50 L 65.96 29 Z;--arrow-right-path-data: M 34 29 C 31 26 30 21 32 19 C 35 17 39 17 42 20 L 66 44 C 66 44 67 45 67 45 C 67 45 68 46 68 46 C 69 47 69 48 69 50 C 69 52 69 53 68 54 C 68 54 67 55 67 55 C 67 55 66 56 66 56 L 42 80 C 39 83 35 83 32 81 C 30 79 31 74 34 71 L 55 50 Z;--arrow-up-path-data: M 13 61 L 46 28 C 46 28 48 26 50 26 C 52 26 54 28 54 28 L 87 61 C 87 61 92 67 87 72 C 82 76 77 71 77 71 L 50 46 L 23 71 C 23 71 18 77 13 72 C 8 67 13 61 13 61 Z;--arrow-down-path-data: M 13 38.99 L 46 71.99 C 46 71.99 48 73.99 50 73.99 C 52 73.99 54 71.99 54 71.99 L 87 38.99 C 87 38.99 92 32.99 87 27.99 C 82 23.99 77 28.99 77 28.99 L 50 53.99 L 23 28.99 C 23 28.99 18 22.99 13 27.99 C 8 32.99 13 38.99 13 38.99 Z;--double-arrow-left-path-data: M 80.98 29 C 83.98 26 84.98 21 82.98 19 C 79.98 17 75.98 17 72.98 20 L 48.98 44 C 48.98 44 47.98 45 47.98 45 C 47.98 45 46.98 46 46.98 46 C 45.98 47 45.98 48 45.98 50 C 45.98 52 45.98 53 46.98 54 C 46.98 54 47.98 55 47.98 55 C 47.98 55 48.98 56 48.98 56 L 72.98 80 C 75.98 83 79.98 83 82.98 81 C 84.98 79 83.98 74 80.98 71 L 59.98 50 L 80.98 29 Z M 50.98 29 C 53.98 26 54.98 21 52.98 19 C 49.98 17 45.98 17 42.98 20 L 18.98 44 C 18.98 44 17.98 45 17.98 45 C 17.98 45 16.98 46 16.98 46 C 15.98 47 15.98 48 15.98 50 C 15.98 52 15.98 53 16.98 54 C 16.98 54 17.98 55 17.98 55 C 17.98 55 18.98 56 18.98 56 L 42.98 80 C 45.98 83 49.98 83 52.98 81 C 54.98 79 53.98 74 50.98 71 L 29.98 50 L 50.98 29 Z;--double-arrow-right-path-data: M 19.02 29 C 16.02 26 15.02 21 17.02 19 C 20.02 17 24.02 17 27.02 20 L 51.02 44 C 51.02 44 52.02 45 52.02 45 C 52.02 45 53.02 46 53.02 46 C 54.02 47 54.02 48 54.02 50 C 54.02 52 54.02 53 53.02 54 C 53.02 54 52.02 55 52.02 55 C 52.02 55 51.02 56 51.02 56 L 27.02 80 C 24.02 83 20.02 83 17.02 81 C 15.02 79 16.02 74 19.02 71 L 40.02 50 L 19.02 29 Z M 49.02 29 C 46.02 26 45.02 21 47.02 19 C 50.02 17 54.02 17 57.02 20 L 81.02 44 C 81.02 44 82.02 45 82.02 45 C 82.02 45 83.02 46 83.02 46 C 84.02 47 84.02 48 84.02 50 C 84.02 52 84.02 53 83.02 54 C 83.02 54 82.02 55 82.02 55 C 82.02 55 81.02 56 81.02 56 L 57.02 80 C 54.02 83 50.02 83 47.02 81 C 45.02 79 46.02 74 49.02 71 L 70.02 50 L 49.02 29 Z;--arrow-up-down-path-data: M 25 41 L 50 16 L 75 41 L 83 34 L 50 1 L 17 34 Z M 17 66 L 50 100 L 83 66 L 75 59 L 50 84 L 25 59 Z;--checkmark-path-data: M 38 74 L 22 55 C 20 52 20 48 22 46 C 25 44 28 44 31 47 L 44 63 L 68 26 C 71 23 75 21 78 23 C 80 25 81 29 78 33 L 51 74 C 50 76 46 78 45 78 C 44 78 42 78 41 77 C 40 76 39 75 38 74 Z;--mixed-checkmark-path-data: M 87 42.6 L 13 42.6 L 13 57.4 L 87 57.4 L 87 42.6 Z;--clear-path-data: M 25 16 L 50 41 L 75 16 L 84 25 L 59 50 L 84 75 L 75 84 L 50 59 L 25 84 L 16 75 L 41 50 L 16 25 Z;--minimize-path-data: M 22 43 L 78 43 C 82 43 85 45 85 48 L 85 52 C 85 55 82 57 78 57 L 22 57 C 18 57 15 55 15 52 L 15 48 C 15 45 18 43 22 43 Z;--maximize-path-data: M 57 23 C 61 23 61 25 57 29 L 29 59 C 25 63 23 63 23 59 L 23 29 C 23 25 25 23 29 23 L 57 23 Z M 40 76 C 36 76 36 74 40 70 L 68 41 C 72 37 75 37 75 41 L 75 70 C 75 74 72 76 68 76 L 40 76 Z;--restore-path-data: M 14 50 C 10 50 10 48 14 44 L 42 14 C 46 10 48 10 48 14 L 48 44 C 48 48 46 50 42 50 L 14 50 Z M 84 50 C 88 50 88 52 84 56 L 56 85 C 52 89 49 89 49 85 L 49 56 C 49 52 52 50 56 50 L 84 50 Z;}h1, h2, h3, h4, h5, h6{color:color(srgb 1 1 1 / 0.92)}a{color:var(--light-accent-color);text-decoration:underline;font-weight:500}a:hover{text-decoration:none}a:focus{outline-width:3px;outline-style:solid;outline-color:var(--light-accent-color)}a::selection{color:var(--text-color)}pre, code, var{background-color:color(srgb 1 1 1 / 0.06);outline-width:1px;outline-style:solid;outline-color:var(--border-color);font-family:ui-monospace, \"Noto Sans Mono\", \"Menlo\", \"Consolas\", monospace}pre{border-radius:7px}code, var{border-radius:4px}blockquote{color:color(srgb 1 1 1 / 0.7);border-color:var(--accent-color)}mark, ::highlight(mark){color:color(srgb 0 0 0);background-color:color(srgb 1 0.96 0.61)}hr{background-color:var(--border-color)}table{border-radius:7px;border-style:hidden;box-shadow:0 0 0 1px var(--border-color)}th, td{border-width:1px;border-style:solid;border-color:var(--border-color)}::selection{color:var(--selection-color);background-color:var(--selection-background-color)}::-webkit-scrollbar{background-color:transparent}::-webkit-scrollbar-thumb{background-color:color(srgb 1 1 1 / 0.3);border-radius:25px}::-webkit-scrollbar-thumb:hover{background-color:color(srgb 1 1 1 / 0.5)}@supports not selector(::-webkit-scrollbar){*{scrollbar-color:color(srgb 1 1 1 / 0.3) transparent}}x-avatar{color:color(srgb 1 1 1);background-color:color(srgb 0.67 0.67 0.67);border-width:0px;border-radius:999px}x-avatar > x-label{font-weight:600}x-card{background-color:var(--foreground-color);border-width:1px;border-style:solid;border-color:var(--border-color);border-radius:7px}x-card > footer{background-color:var(--background-color);border-top-width:1px;border-top-style:solid;border-top-color:var(--border-color)}x-accordion::part(arrow){color:color(srgb 1 1 1 / 0.6);--path-data: var(--arrow-right-path-data);}x-accordion::part(arrow):focus{outline-width:3px;outline-style:solid;outline-color:var(--light-accent-color);outline-offset:-2px}x-accordion > header > x-label{color:color(srgb 1 1 1 / 0.87);font-weight:500}x-tooltip{color:var(--text-color);background-color:var(--foreground-color);border-color:var(--border-color);border-radius:4px;box-shadow:0px 4px 10px color(srgb 0 0 0 / 0.1)}x-stepper{width:14px;height:100%;min-width:14px;color:var(--text-color);background-color:var(--light-foreground-color);box-shadow:0 0 0 1px var(--border-color)}x-stepper::part(increment-button){border-bottom-width:0.5px;border-bottom-style:solid;border-bottom-color:var(--border-color)}x-stepper::part(decrement-button){border-top-width:0.5px;border-top-style:solid;border-top-color:var(--border-color)}x-stepper[pressed=\"increment\"]::part(increment-button), x-stepper[pressed=\"decrement\"]::part(decrement-button){color:var(--text-color);background-color:color(srgb 1 1 1 / 0.2)}x-stepper::part(increment-arrow), x-stepper::part(decrement-arrow){width:10px;height:10px}x-stepper::part(increment-arrow){--path-data: var(--arrow-up-path-data);}x-stepper::part(decrement-arrow){--path-data: var(--arrow-down-path-data);}x-swatch{border-color:color(srgb 0.7 0.7 0.7);border-radius:99px}x-button:focus{box-shadow:0 0 0px 3px var(--light-accent-color)}x-button[disabled]{opacity:0.4}x-button[skin=\"normal\"]{color:var(--text-color);background-color:var(--light-foreground-color);border-width:1px;border-style:solid;border-color:var(--border-color);border-radius:4px}x-button[skin=\"normal\"][expanded]{background-color:color(srgb 0 0 0 / 0.05)}x-button[skin=\"normal\"][toggled]{color:color(srgb 1 1 1);background-image:linear-gradient(to bottom, var(--light-accent-color), var(--accent-color));border-color:var(--light-accent-color)}x-button[skin=\"normal\"][pressed]{color:color(srgb 1 1 1);background-color:var(--dark-accent-color);border-color:var(--light-accent-color)}x-buttons:not([vertical]) > x-button[skin=\"normal\"]:not(:first-of-type){border-top-left-radius:0;border-bottom-left-radius:0}x-buttons:not([vertical]) > x-button[skin=\"normal\"]:not(:last-of-type){border-right:none;border-top-right-radius:0;border-bottom-right-radius:0}x-buttons:not([vertical]) > x-button[skin=\"normal\"][toggled] + x-button[skin=\"normal\"],x-buttons:not([vertical]) > x-button[skin=\"normal\"][pressed] + x-button[skin=\"normal\"],x-buttons:not([vertical]) > x-button[skin=\"normal\"][toggled] + x-button[skin=\"normal\"][pressed]{border-left-color:var(--light-accent-color)}x-buttons[vertical] > x-button[skin=\"normal\"]:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}x-buttons[vertical] > x-button[skin=\"normal\"]:not(:last-of-type){border-bottom-width:0;border-bottom-left-radius:0;border-bottom-right-radius:0}x-buttons[vertical] > x-button[skin=\"normal\"][toggled] + x-button[skin=\"normal\"],x-buttons[vertical] > x-button[skin=\"normal\"][pressed] + x-button[skin=\"normal\"],x-buttons[vertical] > x-button[skin=\"normal\"][toggled] + x-button[skin=\"normal\"][pressed]{border-top-color:var(--light-accent-color)}x-button[skin=\"flat\"]{color:color(srgb 1 1 1 / 0.9)}x-button[skin=\"flat\"][toggled],x-button[skin=\"flat\"][expanded]{color:var(--light-accent-color)}x-button[skin=\"flat\"][pressed]{color:var(--dark-accent-color)}x-button[skin=\"recessed\"]{color:var(--text-color);border-radius:4px}x-button[skin=\"recessed\"][disabled]{opacity:0.3}x-button[skin=\"recessed\"]:hover{background-color:color(srgb 0 0 0 / 0.07)}x-button[skin=\"recessed\"][toggled]{color:color(srgb 1 1 1 / 0.95);background-color:color(srgb 1 1 1 / 0.2)}x-button[skin=\"recessed\"][pressed]{color:color(srgb 1 1 1 / 0.95);background-color:color(srgb 1 1 1 / 0.12)}x-button[skin=\"recessed\"] > x-label{font-size:0.75rem;font-weight:500;text-align:center}x-button[skin=\"dock\"]{color:var(--text-color);background-color:var(--background-color);border-width:1px;border-style:solid;border-color:var(--border-color)}x-button[skin=\"dock\"][toggled]{color:color(srgb 1 1 1);background-color:var(--accent-color);border-color:var(--light-accent-color);z-index:1}x-button[skin=\"dock\"][pressed]{color:color(srgb 1 1 1);background-color:var(--dark-accent-color);border-color:var(--light-accent-color);z-index:2}x-tag{background-color:var(--background-color);border-color:var(--border-color);border-radius:4px}x-tag:active{filter:brightness(1.2)}x-tag:focus{border-color:var(--accent-color);box-shadow:0 0 0px 1px var(--lighter-accent-color)}x-tag[scoped]::part(main){background-color:var(--background-color)}x-tag[toggled]{filter:brightness(1.3)}x-tag[toggled]:active{filter:brightness(0.6)}x-tag::part(remove-button){--path-data: var(--clear-path-data);}x-tag::part(scope){background-color:var(--light-foreground-color);border-color:var(--border-color)}x-tagsinput{background-color:var(--foreground-color);border-width:1px;border-style:solid;border-color:var(--border-color)}x-tagsinput:focus{border-color:var(--accent-color);box-shadow:0 0 0px 3px var(--light-accent-color);outline-width:0}x-tagsinput[error]{border-color:var(--error-color);box-shadow:0 0 0px 3px color(srgb 1 0 0 / 0.49);--selection-background-color: oklch(from var(--error-color) l c h / 0.6);}x-tagsinput > x-label{color:color(srgb 1 1 1 / 0.4)}x-tabs{background-color:color(srgb 0.2 0.2 0.2);border-width:1px;border-style:solid;border-color:color(srgb 0.4 0.4 0.4);border-radius:10px}x-tab{border-width:1px;border-style:solid;border-color:transparent;border-radius:9px}x-tab:focus{box-shadow:0 0 0px 3px var(--light-accent-color)}x-tab[toggled]{background-color:var(--light-foreground-color);border-width:1px;border-style:solid;border-color:var(--light-foreground-color)}x-tab:active{background-color:color(srgb 0.51 0.51 0.51);border-color:color(srgb 0.51 0.51 0.51)}x-navitem:focus{outline-width:0}x-navitem::part(button){color:var(--text-color);border-radius:7px}x-navitem[toggled]::part(button){background-color:color(srgb 1 1 1 / 0.14)}x-navitem[pressed]::part(button){background-color:color(srgb 1 1 1 / 0.2)}x-navitem:focus::part(button){box-shadow:0 0 0px 3px var(--light-accent-color)}x-navitem::part(arrow){color:var(--light-accent-color);transform:scale(1.2);--path-data: var(--arrow-right-path-data);}x-nav x-icon:first-child{opacity:0.9}x-nav x-label + x-icon{color:var(--light-accent-color)}x-menu{padding:3px;color:var(--text-color);background-color:var(--light-foreground-color);border-width:1px;border-style:solid;border-color:var(--border-color);border-radius:7px;box-shadow:0px 4px 22px color(srgb 0 0 0 / 0.3);--close-transition: 200 opacity cubic-bezier(0.4, 0, 0.2, 1);}x-menu hr{width:calc(100% - 24px);margin:4px 0px 4px 12px}x-menuitem{color:var(--text-color);border-radius:5px}x-menuitem:focus, x-menuitem[expanded]{color:color(srgb 1 1 1);background-color:var(--accent-color)}x-menuitem::part(checkmark){--path-data: var(--checkmark-path-data);}x-menuitem::part(arrow){--path-data: var(--arrow-right-path-data);}x-menubar{padding:0 4px}dialog{color:inherit;background-color:var(--background-color);border-width:1px;border-style:solid;border-color:var(--border-color);border-radius:7px;box-shadow:0px 4px 22px color(srgb 0 0 0 / 0.3);transition-duration:120ms;transition-timing-function:cubic-bezier(0, 0, 0.2, 1);--transition-type: grow;}dialog::backdrop{background-color:color(srgb 0 0 0 / 0.3)}dialog h3{color:color(srgb 1 1 1 / 0.95)}dialog > footer{background-color:var(--background-color);border-top-width:1px;border-top-style:solid;border-top-color:var(--border-color)}x-pager{--prev-path-data: var(--arrow-left-path-data);--next-path-data: var(--arrow-right-path-data);--first-path-data: var(--double-arrow-left-path-data);--last-path-data: var(--double-arrow-right-path-data);}x-pager::part(item){color:var(--text-color);background-color:var(--foreground-color);border-color:var(--border-color);border-radius:4px}x-pager::part(item):focus{border-color:var(--accent-color);outline-width:3px;outline-style:solid;outline-color:var(--light-accent-color)}x-pager::part(toggled-item){color:color(srgb 1 1 1);background-color:var(--accent-color);border-color:var(--light-accent-color)}x-popover{color:var(--text-color);background-color:var(--foreground-color);border-width:1px;border-style:solid;border-color:var(--border-color);border-radius:4px;box-shadow:0px 4px 22px color(srgb 0 0 0 / 0.3);--open-transition: none;}x-popover > footer{background-color:var(--background-color);border-top-width:1px;border-top-style:solid;border-top-color:var(--border-color)}x-notification{border-radius:5px}x-notification::selection{color:color(srgb 0 0 0);background-color:color(srgb 1 1 1)}x-checkbox::part(indicator){background-color:var(--background-color);border-width:1px;border-style:solid;border-color:color(srgb 1 1 1 / 0.6);border-radius:4px;--path-data: var(--checkmark-path-data);}x-checkbox[mixed]::part(indicator){--path-data: var(--mixed-checkmark-path-data);}x-checkbox:active::part(indicator){background-color:color(srgb 1 1 1 / 0.1)}x-checkbox:focus::part(indicator){box-shadow:0 0 0px 3px var(--light-accent-color)}x-checkbox[toggled]::part(indicator){color:color(srgb 1 1 1);background-color:var(--accent-color);border-color:var(--accent-color)}x-checkbox[toggled]:active::part(indicator){filter:brightness(1.3)}x-radio::part(indicator){background-color:var(--background-color);border-width:1px;border-style:solid;border-color:color(srgb 1 1 1 / 0.6)}x-radio:active::part(indicator){filter:brightness(1.3)}x-radio:focus::part(indicator){box-shadow:0 0 0px 3px var(--light-accent-color)}x-radio[toggled]::part(indicator){background-color:var(--accent-color);border-color:var(--dark-accent-color)}x-radio::part(indicator-dot){background-color:color(srgb 1 1 1);opacity:0}x-radio[toggled]::part(indicator-dot){transform:scale(0.4);box-shadow:1px 3px 7px color(srgb 0 0 0 / 0.4);opacity:1}x-switch::part(indicator-thumb){background-color:color(srgb 1 1 1);width:15px;height:15px}x-switch[toggled]::part(indicator-thumb){left:calc(100% - 15px)}x-switch:focus::part(indicator-thumb){box-shadow:0 0 0px 3px var(--light-accent-color)}x-switch[size=\"small\"]::part(indicator-thumb){width:12px;height:12px}x-switch[size=\"small\"][toggled]::part(indicator-thumb){left:calc(100% - 12px)}x-switch[size=\"large\"]::part(indicator-thumb){width:18px;height:18px;left:1px}x-switch[size=\"large\"][toggled]::part(indicator-thumb){left:calc(100% - 19px)}x-switch::part(indicator-track){height:100%;background-color:color(srgb 0.15 0.15 0.15);box-shadow:0 0 0 2px color(srgb 0.41 0.41 0.41)}x-switch[toggled]::part(indicator-track){background-color:var(--light-accent-color);box-shadow:0 0 0 2px var(--dark-accent-color)}x-select{color:var(--text-color);background-color:var(--light-foreground-color);border-width:1px;border-style:solid;border-color:var(--border-color);border-radius:4px}x-select[disabled]{opacity:0.4}x-select:focus{box-shadow:0 0 0px 3px var(--light-accent-color)}x-select::part(arrow){color:color(srgb 1 1 1);margin:0 5px 0 11px;--path-data: var(--arrow-up-down-path-data);}x-select::before{content:\"\";display:block;width:20px;height:calc(100% - 4px);position:absolute;top:2px;right:2px;background-image:linear-gradient(to bottom, var(--light-accent-color), var(--accent-color));border-width:1px;border-style:solid;border-color:var(--dark-accent-color);border-radius:4px;box-sizing:border-box}x-slider::part(groove-track){background-color:color(srgb 1 1 1 / 0.6);border-radius:5px}x-slider::part(range-track){background-color:var(--light-accent-color);border-radius:5px}x-slider::part(thumb){background-color:color(srgb 1 1 1);border-radius:99px}x-slider[dragging=\"start\"]::part(start-thumb), x-slider[dragging=\"end\"]::part(end-thumb){background-color:color(srgb 0.95 0.96 0.96)}x-slider::part(thumb):focus{border-color:var(--accent-color);box-shadow:0 0 0px 3px var(--lighter-accent-color)}x-slider::part(tick){background-color:color(srgb 1 1 1 / 0.6)}x-input{background-color:var(--foreground-color);border-width:1px;border-style:solid;border-color:var(--border-color)}x-input:focus{border-color:var(--accent-color);outline-width:3px;outline-style:solid;outline-color:var(--lighter-accent-color)}x-input[error]{border-color:var(--error-color);outline-width:3px;outline-style:solid;outline-color:color(srgb 1 0 0 / 0.49);--selection-background-color: oklch(from var(--error-color) l c h / 0.6);}x-input > x-icon{color:color(srgb 1 1 1 / 0.6)}x-input > x-label{color:color(srgb 1 1 1 / 0.4)}x-input > x-icon + x-label{padding-top:1px}x-numberinput{background-color:var(--foreground-color);border-width:1px;border-style:solid;border-color:var(--border-color)}x-numberinput:focus{border-color:var(--accent-color);outline-width:3px;outline-style:solid;outline-color:var(--lighter-accent-color)}x-numberinput:focus:has(x-stepper){padding-right:14px}x-numberinput[error]{border-color:var(--error-color);outline-width:3px;outline-style:solid;outline-color:color(srgb 1 0 0 / 0.49);--selection-background-color: oklch(from var(--error-color) l c h / 0.6);}x-numberinput > x-label{color:color(srgb 1 1 1 / 0.4)}x-numberinput:focus > x-stepper{display:none}x-texteditor{background-color:var(--foreground-color);border-width:1px;border-style:solid;border-color:var(--border-color)}x-texteditor:focus{border-color:var(--accent-color);outline-width:3px;outline-style:solid;outline-color:var(--lighter-accent-color)}x-texteditor[error]{border-color:var(--error-color);outline-width:3px;outline-style:solid;outline-color:color(srgb 1 0 0 / 0.49);--selection-background-color: oklch(from var(--error-color) l c h / 0.6);}x-texteditor > x-label{color:color(srgb 1 1 1 / 0.4)}x-colorinput{background-color:var(--foreground-color);border-width:1px;border-style:solid;border-color:var(--border-color)}x-colorinput:focus{border-color:var(--accent-color);outline-width:3px;outline-style:solid;outline-color:var(--lighter-accent-color)}x-colorinput[error]{border-color:var(--error-color);outline-width:3px;outline-style:solid;outline-color:color(srgb 1 0 0 / 0.49);--selection-background-color: oklch(from var(--error-color) l c h / 0.6);}x-colorinput::part(arrow){color:color(srgb 1 1 1);background-image:linear-gradient(to bottom, var(--light-accent-color), var(--accent-color));border-width:1px;border-style:solid;border-color:var(--dark-accent-color);border-radius:4px;padding:5px 2px;--path-data: var(--arrow-up-down-path-data);}x-colorinput[size=\"small\"]::part(arrow){padding:2px}x-colorinput > x-label{color:color(srgb 1 1 1 / 0.4)}x-colorpicker::part(slider){border-radius:4px}x-colorselect{border-width:1px;border-style:solid;border-color:color(srgb 0.7 0.7 0.7);border-radius:999px}x-progressbar{background-color:var(--light-foreground-color);box-shadow:0px 0px 0px 1px inset var(--border-color);border-radius:5px}x-progressbar::part(bar){background-color:var(--light-accent-color)}x-throbber{color:var(--light-accent-color)}x-titlebar::part(buttons){left:10px;gap:8px}x-titlebar::part(button){width:12px;height:12px;min-width:12px;min-height:12px;border:1px solid transparent;border-radius:999px}x-titlebar::part(button):active{filter:brightness(0.8)}x-titlebar::part(minimize-button){background-color:color(srgb 1 0.74 0.18);border-color:transparent;--path-data: var(--minimize-path-data);}x-titlebar::part(maximize-button){background-color:color(srgb 0.15 0.8 0.25);border-color:transparent;--path-data: var(--maximize-path-data);}x-titlebar::part(restore-button){background-color:color(srgb 0.15 0.8 0.25);border-color:transparent;--path-data: var(--restore-path-data);}x-titlebar::part(close-button){background-color:color(srgb 1 0.37 0.34);border-color:transparent;order:-1;--path-data: var(--clear-path-data);}x-titlebar::part(icon){fill:color(srgb 0 0 0);opacity:0}x-titlebar:hover::part(icon){opacity:0.5}x-titlebar x-label{font-weight:700}\n"
  },
  {
    "path": "src/renderer/public/xel/themes/cupertino.css",
    "content": ":root{width:100%;height:100%;margin:0;interpolate-size:allow-keywords;font-family:sans-serif;line-height:1.6}body{width:100vw;height:100%;margin:0;overflow-y:overlay}h1{margin:22px 0 16px;box-sizing:border-box;line-height:1;font-size:3.25rem;font-weight:700}h2{margin:18px 0 14px 0;box-sizing:border-box;line-height:1;font-size:2.125rem;font-weight:700}h3{margin:16px 0 12px 0;box-sizing:border-box;line-height:1.2;font-size:1.75rem;font-weight:700}h4{margin:14px 0 10px 0;box-sizing:border-box;line-height:1.1;font-size:1.5rem;font-weight:700}h5{margin:12px 0 8px 0;box-sizing:border-box;line-height:1.1;font-size:1.25rem;font-weight:700}h6{margin:8px 0 5px 0;box-sizing:border-box;line-height:1.1;font-size:1rem;font-weight:700}h1 em, h2 em, h3 em, h4 em, h5 em, h6 em{font-weight:inherit}h1 strong, h2 strong, h3 strong, h4 strong, h5 strong, h6 strong{font-weight:900}p{margin:16px 0}p:last-child{margin-bottom:0}a{font-weight:500}table{width:100%;margin:16px 0;border-collapse:collapse;border-style:hidden;box-shadow:0 0 0 1px var(--border-color)}th{text-align:start;padding:8px 14px;border-spacing:0}td{padding:8px 14px;border-spacing:0}em{font-weight:500}pre, code, var{font-size:0.875rem;font-style:normal;padding:0 4px}pre{margin:14px 0;padding:4px 6px;white-space:pre-wrap;box-sizing:border-box}pre > code{display:block;padding:0;box-sizing:border-box;background-color:transparent;outline-width:0px;line-height:1.3}hr{width:100%;height:1px;min-height:1px;margin:24px 0;box-sizing:border-box;border:none}blockquote{box-sizing:border-box;margin:16px 0;padding:5px 14px;border-left-width:8px;border-left-style:solid}blockquote > blockquote{margin:6px 0}blockquote > p:first-child{margin-top:0}ul, ol{margin:12px 0;padding:0}p + ul{margin:-10px 0 0 0}li > ul, li > ol{margin:0}li{position:relative;margin:0;padding:0}ul li{margin-left:20px}ol li{margin-left:16px}li > p{margin:4px 0}ol > li::marker{font-weight:700}img{display:block;height:auto;margin:14px auto;max-width:100%;user-select:none;box-sizing:border-box;background:var(--checkboard-background);border-width:1px;border-style:solid;border-color:var(--border-color);-webkit-user-select:none;-webkit-user-modify:read-only}img:active{cursor:-webkit-grabbing}[popover]{color:var(--text-color);background-color:var(--foreground-color)}::-webkit-scrollbar{max-width:6px;max-height:6px}::-webkit-scrollbar-corner{display:none}@supports not selector(::-webkit-scrollbar){*{scrollbar-width:thin}}x-card:not(:defined){display:none}x-card > footer{padding:8px 16px;width:calc(100% + 40px);height:calc(100% + 20px);margin-left:-20px;margin-bottom:-16px;box-sizing:border-box;background:lightgrey}x-card > footer:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}x-card > footer:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}x-card > h1:first-child{margin-top:0}x-card > h2:first-child{margin-top:0}x-card > h3:first-child{margin-top:0}x-card > h4:first-child{margin-top:0}x-card > h5:first-child{margin-top:0}x-card > h6:first-child{margin-top:0}x-avatar[size=\"small\"]{width:28px;height:28px}x-avatar[size=\"large\"]{width:54px;height:54px}x-avatar > img{width:100%;height:100%;-webkit-user-drag:none}x-avatar > x-icon{width:55%;height:55%}x-avatar > x-label{font-size:1rem;pointer-events:none}x-avatar[size=\"small\"] > x-label{font-size:0.75rem}x-avatar[size=\"large\"] > x-label{font-size:1.5rem}x-accordion:not(:defined){display:none}x-accordion[size=\"small\"]::part(arrow){width:14px;height:14px}x-accordion[size=\"large\"]::part(arrow){width:18px;height:18px}x-accordion > header{display:flex;align-items:center;box-sizing:border-box;width:100%;padding:7px 0 7px 20px}x-accordion[size=\"small\"] > header{padding-left:18px}x-accordion[size=\"large\"] > header{padding-left:22px}x-accordion > header > x-label:first-child{flex:1}x-accordion > header > *:not(:last-child){margin-right:20px}x-accordion:not([expanded]):not([animating]) > *:not(header){display:none!important}x-icon[size=\"small\"]{width:15px;height:15px}x-icon[size=\"large\"]{width:21px;height:21px}x-icon:not(:defined){display:none}x-label:not(:defined){display:none}x-shortcut:not(:defined){display:none}x-stepper:not(:defined){display:none}x-swatch[size=\"small\"]{width:16px;height:16px}x-swatch[size=\"large\"]{width:20px;height:20px}x-swatch:not(:defined){display:none}x-button{--min-pressed-time: 150ms;}@media (pointer:coarse){x-button{--min-pressed-time: 600ms;}}a:has(x-button){text-decoration:none}x-button[toggled]{z-index:1}x-button[condensed]{padding:2px 7px}x-button[size=\"small\"]{min-height:24px}x-button[size=\"large\"]{min-height:38px}x-buttons[vertical] > x-button{width:100%;justify-content:flex-start}x-button:not(:defined){display:none}x-button > x-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;text-align:center;min-width:1px;pointer-events:none}x-button > x-label ~ x-icon, x-button > x-icon ~ x-label{margin:0 0 0 6px}x-button > x-menu{font-size:0.875rem}x-button[skin=\"normal\"][size=\"small\"] > x-icon{width:14px;height:14px}x-button[skin=\"normal\"][size=\"large\"] > x-icon{width:20px;height:20px}x-button[skin=\"flat\"]{padding:0}x-buttons:not([vertical]) > x-button[skin=\"flat\"]:not(:first-of-type){margin-left:10px}x-buttons:not([vertical]) > x-button[skin=\"flat\"][size=\"small\"]:not(:first-of-type){margin-left:5px}x-buttons[vertical] > x-button[skin=\"flat\"]:not(:first-of-type){margin-top:10px}x-buttons[vertical] > x-button[skin=\"flat\"][size=\"small\"]:not(:first-of-type){margin-top:5px}x-button[skin=\"flat\"] > x-icon{width:26px;height:26px}x-button[skin=\"flat\"][size=\"small\"] > x-icon{width:22px;height:22px}x-button[skin=\"flat\"][size=\"large\"] > x-icon{width:28px;height:28px}x-button[skin=\"recessed\"]{min-height:18px;padding:4px 8px}x-button[skin=\"recessed\"][size=\"small\"]{padding:3px 8px}x-button[skin=\"recessed\"][size=\"large\"]{padding:5px 8px}x-buttons:not([vertical]) > x-button[skin=\"recessed\"] + x-button[skin=\"recessed\"]{margin-left:4px}x-buttons[vertical] > x-button[skin=\"recessed\"] + x-button[skin=\"recessed\"]{margin-top:4px}x-button[skin=\"recessed\"] > x-icon{width:16px;height:16px}x-button[skin=\"recessed\"][size=\"small\"] > x-icon{width:12px;height:12px}x-button[skin=\"recessed\"][size=\"large\"] > x-icon{width:20px;height:20px}x-button[skin=\"dock\"], x-buttons[vertical] > x-button[skin=\"dock\"]{width:38px;height:38px;min-height:38px;padding:0;justify-content:center}x-button[skin=\"dock\"][size=\"small\"], x-buttons[vertical] > x-button[skin=\"dock\"][size=\"small\"]{width:30px;height:30px;min-height:30px}x-button[skin=\"dock\"][size=\"large\"], x-buttons[vertical] > x-button[skin=\"dock\"][size=\"large\"]{width:45px;height:45px;min-height:45px}x-buttons:not([vertical]) > x-button[skin=\"dock\"] + x-button[skin=\"dock\"]{margin-left:-1px}x-buttons[vertical] > x-button[skin=\"dock\"] + x-button[skin=\"dock\"]{margin-top:-1px}x-button[skin=\"dock\"] > x-icon{width:17px;height:17px}x-button[skin=\"dock\"][size=\"small\"] > x-icon{width:14px;height:14px}x-button[skin=\"dock\"][size=\"large\"] > x-icon{width:20px;height:20px}x-buttons[vertical]{flex-flow:column;align-items:flex-start;justify-content:center}x-buttons:not(:defined){display:none}x-tag[size=\"small\"]{height:18px}x-tag[size=\"large\"]{height:30px}x-tag:not(:defined){display:none}x-tag > x-swatch{width:14px;height:14px}x-tag[size=\"small\"] > x-swatch{width:12px;height:12px}x-tag[size=\"large\"] > x-swatch{width:16px;height:16px}x-tag > x-label{font-size:0.75rem}x-tag :not(x-label) + x-label{margin-left:0.25rem}x-tag[size=\"small\"] > x-label{font-size:0.6875rem}x-tag > x-icon{width:15px;height:15px}x-tags{margin-top:-2px;margin-left:-2px}x-tags:not(:defined){display:none}x-tags x-tag{margin:2px}x-tagsinput[size=\"small\"]{padding:0px;gap:0px}x-tagsinput[size=\"small\"] > x-tag{height:22px;transform:scale(0.92)}x-tagsinput[size=\"large\"]{padding:6px;gap:6px}x-tagsinput:focus-within{z-index:10}x-tagsinput:not(:defined){display:none}x-tagsinput > x-label{position:absolute;top:50%;left:8px;transform:translateY(-50%);pointer-events:none}x-tagsinput[size=\"small\"][error]::before{top:27px}x-tagsinput[size=\"large\"][error]::before{top:41px}x-tab[size=\"small\"]{min-height:24px}x-tab[size=\"large\"]{min-height:38px}x-tab:not(:defined){display:none}x-tab x-icon{width:17px;height:17px;min-width:17px;color:inherit}x-tab[size=\"small\"] x-icon{width:15px;height:15px;min-width:15px}x-tab[size=\"large\"] x-icon{width:19px;height:19px;min-width:19px}x-tab x-label{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;line-height:1.2;cursor:inherit;flex:1}x-tab x-icon + x-label{margin-left:6px}x-tab x-box:is([vertical]) x-icon + x-label{margin-left:0px}x-tabs:not(:defined){display:none}x-menu:not(:defined){display:none}x-menu:has(x-menu[opened]){overflow:-webkit-paged-x}x-menu img{margin:0;background:none;border:none}x-menu hr{width:100%;height:1px;margin:4px 0px;box-sizing:border-box}x-menu hr + hr, x-menu hr:last-child{display:none}x-menuitem[size=\"small\"]{min-height:24px}x-menuitem[size=\"large\"]{min-height:38px}x-menuitem:not(:defined){display:none}x-menuitem[highlighted]{color:white;background:var(--accent-color)}x-menuitem img{width:16px;height:16px}x-menuitem x-icon{width:16px;height:16px}x-menuitem x-label{display:block;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:inherit;line-height:1.4}x-menuitem img + x-label, x-menuitem x-swatch + x-label, x-menuitem x-icon + x-label{margin-left:8px}x-menuitem x-shortcut{margin-left:auto}x-menuitem x-label + x-shortcut{margin-left:8px}x-menubar[size=\"small\"]{height:30px}x-menubar[size=\"large\"]{height:42px}x-menubar:not(:defined){display:none}x-menubar > x-menuitem{height:100%;padding:0 11px;min-height:0}x-menubar > x-menuitem[autohidden]{display:none}x-navitem + x-navitem, a:has(x-navitem) + a:has(x-navitem), a:has(x-navitem) + x-navitem, x-navitem + a:has(x-navitem){margin:3px 0}x-nav x-nav > *:first-child{margin-top:3px}x-nav x-nav > *:last-child{margin-bottom:0}x-nav x-nav > *{margin-left:34px!important}x-nav x-nav > *{max-width:calc(100% - 34px)!important}x-nav > a{display:block;text-decoration:none}x-nav x-label{max-width:100%;flex:1 1 0%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:500;font-size:0.9375rem;text-align:start}x-nav x-icon + x-label{margin-left:14px}x-nav[collapsed] x-navitem > x-label{display:none}x-nav x-icon{width:20px;height:20px}x-nav x-label + x-icon{width:18px;height:18px;margin:0 0 0 10px}x-nav[collapsed] x-navitem > x-label + x-icon{display:none}x-nav[collapsed] x-navitem::part(button){padding:0}x-nav[collapsed] x-navitem::part(arrow){display:none}x-contextmenu:not(:defined){display:none}dialog{overflow:hidden;position:fixed;min-width:200px;min-height:100px;max-height:none;margin:auto;padding:20px 24px;box-sizing:border-box;font-size:0.8125rem;line-height:1.6}dialog:focus{outline:none}dialog:not(:defined){display:none}dialog > footer{display:flex;flex-flow:row;justify-content:flex-end;padding:12px 24px;width:calc(100% + 48px);height:calc(100% + 22px);margin-top:10px;margin-left:-24px;margin-bottom:-20px;box-sizing:border-box;background:lightgrey}dialog > footer:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}dialog > footer:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}dialog > footer x-button + x-button{margin-left:8px}dialog h3{font-size:1.125rem;font-weight:700}dialog > *:first-child{margin-top:0}x-popover{padding:12px;overflow:auto}x-popover:has(footer){overflow:hidden}x-popover:not(:defined){display:none}x-popover > footer{padding:12px;width:calc(100% + 24px);height:calc(100% + 12px);margin-left:-12px;margin-bottom:-12px;margin-top:12px;box-sizing:border-box;background:lightgrey}x-popover > footer:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}x-popover > footer:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}x-notification[size=\"small\"]{padding:3px 12px}x-notification[size=\"large\"]{padding:8px 12px}x-notification:not(:defined){display:none}x-notification > p{margin:0}x-checkbox:not(:defined){display:none}x-checkbox + x-checkbox{margin-top:6px}x-checkbox[size=\"small\"]::part(indicator){width:17px;height:17px}x-checkbox[size=\"large\"]::part(indicator){width:21px;height:21px}x-checkbox > x-label{display:block;margin-left:8px;padding:1px 0}x-radio + x-radio{margin-top:6px}x-radio:not(:defined){display:none}x-radio[size=\"small\"]::part(indicator){width:17px;height:17px}x-radio[size=\"large\"]::part(indicator){width:21px;height:21px}x-radio > x-label{margin:0 0 0 8px;padding:1px 0}x-radio[size=\"small\"] > x-label{margin-left:6px}x-radio[size=\"large\"] > x-label{margin-left:10px}x-radios:not(:defined){display:none}x-switch + x-switch{margin-top:12px}x-switch:not(:defined){display:none}x-switch[size=\"large\"]::part(indicator){width:42px;height:20px}x-switch[size=\"small\"]::part(indicator){width:28px;height:12px}x-switch > x-label{margin:0 0 0 8px;padding:1px 0}x-switch[size=\"small\"] > x-label{margin-left:6px}x-switch[size=\"large\"] > x-label{margin-left:10px}x-select[size=\"small\"]{height:24px}x-select[size=\"large\"]{height:38px}x-select:not(:defined){display:none}x-colorselect[size=\"small\"]{width:24px;height:24px}x-colorselect[size=\"large\"]{width:38px;height:38px}x-colorselect:not(:defined){display:none}x-input[size=\"small\"]{height:24px}x-input[size=\"large\"]{height:38px}x-input:not(:defined){display:none}x-input + x-input{margin-top:20px}x-input > x-icon{width:15px;height:15px;min-width:15px;margin:0 0 0 8px}x-input[size=\"small\"] > x-icon{transform:scale(0.8)}x-input[size=\"large\"] > x-icon{transform:scale(1.1)}x-input > x-icon:hover{cursor:default}x-input > x-label{display:none;position:absolute;top:50%;max-width:100%;padding:0 5px 0 5px;transform:translateY(-50%);font-family:inherit;font-size:inherit;line-height:inherit;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;pointer-events:none}x-input[empty] > x-label{display:block}x-input > x-icon + x-label{padding:0 5px 0 29px}x-numberinput[size=\"small\"]{height:24px}x-numberinput[size=\"large\"]{height:38px}x-numberinput:focus{z-index:10}x-numberinput:not(:defined){display:none}x-numberinput > x-label{display:none;position:absolute;top:50%;max-width:100%;padding:0 5px 0 5px;transform:translateY(-50%);font-family:inherit;font-size:inherit;line-height:inherit;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;pointer-events:none}x-numberinput[empty] > x-label{display:block}x-numberinput[size=\"small\"][error]::before{top:27px}x-numberinput[size=\"large\"][error]::before{top:41px}x-texteditor:focus{z-index:10}x-texteditor:not(:defined){display:none}x-texteditor > x-label{display:none;position:absolute;width:100%;top:0;left:0;padding:2px 6px;font-family:inherit;font-size:inherit;line-height:inherit;pointer-events:none}x-texteditor[empty] > x-label{display:block}x-slider:not(:defined){display:none}x-colorpicker:not(:defined){display:none}x-progressbar[size=\"small\"]{height:6px}x-progressbar[size=\"large\"]{height:10px}x-progressbar:not(:defined){display:none}x-throbber[size=\"small\"]{width:26px;height:26px}x-throbber[size=\"large\"]{width:34px;height:34px}x-throbber:not(:defined){display:none}x-titlebar x-icon + x-label{margin-left:6px}:root{color:var(--text-color);background-color:var(--background-color);font-family:BlinkMacSystemFont, -apple-system, \"Inter\", \"Roboto Flex\", \"Roboto\", \"Noto Sans\", \"Helvetica Neue\", \"Arial\", sans-serif;--theme-id:                   \"cupertino\";--preset-accent-colors:       blue     color(srgb 0.00 0.48 1.00),\n                                purple   color(srgb 0.58 0.24 0.59),\n                                pink     color(srgb 0.97 0.31 0.62),\n                                red      color(srgb 0.88 0.22 0.24),\n                                orange   color(srgb 0.97 0.51 0.11),\n                                yellow   color(srgb 1.00 0.78 0.15),\n                                green    color(srgb 0.38 0.73 0.27),\n                                gray     color(srgb 0.60 0.60 0.60);--accent-color:               color(srgb 0.00 0.48 1.00);--light-accent-color:         oklch(from var(--accent-color) calc(l + 0.08) calc(c + 0.02) h);--lighter-accent-color:       oklch(from var(--accent-color) calc(l + 0.15) c h);--dark-accent-color:          oklch(from var(--accent-color) calc(l - 0.04) calc(c - 0.02) h);--darker-accent-color:        oklch(from var(--accent-color) calc(l - 0.06) c h);--darkest-accent-color:       oklch(from var(--accent-color) calc(l - 0.2) calc(c - 0.07) h);--background-color:           color(srgb 0.96 0.96 0.96);--foreground-color:           color(srgb 0.98 0.98 0.98);--border-color:               color(srgb 0.85 0.85 0.85);--text-color:                 color(srgb 0 0 0 / 0.85);--error-color:                color(srgb 1 0.23 0.19);--selection-color:            currentColor;--selection-background-color: oklch(from var(--accent-color) l c h / 0.2);--autofill-background-color:  color(srgb 0.98 1 0.74);--titlebar-color:             auto;--autocapitalize:             titlecase;--checkboard-background:      linear-gradient( 45deg, #d6d6d6 25%, #0000   25%)  0px  0px / 10px 10px,\n                                linear-gradient(-45deg, #d6d6d6 25%, #0000   25%)  0px  5px / 10px 10px,\n                                linear-gradient( 45deg, #0000   75%, #d6d6d6 75%)  5px -5px / 10px 10px,\n                                linear-gradient(-45deg, #0000   75%, #d6d6d6 75%) -5px  0px / 10px 10px, #ffffff;--arrow-left-path-data: M 65.96 29 C 68.96 26 69.96 21 67.96 19 C 64.96 17 60.96 17 57.96 20 L 33.96 44 C 33.96 44 32.96 45 32.96 45 C 32.96 45 31.96 46 31.96 46 C 30.96 47 30.96 48 30.96 50 C 30.96 52 30.96 53 31.96 54 C 31.96 54 32.96 55 32.96 55 C 32.96 55 33.96 56 33.96 56 L 57.96 80 C 60.96 83 64.96 83 67.96 81 C 69.96 79 68.96 74 65.96 71 L 44.96 50 L 65.96 29 Z;--arrow-right-path-data: M 34 29 C 31 26 30 21 32 19 C 35 17 39 17 42 20 L 66 44 C 66 44 67 45 67 45 C 67 45 68 46 68 46 C 69 47 69 48 69 50 C 69 52 69 53 68 54 C 68 54 67 55 67 55 C 67 55 66 56 66 56 L 42 80 C 39 83 35 83 32 81 C 30 79 31 74 34 71 L 55 50 Z;--arrow-up-path-data: M 13 61 L 46 28 C 46 28 48 26 50 26 C 52 26 54 28 54 28 L 87 61 C 87 61 92 67 87 72 C 82 76 77 71 77 71 L 50 46 L 23 71 C 23 71 18 77 13 72 C 8 67 13 61 13 61 Z;--arrow-down-path-data: M 13 38.99 L 46 71.99 C 46 71.99 48 73.99 50 73.99 C 52 73.99 54 71.99 54 71.99 L 87 38.99 C 87 38.99 92 32.99 87 27.99 C 82 23.99 77 28.99 77 28.99 L 50 53.99 L 23 28.99 C 23 28.99 18 22.99 13 27.99 C 8 32.99 13 38.99 13 38.99 Z;--double-arrow-left-path-data: M 80.98 29 C 83.98 26 84.98 21 82.98 19 C 79.98 17 75.98 17 72.98 20 L 48.98 44 C 48.98 44 47.98 45 47.98 45 C 47.98 45 46.98 46 46.98 46 C 45.98 47 45.98 48 45.98 50 C 45.98 52 45.98 53 46.98 54 C 46.98 54 47.98 55 47.98 55 C 47.98 55 48.98 56 48.98 56 L 72.98 80 C 75.98 83 79.98 83 82.98 81 C 84.98 79 83.98 74 80.98 71 L 59.98 50 L 80.98 29 Z M 50.98 29 C 53.98 26 54.98 21 52.98 19 C 49.98 17 45.98 17 42.98 20 L 18.98 44 C 18.98 44 17.98 45 17.98 45 C 17.98 45 16.98 46 16.98 46 C 15.98 47 15.98 48 15.98 50 C 15.98 52 15.98 53 16.98 54 C 16.98 54 17.98 55 17.98 55 C 17.98 55 18.98 56 18.98 56 L 42.98 80 C 45.98 83 49.98 83 52.98 81 C 54.98 79 53.98 74 50.98 71 L 29.98 50 L 50.98 29 Z;--double-arrow-right-path-data: M 19.02 29 C 16.02 26 15.02 21 17.02 19 C 20.02 17 24.02 17 27.02 20 L 51.02 44 C 51.02 44 52.02 45 52.02 45 C 52.02 45 53.02 46 53.02 46 C 54.02 47 54.02 48 54.02 50 C 54.02 52 54.02 53 53.02 54 C 53.02 54 52.02 55 52.02 55 C 52.02 55 51.02 56 51.02 56 L 27.02 80 C 24.02 83 20.02 83 17.02 81 C 15.02 79 16.02 74 19.02 71 L 40.02 50 L 19.02 29 Z M 49.02 29 C 46.02 26 45.02 21 47.02 19 C 50.02 17 54.02 17 57.02 20 L 81.02 44 C 81.02 44 82.02 45 82.02 45 C 82.02 45 83.02 46 83.02 46 C 84.02 47 84.02 48 84.02 50 C 84.02 52 84.02 53 83.02 54 C 83.02 54 82.02 55 82.02 55 C 82.02 55 81.02 56 81.02 56 L 57.02 80 C 54.02 83 50.02 83 47.02 81 C 45.02 79 46.02 74 49.02 71 L 70.02 50 L 49.02 29 Z;--arrow-up-down-path-data: M 25 41 L 50 16 L 75 41 L 83 34 L 50 1 L 17 34 Z M 17 66 L 50 100 L 83 66 L 75 59 L 50 84 L 25 59 Z;--checkmark-path-data: M 38 74 L 22 55 C 20 52 20 48 22 46 C 25 44 28 44 31 47 L 44 63 L 68 26 C 71 23 75 21 78 23 C 80 25 81 29 78 33 L 51 74 C 50 76 46 78 45 78 C 44 78 42 78 41 77 C 40 76 39 75 38 74 Z;--mixed-checkmark-path-data: M 87 42.6 L 13 42.6 L 13 57.4 L 87 57.4 L 87 42.6 Z;--clear-path-data: M 25 16 L 50 41 L 75 16 L 84 25 L 59 50 L 84 75 L 75 84 L 50 59 L 25 84 L 16 75 L 41 50 L 16 25 Z;--minimize-path-data: M 22 43 L 78 43 C 82 43 85 45 85 48 L 85 52 C 85 55 82 57 78 57 L 22 57 C 18 57 15 55 15 52 L 15 48 C 15 45 18 43 22 43 Z;--maximize-path-data: M 57 23 C 61 23 61 25 57 29 L 29 59 C 25 63 23 63 23 59 L 23 29 C 23 25 25 23 29 23 L 57 23 Z M 40 76 C 36 76 36 74 40 70 L 68 41 C 72 37 75 37 75 41 L 75 70 C 75 74 72 76 68 76 L 40 76 Z;--restore-path-data: M 14 50 C 10 50 10 48 14 44 L 42 14 C 46 10 48 10 48 14 L 48 44 C 48 48 46 50 42 50 L 14 50 Z M 84 50 C 88 50 88 52 84 56 L 56 85 C 52 89 49 89 49 85 L 49 56 C 49 52 52 50 56 50 L 84 50 Z;}h1, h2, h3, h4, h5, h6{color:color(srgb 0 0 0)}a{color:var(--accent-color);text-decoration:underline;font-weight:500}a:hover{text-decoration:none}a:focus{outline-width:3px;outline-style:solid;outline-color:var(--light-accent-color)}pre, code, var{background-color:color(srgb 0 0 0 / 0.02);outline-width:1px;outline-style:solid;outline-color:var(--border-color);font-family:ui-monospace, \"Noto Sans Mono\", \"Menlo\", \"Consolas\", monospace}pre{border-radius:7px}code, var{border-radius:4px}blockquote{border-color:color(srgb 0.97 0.39 0.4)}mark, ::highlight(mark){color:inherit;background-color:color(srgb 1 0.96 0.61)}hr{background-color:var(--border-color)}table{border-radius:7px;border-style:hidden;box-shadow:0 0 0 1px var(--border-color)}th, td{border-width:1px;border-style:solid;border-color:var(--border-color)}::selection{color:var(--selection-color);background-color:var(--selection-background-color)}::-webkit-scrollbar{background-color:transparent}::-webkit-scrollbar-thumb{background-color:color(srgb 0 0 0 / 0.23);border-radius:25px}::-webkit-scrollbar-thumb:hover{background-color:color(srgb 0 0 0 / 0.5)}@supports not selector(::-webkit-scrollbar){*{scrollbar-color:color(srgb 0 0 0 / 0.23) transparent}}x-avatar{color:color(srgb 1 1 1);background-color:color(srgb 0.67 0.67 0.67);border-width:0px;border-radius:999px}x-avatar > x-label{font-weight:600}x-card{background-color:var(--foreground-color);border-width:1px;border-style:solid;border-color:var(--border-color);border-radius:7px}x-card > footer{background-color:var(--background-color);border-top-width:1px;border-top-style:solid;border-top-color:var(--border-color)}x-accordion::part(arrow){color:color(srgb 0 0 0 / 0.48);--path-data: var(--arrow-right-path-data);}x-accordion::part(arrow):focus{outline-width:3px;outline-style:solid;outline-color:var(--light-accent-color);outline-offset:-2px}x-accordion > header > x-label{font-weight:500}x-tooltip{color:var(--text-color);background-color:color(srgb 0.93 0.93 0.93);border-color:var(--border-color);border-radius:4px;box-shadow:0px 4px 10px color(srgb 0 0 0 / 0.1)}x-stepper{width:14px;height:100%;min-width:14px;color:var(--text-color);background-color:color(srgb 1 1 1);box-shadow:0 0 0 1px var(--border-color)}x-stepper::part(increment-button){border-bottom-width:0.5px;border-bottom-style:solid;border-bottom-color:var(--border-color)}x-stepper::part(decrement-button){border-top-width:0.5px;border-top-style:solid;border-top-color:var(--border-color)}x-stepper[pressed=\"increment\"]::part(increment-button), x-stepper[pressed=\"decrement\"]::part(decrement-button){color:var(--text-color);background-color:color(srgb 0 0 0 / 0.1)}x-stepper::part(increment-arrow), x-stepper::part(decrement-arrow){width:10px;height:10px}x-stepper::part(increment-arrow){--path-data: var(--arrow-up-path-data);}x-stepper::part(decrement-arrow){--path-data: var(--arrow-down-path-data);}x-swatch{border-color:color(srgb 0.8 0.8 0.8);border-radius:99px}x-button:focus{box-shadow:0 0 0px 3px var(--light-accent-color)}x-button[disabled]{opacity:0.4}x-button[skin=\"normal\"]{color:var(--text-color);background-color:color(srgb 1 1 1);border-width:1px;border-style:solid;border-color:var(--border-color);border-radius:4px}x-button[skin=\"normal\"][expanded]{background-color:color(srgb 0 0 0 / 0.05)}x-button[skin=\"normal\"][toggled]{color:color(srgb 1 1 1);background-image:linear-gradient(to bottom, var(--light-accent-color), var(--accent-color));border-color:var(--darker-accent-color)}x-button[skin=\"normal\"][pressed]{color:color(srgb 1 1 1);background-color:var(--dark-accent-color);border-color:var(--darkest-accent-color)}x-buttons:not([vertical]) > x-button[skin=\"normal\"]:not(:first-of-type){border-top-left-radius:0;border-bottom-left-radius:0}x-buttons:not([vertical]) > x-button[skin=\"normal\"]:not(:last-of-type){border-right:none;border-top-right-radius:0;border-bottom-right-radius:0}x-buttons:not([vertical]) > x-button[skin=\"normal\"][toggled] + x-button[skin=\"normal\"]{border-left-color:var(--darker-accent-color)}x-buttons:not([vertical]) > x-button[skin=\"normal\"][pressed] + x-button[skin=\"normal\"],x-buttons:not([vertical]) > x-button[skin=\"normal\"][toggled] + x-button[skin=\"normal\"][pressed]{border-left-color:var(--darkest-accent-color)}x-buttons[vertical] > x-button[skin=\"normal\"]:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}x-buttons[vertical] > x-button[skin=\"normal\"]:not(:last-of-type){border-bottom-width:0;border-bottom-left-radius:0;border-bottom-right-radius:0}x-buttons[vertical] > x-button[skin=\"normal\"][toggled] + x-button[skin=\"normal\"]{border-top-color:var(--darker-accent-color)}x-buttons[vertical] > x-button[skin=\"normal\"][pressed] + x-button[skin=\"normal\"],x-buttons[vertical] > x-button[skin=\"normal\"][toggled] + x-button[skin=\"normal\"][pressed]{border-top-color:var(--darkest-accent-color)}x-button[skin=\"flat\"]{color:color(srgb 0 0 0 / 0.65)}x-button[skin=\"flat\"][toggled],x-button[skin=\"flat\"][expanded]{color:var(--dark-accent-color)}x-button[skin=\"flat\"][pressed]{color:var(--darker-accent-color)}x-button[skin=\"recessed\"]{color:var(--text-color);border-radius:4px}x-button[skin=\"recessed\"][disabled]{opacity:0.3}x-button[skin=\"recessed\"]:hover{background-color:color(srgb 0 0 0 / 0.07)}x-button[skin=\"recessed\"][toggled]{color:color(srgb 1 1 1 / 0.95);background-color:color(srgb 0 0 0 / 0.42)}x-button[skin=\"recessed\"][pressed]{color:color(srgb 1 1 1 / 0.95);background-color:color(srgb 0 0 0 / 0.6)}x-button[skin=\"recessed\"] > x-label{font-size:0.75rem;font-weight:500;text-align:center}x-button[skin=\"dock\"]{color:var(--text-color);background-color:color(srgb 1 1 1);border-width:1px;border-style:solid;border-color:var(--border-color)}x-button[skin=\"dock\"][toggled]{color:color(srgb 1 1 1);background-color:var(--accent-color);border-color:var(--darkest-accent-color);z-index:1}x-button[skin=\"dock\"][pressed]{color:color(srgb 1 1 1);background-color:var(--dark-accent-color);border-color:var(--darkest-accent-color);z-index:2}x-tag{background-color:var(--background-color);border-color:var(--border-color);border-radius:4px}x-tag:active{filter:brightness(0.97)}x-tag:focus{border-color:var(--accent-color);box-shadow:0 0 0px 1px var(--light-accent-color)}x-tag[scoped]::part(main){background-color:var(--background-color)}x-tag[toggled]{color:color(srgb 0 0 0 / 0.8);filter:brightness(0.8)}x-tag[toggled]:active{filter:brightness(0.7)}x-tag::part(remove-button){--path-data: var(--clear-path-data);}x-tag::part(scope){background-color:var(--foreground-color);border-color:var(--border-color)}x-tagsinput{background-color:color(srgb 1 1 1);border-color:var(--border-color);border-width:1px;border-style:solid}x-tagsinput:focus{border-color:var(--accent-color);box-shadow:0 0 0px 3px var(--lighter-accent-color);outline-width:0}x-tagsinput[error]{border-color:var(--error-color);box-shadow:0 0 0px 3px color(srgb 1 0 0 / 0.49);--selection-background-color: oklch(from var(--error-color) l c h / 0.3);}x-tagsinput > x-label{color:color(srgb 0 0 0 / 0.4)}x-tabs{background-color:color(srgb 0.88 0.88 0.88);border-width:1px;border-style:solid;border-color:color(srgb 0 0 0 / 0.06);border-radius:10px}x-tab{border-width:1px;border-style:solid;border-color:transparent;border-radius:9px}x-tab:focus{box-shadow:0 0 0px 3px var(--light-accent-color)}x-tab[toggled]{background-color:color(srgb 1 1 1);border-width:1px;border-style:solid;border-color:var(--border-color)}x-tab:active{background-color:color(srgb 0.96 0.96 0.96);border-color:color(srgb 0 0 0 / 0.1)}x-navitem:focus{outline-width:0}x-navitem::part(button){color:var(--text-color);border-radius:7px}x-navitem[toggled]::part(button){background-color:color(srgb 0 0 0 / 0.08)}x-navitem[pressed]::part(button){background-color:color(srgb 0 0 0 / 0.2)}x-navitem:focus::part(button){box-shadow:0 0 0px 3px var(--light-accent-color)}x-navitem::part(arrow){color:var(--accent-color);transform:scale(1.2);--path-data: var(--arrow-right-path-data);}x-nav x-icon:first-child{opacity:0.9}x-nav x-label + x-icon{color:var(--accent-color)}x-menu{padding:3px;color:var(--text-color);background-color:color(srgb 0.93 0.93 0.93);border-width:1px;border-style:solid;border-color:color(srgb 0.8 0.8 0.8);border-radius:7px;box-shadow:0px 4px 22px color(srgb 0 0 0 / 0.3);--close-transition: 200 opacity cubic-bezier(0.4, 0, 0.2, 1);}x-menu hr{width:calc(100% - 24px);margin:4px 0px 4px 12px}x-menuitem{color:var(--text-color);border-radius:5px}x-menuitem:focus, x-menuitem[expanded]{background-color:var(--darker-accent-color);color:color(srgb 1 1 1)}x-menuitem::part(checkmark){--path-data: var(--checkmark-path-data);}x-menuitem::part(arrow){--path-data: var(--arrow-right-path-data);}x-menuitem:focus > x-swatch, x-menuitem[expanded] > x-swatch{border-color:color(srgb 1 1 1 / 0.8)}x-menubar{padding:0 4px}dialog{color:inherit;background-color:var(--background-color);border-width:1px;border-style:solid;border-color:color(srgb 0.8 0.8 0.8);border-radius:7px;box-shadow:0px 4px 22px color(srgb 0 0 0 / 0.3);transition-duration:120ms;transition-timing-function:cubic-bezier(0, 0, 0.2, 1);--transition-type: grow;}dialog::backdrop{background-color:color(srgb 0 0 0 / 0.3)}dialog h3{color:color(srgb 0 0 0 / 0.95)}dialog > footer{background-color:var(--background-color);border-top-width:1px;border-top-style:solid;border-top-color:var(--border-color)}x-pager{--prev-path-data: var(--arrow-left-path-data);--next-path-data: var(--arrow-right-path-data);--first-path-data: var(--double-arrow-left-path-data);--last-path-data: var(--double-arrow-right-path-data);}x-pager::part(item){color:var(--accent-color);background-color:var(--foreground-color);border-color:var(--border-color);border-radius:4px}x-pager::part(item):focus{border-color:var(--accent-color);outline-width:3px;outline-style:solid;outline-color:var(--light-accent-color)}x-pager::part(toggled-item){color:color(srgb 1 1 1);background-color:var(--accent-color);border-color:var(--dark-accent-color)}x-popover{color:var(--text-color);background-color:var(--foreground-color);border-width:1px;border-style:solid;border-color:color(srgb 0.8 0.8 0.8);border-radius:4px;box-shadow:0px 4px 22px color(srgb 0 0 0 / 0.3);--open-transition: none;}x-popover > footer{background-color:var(--background-color);border-top-width:1px;border-top-style:solid;border-top-color:var(--border-color)}x-notification{border-radius:5px}x-notification::selection{color:color(srgb 0 0 0);background-color:color(srgb 1 1 1)}x-notification a{color:var(--light-accent-color)}x-checkbox::part(indicator){background-color:color(srgb 1 1 1);border-width:1px;border-style:solid;border-color:color(srgb 0.8 0.8 0.8);border-radius:4px;--path-data: var(--checkmark-path-data);}x-checkbox[mixed]::part(indicator){--path-data: var(--mixed-checkmark-path-data);}x-checkbox:active::part(indicator){background-color:color(srgb 0 0 0 / 0.03)}x-checkbox:focus::part(indicator){box-shadow:0 0 0px 3px var(--light-accent-color)}x-checkbox[toggled]::part(indicator){color:color(srgb 1 1 1);background-color:var(--accent-color);border-color:var(--accent-color)}x-checkbox[toggled]:active::part(indicator){background-color:var(--darkest-accent-color);border-color:var(--darkest-accent-color)}x-radio::part(indicator){background-color:color(srgb 1 1 1);border-width:1px;border-style:solid;border-color:color(srgb 0.8 0.8 0.8)}x-radio:active::part(indicator){background-color:color(srgb 0 0 0 / 0.03)}x-radio:focus::part(indicator){box-shadow:0 0 0px 3px var(--light-accent-color)}x-radio[toggled]::part(indicator){background-color:var(--accent-color);border-color:var(--dark-accent-color)}x-radio[toggled]:active::part(indicator){background-color:var(--darkest-accent-color)}x-radio::part(indicator-dot){background-color:color(srgb 1 1 1);opacity:0}x-radio[toggled]::part(indicator-dot){transform:scale(0.4);box-shadow:1px 3px 7px color(srgb 0 0 0 / 0.4);opacity:1}x-switch::part(indicator-thumb){background-color:color(srgb 1 1 1);width:15px;height:15px}x-switch[toggled]::part(indicator-thumb){left:calc(100% - 15px)}x-switch:focus::part(indicator-thumb){box-shadow:0 0 0px 3px var(--light-accent-color)}x-switch[size=\"small\"]::part(indicator-thumb){width:12px;height:12px}x-switch[size=\"small\"][toggled]::part(indicator-thumb){left:calc(100% - 12px)}x-switch[size=\"large\"]::part(indicator-thumb){width:18px;height:18px;left:1px}x-switch[size=\"large\"][toggled]::part(indicator-thumb){left:calc(100% - 19px)}x-switch::part(indicator-track){height:100%;background-color:color(srgb 0.7 0.7 0.7);box-shadow:0 0 0 2px color(srgb 0.7 0.7 0.7)}x-switch[toggled]::part(indicator-track){background-color:var(--light-accent-color);box-shadow:0 0 0 2px var(--dark-accent-color)}x-select{color:var(--text-color);background-color:color(srgb 1 1 1);border-width:1px;border-style:solid;border-color:var(--border-color);border-radius:4px}x-select[disabled]{opacity:0.4}x-select:focus{box-shadow:0 0 0px 3px var(--light-accent-color)}x-select::part(arrow){color:color(srgb 1 1 1);margin:0 5px 0 11px;--path-data: var(--arrow-up-down-path-data);}x-select::before{content:\"\";display:block;width:20px;height:calc(100% - 4px);position:absolute;top:2px;right:2px;background-image:linear-gradient(to bottom, var(--light-accent-color), var(--accent-color));border-width:1px;border-style:solid;border-color:var(--dark-accent-color);border-radius:4px;box-sizing:border-box}x-slider::part(groove-track){background-color:color(srgb 0.8 0.8 0.8);border-radius:5px}x-slider::part(range-track){background-color:var(--accent-color);border-radius:5px}x-slider::part(thumb){background-color:color(srgb 1 1 1);border-radius:99px}x-slider[dragging=\"start\"]::part(start-thumb), x-slider[dragging=\"end\"]::part(end-thumb){background-color:var(--background-color)}x-slider::part(thumb):focus{border-color:var(--accent-color);box-shadow:0 0 0px 3px var(--lighter-accent-color)}x-slider::part(tick){background-color:color(srgb 0 0 0 / 0.5)}x-input{background-color:color(srgb 1 1 1);border-width:1px;border-style:solid;border-color:var(--border-color)}x-input:focus{border-color:var(--accent-color);outline-width:3px;outline-style:solid;outline-color:var(--lighter-accent-color)}x-input[error]{border-color:var(--error-color);outline-width:3px;outline-style:solid;outline-color:color(srgb 1 0 0 / 0.49);--selection-background-color: oklch(from var(--error-color) l c h / 0.3);}x-input > x-icon{color:color(srgb 0.34 0.34 0.34)}x-input > x-label{color:color(srgb 0 0 0 / 0.4)}x-input > x-icon + x-label{padding-top:1px}x-numberinput{background-color:color(srgb 1 1 1);border-width:1px;border-style:solid;border-color:var(--border-color)}x-numberinput:focus{border-color:var(--accent-color);outline-width:3px;outline-style:solid;outline-color:var(--lighter-accent-color)}x-numberinput:focus:has(x-stepper){padding-right:14px}x-numberinput[error]{border-color:var(--error-color);outline-width:3px;outline-style:solid;outline-color:color(srgb 1 0 0 / 0.49);--selection-background-color: oklch(from var(--error-color) l c h / 0.3);}x-numberinput > x-label{color:color(srgb 0 0 0 / 0.4)}x-numberinput:focus > x-stepper{display:none}x-texteditor{background-color:color(srgb 1 1 1);border-width:1px;border-style:solid;border-color:var(--border-color)}x-texteditor:focus{border-color:var(--accent-color);outline-width:3px;outline-style:solid;outline-color:var(--lighter-accent-color)}x-texteditor[error]{border-color:var(--error-color);outline-width:3px;outline-style:solid;outline-color:color(srgb 1 0 0 / 0.49);--selection-background-color: oklch(from var(--error-color) l c h / 0.3);}x-texteditor > x-label{color:color(srgb 0 0 0 / 0.4)}x-colorinput{background-color:color(srgb 1 1 1);border-width:1px;border-style:solid;border-color:var(--border-color)}x-colorinput:focus{border-color:var(--accent-color);outline-width:3px;outline-style:solid;outline-color:var(--lighter-accent-color)}x-colorinput[error]{border-color:var(--error-color);outline-width:3px;outline-style:solid;outline-color:color(srgb 1 0 0 / 0.49);--selection-background-color: oklch(from var(--error-color) l c h / 0.3);}x-colorinput::part(arrow){color:color(srgb 1 1 1);background-image:linear-gradient(to bottom, var(--light-accent-color), var(--accent-color));border-width:1px;border-style:solid;border-color:var(--dark-accent-color);border-radius:4px;padding:5px 2px;--path-data: var(--arrow-up-down-path-data);}x-colorinput[size=\"small\"]::part(arrow){padding:2px}x-colorinput > x-label{color:color(srgb 0 0 0 / 0.4)}x-colorpicker::part(slider){border-radius:4px}x-colorselect{border-width:1px;border-style:solid;border-color:color(srgb 0.8 0.8 0.8);border-radius:999px}x-progressbar{background-color:color(srgb 0.93 0.93 0.93);border-radius:5px;box-shadow:0px 0px 0px 1px inset var(--border-color)}x-progressbar::part(bar){background-color:var(--light-accent-color)}x-throbber{color:var(--light-accent-color)}x-titlebar::part(buttons){left:10px;gap:8px}x-titlebar::part(button){width:12px;height:12px;min-width:12px;min-height:12px;border:1px solid transparent;border-radius:999px}x-titlebar::part(button):active{filter:brightness(0.8)}x-titlebar::part(minimize-button){background-color:color(srgb 1 0.74 0.18);border-color:color(srgb 0.89 0.62 0.11);--path-data: var(--minimize-path-data);}x-titlebar::part(maximize-button){background-color:color(srgb 0.15 0.8 0.25);border-color:color(srgb 0.12 0.67 0.15);--path-data: var(--maximize-path-data);}x-titlebar::part(restore-button){background-color:color(srgb 0.15 0.8 0.25);border-color:color(srgb 0.12 0.67 0.15);--path-data: var(--restore-path-data);}x-titlebar::part(close-button){background-color:color(srgb 1 0.37 0.34);border-color:color(srgb 0.9 0.33 0.29);order:-1;--path-data: var(--clear-path-data);}x-titlebar::part(icon){fill:color(srgb 0 0 0);opacity:0}x-titlebar:hover::part(icon){opacity:0.5}x-titlebar x-label{font-weight:700}\n"
  },
  {
    "path": "src/renderer/public/xel/themes/fluent-dark.css",
    "content": ":root{width:100%;height:100%;margin:0;interpolate-size:allow-keywords;font-family:sans-serif;line-height:1.6}body{width:100vw;height:100%;margin:0;overflow-y:overlay}h1{margin:22px 0 16px;box-sizing:border-box;line-height:1;font-size:3.25rem;font-weight:700}h2{margin:18px 0 14px 0;box-sizing:border-box;line-height:1;font-size:2.125rem;font-weight:700}h3{margin:16px 0 12px 0;box-sizing:border-box;line-height:1.2;font-size:1.75rem;font-weight:700}h4{margin:14px 0 10px 0;box-sizing:border-box;line-height:1.1;font-size:1.5rem;font-weight:700}h5{margin:12px 0 8px 0;box-sizing:border-box;line-height:1.1;font-size:1.25rem;font-weight:700}h6{margin:8px 0 5px 0;box-sizing:border-box;line-height:1.1;font-size:1rem;font-weight:700}h1 em, h2 em, h3 em, h4 em, h5 em, h6 em{font-weight:inherit}h1 strong, h2 strong, h3 strong, h4 strong, h5 strong, h6 strong{font-weight:900}p{margin:16px 0}p:last-child{margin-bottom:0}a{font-weight:500}table{width:100%;margin:16px 0;border-collapse:collapse;border-style:hidden;box-shadow:0 0 0 1px var(--border-color)}th{text-align:start;padding:8px 14px;border-spacing:0}td{padding:8px 14px;border-spacing:0}em{font-weight:500}pre, code, var{font-size:0.875rem;font-style:normal;padding:0 4px}pre{margin:14px 0;padding:4px 6px;white-space:pre-wrap;box-sizing:border-box}pre > code{display:block;padding:0;box-sizing:border-box;background-color:transparent;outline-width:0px;line-height:1.3}hr{width:100%;height:1px;min-height:1px;margin:24px 0;box-sizing:border-box;border:none}blockquote{box-sizing:border-box;margin:16px 0;padding:5px 14px;border-left-width:8px;border-left-style:solid}blockquote > blockquote{margin:6px 0}blockquote > p:first-child{margin-top:0}ul, ol{margin:12px 0;padding:0}p + ul{margin:-10px 0 0 0}li > ul, li > ol{margin:0}li{position:relative;margin:0;padding:0}ul li{margin-left:20px}ol li{margin-left:16px}li > p{margin:4px 0}ol > li::marker{font-weight:700}img{display:block;height:auto;margin:14px auto;max-width:100%;user-select:none;box-sizing:border-box;background:var(--checkboard-background);border-width:1px;border-style:solid;border-color:var(--border-color);-webkit-user-select:none;-webkit-user-modify:read-only}img:active{cursor:-webkit-grabbing}[popover]{color:var(--text-color);background-color:var(--foreground-color)}::-webkit-scrollbar{max-width:6px;max-height:6px}::-webkit-scrollbar-corner{display:none}@supports not selector(::-webkit-scrollbar){*{scrollbar-width:thin}}x-card:not(:defined){display:none}x-card > footer{padding:8px 16px;width:calc(100% + 40px);height:calc(100% + 20px);margin-left:-20px;margin-bottom:-16px;box-sizing:border-box;background:lightgrey}x-card > footer:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}x-card > footer:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}x-card > h1:first-child{margin-top:0}x-card > h2:first-child{margin-top:0}x-card > h3:first-child{margin-top:0}x-card > h4:first-child{margin-top:0}x-card > h5:first-child{margin-top:0}x-card > h6:first-child{margin-top:0}x-avatar[size=\"small\"]{width:28px;height:28px}x-avatar[size=\"large\"]{width:54px;height:54px}x-avatar > img{width:100%;height:100%;-webkit-user-drag:none}x-avatar > x-icon{width:55%;height:55%}x-avatar > x-label{font-size:1rem;pointer-events:none}x-avatar[size=\"small\"] > x-label{font-size:0.75rem}x-avatar[size=\"large\"] > x-label{font-size:1.5rem}x-accordion:not(:defined){display:none}x-accordion[size=\"small\"]::part(arrow){width:14px;height:14px}x-accordion[size=\"large\"]::part(arrow){width:18px;height:18px}x-accordion > header{display:flex;align-items:center;box-sizing:border-box;width:100%;padding:7px 0 7px 20px}x-accordion[size=\"small\"] > header{padding-left:18px}x-accordion[size=\"large\"] > header{padding-left:22px}x-accordion > header > x-label:first-child{flex:1}x-accordion > header > *:not(:last-child){margin-right:20px}x-accordion:not([expanded]):not([animating]) > *:not(header){display:none!important}x-icon[size=\"small\"]{width:15px;height:15px}x-icon[size=\"large\"]{width:21px;height:21px}x-icon:not(:defined){display:none}x-label:not(:defined){display:none}x-shortcut:not(:defined){display:none}x-stepper:not(:defined){display:none}x-swatch[size=\"small\"]{width:16px;height:16px}x-swatch[size=\"large\"]{width:20px;height:20px}x-swatch:not(:defined){display:none}x-button{--min-pressed-time: 150ms;}@media (pointer:coarse){x-button{--min-pressed-time: 600ms;}}a:has(x-button){text-decoration:none}x-button[toggled]{z-index:1}x-button[condensed]{padding:2px 7px}x-button[size=\"small\"]{min-height:24px}x-button[size=\"large\"]{min-height:38px}x-buttons[vertical] > x-button{width:100%;justify-content:flex-start}x-button:not(:defined){display:none}x-button > x-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;text-align:center;min-width:1px;pointer-events:none}x-button > x-label ~ x-icon, x-button > x-icon ~ x-label{margin:0 0 0 6px}x-button > x-menu{font-size:0.875rem}x-button[skin=\"normal\"][size=\"small\"] > x-icon{width:14px;height:14px}x-button[skin=\"normal\"][size=\"large\"] > x-icon{width:20px;height:20px}x-button[skin=\"flat\"]{padding:0}x-buttons:not([vertical]) > x-button[skin=\"flat\"]:not(:first-of-type){margin-left:10px}x-buttons:not([vertical]) > x-button[skin=\"flat\"][size=\"small\"]:not(:first-of-type){margin-left:5px}x-buttons[vertical] > x-button[skin=\"flat\"]:not(:first-of-type){margin-top:10px}x-buttons[vertical] > x-button[skin=\"flat\"][size=\"small\"]:not(:first-of-type){margin-top:5px}x-button[skin=\"flat\"] > x-icon{width:26px;height:26px}x-button[skin=\"flat\"][size=\"small\"] > x-icon{width:22px;height:22px}x-button[skin=\"flat\"][size=\"large\"] > x-icon{width:28px;height:28px}x-button[skin=\"recessed\"]{min-height:18px;padding:4px 8px}x-button[skin=\"recessed\"][size=\"small\"]{padding:3px 8px}x-button[skin=\"recessed\"][size=\"large\"]{padding:5px 8px}x-buttons:not([vertical]) > x-button[skin=\"recessed\"] + x-button[skin=\"recessed\"]{margin-left:4px}x-buttons[vertical] > x-button[skin=\"recessed\"] + x-button[skin=\"recessed\"]{margin-top:4px}x-button[skin=\"recessed\"] > x-icon{width:16px;height:16px}x-button[skin=\"recessed\"][size=\"small\"] > x-icon{width:12px;height:12px}x-button[skin=\"recessed\"][size=\"large\"] > x-icon{width:20px;height:20px}x-button[skin=\"dock\"], x-buttons[vertical] > x-button[skin=\"dock\"]{width:38px;height:38px;min-height:38px;padding:0;justify-content:center}x-button[skin=\"dock\"][size=\"small\"], x-buttons[vertical] > x-button[skin=\"dock\"][size=\"small\"]{width:30px;height:30px;min-height:30px}x-button[skin=\"dock\"][size=\"large\"], x-buttons[vertical] > x-button[skin=\"dock\"][size=\"large\"]{width:45px;height:45px;min-height:45px}x-buttons:not([vertical]) > x-button[skin=\"dock\"] + x-button[skin=\"dock\"]{margin-left:-1px}x-buttons[vertical] > x-button[skin=\"dock\"] + x-button[skin=\"dock\"]{margin-top:-1px}x-button[skin=\"dock\"] > x-icon{width:17px;height:17px}x-button[skin=\"dock\"][size=\"small\"] > x-icon{width:14px;height:14px}x-button[skin=\"dock\"][size=\"large\"] > x-icon{width:20px;height:20px}x-buttons[vertical]{flex-flow:column;align-items:flex-start;justify-content:center}x-buttons:not(:defined){display:none}x-tag[size=\"small\"]{height:18px}x-tag[size=\"large\"]{height:30px}x-tag:not(:defined){display:none}x-tag > x-swatch{width:14px;height:14px}x-tag[size=\"small\"] > x-swatch{width:12px;height:12px}x-tag[size=\"large\"] > x-swatch{width:16px;height:16px}x-tag > x-label{font-size:0.75rem}x-tag :not(x-label) + x-label{margin-left:0.25rem}x-tag[size=\"small\"] > x-label{font-size:0.6875rem}x-tag > x-icon{width:15px;height:15px}x-tags{margin-top:-2px;margin-left:-2px}x-tags:not(:defined){display:none}x-tags x-tag{margin:2px}x-tagsinput[size=\"small\"]{padding:0px;gap:0px}x-tagsinput[size=\"small\"] > x-tag{height:22px;transform:scale(0.92)}x-tagsinput[size=\"large\"]{padding:6px;gap:6px}x-tagsinput:focus-within{z-index:10}x-tagsinput:not(:defined){display:none}x-tagsinput > x-label{position:absolute;top:50%;left:8px;transform:translateY(-50%);pointer-events:none}x-tagsinput[size=\"small\"][error]::before{top:27px}x-tagsinput[size=\"large\"][error]::before{top:41px}x-tab[size=\"small\"]{min-height:24px}x-tab[size=\"large\"]{min-height:38px}x-tab:not(:defined){display:none}x-tab x-icon{width:17px;height:17px;min-width:17px;color:inherit}x-tab[size=\"small\"] x-icon{width:15px;height:15px;min-width:15px}x-tab[size=\"large\"] x-icon{width:19px;height:19px;min-width:19px}x-tab x-label{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;line-height:1.2;cursor:inherit;flex:1}x-tab x-icon + x-label{margin-left:6px}x-tab x-box:is([vertical]) x-icon + x-label{margin-left:0px}x-tabs:not(:defined){display:none}x-menu:not(:defined){display:none}x-menu:has(x-menu[opened]){overflow:-webkit-paged-x}x-menu img{margin:0;background:none;border:none}x-menu hr{width:100%;height:1px;margin:4px 0px;box-sizing:border-box}x-menu hr + hr, x-menu hr:last-child{display:none}x-menuitem[size=\"small\"]{min-height:24px}x-menuitem[size=\"large\"]{min-height:38px}x-menuitem:not(:defined){display:none}x-menuitem[highlighted]{color:white;background:var(--accent-color)}x-menuitem img{width:16px;height:16px}x-menuitem x-icon{width:16px;height:16px}x-menuitem x-label{display:block;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:inherit;line-height:1.4}x-menuitem img + x-label, x-menuitem x-swatch + x-label, x-menuitem x-icon + x-label{margin-left:8px}x-menuitem x-shortcut{margin-left:auto}x-menuitem x-label + x-shortcut{margin-left:8px}x-menubar[size=\"small\"]{height:30px}x-menubar[size=\"large\"]{height:42px}x-menubar:not(:defined){display:none}x-menubar > x-menuitem{height:100%;padding:0 11px;min-height:0}x-menubar > x-menuitem[autohidden]{display:none}x-navitem + x-navitem, a:has(x-navitem) + a:has(x-navitem), a:has(x-navitem) + x-navitem, x-navitem + a:has(x-navitem){margin:3px 0}x-nav x-nav > *:first-child{margin-top:3px}x-nav x-nav > *:last-child{margin-bottom:0}x-nav x-nav > *{margin-left:34px!important}x-nav x-nav > *{max-width:calc(100% - 34px)!important}x-nav > a{display:block;text-decoration:none}x-nav x-label{max-width:100%;flex:1 1 0%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:500;font-size:0.9375rem;text-align:start}x-nav x-icon + x-label{margin-left:14px}x-nav[collapsed] x-navitem > x-label{display:none}x-nav x-icon{width:20px;height:20px}x-nav x-label + x-icon{width:18px;height:18px;margin:0 0 0 10px}x-nav[collapsed] x-navitem > x-label + x-icon{display:none}x-nav[collapsed] x-navitem::part(button){padding:0}x-nav[collapsed] x-navitem::part(arrow){display:none}x-contextmenu:not(:defined){display:none}dialog{overflow:hidden;position:fixed;min-width:200px;min-height:100px;max-height:none;margin:auto;padding:20px 24px;box-sizing:border-box;font-size:0.8125rem;line-height:1.6}dialog:focus{outline:none}dialog:not(:defined){display:none}dialog > footer{display:flex;flex-flow:row;justify-content:flex-end;padding:12px 24px;width:calc(100% + 48px);height:calc(100% + 22px);margin-top:10px;margin-left:-24px;margin-bottom:-20px;box-sizing:border-box;background:lightgrey}dialog > footer:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}dialog > footer:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}dialog > footer x-button + x-button{margin-left:8px}dialog h3{font-size:1.125rem;font-weight:700}dialog > *:first-child{margin-top:0}x-popover{padding:12px;overflow:auto}x-popover:has(footer){overflow:hidden}x-popover:not(:defined){display:none}x-popover > footer{padding:12px;width:calc(100% + 24px);height:calc(100% + 12px);margin-left:-12px;margin-bottom:-12px;margin-top:12px;box-sizing:border-box;background:lightgrey}x-popover > footer:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}x-popover > footer:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}x-notification[size=\"small\"]{padding:3px 12px}x-notification[size=\"large\"]{padding:8px 12px}x-notification:not(:defined){display:none}x-notification > p{margin:0}x-checkbox:not(:defined){display:none}x-checkbox + x-checkbox{margin-top:6px}x-checkbox[size=\"small\"]::part(indicator){width:17px;height:17px}x-checkbox[size=\"large\"]::part(indicator){width:21px;height:21px}x-checkbox > x-label{display:block;margin-left:8px;padding:1px 0}x-radio + x-radio{margin-top:6px}x-radio:not(:defined){display:none}x-radio[size=\"small\"]::part(indicator){width:17px;height:17px}x-radio[size=\"large\"]::part(indicator){width:21px;height:21px}x-radio > x-label{margin:0 0 0 8px;padding:1px 0}x-radio[size=\"small\"] > x-label{margin-left:6px}x-radio[size=\"large\"] > x-label{margin-left:10px}x-radios:not(:defined){display:none}x-switch + x-switch{margin-top:12px}x-switch:not(:defined){display:none}x-switch[size=\"large\"]::part(indicator){width:42px;height:20px}x-switch[size=\"small\"]::part(indicator){width:28px;height:12px}x-switch > x-label{margin:0 0 0 8px;padding:1px 0}x-switch[size=\"small\"] > x-label{margin-left:6px}x-switch[size=\"large\"] > x-label{margin-left:10px}x-select[size=\"small\"]{height:24px}x-select[size=\"large\"]{height:38px}x-select:not(:defined){display:none}x-colorselect[size=\"small\"]{width:24px;height:24px}x-colorselect[size=\"large\"]{width:38px;height:38px}x-colorselect:not(:defined){display:none}x-input[size=\"small\"]{height:24px}x-input[size=\"large\"]{height:38px}x-input:not(:defined){display:none}x-input + x-input{margin-top:20px}x-input > x-icon{width:15px;height:15px;min-width:15px;margin:0 0 0 8px}x-input[size=\"small\"] > x-icon{transform:scale(0.8)}x-input[size=\"large\"] > x-icon{transform:scale(1.1)}x-input > x-icon:hover{cursor:default}x-input > x-label{display:none;position:absolute;top:50%;max-width:100%;padding:0 5px 0 5px;transform:translateY(-50%);font-family:inherit;font-size:inherit;line-height:inherit;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;pointer-events:none}x-input[empty] > x-label{display:block}x-input > x-icon + x-label{padding:0 5px 0 29px}x-numberinput[size=\"small\"]{height:24px}x-numberinput[size=\"large\"]{height:38px}x-numberinput:focus{z-index:10}x-numberinput:not(:defined){display:none}x-numberinput > x-label{display:none;position:absolute;top:50%;max-width:100%;padding:0 5px 0 5px;transform:translateY(-50%);font-family:inherit;font-size:inherit;line-height:inherit;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;pointer-events:none}x-numberinput[empty] > x-label{display:block}x-numberinput[size=\"small\"][error]::before{top:27px}x-numberinput[size=\"large\"][error]::before{top:41px}x-texteditor:focus{z-index:10}x-texteditor:not(:defined){display:none}x-texteditor > x-label{display:none;position:absolute;width:100%;top:0;left:0;padding:2px 6px;font-family:inherit;font-size:inherit;line-height:inherit;pointer-events:none}x-texteditor[empty] > x-label{display:block}x-slider:not(:defined){display:none}x-colorpicker:not(:defined){display:none}x-progressbar[size=\"small\"]{height:6px}x-progressbar[size=\"large\"]{height:10px}x-progressbar:not(:defined){display:none}x-throbber[size=\"small\"]{width:26px;height:26px}x-throbber[size=\"large\"]{width:34px;height:34px}x-throbber:not(:defined){display:none}x-titlebar x-icon + x-label{margin-left:6px}:root{color:var(--text-color);background-color:var(--background-color);font-family:\"Segoe UI\", \"SegoeUI\", system-ui, sans-serif;--theme-id:                   \"fluent-dark\";--preset-accent-colors:       blue     color(srgb 0.30 0.76 1.00),\n                                purple   color(srgb 0.85 0.36 0.90),\n                                pink     color(srgb 1.00 0.31 0.80),\n                                red      color(srgb 0.96 0.40 0.38),\n                                orange   color(srgb 0.98 0.61 0.26),\n                                yellow   color(srgb 1.00 0.84 0.16),\n                                green    color(srgb 0.27 0.90 0.20),\n                                gray     color(srgb 0.74 0.73 0.72);--accent-color:               color(srgb 0.30 0.76 1.00);--background-color:           color(srgb 0.12 0.12 0.12);--foreground-color:           color(srgb 0.18 0.18 0.18);--border-color:               color(srgb 0.22 0.22 0.22);--text-color:                 color(srgb 1 1 1 / 0.9);--error-color:                color(srgb 1 0.6 0.64);--selection-color:            color(srgb 1 1 1);--selection-background-color: oklch(from var(--accent-color) calc(l - 0.2) c h);--autofill-background-color:  color(srgb 0.99 0.88 0 / 0.35);--titlebar-color:             auto;--autocapitalize:             none;--checkboard-background:      linear-gradient( 45deg, #5b5b5b 25%, #0000   25%)  0px  0px / 10px 10px,\n                                linear-gradient(-45deg, #5b5b5b 25%, #0000   25%)  0px  5px / 10px 10px,\n                                linear-gradient( 45deg, #0000   75%, #5b5b5b 75%)  5px -5px / 10px 10px,\n                                linear-gradient(-45deg, #0000   75%, #5b5b5b 75%) -5px  0px / 10px 10px, #919191;--arrow-left-path-data: M 68.75 79.17 C 68.75 78 68.33 77 67.5 76.25 L 41.25 50 L 67.5 23.75 C 68.33 23 68.75 22 68.75 20.84 C 68.75 19.75 68.33 18.75 67.5 17.92 C 66.75 17.09 65.75 16.67 64.58 16.67 C 63.42 16.67 62.42 17.09 61.67 17.84 L 32.42 47.09 C 31.58 47.92 31.25 48.84 31.25 50 C 31.25 51.17 31.58 52.09 32.42 52.92 L 61.67 82.17 C 62.42 82.92 63.42 83.34 64.58 83.34 C 65.75 83.34 66.75 82.92 67.5 82.17 C 68.33 81.25 68.75 80.34 68.75 79.17 Z;--arrow-right-path-data: M 31.25 79.17 C 31.25 78 31.67 77 32.5 76.25 L 58.75 50 L 32.5 23.75 C 31.67 23 31.25 22 31.25 20.84 C 31.25 19.75 31.67 18.75 32.5 17.92 C 33.25 17.09 34.25 16.67 35.42 16.67 C 36.58 16.67 37.58 17.09 38.33 17.84 L 67.58 47.09 C 68.42 47.92 68.75 48.84 68.75 50 C 68.75 51.17 68.42 52.09 67.58 52.92 L 38.33 82.17 C 37.58 82.92 36.58 83.34 35.42 83.34 C 34.25 83.34 33.25 82.92 32.5 82.17 C 31.67 81.25 31.25 80.34 31.25 79.17 Z;--arrow-down-path-data: M 20.83 31.25 C 22 31.25 23 31.67 23.75 32.5 L 50 58.75 L 76.25 32.5 C 77 31.67 78 31.25 79.16 31.25 C 80.25 31.25 81.25 31.67 82.08 32.5 C 82.91 33.25 83.33 34.25 83.33 35.42 C 83.33 36.58 82.91 37.58 82.16 38.33 L 52.91 67.58 C 52.08 68.42 51.16 68.75 50 68.75 C 48.83 68.75 47.91 68.42 47.08 67.58 L 17.83 38.33 C 17.08 37.58 16.66 36.58 16.66 35.42 C 16.66 34.25 17.08 33.25 17.83 32.5 C 18.75 31.67 19.66 31.25 20.83 31.25 Z;--arrow-up-path-data: M 20.83 68.75 C 22 68.75 23 68.33 23.75 67.5 L 50 41.25 L 76.25 67.5 C 77 68.33 78 68.75 79.16 68.75 C 80.25 68.75 81.25 68.33 82.08 67.5 C 82.91 66.75 83.33 65.75 83.33 64.58 C 83.33 63.42 82.91 62.42 82.16 61.67 L 52.91 32.42 C 52.08 31.58 51.16 31.25 50 31.25 C 48.83 31.25 47.91 31.58 47.08 32.42 L 17.83 61.67 C 17.08 62.42 16.66 63.42 16.66 64.58 C 16.66 65.75 17.08 66.75 17.83 67.5 C 18.75 68.33 19.66 68.75 20.83 68.75 Z;--double-arrow-left-path-data: M 81.24 79.17 C 81.24 78 80.82 77 79.99 76.25 L 53.74 50 L 79.99 23.75 C 80.82 23 81.24 22 81.24 20.84 C 81.24 19.75 80.82 18.75 79.99 17.92 C 79.24 17.09 78.24 16.67 77.07 16.67 C 75.91 16.67 74.91 17.09 74.16 17.84 L 44.91 47.09 C 44.07 47.92 43.74 48.84 43.74 50 C 43.74 51.17 44.07 52.09 44.91 52.92 L 74.16 82.17 C 74.91 82.92 75.91 83.34 77.07 83.34 C 78.24 83.34 79.24 82.92 79.99 82.17 C 80.82 81.25 81.24 80.34 81.24 79.17 Z M 56.26 79.17 C 56.26 78 55.84 77 55.01 76.25 L 28.76 50 L 55.01 23.75 C 55.84 23 56.26 22 56.26 20.84 C 56.26 19.75 55.84 18.75 55.01 17.92 C 54.26 17.09 53.26 16.67 52.09 16.67 C 50.93 16.67 49.93 17.09 49.18 17.84 L 19.93 47.09 C 19.09 47.92 18.76 48.84 18.76 50 C 18.76 51.17 19.09 52.09 19.93 52.92 L 49.18 82.17 C 49.93 82.92 50.93 83.34 52.09 83.34 C 53.26 83.34 54.26 82.92 55.01 82.17 C 55.84 81.25 56.26 80.34 56.26 79.17 Z;--double-arrow-right-path-data: M 18.76 79.17 C 18.76 78 19.18 77 20.01 76.25 L 46.26 50 L 20.01 23.75 C 19.18 23 18.76 22 18.76 20.84 C 18.76 19.75 19.18 18.75 20.01 17.92 C 20.76 17.09 21.76 16.67 22.93 16.67 C 24.09 16.67 25.09 17.09 25.84 17.84 L 55.09 47.09 C 55.93 47.92 56.26 48.84 56.26 50 C 56.26 51.17 55.93 52.09 55.09 52.92 L 25.84 82.17 C 25.09 82.92 24.09 83.34 22.93 83.34 C 21.76 83.34 20.76 82.92 20.01 82.17 C 19.18 81.25 18.76 80.34 18.76 79.17 Z M 43.74 79.17 C 43.74 78 44.16 77 44.99 76.25 L 71.24 50 L 44.99 23.75 C 44.16 23 43.74 22 43.74 20.84 C 43.74 19.75 44.16 18.75 44.99 17.92 C 45.74 17.09 46.74 16.67 47.91 16.67 C 49.07 16.67 50.07 17.09 50.82 17.84 L 80.07 47.09 C 80.91 47.92 81.24 48.84 81.24 50 C 81.24 51.17 80.91 52.09 80.07 52.92 L 50.82 82.17 C 50.07 82.92 49.07 83.34 47.91 83.34 C 46.74 83.34 45.74 82.92 44.99 82.17 C 44.16 81.25 43.74 80.34 43.74 79.17 Z;--checkmark-path-data: M 15.51 49.52 C 15.51 48.35 15.93 47.35 16.76 46.6 C 17.59 45.77 18.51 45.35 19.68 45.35 C 20.84 45.35 21.76 45.77 22.59 46.6 L 39.73 64.13 L 77.41 27.04 C 78.24 26.21 79.16 25.79 80.33 25.79 C 80.91 25.79 81.41 25.87 81.91 26.12 C 82.49 26.29 82.91 26.62 83.24 27.04 C 83.66 27.37 83.91 27.79 84.16 28.29 C 84.41 28.79 84.49 29.37 84.49 29.96 C 84.49 31.04 84.08 32.04 83.24 32.87 L 42.64 72.96 C 41.81 73.8 40.89 74.21 39.73 74.21 C 38.56 74.21 37.64 73.8 36.81 72.96 L 16.76 52.43 C 15.93 51.68 15.51 50.68 15.51 49.52 Z;--mixed-checkmark-path-data: M 25.22 53.98 C 24.66 53.98 24.11 53.89 23.62 53.67 C 23.15 53.5 22.76 53.17 22.35 52.86 C 22.05 52.47 21.72 52.07 21.47 51.6 C 21.33 51.12 21.17 50.56 21.17 50 C 21.17 49.44 21.33 48.97 21.47 48.48 C 21.72 48.01 22.05 47.53 22.35 47.21 C 22.76 46.83 23.15 46.57 23.62 46.33 C 24.11 46.18 24.66 46.02 25.22 46.02 L 74.77 46.02 C 75.33 46.02 75.88 46.18 76.37 46.33 C 76.84 46.57 77.23 46.83 77.55 47.21 C 77.94 47.53 78.27 48.01 78.52 48.48 C 78.66 48.97 78.82 49.44 78.82 50 C 78.82 50.56 78.66 51.12 78.52 51.6 C 78.27 52.07 77.94 52.47 77.55 52.86 C 77.23 53.17 76.84 53.5 76.37 53.67 C 75.88 53.89 75.33 53.98 74.77 53.98 L 25.22 53.98 Z;--clear-path-data: M 50 55.57 L 25.59 79.97 C 24.82 80.75 23.87 81.14 22.8 81.14 C 21.71 81.14 20.78 80.75 20.07 79.97 C 19.3 79.19 18.91 78.34 18.91 77.18 C 18.91 76.16 19.3 75.23 20.07 74.45 L 44.48 50.05 L 20.07 25.56 C 19.3 24.78 18.91 23.85 18.91 22.76 C 18.91 22.23 18.98 21.76 19.21 21.28 C 19.45 20.82 19.69 20.36 20.07 20.04 C 20.39 19.65 20.85 19.41 21.32 19.26 C 21.79 19.02 22.26 18.87 22.8 18.87 C 23.87 18.87 24.82 19.26 25.59 20.04 L 50 44.53 L 74.49 20.04 C 75.27 19.26 76.13 18.87 77.2 18.87 C 78.29 18.87 79.22 19.26 80 20.04 C 80.79 20.82 81.09 21.76 81.09 22.83 C 81.09 23.92 80.79 24.78 80 25.56 L 55.52 50.05 L 80 74.45 C 80.79 75.23 81.09 76.16 81.09 77.25 C 81.09 77.78 81.02 78.34 80.79 78.8 C 80.62 79.27 80.31 79.65 79.93 80.04 C 79.61 80.36 79.22 80.66 78.68 80.83 C 78.29 81.05 77.74 81.14 77.2 81.14 C 76.13 81.14 75.27 80.75 74.49 79.97 L 50 55.57 Z;--minimize-path-data: M 15 46 L 85 46 L 85 54 L 15 54 L 15 46 Z;--maximize-path-data: M 27 16 L 74 16 C 79 16 85 21 85 27 L 85 73 C 85 79 79 85 74 85 L 27 85 C 21 85 16 79 16 73 L 16 27 C 16 21 21 16 27 16 Z M 27 24 C 25 24 24 25 24 27 L 24 73 C 24 76 25 77 27 77 L 74 77 C 76 77 77 76 77 73 L 77 27 C 77 25 76 24 74 24 L 27 24 Z;--restore-path-data: M 27 32 L 58 32 C 63 32 69 37 69 43 L 69 73 C 69 79 63 85 58 85 L 27 85 C 21 85 16 79 16 73 L 16 43 C 16 37 21 32 27 32 Z M 27 40 C 25 40 24 41 24 43 L 24 73 C 24 76 25 77 27 77 L 58 77 C 60 77 61 76 61 73 L 61 43 C 61 41 60 40 58 40 Z M 80 64.83 C 80 68.15 77.43 70.88 74.15 71.14 L 74.15 35.63 C 74.15 31.33 68.67 25.85 64.37 25.85 L 28.86 25.85 C 29.12 22.57 31.85 20 35.17 20 L 66.8 20 C 72.98 20 80 27.02 80 33.2 Z;}h1, h2, h3, h4, h5, h6{color:var(--text-color)}a{color:oklch(from var(--accent-color) calc(l + 0.15) c h);text-decoration:underline}a:hover{color:var(--accent-color);text-decoration:none}a:active{color:oklch(from var(--accent-color) calc(l + 0.1) c h)}a:focus{border-radius:2px;outline-width:2px;outline-style:solid;outline-color:color(srgb 1 1 1);outline-offset:2px}pre, code, var{background-color:color(srgb 1 1 1 / 0.0605);border-radius:4px;outline-width:1px;outline-style:solid;outline-color:var(--border-color);font-family:\"Consolas\", ui-monospace, monospace;font-weight:500}blockquote{color:color(srgb 1 1 1 / 0.7);border-color:var(--accent-color)}mark, ::highlight(mark){color:color(srgb 0 0 0);background-color:color(srgb 1 0.84 0.18)}hr{background-color:var(--border-color)}table{border-radius:2px;box-shadow:0 0 0 1px color(srgb 1 1 1 / 0.12)}th, td{border-width:1px;border-style:solid;border-color:color(srgb 1 1 1 / 0.12)}img{border-color:var(--border-color)}::selection{color:var(--selection-color);background-color:var(--selection-background-color)}::-webkit-scrollbar{background-color:transparent}::-webkit-scrollbar-thumb{border-radius:10px}::-webkit-scrollbar-thumb:vertical{background-image:linear-gradient( 90deg, transparent 0%, transparent 30%, color(srgb 0.62 0.62 0.62) 30%, color(srgb 0.62 0.62 0.62) 70%, transparent 70%, transparent 100% )}::-webkit-scrollbar-thumb:horizontal{background-image:linear-gradient( 0deg, transparent 0%, transparent 30%, color(srgb 0.62 0.62 0.62) 30%, color(srgb 0.62 0.62 0.62) 70%, transparent 70%, transparent 100% )}::-webkit-scrollbar-thumb:hover{background-color:color(srgb 0.62 0.62 0.62)}@supports not selector(::-webkit-scrollbar){*{scrollbar-color:color(srgb 0.62 0.62 0.62) transparent}}x-avatar{color:color(srgb 1 1 1 / 0.786);background-color:color(srgb 1 1 1 / 0.1);border-width:0px;border-radius:999px}x-avatar > x-label{font-weight:500}x-card{background-color:var(--foreground-color);border-width:1px;border-style:solid;border-color:var(--border-color);border-radius:4px}x-card > footer{background-color:var(--background-color);border-top-width:1px;border-top-style:solid;border-top-color:var(--border-color)}x-accordion::part(arrow){color:color(srgb 1 1 1 / 0.8);--path-data: var(--arrow-right-path-data);}x-accordion::part(arrow):focus{border-radius:2px;outline-width:2px;outline-style:solid;outline-color:color(srgb 1 1 1)}x-accordion > header > x-label{font-weight:500}x-tooltip{color:var(--text-color);background-color:color(srgb 0.17 0.17 0.17);border-color:var(--border-color);border-radius:4px;box-shadow:0 4px 8px color(srgb 0 0 0 / 0.26)}x-stepper{width:40px;height:70px;padding:5px;color:color(srgb 1 1 1 / 0.786);background-color:color(srgb 0.17 0.18 0.18);border-width:1px;border-style:solid;border-color:var(--border-color);border-radius:7px}x-stepper::part(increment-button), x-stepper::part(decrement-button){border-radius:3px}x-stepper::part(increment-button):hover, x-stepper::part(decrement-button):hover{background-color:color(srgb 1 1 1 / 0.0837)}x-stepper[pressed=\"increment\"]::part(increment-button), x-stepper[pressed=\"decrement\"]::part(decrement-button){color:inherit;background-color:color(srgb 1 1 1 / 0.0326)}x-stepper::part(increment-arrow), x-stepper::part(decrement-arrow){width:18px;height:18px}x-stepper::part(increment-arrow){--path-data: var(--arrow-up-path-data);}x-stepper::part(decrement-arrow){--path-data: var(--arrow-down-path-data);}x-swatch{border-color:var(--border-color);border-radius:4px}x-button:focus{outline-width:2px;outline-style:solid;outline-color:color(srgb 1 1 1);outline-offset:2px}x-button[mixed]{opacity:0.7}x-button[disabled]{opacity:0.4}x-button[skin=\"normal\"]{color:var(--text-color);background-color:color(srgb 1 1 1 / 0.0605);border-width:1px;border-style:solid;border-color:var(--border-color);border-radius:4px}x-button[skin=\"normal\"]:hover{background-color:color(srgb 1 1 1 / 0.0837)}x-button[skin=\"normal\"][pressed]{color:color(srgb 1 1 1 / 0.786);background-color:color(srgb 1 1 1 / 0.0326)}x-button[skin=\"normal\"][toggled]{color:color(srgb 0 0 0);background-color:var(--accent-color);border-color:transparent}x-button[skin=\"normal\"][toggled]:hover{background-color:oklch(from var(--accent-color) l c h / 90%)}x-button[skin=\"normal\"][toggled][pressed]{color:color(srgb 0 0 0 / 0.5);background-color:oklch(from var(--accent-color) l c h / 80%)}x-buttons > x-button[skin=\"normal\"][toggled]:hover{background-color:var(--accent-color)}x-buttons > x-button[skin=\"normal\"][toggled][pressed]{background-color:oklch(from var(--accent-color) l c h / 80%)}x-buttons:not([vertical]) > x-button[skin=\"normal\"]:not(:first-of-type){border-top-left-radius:0;border-bottom-left-radius:0}x-buttons:not([vertical]) > x-button[skin=\"normal\"]:not(:last-of-type){border-right:none;border-top-right-radius:0;border-bottom-right-radius:0}x-buttons:not([vertical]) > x-button[skin=\"normal\"][toggled] + x-button[skin=\"normal\"]{border-left-color:transparent}x-buttons[vertical] > x-button[skin=\"normal\"]:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}x-buttons[vertical] > x-button[skin=\"normal\"]:not(:last-of-type){border-bottom-width:0;border-bottom-left-radius:0;border-bottom-right-radius:0}x-buttons[vertical] > x-button[skin=\"normal\"][toggled] + x-button[skin=\"normal\"]{border-top-color:transparent}x-button[skin=\"flat\"][pressed]{color:color(srgb 1 1 1 / 0.786)}x-button[skin=\"flat\"][toggled]{color:var(--accent-color)}x-button[skin=\"flat\"][toggled][pressed]{color:oklch(from var(--accent-color) l c h / 80%)}x-button[skin=\"recessed\"]{color:color(srgb 1 1 1 / 0.8);border-radius:4px}x-button[skin=\"recessed\"][disabled]{opacity:0.3}x-button[skin=\"recessed\"]:hover{background-color:color(srgb 1 1 1 / 0.2)}x-button[skin=\"recessed\"][toggled]{color:color(srgb 0 0 0 / 0.95);background-color:color(srgb 1 1 1 / 0.8)}x-button[skin=\"recessed\"][toggled]:hover{background-color:color(srgb 1 1 1 / 0.9)}x-button[skin=\"recessed\"][pressed],x-button[skin=\"recessed\"][toggled][pressed]{color:color(srgb 0 0 0);background-color:color(srgb 1 1 1)}x-button[skin=\"recessed\"] > x-label{font-size:0.75rem;font-weight:700;text-align:center}x-button[skin=\"dock\"]{color:var(--text-color);background-color:color(srgb 1 1 1 / 0.0605);border-width:1px;border-style:solid;border-color:var(--border-color)}x-button[skin=\"dock\"]:hover{background-color:color(srgb 1 1 1 / 0.0837)}x-button[skin=\"dock\"][pressed]{color:color(srgb 1 1 1 / 0.786);background-color:color(srgb 1 1 1 / 0.0326)}x-button[skin=\"dock\"][toggled]{color:color(srgb 0 0 0);background-color:var(--accent-color);border-color:var(--accent-color);z-index:1}x-button[skin=\"dock\"][toggled][pressed]{color:color(srgb 0 0 0 / 0.5);background-color:oklch(from var(--accent-color) l c h / 80%);border-color:transparent}x-button[skin=\"dock\"]:focus{outline-offset:-2px}x-tag{background-color:color(srgb 1 1 1 / 0.0605);border-color:transparent;border-radius:99px}x-tag:hover{background-color:color(srgb 1 1 1 / 0.0837)}x-tag:active{filter:brightness(0.8)}x-tag:focus{outline-width:2px;outline-style:solid;outline-color:color(srgb 1 1 1);outline-offset:2px}x-tag[toggled]{color:color(srgb 0 0 0);background-color:var(--accent-color);border-color:transparent}x-tag[toggled]:hover{filter:brightness(0.99)}x-tag[toggled]:active{filter:brightness(0.8)}x-tag::part(remove-button){--path-data: var(--clear-path-data);}x-tag::part(remove-button):hover{color:color(srgb 0 0 0)}x-tag::part(scope){background-color:var(--foreground-color);border-color:var(--border-color)}x-tag[scoped]::part(main){background-color:var(--background-color)}x-tagsinput{background-color:color(srgb 1 1 1 / 0.0605);border-color:var(--border-color);border-width:1px;border-style:solid;border-radius:3px}x-tagsinput:hover{background-color:color(srgb 1 1 1 / 0.0737)}x-tagsinput:focus{background-color:color(srgb 1 1 1 / 0)}x-tagsinput::before{position:absolute;bottom:-1px;left:0px;width:100%;height:1px;background-color:color(srgb 1 1 1 / 0.54);border-radius:0 0 4px 4px;content:\"\"}x-tagsinput:focus::before{height:2px;background-color:var(--accent-color)}x-tagsinput[error]::before{height:2px;background-color:var(--error-color)}x-tagsinput[disabled]::before{display:none}x-tagsinput > x-label{color:color(srgb 1 1 1 / 0.4)}x-tabs{background-color:color(srgb 1 1 1 / 0);border-radius:4px;box-shadow:0 0 0px 1px color(srgb 1 1 1 / 0.0698)}x-tab{border-radius:4px}x-tab:hover{background-color:color(srgb 1 1 1 / 0.0605)}x-tab:active{color:color(srgb 1 1 1 / 0.786);background-color:color(srgb 1 1 1 / 0.04019)}x-tab[toggled]{background-color:color(srgb 1 1 1 / 0.0605);box-shadow:0 0 0px 1px var(--border-color)}x-tab:focus{outline-width:2px;outline-style:solid;outline-color:color(srgb 1 1 1);outline-offset:2px}x-tab::before{position:absolute;width:0px;height:2px;bottom:0px;background-color:var(--accent-color);border-radius:99px;transition-property:width;transition-duration:0.187s;transition-timing-function:cubic-bezier(0.55, 0.55, 0, 1);content:\"\"}x-tab[toggled]::before{width:16px}x-tab[toggled]:active::before{width:12px}x-navitem:focus{outline-width:0}x-navitem::part(button){position:relative;color:color(srgb 1 1 1);border-radius:7px}x-navitem::part(button):hover{background-color:color(srgb 1 1 1 / 0.0605)}x-navitem[toggled]::part(button){background-color:color(srgb 1 1 1 / 0.0605)}x-navitem[pressed]::part(button){color:color(srgb 1 1 1 / 0.786);background-color:color(srgb 1 1 1/ 0.0326)}x-navitem:focus::part(button){outline-width:2px;outline-style:solid;outline-color:color(srgb 1 1 1);outline-offset:2px}x-navitem[disabled]{opacity:0.5}x-navitem::part(button)::before{position:absolute;left:0;width:3px;height:0px;background-color:var(--accent-color);border-radius:99px;transition-property:height;transition-duration:0.187s;transition-timing-function:cubic-bezier(0.55, 0.55, 0, 1);content:\"\"}x-navitem[toggled]::part(button)::before{height:50%}x-navitem[pressed]::part(button)::before{height:30%}x-navitem::part(arrow){color:color(srgb 1 1 1 / 0.786);transform:scale(1.2);--path-data: var(--arrow-right-path-data);}x-nav x-icon:first-child{opacity:0.9}x-nav x-label + x-icon{color:var(--accent-color)}x-menu{padding:4px;color:var(--text-color);background-color:var(--foreground-color);border-width:1px;border-style:solid;border-color:var(--border-color);border-radius:7px;box-shadow:0 8px 16px color(srgb 0 0 0 / 0.26);--open-transition: 100 transform cubic-bezier(0.4, 0, 0.2, 1);--close-transition: 200 opacity cubic-bezier(0.4, 0, 0.2, 1);}x-menuitem{color:var(--text-color);border-radius:4px;--trigger-effect: none;}x-menuitem:focus{background-color:color(srgb 1 1 1 / 0.0605)}x-menuitem[expanded]{background-color:color(srgb 1 1 1 / 0.0605)}x-menuitem[pressed]:active{background-color:color(srgb 1 1 1/ 0.0326)}x-menu x-menuitem + x-menuitem{margin-top:4px}x-menuitem::part(checkmark){--path-data: var(--checkmark-path-data);}x-menuitem::part(arrow){--path-data: var(--arrow-right-path-data);}x-menuitem x-shortcut{color:color(srgb 1 1 1 / 0.786);font-size:0.75rem}x-menubar > x-menuitem:hover{background-color:color(srgb 1 1 1 / 0.0605)}x-menubar > x-menuitem[highlighted]{color:color(srgb 0 0 0);background:var(--accent-color)}dialog{color:inherit;background-color:var(--foreground-color);border-width:1px;border-style:solid;border-color:color(srgb 1 1 1 / 0.09);border-radius:8px;box-shadow:0px 4.8px 14.4px color(srgb 0 0 0 / 0.18), 0px 25.6px 57.6px color(srgb 0 0 0 / 0.22);transition-duration:120ms;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);--transition-type: grow;}dialog::backdrop{background-color:color(srgb 0 0 0 / 0.3)}dialog > footer{background-color:var(--background-color);border-top-width:1px;border-top-style:solid;border-top-color:var(--border-color)}dialog > footer > x-button{flex:1}x-pager{--prev-path-data: var(--arrow-left-path-data);--next-path-data: var(--arrow-right-path-data);--first-path-data: var(--double-arrow-left-path-data);--last-path-data: var(--double-arrow-right-path-data);}x-pager::part(item){color:var(--text-color);background-color:color(srgb 1 1 1 / 0.0605);border-color:var(--border-color);border-radius:3px;font-weight:500}x-pager::part(item):hover{background-color:color(srgb 1 1 1 / 0.0837)}x-pager::part(item):active{color:color(srgb 1 1 1 / 0.786);background-color:color(srgb 1 1 1 / 0.0326)}x-pager::part(item):focus{outline-width:2px;outline-style:solid;outline-color:color(srgb 1 1 1);outline-offset:2px}x-pager::part(toggled-item){color:color(srgb 0 0 0);background-color:var(--accent-color);border-color:transparent}x-pager::part(toggled-item):hover{background-color:var(--accent-color)}x-pager::part(toggled-item):active{color:color(srgb 0 0 0 / 0.5);background-color:oklch(from var(--accent-color) l c h / 80%)}x-popover{color:var(--text-color);background-color:var(--foreground-color);border-width:1px;border-style:solid;border-color:color(srgb 0.46 0.46 0.46 / 0.4);border-radius:4px;box-shadow:0px 8px 16px color(srgb 0 0 0 / 0.26);--arrow-size: 14px;--open-transition: none;}x-popover > footer{background-color:var(--background-color);border-top-width:1px;border-top-style:solid;border-top-color:var(--border-color)}x-notification{color:color(srgb 1 1 1);background-color:var(--foreground-color);border-radius:4px;box-shadow:0 4px 8px color(srgb 0 0 0 / 0.14)}x-notification a{color:oklch(from var(--accent-color) calc(l + 0.15) c h)}x-notification a:hover{color:oklch(from var(--accent-color) calc(l + 0.15) c h)}x-notification a:active{color:oklch(from var(--accent-color) calc(l + 0.25) c h)}x-checkbox[disabled]{opacity:1}x-checkbox:focus{border-radius:2px;outline-width:2px;outline-style:solid;outline-color:color(srgb 1 1 1);outline-offset:2px}x-checkbox::part(indicator){color:color(srgb 1 1 1 / 0.6);background-color:color(srgb 0 0 0 / 0.1);border-width:1px;border-style:solid;border-color:color(srgb 1 1 1 / 0.6);border-radius:3px;--path-data: var(--checkmark-path-data);}x-checkbox[mixed]::part(indicator){--path-data: var(--mixed-checkmark-path-data);}x-checkbox:hover::part(indicator){background-color:color(srgb 1 1 1 / 0.0419)}x-checkbox:active::part(indicator){color:color(srgb 1 1 1 / 0.1581);background-color:color(srgb 1 1 1 / 0.0698);border-color:color(srgb 1 1 1 / 0.1581)}x-checkbox[disabled]::part(indicator){color:color(srgb 1 1 1 / 0.1581);border-color:color(srgb 1 1 1 / 0.1581);background-color:none}x-checkbox[toggled]::part(indicator){color:color(srgb 0 0 0);background-color:var(--accent-color);border-color:var(--accent-color)}x-checkbox[toggled]:hover::part(indicator){background-color:oklch(from var(--accent-color) l c h / 0.9);border-color:transparent}x-checkbox[toggled]:active::part(indicator){color:color(srgb 0 0 0 / 0.5);background-color:oklch(from var(--accent-color) l c h / 0.8);border-color:transparent}x-checkbox[toggled][disabled]::part(indicator){color:color(srgb 1 1 1 / 0.5302);background-color:color(srgb 1 1 1 / 0.1581);border-color:transparent}x-checkbox[disabled] > x-label{opacity:0.3;filter:saturate(0)}x-radio:focus{border-radius:2px;outline-width:2px;outline-style:solid;outline-color:color(srgb 1 1 1);outline-offset:2px}x-radio[disabled]{filter:saturate(0)}x-radio[disabled][toggled]{opacity:0.5}x-radio::part(indicator){background-color:color(srgb 0 0 0 / 0.01);border-color:color(srgb 1 1 1 / 0.6047);border-width:1px;border-style:solid}x-radio:hover::part(indicator){background-color:color(srgb 1 1 1 / 0.0419)}x-radio:active::part(indicator){background-color:color(srgb 1 1 1 / 0.0698);border-color:color(srgb 1 1 1 / 0.1581)}x-radio[toggled]::part(indicator){background-color:var(--accent-color);border-color:transparent}x-radio[toggled]:hover::part(indicator){background-color:oklch(from var(--accent-color) l c h / 0.9)}x-radio[toggled]:active::part(indicator){background-color:oklch(from var(--accent-color) l c h / 0.8)}x-radio::part(indicator-dot){transform:scale(0.45);background-color:color(srgb 0 0 0);outline-width:2px;outline-style:solid;outline-color:color(srgb 1 1 1 / 0.1);visibility:hidden}x-radio[toggled]::part(indicator-dot){visibility:visible;transition:transform 100ms cubic-bezier(0.1, 0.7, 1.0, 0.1)}x-radio[toggled]:active::part(indicator-dot){transform:scale(0.33)}x-radio[mixed]::part(indicator-dot){height:16%;transform:scale(0.5);border-radius:3px}x-radio[mixed]:active::part(indicator-dot){transform:scale(0.5)}x-switch:focus{border-radius:2px;outline-width:2px;outline-style:solid;outline-color:color(srgb 1 1 1);outline-offset:2px}x-switch[disabled]{opacity:0.5}x-switch::part(indicator){width:34px;height:15px}x-switch::part(indicator-thumb){width:12px;height:12px;left:10px;transform:translate(-50%);background-color:color(srgb 1 1 1 / 0.786);transition-property:left;transition-duration:0.187s;transition-timing-function:cubic-bezier(0.55, 0.55, 0, 1)}x-switch:active::part(indicator-thumb){width:16px;margin-left:2px}x-switch[toggled]::part(indicator-thumb){left:calc(100% - 10px);background-color:color(srgb 0 0 0)}x-switch[toggled]:active::part(indicator-thumb){margin-left:-2px}x-switch[mixed]::part(indicator-thumb){left:50%!important;margin-left:0}x-switch[toggled][disabled]::part(indicator-thumb){background-color:color(srgb 1 1 1 / 0.786)}x-switch[size=\"small\"]::part(indicator-thumb){width:8px;height:8px;left:8px}x-switch[size=\"small\"]:active::part(indicator-thumb){width:12px}x-switch[size=\"small\"][toggled]::part(indicator-thumb){left:calc(100% - 8px)}x-switch[size=\"large\"]::part(indicator-thumb){width:14px;height:14px;left:12px}x-switch[size=\"large\"]:active::part(indicator-thumb){width:18px}x-switch[size=\"large\"][toggled]::part(indicator-thumb){left:calc(100% - 12px)}x-switch::part(indicator-track){height:100%;background-color:color(srgb 0 0 0 / 0.1);border-color:color(srgb 1 1 1 / 0.6047);border-width:1px;border-style:solid;border-radius:999px}x-switch:hover::part(indicator-track){background-color:color(srgb 1 1 1 / 0.0419)}x-switch:active::part(indicator-track){background-color:color(srgb 1 1 1 / 0.0698);border-color:color(srgb 1 1 1 / 0.6047)}x-switch[toggled]::part(indicator-track){background-color:var(--accent-color);border-color:transparent}x-switch[toggled]:hover::part(indicator-track){background-color:oklch(from var(--accent-color) l c h / 0.9)}x-switch[toggled]:active::part(indicator-track){background-color:oklch(from var(--accent-color) l c h / 0.8)}x-switch[toggled][disabled]::part(indicator-track){background-color:color(srgb 1 1 1 / 0.1581)}x-select{background-color:color(srgb 1 1 1 / 0.0605);border-color:var(--border-color);border-width:1px;border-style:solid;border-radius:3px}x-select:hover{background-color:color(srgb 1 1 1 / 0.0837)}x-select:active{color:color(srgb 1 1 1 / 0.786);background-color:color(srgb 1 1 1/ 0.0326)}x-select:focus{outline-width:2px;outline-style:solid;outline-color:color(srgb 1 1 1);outline-offset:2px}x-select[disabled]{opacity:0.5}x-select::part(arrow){width:16px;height:16px;margin:0 8px;--path-data: var(--arrow-down-path-data);}x-select x-menuitem[toggled]{background-color:color(srgb 1 1 1 / 0.0605)}x-select x-menuitem::part(checkmark){width:4px;margin:0 8px 0 -22px;color:var(--accent-color);--path-data: M 0 0 L 100 0 L 100 100 L 0 100 Z;}x-slider[disabled]{filter:saturate(0)}x-slider::part(groove-track){background-color:color(srgb 1 1 1 / 0.5442);border-radius:99px}x-slider::part(range-track){background-color:var(--accent-color);border-radius:99px}x-slider::part(thumb){background-color:var(--accent-color);border-color:color(srgb 0.27 0.27 0.27);border-width:4.5px;border-style:solid;border-radius:99px;outline-color:color(srgb 1 1 1 / 0.08);outline-width:1px;outline-style:solid;transition-property:border-width;transition-duration:0.187s;transition-timing-function:cubic-bezier(0.55, 0.55, 0, 1)}x-slider[dragging=\"start\"]::part(start-thumb), x-slider[dragging=\"end\"]::part(end-thumb){border-width:6px}x-slider::part(thumb):focus{outline-width:2px;outline-style:solid;outline-color:color(srgb 1 1 1)}x-slider::part(tick){background-color:color(srgb 1 1 1 / 0.5442)}x-input{background-color:color(srgb 1 1 1 / 0.0605);border-color:var(--border-color);border-width:1px;border-style:solid;border-radius:3px}x-input:hover{background-color:color(srgb 1 1 1 / 0.0737)}x-input:focus{background-color:color(srgb 1 1 1 / 0)}x-input[error]{--selection-color: white;--selection-background-color: var(--error-color);}x-input::before{position:absolute;left:0px;bottom:-1px;width:100%;height:1px;background-color:color(srgb 1 1 1 / 0.54);border-radius:0 0 4px 4px;content:\"\"}x-input:focus::before{height:2px;background-color:var(--accent-color)}x-input[error]::before{height:2px;background-color:var(--error-color)}x-input[disabled]::before{display:none}x-input > x-label{color:color(srgb 1 1 1 / 0.4)}x-numberinput{background-color:color(srgb 1 1 1 / 0.0605);border-color:var(--border-color);border-width:1px;border-style:solid;border-radius:3px;line-height:1.5}x-numberinput:focus:has(x-stepper){padding-right:16px}x-numberinput:hover{background-color:color(srgb 1 1 1 / 0.0737)}x-numberinput:focus{background-color:color(srgb 1 1 1 / 0)}x-numberinput[error]{--selection-color: white;--selection-background-color: var(--error-color);}x-numberinput::before{position:absolute;left:0px;bottom:-1px;width:100%;height:1px;background-color:color(srgb 1 1 1 / 0.54);border-radius:0 0 4px 4px;content:\"\"}x-numberinput:focus::before{height:2px;background-color:var(--accent-color)}x-numberinput[error]::before{height:2px;background-color:var(--error-color)}x-numberinput[disabled]::before{display:none}x-numberinput > x-label{color:color(srgb 1 1 1 / 0.4)}x-numberinput > x-stepper{width:16px;height:11px;padding:0;transform:translateX(-2px);background-color:transparent;border-width:0;pointer-events:none}x-numberinput:focus > x-stepper{position:absolute;right:-12px;width:26px;height:52px;padding:2px;z-index:1;color:color(srgb 1 1 1 / 0.786);background-color:color(srgb 0.17 0.18 0.18);border-width:1px;border-style:solid;border-color:var(--border-color);border-radius:7px;pointer-events:all}x-numberinput[size=\"small\"]:not(:focus) > x-stepper{transform:scale(0.6)}x-numberinput[size=\"large\"]:not(:focus) > x-stepper{transform:scale(1.1) translateX(-2px)}x-numberinput:not(:focus) > x-stepper::part(increment-button), x-numberinput:not(:focus) > x-stepper::part(decrement-button){opacity:0.5}x-texteditor{background-color:color(srgb 1 1 1 / 0.0605);border-color:var(--border-color);border-width:1px;border-style:solid;border-radius:3px;border-bottom-color:color(srgb 1 1 1 / 0.54)}x-texteditor:hover{background-color:color(srgb 1 1 1 / 0.0737)}x-texteditor:focus{background-color:color(srgb 1 1 1 / 0);border-bottom-color:var(--border-color);box-shadow:0px -2px 0 0px inset var(--accent-color)}x-texteditor[error]{border-bottom-color:var(--border-color);box-shadow:0px -2px 0 0px inset var(--error-color)}x-texteditor[disabled]{border-bottom-color:var(--border-color);box-shadow:none}x-texteditor > x-label{color:color(srgb 1 1 1 / 0.4)}x-colorinput{background-color:color(srgb 1 1 1 / 0.0605);border-width:1px;border-style:solid;border-color:var(--border-color);border-radius:3px}x-colorinput:hover{background-color:color(srgb 1 1 1 / 0.0737)}x-colorinput:focus{background-color:color(srgb 1 1 1 / 0)}x-colorinput::before{position:absolute;left:0px;bottom:-1px;width:100%;height:1px;background-color:color(srgb 1 1 1 / 0.54);border-radius:0 0 4px 4px;content:\"\"}x-colorinput:focus::before{height:2px;background-color:var(--accent-color)}x-colorinput[error]::before{height:2px;background-color:var(--error-color)}x-colorinput[disabled]::before{display:none}x-colorinput > x-label{color:color(srgb 1 1 1 / 0.4)}x-colorinput::part(arrow){width:16px;height:16px;margin:0 2px 0 0;--path-data: var(--arrow-down-path-data);}x-colorinput x-menuitem[toggled]{background-color:color(srgb 1 1 1 / 0.2)}x-colorinput x-menuitem::part(checkmark){margin:0px 4px 0 -22px;color:var(--accent-color);--path-data: M 0 0 L 22 0 L 22 100 L 0 100 Z;}x-colorpicker::part(slider){border-radius:3px}x-colorselect{border-color:var(--border-color);border-width:1px;border-style:solid;border-radius:3px}x-colorselect:focus{outline-width:2px;outline-style:solid;outline-color:color(srgb 1 1 1);outline-offset:2px}x-colorinput::part(arrow){padding-left:0}x-progressbar{height:3px;border-radius:99px}x-progressbar::before{position:absolute;top:1px;width:100%;height:1px;background-color:color(srgb 1 1 1 / 0.6047);border-radius:99px;content:\"\"}x-progressbar::part(bar){background-color:var(--accent-color);border-radius:99px}x-throbber{color:var(--accent-color)}x-titlebar{padding-left:8px;justify-content:flex-start}x-titlebar::part(buttons){right:0;top:0}x-titlebar::part(button){padding:0 14px;color:var(--text-color)}x-titlebar::part(button):hover{background-color:color(srgb 1 1 1 / 0.0837)}x-titlebar::part(button):active{color:color(srgb 1 1 1 / 0.786);background-color:color(srgb 1 1 1/ 0.0326)}x-titlebar::part(minimize-button){--path-data: var(--minimize-path-data);}x-titlebar::part(maximize-button){--path-data: var(--maximize-path-data);}x-titlebar::part(restore-button){--path-data: var(--restore-path-data);}x-titlebar::part(close-button){--path-data: var(--clear-path-data);}x-titlebar::part(close-button):hover{color:color(srgb 1 1 1);background-color:color(srgb 0.77 0.16 0.11)}x-titlebar::part(close-button):active{color:color(srgb 1 1 1 / 0.7);background-color:color(srgb 0.77 0.16 0.11 / 0.8)}x-titlebar::part(icon){width:16px;height:16px}\n"
  },
  {
    "path": "src/renderer/public/xel/themes/fluent.css",
    "content": ":root{width:100%;height:100%;margin:0;interpolate-size:allow-keywords;font-family:sans-serif;line-height:1.6}body{width:100vw;height:100%;margin:0;overflow-y:overlay}h1{margin:22px 0 16px;box-sizing:border-box;line-height:1;font-size:3.25rem;font-weight:700}h2{margin:18px 0 14px 0;box-sizing:border-box;line-height:1;font-size:2.125rem;font-weight:700}h3{margin:16px 0 12px 0;box-sizing:border-box;line-height:1.2;font-size:1.75rem;font-weight:700}h4{margin:14px 0 10px 0;box-sizing:border-box;line-height:1.1;font-size:1.5rem;font-weight:700}h5{margin:12px 0 8px 0;box-sizing:border-box;line-height:1.1;font-size:1.25rem;font-weight:700}h6{margin:8px 0 5px 0;box-sizing:border-box;line-height:1.1;font-size:1rem;font-weight:700}h1 em, h2 em, h3 em, h4 em, h5 em, h6 em{font-weight:inherit}h1 strong, h2 strong, h3 strong, h4 strong, h5 strong, h6 strong{font-weight:900}p{margin:16px 0}p:last-child{margin-bottom:0}a{font-weight:500}table{width:100%;margin:16px 0;border-collapse:collapse;border-style:hidden;box-shadow:0 0 0 1px var(--border-color)}th{text-align:start;padding:8px 14px;border-spacing:0}td{padding:8px 14px;border-spacing:0}em{font-weight:500}pre, code, var{font-size:0.875rem;font-style:normal;padding:0 4px}pre{margin:14px 0;padding:4px 6px;white-space:pre-wrap;box-sizing:border-box}pre > code{display:block;padding:0;box-sizing:border-box;background-color:transparent;outline-width:0px;line-height:1.3}hr{width:100%;height:1px;min-height:1px;margin:24px 0;box-sizing:border-box;border:none}blockquote{box-sizing:border-box;margin:16px 0;padding:5px 14px;border-left-width:8px;border-left-style:solid}blockquote > blockquote{margin:6px 0}blockquote > p:first-child{margin-top:0}ul, ol{margin:12px 0;padding:0}p + ul{margin:-10px 0 0 0}li > ul, li > ol{margin:0}li{position:relative;margin:0;padding:0}ul li{margin-left:20px}ol li{margin-left:16px}li > p{margin:4px 0}ol > li::marker{font-weight:700}img{display:block;height:auto;margin:14px auto;max-width:100%;user-select:none;box-sizing:border-box;background:var(--checkboard-background);border-width:1px;border-style:solid;border-color:var(--border-color);-webkit-user-select:none;-webkit-user-modify:read-only}img:active{cursor:-webkit-grabbing}[popover]{color:var(--text-color);background-color:var(--foreground-color)}::-webkit-scrollbar{max-width:6px;max-height:6px}::-webkit-scrollbar-corner{display:none}@supports not selector(::-webkit-scrollbar){*{scrollbar-width:thin}}x-card:not(:defined){display:none}x-card > footer{padding:8px 16px;width:calc(100% + 40px);height:calc(100% + 20px);margin-left:-20px;margin-bottom:-16px;box-sizing:border-box;background:lightgrey}x-card > footer:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}x-card > footer:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}x-card > h1:first-child{margin-top:0}x-card > h2:first-child{margin-top:0}x-card > h3:first-child{margin-top:0}x-card > h4:first-child{margin-top:0}x-card > h5:first-child{margin-top:0}x-card > h6:first-child{margin-top:0}x-avatar[size=\"small\"]{width:28px;height:28px}x-avatar[size=\"large\"]{width:54px;height:54px}x-avatar > img{width:100%;height:100%;-webkit-user-drag:none}x-avatar > x-icon{width:55%;height:55%}x-avatar > x-label{font-size:1rem;pointer-events:none}x-avatar[size=\"small\"] > x-label{font-size:0.75rem}x-avatar[size=\"large\"] > x-label{font-size:1.5rem}x-accordion:not(:defined){display:none}x-accordion[size=\"small\"]::part(arrow){width:14px;height:14px}x-accordion[size=\"large\"]::part(arrow){width:18px;height:18px}x-accordion > header{display:flex;align-items:center;box-sizing:border-box;width:100%;padding:7px 0 7px 20px}x-accordion[size=\"small\"] > header{padding-left:18px}x-accordion[size=\"large\"] > header{padding-left:22px}x-accordion > header > x-label:first-child{flex:1}x-accordion > header > *:not(:last-child){margin-right:20px}x-accordion:not([expanded]):not([animating]) > *:not(header){display:none!important}x-icon[size=\"small\"]{width:15px;height:15px}x-icon[size=\"large\"]{width:21px;height:21px}x-icon:not(:defined){display:none}x-label:not(:defined){display:none}x-shortcut:not(:defined){display:none}x-stepper:not(:defined){display:none}x-swatch[size=\"small\"]{width:16px;height:16px}x-swatch[size=\"large\"]{width:20px;height:20px}x-swatch:not(:defined){display:none}x-button{--min-pressed-time: 150ms;}@media (pointer:coarse){x-button{--min-pressed-time: 600ms;}}a:has(x-button){text-decoration:none}x-button[toggled]{z-index:1}x-button[condensed]{padding:2px 7px}x-button[size=\"small\"]{min-height:24px}x-button[size=\"large\"]{min-height:38px}x-buttons[vertical] > x-button{width:100%;justify-content:flex-start}x-button:not(:defined){display:none}x-button > x-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;text-align:center;min-width:1px;pointer-events:none}x-button > x-label ~ x-icon, x-button > x-icon ~ x-label{margin:0 0 0 6px}x-button > x-menu{font-size:0.875rem}x-button[skin=\"normal\"][size=\"small\"] > x-icon{width:14px;height:14px}x-button[skin=\"normal\"][size=\"large\"] > x-icon{width:20px;height:20px}x-button[skin=\"flat\"]{padding:0}x-buttons:not([vertical]) > x-button[skin=\"flat\"]:not(:first-of-type){margin-left:10px}x-buttons:not([vertical]) > x-button[skin=\"flat\"][size=\"small\"]:not(:first-of-type){margin-left:5px}x-buttons[vertical] > x-button[skin=\"flat\"]:not(:first-of-type){margin-top:10px}x-buttons[vertical] > x-button[skin=\"flat\"][size=\"small\"]:not(:first-of-type){margin-top:5px}x-button[skin=\"flat\"] > x-icon{width:26px;height:26px}x-button[skin=\"flat\"][size=\"small\"] > x-icon{width:22px;height:22px}x-button[skin=\"flat\"][size=\"large\"] > x-icon{width:28px;height:28px}x-button[skin=\"recessed\"]{min-height:18px;padding:4px 8px}x-button[skin=\"recessed\"][size=\"small\"]{padding:3px 8px}x-button[skin=\"recessed\"][size=\"large\"]{padding:5px 8px}x-buttons:not([vertical]) > x-button[skin=\"recessed\"] + x-button[skin=\"recessed\"]{margin-left:4px}x-buttons[vertical] > x-button[skin=\"recessed\"] + x-button[skin=\"recessed\"]{margin-top:4px}x-button[skin=\"recessed\"] > x-icon{width:16px;height:16px}x-button[skin=\"recessed\"][size=\"small\"] > x-icon{width:12px;height:12px}x-button[skin=\"recessed\"][size=\"large\"] > x-icon{width:20px;height:20px}x-button[skin=\"dock\"], x-buttons[vertical] > x-button[skin=\"dock\"]{width:38px;height:38px;min-height:38px;padding:0;justify-content:center}x-button[skin=\"dock\"][size=\"small\"], x-buttons[vertical] > x-button[skin=\"dock\"][size=\"small\"]{width:30px;height:30px;min-height:30px}x-button[skin=\"dock\"][size=\"large\"], x-buttons[vertical] > x-button[skin=\"dock\"][size=\"large\"]{width:45px;height:45px;min-height:45px}x-buttons:not([vertical]) > x-button[skin=\"dock\"] + x-button[skin=\"dock\"]{margin-left:-1px}x-buttons[vertical] > x-button[skin=\"dock\"] + x-button[skin=\"dock\"]{margin-top:-1px}x-button[skin=\"dock\"] > x-icon{width:17px;height:17px}x-button[skin=\"dock\"][size=\"small\"] > x-icon{width:14px;height:14px}x-button[skin=\"dock\"][size=\"large\"] > x-icon{width:20px;height:20px}x-buttons[vertical]{flex-flow:column;align-items:flex-start;justify-content:center}x-buttons:not(:defined){display:none}x-tag[size=\"small\"]{height:18px}x-tag[size=\"large\"]{height:30px}x-tag:not(:defined){display:none}x-tag > x-swatch{width:14px;height:14px}x-tag[size=\"small\"] > x-swatch{width:12px;height:12px}x-tag[size=\"large\"] > x-swatch{width:16px;height:16px}x-tag > x-label{font-size:0.75rem}x-tag :not(x-label) + x-label{margin-left:0.25rem}x-tag[size=\"small\"] > x-label{font-size:0.6875rem}x-tag > x-icon{width:15px;height:15px}x-tags{margin-top:-2px;margin-left:-2px}x-tags:not(:defined){display:none}x-tags x-tag{margin:2px}x-tagsinput[size=\"small\"]{padding:0px;gap:0px}x-tagsinput[size=\"small\"] > x-tag{height:22px;transform:scale(0.92)}x-tagsinput[size=\"large\"]{padding:6px;gap:6px}x-tagsinput:focus-within{z-index:10}x-tagsinput:not(:defined){display:none}x-tagsinput > x-label{position:absolute;top:50%;left:8px;transform:translateY(-50%);pointer-events:none}x-tagsinput[size=\"small\"][error]::before{top:27px}x-tagsinput[size=\"large\"][error]::before{top:41px}x-tab[size=\"small\"]{min-height:24px}x-tab[size=\"large\"]{min-height:38px}x-tab:not(:defined){display:none}x-tab x-icon{width:17px;height:17px;min-width:17px;color:inherit}x-tab[size=\"small\"] x-icon{width:15px;height:15px;min-width:15px}x-tab[size=\"large\"] x-icon{width:19px;height:19px;min-width:19px}x-tab x-label{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;line-height:1.2;cursor:inherit;flex:1}x-tab x-icon + x-label{margin-left:6px}x-tab x-box:is([vertical]) x-icon + x-label{margin-left:0px}x-tabs:not(:defined){display:none}x-menu:not(:defined){display:none}x-menu:has(x-menu[opened]){overflow:-webkit-paged-x}x-menu img{margin:0;background:none;border:none}x-menu hr{width:100%;height:1px;margin:4px 0px;box-sizing:border-box}x-menu hr + hr, x-menu hr:last-child{display:none}x-menuitem[size=\"small\"]{min-height:24px}x-menuitem[size=\"large\"]{min-height:38px}x-menuitem:not(:defined){display:none}x-menuitem[highlighted]{color:white;background:var(--accent-color)}x-menuitem img{width:16px;height:16px}x-menuitem x-icon{width:16px;height:16px}x-menuitem x-label{display:block;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:inherit;line-height:1.4}x-menuitem img + x-label, x-menuitem x-swatch + x-label, x-menuitem x-icon + x-label{margin-left:8px}x-menuitem x-shortcut{margin-left:auto}x-menuitem x-label + x-shortcut{margin-left:8px}x-menubar[size=\"small\"]{height:30px}x-menubar[size=\"large\"]{height:42px}x-menubar:not(:defined){display:none}x-menubar > x-menuitem{height:100%;padding:0 11px;min-height:0}x-menubar > x-menuitem[autohidden]{display:none}x-navitem + x-navitem, a:has(x-navitem) + a:has(x-navitem), a:has(x-navitem) + x-navitem, x-navitem + a:has(x-navitem){margin:3px 0}x-nav x-nav > *:first-child{margin-top:3px}x-nav x-nav > *:last-child{margin-bottom:0}x-nav x-nav > *{margin-left:34px!important}x-nav x-nav > *{max-width:calc(100% - 34px)!important}x-nav > a{display:block;text-decoration:none}x-nav x-label{max-width:100%;flex:1 1 0%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:500;font-size:0.9375rem;text-align:start}x-nav x-icon + x-label{margin-left:14px}x-nav[collapsed] x-navitem > x-label{display:none}x-nav x-icon{width:20px;height:20px}x-nav x-label + x-icon{width:18px;height:18px;margin:0 0 0 10px}x-nav[collapsed] x-navitem > x-label + x-icon{display:none}x-nav[collapsed] x-navitem::part(button){padding:0}x-nav[collapsed] x-navitem::part(arrow){display:none}x-contextmenu:not(:defined){display:none}dialog{overflow:hidden;position:fixed;min-width:200px;min-height:100px;max-height:none;margin:auto;padding:20px 24px;box-sizing:border-box;font-size:0.8125rem;line-height:1.6}dialog:focus{outline:none}dialog:not(:defined){display:none}dialog > footer{display:flex;flex-flow:row;justify-content:flex-end;padding:12px 24px;width:calc(100% + 48px);height:calc(100% + 22px);margin-top:10px;margin-left:-24px;margin-bottom:-20px;box-sizing:border-box;background:lightgrey}dialog > footer:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}dialog > footer:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}dialog > footer x-button + x-button{margin-left:8px}dialog h3{font-size:1.125rem;font-weight:700}dialog > *:first-child{margin-top:0}x-popover{padding:12px;overflow:auto}x-popover:has(footer){overflow:hidden}x-popover:not(:defined){display:none}x-popover > footer{padding:12px;width:calc(100% + 24px);height:calc(100% + 12px);margin-left:-12px;margin-bottom:-12px;margin-top:12px;box-sizing:border-box;background:lightgrey}x-popover > footer:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}x-popover > footer:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}x-notification[size=\"small\"]{padding:3px 12px}x-notification[size=\"large\"]{padding:8px 12px}x-notification:not(:defined){display:none}x-notification > p{margin:0}x-checkbox:not(:defined){display:none}x-checkbox + x-checkbox{margin-top:6px}x-checkbox[size=\"small\"]::part(indicator){width:17px;height:17px}x-checkbox[size=\"large\"]::part(indicator){width:21px;height:21px}x-checkbox > x-label{display:block;margin-left:8px;padding:1px 0}x-radio + x-radio{margin-top:6px}x-radio:not(:defined){display:none}x-radio[size=\"small\"]::part(indicator){width:17px;height:17px}x-radio[size=\"large\"]::part(indicator){width:21px;height:21px}x-radio > x-label{margin:0 0 0 8px;padding:1px 0}x-radio[size=\"small\"] > x-label{margin-left:6px}x-radio[size=\"large\"] > x-label{margin-left:10px}x-radios:not(:defined){display:none}x-switch + x-switch{margin-top:12px}x-switch:not(:defined){display:none}x-switch[size=\"large\"]::part(indicator){width:42px;height:20px}x-switch[size=\"small\"]::part(indicator){width:28px;height:12px}x-switch > x-label{margin:0 0 0 8px;padding:1px 0}x-switch[size=\"small\"] > x-label{margin-left:6px}x-switch[size=\"large\"] > x-label{margin-left:10px}x-select[size=\"small\"]{height:24px}x-select[size=\"large\"]{height:38px}x-select:not(:defined){display:none}x-colorselect[size=\"small\"]{width:24px;height:24px}x-colorselect[size=\"large\"]{width:38px;height:38px}x-colorselect:not(:defined){display:none}x-input[size=\"small\"]{height:24px}x-input[size=\"large\"]{height:38px}x-input:not(:defined){display:none}x-input + x-input{margin-top:20px}x-input > x-icon{width:15px;height:15px;min-width:15px;margin:0 0 0 8px}x-input[size=\"small\"] > x-icon{transform:scale(0.8)}x-input[size=\"large\"] > x-icon{transform:scale(1.1)}x-input > x-icon:hover{cursor:default}x-input > x-label{display:none;position:absolute;top:50%;max-width:100%;padding:0 5px 0 5px;transform:translateY(-50%);font-family:inherit;font-size:inherit;line-height:inherit;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;pointer-events:none}x-input[empty] > x-label{display:block}x-input > x-icon + x-label{padding:0 5px 0 29px}x-numberinput[size=\"small\"]{height:24px}x-numberinput[size=\"large\"]{height:38px}x-numberinput:focus{z-index:10}x-numberinput:not(:defined){display:none}x-numberinput > x-label{display:none;position:absolute;top:50%;max-width:100%;padding:0 5px 0 5px;transform:translateY(-50%);font-family:inherit;font-size:inherit;line-height:inherit;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;pointer-events:none}x-numberinput[empty] > x-label{display:block}x-numberinput[size=\"small\"][error]::before{top:27px}x-numberinput[size=\"large\"][error]::before{top:41px}x-texteditor:focus{z-index:10}x-texteditor:not(:defined){display:none}x-texteditor > x-label{display:none;position:absolute;width:100%;top:0;left:0;padding:2px 6px;font-family:inherit;font-size:inherit;line-height:inherit;pointer-events:none}x-texteditor[empty] > x-label{display:block}x-slider:not(:defined){display:none}x-colorpicker:not(:defined){display:none}x-progressbar[size=\"small\"]{height:6px}x-progressbar[size=\"large\"]{height:10px}x-progressbar:not(:defined){display:none}x-throbber[size=\"small\"]{width:26px;height:26px}x-throbber[size=\"large\"]{width:34px;height:34px}x-throbber:not(:defined){display:none}x-titlebar x-icon + x-label{margin-left:6px}:root{color:var(--text-color);background-color:var(--background-color);font-family:\"Segoe UI\", \"SegoeUI\", system-ui, sans-serif;--theme-id:                   \"fluent\";--preset-accent-colors:       blue     color(srgb 0.00 0.47 0.83),\n                                purple   color(srgb 0.53 0.09 0.60),\n                                pink     color(srgb 0.89 0.00 0.56),\n                                red      color(srgb 0.91 0.06 0.14),\n                                orange   color(srgb 0.96 0.39 0.05),\n                                yellow   color(srgb 1.00 0.73 0.00),\n                                green    color(srgb 0.06 0.49 0.06),\n                                gray     color(srgb 0.48 0.46 0.45);--accent-color:               color(srgb 0.00 0.47 0.83);--background-color:           color(srgb 0.95 0.95 0.95);--foreground-color:           color(srgb 0.98 0.98 0.98);--border-color:               color(srgb 0.88 0.88 0.88);--text-color:                 color(srgb 0 0 0 / 0.8);--error-color:                color(srgb 0.77 0.17 0.11);--selection-color:            color(srgb 1 1 1);--selection-background-color: var(--accent-color);--autofill-background-color:  color(srgb 1 0.96 0.81);--titlebar-color:             auto;--autocapitalize:             none;--checkboard-background:      linear-gradient( 45deg, #d6d6d6 25%, #0000   25%)  0px  0px / 10px 10px,\n                                linear-gradient(-45deg, #d6d6d6 25%, #0000   25%)  0px  5px / 10px 10px,\n                                linear-gradient( 45deg, #0000   75%, #d6d6d6 75%)  5px -5px / 10px 10px,\n                                linear-gradient(-45deg, #0000   75%, #d6d6d6 75%) -5px  0px / 10px 10px, #ffffff;--arrow-left-path-data: M 68.75 79.17 C 68.75 78 68.33 77 67.5 76.25 L 41.25 50 L 67.5 23.75 C 68.33 23 68.75 22 68.75 20.84 C 68.75 19.75 68.33 18.75 67.5 17.92 C 66.75 17.09 65.75 16.67 64.58 16.67 C 63.42 16.67 62.42 17.09 61.67 17.84 L 32.42 47.09 C 31.58 47.92 31.25 48.84 31.25 50 C 31.25 51.17 31.58 52.09 32.42 52.92 L 61.67 82.17 C 62.42 82.92 63.42 83.34 64.58 83.34 C 65.75 83.34 66.75 82.92 67.5 82.17 C 68.33 81.25 68.75 80.34 68.75 79.17 Z;--arrow-right-path-data: M 31.25 79.17 C 31.25 78 31.67 77 32.5 76.25 L 58.75 50 L 32.5 23.75 C 31.67 23 31.25 22 31.25 20.84 C 31.25 19.75 31.67 18.75 32.5 17.92 C 33.25 17.09 34.25 16.67 35.42 16.67 C 36.58 16.67 37.58 17.09 38.33 17.84 L 67.58 47.09 C 68.42 47.92 68.75 48.84 68.75 50 C 68.75 51.17 68.42 52.09 67.58 52.92 L 38.33 82.17 C 37.58 82.92 36.58 83.34 35.42 83.34 C 34.25 83.34 33.25 82.92 32.5 82.17 C 31.67 81.25 31.25 80.34 31.25 79.17 Z;--arrow-down-path-data: M 20.83 31.25 C 22 31.25 23 31.67 23.75 32.5 L 50 58.75 L 76.25 32.5 C 77 31.67 78 31.25 79.16 31.25 C 80.25 31.25 81.25 31.67 82.08 32.5 C 82.91 33.25 83.33 34.25 83.33 35.42 C 83.33 36.58 82.91 37.58 82.16 38.33 L 52.91 67.58 C 52.08 68.42 51.16 68.75 50 68.75 C 48.83 68.75 47.91 68.42 47.08 67.58 L 17.83 38.33 C 17.08 37.58 16.66 36.58 16.66 35.42 C 16.66 34.25 17.08 33.25 17.83 32.5 C 18.75 31.67 19.66 31.25 20.83 31.25 Z;--arrow-up-path-data: M 20.83 68.75 C 22 68.75 23 68.33 23.75 67.5 L 50 41.25 L 76.25 67.5 C 77 68.33 78 68.75 79.16 68.75 C 80.25 68.75 81.25 68.33 82.08 67.5 C 82.91 66.75 83.33 65.75 83.33 64.58 C 83.33 63.42 82.91 62.42 82.16 61.67 L 52.91 32.42 C 52.08 31.58 51.16 31.25 50 31.25 C 48.83 31.25 47.91 31.58 47.08 32.42 L 17.83 61.67 C 17.08 62.42 16.66 63.42 16.66 64.58 C 16.66 65.75 17.08 66.75 17.83 67.5 C 18.75 68.33 19.66 68.75 20.83 68.75 Z;--double-arrow-left-path-data: M 81.24 79.17 C 81.24 78 80.82 77 79.99 76.25 L 53.74 50 L 79.99 23.75 C 80.82 23 81.24 22 81.24 20.84 C 81.24 19.75 80.82 18.75 79.99 17.92 C 79.24 17.09 78.24 16.67 77.07 16.67 C 75.91 16.67 74.91 17.09 74.16 17.84 L 44.91 47.09 C 44.07 47.92 43.74 48.84 43.74 50 C 43.74 51.17 44.07 52.09 44.91 52.92 L 74.16 82.17 C 74.91 82.92 75.91 83.34 77.07 83.34 C 78.24 83.34 79.24 82.92 79.99 82.17 C 80.82 81.25 81.24 80.34 81.24 79.17 Z M 56.26 79.17 C 56.26 78 55.84 77 55.01 76.25 L 28.76 50 L 55.01 23.75 C 55.84 23 56.26 22 56.26 20.84 C 56.26 19.75 55.84 18.75 55.01 17.92 C 54.26 17.09 53.26 16.67 52.09 16.67 C 50.93 16.67 49.93 17.09 49.18 17.84 L 19.93 47.09 C 19.09 47.92 18.76 48.84 18.76 50 C 18.76 51.17 19.09 52.09 19.93 52.92 L 49.18 82.17 C 49.93 82.92 50.93 83.34 52.09 83.34 C 53.26 83.34 54.26 82.92 55.01 82.17 C 55.84 81.25 56.26 80.34 56.26 79.17 Z;--double-arrow-right-path-data: M 18.76 79.17 C 18.76 78 19.18 77 20.01 76.25 L 46.26 50 L 20.01 23.75 C 19.18 23 18.76 22 18.76 20.84 C 18.76 19.75 19.18 18.75 20.01 17.92 C 20.76 17.09 21.76 16.67 22.93 16.67 C 24.09 16.67 25.09 17.09 25.84 17.84 L 55.09 47.09 C 55.93 47.92 56.26 48.84 56.26 50 C 56.26 51.17 55.93 52.09 55.09 52.92 L 25.84 82.17 C 25.09 82.92 24.09 83.34 22.93 83.34 C 21.76 83.34 20.76 82.92 20.01 82.17 C 19.18 81.25 18.76 80.34 18.76 79.17 Z M 43.74 79.17 C 43.74 78 44.16 77 44.99 76.25 L 71.24 50 L 44.99 23.75 C 44.16 23 43.74 22 43.74 20.84 C 43.74 19.75 44.16 18.75 44.99 17.92 C 45.74 17.09 46.74 16.67 47.91 16.67 C 49.07 16.67 50.07 17.09 50.82 17.84 L 80.07 47.09 C 80.91 47.92 81.24 48.84 81.24 50 C 81.24 51.17 80.91 52.09 80.07 52.92 L 50.82 82.17 C 50.07 82.92 49.07 83.34 47.91 83.34 C 46.74 83.34 45.74 82.92 44.99 82.17 C 44.16 81.25 43.74 80.34 43.74 79.17 Z;--checkmark-path-data: M 15.51 49.52 C 15.51 48.35 15.93 47.35 16.76 46.6 C 17.59 45.77 18.51 45.35 19.68 45.35 C 20.84 45.35 21.76 45.77 22.59 46.6 L 39.73 64.13 L 77.41 27.04 C 78.24 26.21 79.16 25.79 80.33 25.79 C 80.91 25.79 81.41 25.87 81.91 26.12 C 82.49 26.29 82.91 26.62 83.24 27.04 C 83.66 27.37 83.91 27.79 84.16 28.29 C 84.41 28.79 84.49 29.37 84.49 29.96 C 84.49 31.04 84.08 32.04 83.24 32.87 L 42.64 72.96 C 41.81 73.8 40.89 74.21 39.73 74.21 C 38.56 74.21 37.64 73.8 36.81 72.96 L 16.76 52.43 C 15.93 51.68 15.51 50.68 15.51 49.52 Z;--mixed-checkmark-path-data: M 25.22 53.98 C 24.66 53.98 24.11 53.89 23.62 53.67 C 23.15 53.5 22.76 53.17 22.35 52.86 C 22.05 52.47 21.72 52.07 21.47 51.6 C 21.33 51.12 21.17 50.56 21.17 50 C 21.17 49.44 21.33 48.97 21.47 48.48 C 21.72 48.01 22.05 47.53 22.35 47.21 C 22.76 46.83 23.15 46.57 23.62 46.33 C 24.11 46.18 24.66 46.02 25.22 46.02 L 74.77 46.02 C 75.33 46.02 75.88 46.18 76.37 46.33 C 76.84 46.57 77.23 46.83 77.55 47.21 C 77.94 47.53 78.27 48.01 78.52 48.48 C 78.66 48.97 78.82 49.44 78.82 50 C 78.82 50.56 78.66 51.12 78.52 51.6 C 78.27 52.07 77.94 52.47 77.55 52.86 C 77.23 53.17 76.84 53.5 76.37 53.67 C 75.88 53.89 75.33 53.98 74.77 53.98 L 25.22 53.98 Z;--clear-path-data: M 50 55.57 L 25.59 79.97 C 24.82 80.75 23.87 81.14 22.8 81.14 C 21.71 81.14 20.78 80.75 20.07 79.97 C 19.3 79.19 18.91 78.34 18.91 77.18 C 18.91 76.16 19.3 75.23 20.07 74.45 L 44.48 50.05 L 20.07 25.56 C 19.3 24.78 18.91 23.85 18.91 22.76 C 18.91 22.23 18.98 21.76 19.21 21.28 C 19.45 20.82 19.69 20.36 20.07 20.04 C 20.39 19.65 20.85 19.41 21.32 19.26 C 21.79 19.02 22.26 18.87 22.8 18.87 C 23.87 18.87 24.82 19.26 25.59 20.04 L 50 44.53 L 74.49 20.04 C 75.27 19.26 76.13 18.87 77.2 18.87 C 78.29 18.87 79.22 19.26 80 20.04 C 80.79 20.82 81.09 21.76 81.09 22.83 C 81.09 23.92 80.79 24.78 80 25.56 L 55.52 50.05 L 80 74.45 C 80.79 75.23 81.09 76.16 81.09 77.25 C 81.09 77.78 81.02 78.34 80.79 78.8 C 80.62 79.27 80.31 79.65 79.93 80.04 C 79.61 80.36 79.22 80.66 78.68 80.83 C 78.29 81.05 77.74 81.14 77.2 81.14 C 76.13 81.14 75.27 80.75 74.49 79.97 L 50 55.57 Z;--minimize-path-data: M 15 46 L 85 46 L 85 54 L 15 54 L 15 46 Z;--maximize-path-data: M 27 16 L 74 16 C 79 16 85 21 85 27 L 85 73 C 85 79 79 85 74 85 L 27 85 C 21 85 16 79 16 73 L 16 27 C 16 21 21 16 27 16 Z M 27 24 C 25 24 24 25 24 27 L 24 73 C 24 76 25 77 27 77 L 74 77 C 76 77 77 76 77 73 L 77 27 C 77 25 76 24 74 24 L 27 24 Z;--restore-path-data: M 27 32 L 58 32 C 63 32 69 37 69 43 L 69 73 C 69 79 63 85 58 85 L 27 85 C 21 85 16 79 16 73 L 16 43 C 16 37 21 32 27 32 Z M 27 40 C 25 40 24 41 24 43 L 24 73 C 24 76 25 77 27 77 L 58 77 C 60 77 61 76 61 73 L 61 43 C 61 41 60 40 58 40 Z M 80 64.83 C 80 68.15 77.43 70.88 74.15 71.14 L 74.15 35.63 C 74.15 31.33 68.67 25.85 64.37 25.85 L 28.86 25.85 C 29.12 22.57 31.85 20 35.17 20 L 66.8 20 C 72.98 20 80 27.02 80 33.2 Z;}h1, h2, h3, h4, h5, h6{color:color(srgb 0 0 0)}a{color:var(--accent-color);text-decoration:underline}a:hover{color:oklch(from var(--accent-color) calc(l - 0.1) c h);text-decoration:none}a:active{color:oklch(from var(--accent-color) calc(l + 0.1) c h)}a:focus{border-radius:2px;outline-width:2px;outline-style:solid;outline-color:color(srgb 0 0 0 / 0.9);outline-offset:2px}pre, code, var{background-color:color(srgb 0 0 0 / 0.02);border-radius:4px;outline-width:1px;outline-style:solid;outline-color:color(srgb 0 0 0 / 0.1);font-family:\"Consolas\", ui-monospace, monospace;font-weight:500}blockquote{border-color:color(srgb 0.97 0.39 0.4)}mark, ::highlight(mark){color:color(srgb 0 0 0);background-color:color(srgb 1 0.84 0.18)}hr{background-color:var(--border-color)}table{border-radius:2px;box-shadow:0 0 0 1px color(srgb 0 0 0 / 0.1)}th, td{border-width:1px;border-style:solid;border-color:color(srgb 0 0 0 / 0.15)}img{border-width:1px;border-style:solid;border-color:var(--border-color)}::selection{color:var(--selection-color);background-color:var(--selection-background-color)}::-webkit-scrollbar{background-color:transparent}::-webkit-scrollbar-thumb{border-radius:10px}::-webkit-scrollbar-thumb:vertical{background-image:linear-gradient( 90deg, transparent 0%, transparent 30%, color(srgb 0.54 0.54 0.54) 30%, color(srgb 0.54 0.54 0.54) 70%, transparent 70%, transparent 100% )}::-webkit-scrollbar-thumb:horizontal{background-image:linear-gradient( 0deg, transparent 0%, transparent 30%, color(srgb 0.54 0.54 0.54) 30%, color(srgb 0.54 0.54 0.54) 70%, transparent 70%, transparent 100% )}::-webkit-scrollbar-thumb:hover{background-color:color(srgb 0.54 0.54 0.54)}@supports not selector(::-webkit-scrollbar){*{scrollbar-color:color(srgb 0.54 0.54 0.54) transparent}}x-avatar{color:var(--text-color);background-color:color(srgb 0 0 0 / 0.1);border-width:0px;border-radius:999px}x-avatar > x-label{font-weight:500}x-card{background-color:var(--foreground-color);border-width:1px;border-style:solid;border-color:var(--border-color);border-radius:4px}x-card > footer{background-color:var(--background-color);border-top-width:1px;border-top-style:solid;border-top-color:var(--border-color)}x-accordion::part(arrow){color:color(srgb 0.14 0.14 0.14);--path-data: var(--arrow-right-path-data);}x-accordion::part(arrow):focus{border-radius:2px;outline-width:2px;outline-style:solid;outline-color:color(srgb 0 0 0 / 0.9)}x-accordion > header > x-label{font-weight:500}x-tooltip{color:var(--text-color);background-color:color(srgb 0.98 0.98 0.98);border-color:var(--border-color);border-radius:4px;box-shadow:0 4px 8px color(srgb 0 0 0 / 0.14)}x-stepper{width:40px;height:70px;padding:5px;color:color(srgb 0 0 0 / 0.8956);background-color:color(srgb 1 1 1);border-width:1px;border-style:solid;border-color:var(--border-color);border-radius:7px}x-stepper::part(increment-button), x-stepper::part(decrement-button){border-radius:3px}x-stepper::part(increment-button):hover, x-stepper::part(decrement-button):hover{background-color:color(srgb 0 0 0 / 0.0373)}x-stepper[pressed=\"increment\"]::part(increment-button), x-stepper[pressed=\"decrement\"]::part(decrement-button){color:color(srgb 0 0 0 / 0.5);background-color:color(srgb 0 0 0 / 0.0241)}x-stepper::part(increment-arrow), x-stepper::part(decrement-arrow){width:18px;height:18px}x-stepper::part(increment-arrow){--path-data: var(--arrow-up-path-data);}x-stepper::part(decrement-arrow){--path-data: var(--arrow-down-path-data);}x-swatch{border-color:var(--border-color);border-radius:4px}x-button:focus{outline-width:2px;outline-style:solid;outline-color:color(srgb 0 0 0 / 0.9);outline-offset:2px}x-button[mixed]{opacity:0.7}x-button[disabled]{opacity:0.4}x-button[skin=\"normal\"]{color:var(--text-color);background-color:color(srgb 1 1 1 / 0.7);border-width:1px;border-style:solid;border-color:var(--border-color);border-radius:4px}x-button[skin=\"normal\"]:hover{background-color:color(srgb 0.976 0.976 0.976 / 0.5)}x-button[skin=\"normal\"][pressed]{color:color(srgb 0 0 0 / 0.5);background-color:color(srgb 0.976 0.976 0.976 / 0.3)}x-button[skin=\"normal\"][toggled]{color:color(srgb 1 1 1);background-color:var(--accent-color);border-color:var(--accent-color)}x-button[skin=\"normal\"][toggled]:hover{background-color:oklch(from var(--accent-color) l c h / 90%)}x-button[skin=\"normal\"][toggled][pressed]{color:color(srgb 1 1 1 / 0.7);background-color:oklch(from var(--accent-color) l c h / 80%)}x-buttons > x-button[skin=\"normal\"][toggled]:hover{background-color:var(--accent-color)}x-buttons > x-button[skin=\"normal\"][toggled][pressed]{background-color:oklch(from var(--accent-color) l c h / 80%)}x-buttons:not([vertical]) > x-button[skin=\"normal\"]:not(:first-of-type){border-top-left-radius:0;border-bottom-left-radius:0}x-buttons:not([vertical]) > x-button[skin=\"normal\"]:not(:last-of-type){border-right:none;border-top-right-radius:0;border-bottom-right-radius:0}x-buttons:not([vertical]) > x-button[skin=\"normal\"][toggled] + x-button[skin=\"normal\"]{border-left-color:transparent}x-buttons[vertical] > x-button[skin=\"normal\"]:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}x-buttons[vertical] > x-button[skin=\"normal\"]:not(:last-of-type){border-bottom-width:0;border-bottom-left-radius:0;border-bottom-right-radius:0}x-buttons[vertical] > x-button[skin=\"normal\"][toggled] + x-button[skin=\"normal\"]{border-top-color:transparent}x-button[skin=\"flat\"][pressed]{color:color(srgb 0 0 0 / 0.5)}x-button[skin=\"flat\"][toggled]{color:var(--accent-color)}x-button[skin=\"flat\"][toggled][pressed]{color:oklch(from var(--accent-color) l c h / 80%)}x-button[skin=\"recessed\"]{color:var(--text-color);border-radius:4px}x-button[skin=\"recessed\"][disabled]{opacity:0.3}x-button[skin=\"recessed\"]:hover{background-color:color(srgb 0 0 0 / 0.1)}x-button[skin=\"recessed\"][toggled]{color:color(srgb 1 1 1 / 0.95);background-color:var(--text-color)}x-button[skin=\"recessed\"][toggled]:hover{background-color:color(srgb 0 0 0 / 0.5)}x-button[skin=\"recessed\"][pressed],x-button[skin=\"recessed\"][toggled][pressed]{color:color(srgb 1 1 1 / 0.95);background-color:color(srgb 0 0 0 / 0.7)}x-button[skin=\"recessed\"] > x-label{font-size:0.75rem;font-weight:700;text-align:center}x-button[skin=\"dock\"]{color:var(--text-color);background-color:color(srgb 1 1 1);border-width:1px;border-style:solid;border-color:var(--border-color)}x-button[skin=\"dock\"]:hover{background-color:color(srgb 0.976 0.976 0.976 / 0.5)}x-button[skin=\"dock\"][pressed]{color:color(srgb 0 0 0 / 0.5);background-color:color(srgb 0.976 0.976 0.976 / 0.3)}x-button[skin=\"dock\"][toggled]{color:color(srgb 1 1 1);background-color:var(--accent-color);border-color:oklch(from var(--accent-color) calc(l - 0.1) c h);z-index:1}x-button[skin=\"dock\"][toggled][pressed]{color:color(srgb 1 1 1 / 0.7);background-color:oklch(from var(--accent-color) l c h / 80%)}x-button[skin=\"dock\"]:focus{outline-offset:-2px}x-tag{background-color:color(srgb 0.95 0.95 0.95 / 0.76);border-color:var(--border-color);border-radius:99px}x-tag:hover{background-color:color(srgb 0.98 0.98 0.98 / 0.5)}x-tag:active{color:color(srgb 0 0 0 / 0.6063)}x-tag:focus{outline-width:2px;outline-style:solid;outline-color:color(srgb 0 0 0 / 0.9);outline-offset:2px}x-tag[toggled]{color:color(srgb 1 1 1);background-color:var(--accent-color);border-color:transparent}x-tag[toggled]:hover{filter:brightness(1.1)}x-tag[toggled]:active{color:color(srgb 1 1 1 / 0.7);background-color:oklch(from var(--accent-color) l c h / 80%)}x-tag::part(remove-button){--path-data: var(--clear-path-data);}x-tag::part(remove-button):hover{color:color(srgb 0 0 0)}x-tag::part(scope){border-color:var(--border-color)}x-tag[scoped]::part(main){background-color:var(--foreground-color)}x-tagsinput{background-color:color(srgb 1 1 1 / 0.7);border-color:var(--border-color);border-width:1px;border-style:solid;border-radius:3px}x-tagsinput:hover{background-color:color(srgb 0.98 0.98 0.98 / 0.5)}x-tagsinput:focus{background-color:color(srgb 1 1 1)}x-tagsinput::before{position:absolute;bottom:-1px;left:0px;width:100%;height:1px;background-color:color(srgb 0 0 0 / 0.45);border-radius:0 0 4px 4px;content:\"\"}x-tagsinput:focus::before{height:2px;background-color:var(--accent-color)}x-tagsinput[error]::before{height:2px;background-color:var(--error-color)}x-tagsinput[disabled]::before{display:none}x-tagsinput > x-label{color:color(srgb 0 0 0 / 0.32)}x-tabs{background-color:color(srgb 0 0 0 / 0.0241);border-radius:4px;box-shadow:0 0 0px 1px color(srgb 0 0 0 / 0.0578)}x-tab{border-radius:4px}x-tab:hover{background-color:color(srgb 0.98 0.98 0.98 / 0.5)}x-tab:active{color:color(srgb 0 0 0 / 0.6063);background-color:color(srgb 0 0 0 / 0.0241)}x-tab[toggled]{background-color:color(srgb 1 1 1 / 0.7);box-shadow:0 0 0px 1px var(--border-color)}x-tab:focus{outline-width:2px;outline-style:solid;outline-color:color(srgb 0 0 0 / 0.9);outline-offset:2px}x-tab::before{position:absolute;width:0px;height:3px;bottom:0px;background-color:var(--accent-color);border-radius:99px;transition-property:width;transition-duration:0.187s;transition-timing-function:cubic-bezier(0.55, 0.55, 0, 1);content:\"\"}x-tab[toggled]::before{width:16px}x-tab[toggled]:active::before{width:12px}x-navitem:focus{outline-width:0}x-navitem::part(button){position:relative;color:color(srgb 0 0 0 / 0.8956);border-radius:7px}x-navitem::part(button):hover{background-color:color(srgb 0 0 0 / 0.04)}x-navitem[toggled]::part(button){background-color:color(srgb 0 0 0 / 0.04)}x-navitem[pressed]::part(button){color:color(srgb 0 0 0 / 0.6063);background-color:color(srgb 0 0 0 / 0.03)}x-navitem:focus::part(button){outline-width:2px;outline-style:solid;outline-color:color(srgb 0 0 0 / 0.9);outline-offset:2px}x-navitem[disabled]{opacity:0.5}x-navitem::part(button)::before{position:absolute;left:0;width:3px;height:0px;background-color:var(--accent-color);border-radius:99px;transition-property:height;transition-duration:0.187s;transition-timing-function:cubic-bezier(0.55, 0.55, 0, 1);content:\"\"}x-navitem[toggled]::part(button)::before{height:50%}x-navitem[pressed]::part(button)::before{height:30%}x-navitem::part(arrow){color:color(srgb 0 0 0 / 0.6063);transform:scale(1.2);--path-data: var(--arrow-right-path-data);}x-nav x-icon:first-child{opacity:0.9}x-nav x-label + x-icon{color:var(--accent-color)}x-menu{padding:4px;color:var(--text-color);background-color:var(--foreground-color);border-width:1px;border-style:solid;border-color:var(--border-color);border-radius:7px;box-shadow:0 8px 16px color(srgb 0 0 0 / 0.14);--open-transition: 100 transform cubic-bezier(0.4, 0, 0.2, 1);--close-transition: 200 opacity cubic-bezier(0.4, 0, 0.2, 1);}x-menuitem{color:var(--text-color);border-radius:4px;--trigger-effect: none;}x-menuitem:focus{background-color:color(srgb 0 0 0 / 0.0373)}x-menuitem[expanded]{background-color:color(srgb 0 0 0 / 0.0373)}x-menuitem[pressed]:active{background-color:color(srgb 0 0 0 / 0.0241)}x-menu x-menuitem + x-menuitem{margin-top:4px}x-menuitem::part(checkmark){--path-data: var(--checkmark-path-data);}x-menuitem::part(arrow){--path-data: var(--arrow-right-path-data);}x-menuitem x-shortcut{color:color(srgb 0 0 0 / 0.6063);font-size:0.75rem}x-menubar > x-menuitem:hover{background-color:color(srgb 0 0 0 / 0.0373)}x-menubar > x-menuitem[highlighted]{color:color(srgb 1 1 1);background-color:var(--accent-color)}dialog{color:inherit;background-color:var(--foreground-color);border-width:0px;border-radius:8px;box-shadow:0px 4.8px 14.4px color(srgb 0 0 0 / 0.18), 0px 25.6px 57.6px color(srgb 0 0 0 / 0.22);transition-duration:120ms;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);--transition-type: grow;}dialog::backdrop{background-color:color(srgb 0 0 0 / 0.3)}dialog > footer{background-color:var(--background-color);border-top-width:1px;border-top-style:solid;border-top-color:var(--border-color)}dialog > footer > x-button{flex:1}x-pager{--prev-path-data: var(--arrow-left-path-data);--next-path-data: var(--arrow-right-path-data);--first-path-data: var(--double-arrow-left-path-data);--last-path-data: var(--double-arrow-right-path-data);}x-pager::part(item){color:var(--text-color);background-color:color(srgb 1 1 1 / 0.7);border-color:var(--border-color);border-radius:3px;font-weight:500}x-pager::part(item):hover{background-color:color(srgb 0.976 0.976 0.976 / 0.5)}x-pager::part(item):active{color:color(srgb 0 0 0 / 0.5);background-color:color(srgb 0.976 0.976 0.976 / 0.3)}x-pager::part(item):focus{outline-width:2px;outline-style:solid;outline-color:color(srgb 0 0 0 / 0.9);outline-offset:2px}x-pager::part(toggled-item){color:color(srgb 1 1 1);background-color:var(--accent-color);border-color:var(--accent-color)}x-pager::part(toggled-item):hover{background-color:var(--accent-color)}x-pager::part(toggled-item):active{color:color(srgb 1 1 1 / 0.7);background-color:oklch(from var(--accent-color) l c h / 80%)}x-popover{color:var(--text-color);background-color:var(--foreground-color);border-width:1px;border-style:solid;border-color:color(srgb 0.46 0.46 0.46 / 0.4);border-radius:4px;box-shadow:0px 8px 16px color(srgb 0 0 0 / 0.14);--arrow-size: 14px;--open-transition: none;}x-popover > footer{background-color:var(--background-color);border-top-width:1px;border-top-style:solid;border-top-color:var(--border-color)}x-notification{color:color(srgb 1 1 1);background-color:color(srgb 0.16 0.16 0.16);border-radius:4px;box-shadow:0 4px 8px color(srgb 0 0 0 / 0.14)}x-notification a{color:oklch(from var(--accent-color) calc(l + 0.15) c h)}x-notification a:hover{color:oklch(from var(--accent-color) calc(l + 0.15) c h)}x-notification a:active{color:oklch(from var(--accent-color) calc(l + 0.25) c h)}x-checkbox[disabled]{filter:saturate(0)}x-checkbox[disabled][toggled]{opacity:0.5}x-checkbox:focus{border-radius:2px;outline-width:2px;outline-style:solid;outline-color:color(srgb 0 0 0 / 0.9);outline-offset:2px}x-checkbox::part(indicator){color:color(srgb 0 0 0 / 0.6);background-color:color(srgb 0 0 0 / 0.024);border-width:1px;border-style:solid;border-color:color(srgb 0 0 0 / 0.6);border-radius:3px;--path-data: var(--checkmark-path-data);}x-checkbox[mixed]::part(indicator){--path-data: var(--mixed-checkmark-path-data);}x-checkbox:hover::part(indicator){background-color:color(srgb 0 0 0 / 0.0578)}x-checkbox:active::part(indicator){color:color(srgb 0 0 0 / 0.2169);background-color:color(srgb 0 0 0 / 0.0924);border-color:color(srgb 0 0 0 / 0.2169)}x-checkbox[toggled]::part(indicator){color:color(srgb 1 1 1);background-color:var(--accent-color);border-color:var(--accent-color)}x-checkbox[toggled]:hover::part(indicator){background-color:oklch(from var(--accent-color) l c h / 0.9);border-color:transparent}x-checkbox[toggled]:active::part(indicator){color:color(srgb 1 1 1 / 0.7);background-color:oklch(from var(--accent-color) l c h / 0.8);border-color:transparent}x-radio:focus{border-radius:2px;outline-width:2px;outline-style:solid;outline-color:color(srgb 0 0 0 / 0.9);outline-offset:2px}x-radio[disabled]{filter:saturate(0)}x-radio[disabled][toggled]{opacity:0.5}x-radio::part(indicator){background-color:color(srgb 0 0 0 / 0.0241);border-color:color(srgb 0 0 0 / 0.6063);border-width:1px;border-style:solid}x-radio:hover::part(indicator){background-color:color(srgb 0 0 0 / 0.0578)}x-radio:active::part(indicator){background-color:color(srgb 0 0 0 / 0.0924);border-color:color(srgb 0 0 0 / 0.2169)}x-radio[toggled]::part(indicator){background-color:var(--accent-color);border-color:transparent}x-radio[toggled]:hover::part(indicator){background-color:oklch(from var(--accent-color) l c h / 0.9)}x-radio[toggled]:active::part(indicator){background-color:oklch(from var(--accent-color) l c h / 0.8)}x-radio::part(indicator-dot){transform:scale(0.45);background-color:color(srgb 1 1 1);outline-width:2px;outline-style:solid;outline-color:color(srgb 0 0 0 / 0.1);visibility:hidden}x-radio[toggled]::part(indicator-dot){visibility:visible;transition-property:transform;transition-duration:0.333s;transition-timing-function:cubic-bezier(0, 0, 0, 1)}x-radio[toggled]:active::part(indicator-dot){transform:scale(0.33)}x-radio[mixed]::part(indicator-dot){height:16%;transform:scale(0.5);border-radius:3px}x-radio[mixed]:active::part(indicator-dot){transform:scale(0.5)}x-switch:focus{border-radius:2px;outline-width:2px;outline-style:solid;outline-color:color(srgb 0 0 0 / 0.9);outline-offset:2px}x-switch::part(indicator){width:34px;height:15px}x-switch::part(indicator-thumb){width:12px;height:12px;left:10px;transform:translate(-50%);background-color:color(srgb 0 0 0 / 0.6063);transition-property:left;transition-duration:0.187s;transition-timing-function:cubic-bezier(0.55, 0.55, 0, 1)}x-switch:active::part(indicator-thumb){width:16px;margin-left:2px}x-switch[toggled]::part(indicator-thumb){left:calc(100% - 10px);background-color:color(srgb 1 1 1)}x-switch[toggled]:active::part(indicator-thumb){margin-left:-2px}x-switch[mixed]::part(indicator-thumb){left:50%!important;margin-left:0}x-switch[size=\"small\"]::part(indicator-thumb){width:8px;height:8px;left:8px}x-switch[size=\"small\"]:active::part(indicator-thumb){width:12px}x-switch[size=\"small\"][toggled]::part(indicator-thumb){left:calc(100% - 8px)}x-switch[size=\"large\"]::part(indicator-thumb){width:14px;height:14px;left:12px}x-switch[size=\"large\"]:active::part(indicator-thumb){width:18px}x-switch[size=\"large\"][toggled]::part(indicator-thumb){left:calc(100% - 12px)}x-switch::part(indicator-track){height:100%;background-color:color(srgb 0 0 0 / 0.0241);border-color:color(srgb 0 0 0 / 0.6063);border-width:1px;border-style:solid;border-radius:999px}x-switch:hover::part(indicator-track){background-color:color(srgb 0 0 0 / 0.0578)}x-switch:active::part(indicator-track){background-color:color(srgb 0 0 0 / 0.0924)}x-switch[toggled]::part(indicator-track){background-color:var(--accent-color);border-color:transparent}x-switch[toggled]:hover::part(indicator-track){background-color:oklch(from var(--accent-color) l c h / 0.9)}x-switch[toggled]:active::part(indicator-track){background-color:oklch(from var(--accent-color) l c h / 0.8)}x-switch[toggled][disabled]::part(indicator-track){background-color:color(srgb 0 0 0 / 0.2169)}x-select{background-color:color(srgb 1 1 1 / 0.7);border-color:var(--border-color);border-width:1px;border-style:solid;border-radius:3px}x-select:hover{background-color:color(srgb 0.98 0.98 0.98 / 0.5)}x-select:active{color:color(srgb 0 0 0 / 0.6063);background-color:color(srgb 0.98 0.98 0.98 / 0.3)}x-select:focus{outline-width:2px;outline-style:solid;outline-color:color(srgb 0 0 0 / 0.9);outline-offset:2px}x-select[disabled]{opacity:0.5}x-select::part(arrow){width:16px;height:16px;margin:0 8px;--path-data: var(--arrow-down-path-data);}x-select x-menuitem[toggled]{background-color:color(srgb 0 0 0 / 0.0373)}x-select x-menuitem::part(checkmark){width:4px;margin:0 8px 0 -22px;color:var(--accent-color);--path-data: M 0 0 L 100 0 L 100 100 L 0 100 Z;}x-slider[disabled]{filter:saturate(0)}x-slider::part(groove-track){background-color:color(srgb 0 0 0 / 0.4458);border-radius:99px}x-slider::part(range-track){background-color:var(--accent-color);border-radius:99px}x-slider::part(thumb){background-color:var(--accent-color);border-color:color(srgb 1 1 1);border-width:4.5px;border-style:solid;border-radius:99px;outline-color:color(srgb 0 0 0 / 0.12);outline-width:1px;outline-style:solid;transition-property:border-width;transition-duration:0.187s;transition-timing-function:cubic-bezier(0.55, 0.55, 0, 1)}x-slider[dragging=\"start\"]::part(start-thumb), x-slider[dragging=\"end\"]::part(end-thumb){border-width:6px}x-slider::part(thumb):focus{outline-width:2px;outline-style:solid;outline-color:color(srgb 0 0 0 / 0.9)}x-slider::part(tick){background-color:color(srgb 0 0 0 / 0.4458)}x-input{background-color:color(srgb 1 1 1 / 0.7);border-color:var(--border-color);border-width:1px;border-style:solid;border-radius:3px}x-input:hover{background-color:color(srgb 0.98 0.98 0.98 / 0.5)}x-input:focus{background-color:color(srgb 1 1 1)}x-input[error]{--selection-color: white;--selection-background-color: var(--error-color);}x-input::before{position:absolute;left:0px;bottom:-1px;width:100%;height:1px;background-color:color(srgb 0 0 0 / 0.45);border-radius:0 0 4px 4px;content:\"\"}x-input:focus::before{height:2px;background-color:var(--accent-color)}x-input[error]::before{height:2px;background-color:var(--error-color)}x-input[disabled]::before{display:none}x-input > x-label{color:color(srgb 0 0 0 / 0.32)}x-numberinput{background-color:color(srgb 1 1 1 / 0.7);border-color:var(--border-color);border-width:1px;border-style:solid;border-radius:3px;line-height:1.5}x-numberinput:focus:has(x-stepper){padding-right:16px}x-numberinput:hover{background-color:color(srgb 0.98 0.98 0.98 / 0.5)}x-numberinput:focus{background-color:color(srgb 1 1 1)}x-numberinput[error]{--selection-color: white;--selection-background-color: var(--error-color);}x-numberinput::before{position:absolute;left:0px;bottom:-1px;width:100%;height:1px;background-color:color(srgb 0 0 0 / 0.45);border-radius:0 0 4px 4px;content:\"\"}x-numberinput:focus::before{height:2px;background-color:var(--accent-color)}x-numberinput[error]::before{height:2px;background-color:var(--error-color)}x-numberinput[disabled]::before{display:none}x-numberinput > x-label{color:color(srgb 0 0 0 / 0.32)}x-numberinput > x-stepper{width:16px;height:11px;padding:0;transform:translateX(-2px);background-color:transparent;border-width:0;pointer-events:none}x-numberinput:focus > x-stepper{position:absolute;right:-12px;width:26px;height:52px;padding:2px;z-index:1;color:color(srgb 0 0 0 / 0.8956);background-color:color(srgb 1 1 1);border-width:1px;border-style:solid;border-color:var(--border-color);border-radius:7px;pointer-events:all}x-numberinput[size=\"small\"]:not(:focus) > x-stepper{transform:scale(0.6)}x-numberinput[size=\"large\"]:not(:focus) > x-stepper{transform:scale(1.1) translateX(-2px)}x-numberinput:not(:focus) > x-stepper::part(increment-button), x-numberinput:not(:focus) > x-stepper::part(decrement-button){opacity:0.5}x-texteditor{background-color:color(srgb 1 1 1 / 0.7);border-color:var(--border-color);border-width:1px;border-style:solid;border-radius:3px;border-bottom-color:color(srgb 0 0 0 / 0.45)}x-texteditor:hover{background-color:color(srgb 0.98 0.98 0.98 / 0.5)}x-texteditor:focus{background-color:color(srgb 1 1 1);border-bottom-color:var(--border-color);box-shadow:0px -2px 0 0px inset var(--accent-color)}x-texteditor[error]{border-bottom-color:var(--border-color);box-shadow:0px -2px 0 0px inset var(--error-color)}x-texteditor[disabled]{border-bottom-color:var(--border-color);box-shadow:none}x-texteditor > x-label{color:color(srgb 0 0 0 / 0.32)}x-colorinput{background-color:color(srgb 1 1 1 / 0.7);border-width:1px;border-style:solid;border-color:var(--border-color);border-radius:3px}x-colorinput:hover{background-color:color(srgb 0.98 0.98 0.98 / 0.5)}x-colorinput:focus{background-color:color(srgb 1 1 1)}x-colorinput::before{position:absolute;left:0px;bottom:-1px;width:100%;height:1px;background-color:color(srgb 0 0 0 / 0.45);border-radius:0 0 4px 4px;content:\"\"}x-colorinput:focus::before{height:2px;background-color:var(--accent-color)}x-colorinput[error]::before{height:2px;background-color:var(--error-color)}x-colorinput[disabled]::before{display:none}x-colorinput > x-label{color:color(srgb 0 0 0 / 0.32)}x-colorinput::part(arrow){width:16px;height:16px;margin:0 2px 0 0;--path-data: var(--arrow-down-path-data);}x-colorinput x-menuitem[toggled]{background-color:color(srgb 0 0 0 / 0.05)}x-colorinput x-menuitem::part(checkmark){margin:0px 4px 0 -22px;color:var(--accent-color);--path-data: M 0 0 L 22 0 L 22 100 L 0 100 Z;}x-colorpicker::part(slider){border-radius:3px}x-colorselect{border-color:var(--border-color);border-width:1px;border-style:solid;border-radius:3px}x-colorselect:focus{outline-width:2px;outline-style:solid;outline-color:color(srgb 0 0 0 / 0.9);outline-offset:2px}x-colorinput::part(arrow){padding-left:0}x-progressbar{height:3px;border-radius:99px}x-progressbar::before{position:absolute;top:1px;width:100%;height:1px;background-color:color(srgb 0 0 0 / 0.6063);border-radius:99px;content:\"\"}x-progressbar::part(bar){background-color:var(--accent-color);border-radius:99px}x-throbber{color:var(--accent-color)}x-titlebar{padding-left:11px;justify-content:flex-start}x-titlebar::part(buttons){right:0;top:0}x-titlebar::part(button){padding:0 14px;color:var(--text-color)}x-titlebar::part(button):hover{background-color:color(srgb 0 0 0 / 0.04)}x-titlebar::part(button):active{color:color(srgb 0 0 0 / 0.6063);background-color:color(srgb 0 0 0 / 0.03)}x-titlebar::part(minimize-button){--path-data: var(--minimize-path-data);}x-titlebar::part(maximize-button){--path-data: var(--maximize-path-data);}x-titlebar::part(restore-button){--path-data: var(--restore-path-data);}x-titlebar::part(close-button){--path-data: var(--clear-path-data);}x-titlebar::part(close-button):hover{color:color(srgb 1 1 1);background-color:color(srgb 0.77 0.16 0.11)}x-titlebar::part(close-button):active{color:color(srgb 1 1 1 / 0.7);background-color:color(srgb 0.77 0.16 0.11 / 0.8)}x-titlebar::part(icon){width:16px;height:16px}\n"
  },
  {
    "path": "src/renderer/public/xel/themes/material-dark.css",
    "content": ":root{width:100%;height:100%;margin:0;interpolate-size:allow-keywords;font-family:sans-serif;line-height:1.6}body{width:100vw;height:100%;margin:0;overflow-y:overlay}h1{margin:22px 0 16px;box-sizing:border-box;line-height:1;font-size:3.25rem;font-weight:700}h2{margin:18px 0 14px 0;box-sizing:border-box;line-height:1;font-size:2.125rem;font-weight:700}h3{margin:16px 0 12px 0;box-sizing:border-box;line-height:1.2;font-size:1.75rem;font-weight:700}h4{margin:14px 0 10px 0;box-sizing:border-box;line-height:1.1;font-size:1.5rem;font-weight:700}h5{margin:12px 0 8px 0;box-sizing:border-box;line-height:1.1;font-size:1.25rem;font-weight:700}h6{margin:8px 0 5px 0;box-sizing:border-box;line-height:1.1;font-size:1rem;font-weight:700}h1 em, h2 em, h3 em, h4 em, h5 em, h6 em{font-weight:inherit}h1 strong, h2 strong, h3 strong, h4 strong, h5 strong, h6 strong{font-weight:900}p{margin:16px 0}p:last-child{margin-bottom:0}a{font-weight:500}table{width:100%;margin:16px 0;border-collapse:collapse;border-style:hidden;box-shadow:0 0 0 1px var(--border-color)}th{text-align:start;padding:8px 14px;border-spacing:0}td{padding:8px 14px;border-spacing:0}em{font-weight:500}pre, code, var{font-size:0.875rem;font-style:normal;padding:0 4px}pre{margin:14px 0;padding:4px 6px;white-space:pre-wrap;box-sizing:border-box}pre > code{display:block;padding:0;box-sizing:border-box;background-color:transparent;outline-width:0px;line-height:1.3}hr{width:100%;height:1px;min-height:1px;margin:24px 0;box-sizing:border-box;border:none}blockquote{box-sizing:border-box;margin:16px 0;padding:5px 14px;border-left-width:8px;border-left-style:solid}blockquote > blockquote{margin:6px 0}blockquote > p:first-child{margin-top:0}ul, ol{margin:12px 0;padding:0}p + ul{margin:-10px 0 0 0}li > ul, li > ol{margin:0}li{position:relative;margin:0;padding:0}ul li{margin-left:20px}ol li{margin-left:16px}li > p{margin:4px 0}ol > li::marker{font-weight:700}img{display:block;height:auto;margin:14px auto;max-width:100%;user-select:none;box-sizing:border-box;background:var(--checkboard-background);border-width:1px;border-style:solid;border-color:var(--border-color);-webkit-user-select:none;-webkit-user-modify:read-only}img:active{cursor:-webkit-grabbing}[popover]{color:var(--text-color);background-color:var(--foreground-color)}::-webkit-scrollbar{max-width:6px;max-height:6px}::-webkit-scrollbar-corner{display:none}@supports not selector(::-webkit-scrollbar){*{scrollbar-width:thin}}x-card:not(:defined){display:none}x-card > footer{padding:8px 16px;width:calc(100% + 40px);height:calc(100% + 20px);margin-left:-20px;margin-bottom:-16px;box-sizing:border-box;background:lightgrey}x-card > footer:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}x-card > footer:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}x-card > h1:first-child{margin-top:0}x-card > h2:first-child{margin-top:0}x-card > h3:first-child{margin-top:0}x-card > h4:first-child{margin-top:0}x-card > h5:first-child{margin-top:0}x-card > h6:first-child{margin-top:0}x-avatar[size=\"small\"]{width:28px;height:28px}x-avatar[size=\"large\"]{width:54px;height:54px}x-avatar > img{width:100%;height:100%;-webkit-user-drag:none}x-avatar > x-icon{width:55%;height:55%}x-avatar > x-label{font-size:1rem;pointer-events:none}x-avatar[size=\"small\"] > x-label{font-size:0.75rem}x-avatar[size=\"large\"] > x-label{font-size:1.5rem}x-accordion:not(:defined){display:none}x-accordion[size=\"small\"]::part(arrow){width:14px;height:14px}x-accordion[size=\"large\"]::part(arrow){width:18px;height:18px}x-accordion > header{display:flex;align-items:center;box-sizing:border-box;width:100%;padding:7px 0 7px 20px}x-accordion[size=\"small\"] > header{padding-left:18px}x-accordion[size=\"large\"] > header{padding-left:22px}x-accordion > header > x-label:first-child{flex:1}x-accordion > header > *:not(:last-child){margin-right:20px}x-accordion:not([expanded]):not([animating]) > *:not(header){display:none!important}x-icon[size=\"small\"]{width:15px;height:15px}x-icon[size=\"large\"]{width:21px;height:21px}x-icon:not(:defined){display:none}x-label:not(:defined){display:none}x-shortcut:not(:defined){display:none}x-stepper:not(:defined){display:none}x-swatch[size=\"small\"]{width:16px;height:16px}x-swatch[size=\"large\"]{width:20px;height:20px}x-swatch:not(:defined){display:none}x-button{--min-pressed-time: 150ms;}@media (pointer:coarse){x-button{--min-pressed-time: 600ms;}}a:has(x-button){text-decoration:none}x-button[toggled]{z-index:1}x-button[condensed]{padding:2px 7px}x-button[size=\"small\"]{min-height:24px}x-button[size=\"large\"]{min-height:38px}x-buttons[vertical] > x-button{width:100%;justify-content:flex-start}x-button:not(:defined){display:none}x-button > x-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;text-align:center;min-width:1px;pointer-events:none}x-button > x-label ~ x-icon, x-button > x-icon ~ x-label{margin:0 0 0 6px}x-button > x-menu{font-size:0.875rem}x-button[skin=\"normal\"][size=\"small\"] > x-icon{width:14px;height:14px}x-button[skin=\"normal\"][size=\"large\"] > x-icon{width:20px;height:20px}x-button[skin=\"flat\"]{padding:0}x-buttons:not([vertical]) > x-button[skin=\"flat\"]:not(:first-of-type){margin-left:10px}x-buttons:not([vertical]) > x-button[skin=\"flat\"][size=\"small\"]:not(:first-of-type){margin-left:5px}x-buttons[vertical] > x-button[skin=\"flat\"]:not(:first-of-type){margin-top:10px}x-buttons[vertical] > x-button[skin=\"flat\"][size=\"small\"]:not(:first-of-type){margin-top:5px}x-button[skin=\"flat\"] > x-icon{width:26px;height:26px}x-button[skin=\"flat\"][size=\"small\"] > x-icon{width:22px;height:22px}x-button[skin=\"flat\"][size=\"large\"] > x-icon{width:28px;height:28px}x-button[skin=\"recessed\"]{min-height:18px;padding:4px 8px}x-button[skin=\"recessed\"][size=\"small\"]{padding:3px 8px}x-button[skin=\"recessed\"][size=\"large\"]{padding:5px 8px}x-buttons:not([vertical]) > x-button[skin=\"recessed\"] + x-button[skin=\"recessed\"]{margin-left:4px}x-buttons[vertical] > x-button[skin=\"recessed\"] + x-button[skin=\"recessed\"]{margin-top:4px}x-button[skin=\"recessed\"] > x-icon{width:16px;height:16px}x-button[skin=\"recessed\"][size=\"small\"] > x-icon{width:12px;height:12px}x-button[skin=\"recessed\"][size=\"large\"] > x-icon{width:20px;height:20px}x-button[skin=\"dock\"], x-buttons[vertical] > x-button[skin=\"dock\"]{width:38px;height:38px;min-height:38px;padding:0;justify-content:center}x-button[skin=\"dock\"][size=\"small\"], x-buttons[vertical] > x-button[skin=\"dock\"][size=\"small\"]{width:30px;height:30px;min-height:30px}x-button[skin=\"dock\"][size=\"large\"], x-buttons[vertical] > x-button[skin=\"dock\"][size=\"large\"]{width:45px;height:45px;min-height:45px}x-buttons:not([vertical]) > x-button[skin=\"dock\"] + x-button[skin=\"dock\"]{margin-left:-1px}x-buttons[vertical] > x-button[skin=\"dock\"] + x-button[skin=\"dock\"]{margin-top:-1px}x-button[skin=\"dock\"] > x-icon{width:17px;height:17px}x-button[skin=\"dock\"][size=\"small\"] > x-icon{width:14px;height:14px}x-button[skin=\"dock\"][size=\"large\"] > x-icon{width:20px;height:20px}x-buttons[vertical]{flex-flow:column;align-items:flex-start;justify-content:center}x-buttons:not(:defined){display:none}x-tag[size=\"small\"]{height:18px}x-tag[size=\"large\"]{height:30px}x-tag:not(:defined){display:none}x-tag > x-swatch{width:14px;height:14px}x-tag[size=\"small\"] > x-swatch{width:12px;height:12px}x-tag[size=\"large\"] > x-swatch{width:16px;height:16px}x-tag > x-label{font-size:0.75rem}x-tag :not(x-label) + x-label{margin-left:0.25rem}x-tag[size=\"small\"] > x-label{font-size:0.6875rem}x-tag > x-icon{width:15px;height:15px}x-tags{margin-top:-2px;margin-left:-2px}x-tags:not(:defined){display:none}x-tags x-tag{margin:2px}x-tagsinput[size=\"small\"]{padding:0px;gap:0px}x-tagsinput[size=\"small\"] > x-tag{height:22px;transform:scale(0.92)}x-tagsinput[size=\"large\"]{padding:6px;gap:6px}x-tagsinput:focus-within{z-index:10}x-tagsinput:not(:defined){display:none}x-tagsinput > x-label{position:absolute;top:50%;left:8px;transform:translateY(-50%);pointer-events:none}x-tagsinput[size=\"small\"][error]::before{top:27px}x-tagsinput[size=\"large\"][error]::before{top:41px}x-tab[size=\"small\"]{min-height:24px}x-tab[size=\"large\"]{min-height:38px}x-tab:not(:defined){display:none}x-tab x-icon{width:17px;height:17px;min-width:17px;color:inherit}x-tab[size=\"small\"] x-icon{width:15px;height:15px;min-width:15px}x-tab[size=\"large\"] x-icon{width:19px;height:19px;min-width:19px}x-tab x-label{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;line-height:1.2;cursor:inherit;flex:1}x-tab x-icon + x-label{margin-left:6px}x-tab x-box:is([vertical]) x-icon + x-label{margin-left:0px}x-tabs:not(:defined){display:none}x-menu:not(:defined){display:none}x-menu:has(x-menu[opened]){overflow:-webkit-paged-x}x-menu img{margin:0;background:none;border:none}x-menu hr{width:100%;height:1px;margin:4px 0px;box-sizing:border-box}x-menu hr + hr, x-menu hr:last-child{display:none}x-menuitem[size=\"small\"]{min-height:24px}x-menuitem[size=\"large\"]{min-height:38px}x-menuitem:not(:defined){display:none}x-menuitem[highlighted]{color:white;background:var(--accent-color)}x-menuitem img{width:16px;height:16px}x-menuitem x-icon{width:16px;height:16px}x-menuitem x-label{display:block;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:inherit;line-height:1.4}x-menuitem img + x-label, x-menuitem x-swatch + x-label, x-menuitem x-icon + x-label{margin-left:8px}x-menuitem x-shortcut{margin-left:auto}x-menuitem x-label + x-shortcut{margin-left:8px}x-menubar[size=\"small\"]{height:30px}x-menubar[size=\"large\"]{height:42px}x-menubar:not(:defined){display:none}x-menubar > x-menuitem{height:100%;padding:0 11px;min-height:0}x-menubar > x-menuitem[autohidden]{display:none}x-navitem + x-navitem, a:has(x-navitem) + a:has(x-navitem), a:has(x-navitem) + x-navitem, x-navitem + a:has(x-navitem){margin:3px 0}x-nav x-nav > *:first-child{margin-top:3px}x-nav x-nav > *:last-child{margin-bottom:0}x-nav x-nav > *{margin-left:34px!important}x-nav x-nav > *{max-width:calc(100% - 34px)!important}x-nav > a{display:block;text-decoration:none}x-nav x-label{max-width:100%;flex:1 1 0%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:500;font-size:0.9375rem;text-align:start}x-nav x-icon + x-label{margin-left:14px}x-nav[collapsed] x-navitem > x-label{display:none}x-nav x-icon{width:20px;height:20px}x-nav x-label + x-icon{width:18px;height:18px;margin:0 0 0 10px}x-nav[collapsed] x-navitem > x-label + x-icon{display:none}x-nav[collapsed] x-navitem::part(button){padding:0}x-nav[collapsed] x-navitem::part(arrow){display:none}x-contextmenu:not(:defined){display:none}dialog{overflow:hidden;position:fixed;min-width:200px;min-height:100px;max-height:none;margin:auto;padding:20px 24px;box-sizing:border-box;font-size:0.8125rem;line-height:1.6}dialog:focus{outline:none}dialog:not(:defined){display:none}dialog > footer{display:flex;flex-flow:row;justify-content:flex-end;padding:12px 24px;width:calc(100% + 48px);height:calc(100% + 22px);margin-top:10px;margin-left:-24px;margin-bottom:-20px;box-sizing:border-box;background:lightgrey}dialog > footer:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}dialog > footer:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}dialog > footer x-button + x-button{margin-left:8px}dialog h3{font-size:1.125rem;font-weight:700}dialog > *:first-child{margin-top:0}x-popover{padding:12px;overflow:auto}x-popover:has(footer){overflow:hidden}x-popover:not(:defined){display:none}x-popover > footer{padding:12px;width:calc(100% + 24px);height:calc(100% + 12px);margin-left:-12px;margin-bottom:-12px;margin-top:12px;box-sizing:border-box;background:lightgrey}x-popover > footer:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}x-popover > footer:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}x-notification[size=\"small\"]{padding:3px 12px}x-notification[size=\"large\"]{padding:8px 12px}x-notification:not(:defined){display:none}x-notification > p{margin:0}x-checkbox:not(:defined){display:none}x-checkbox + x-checkbox{margin-top:6px}x-checkbox[size=\"small\"]::part(indicator){width:17px;height:17px}x-checkbox[size=\"large\"]::part(indicator){width:21px;height:21px}x-checkbox > x-label{display:block;margin-left:8px;padding:1px 0}x-radio + x-radio{margin-top:6px}x-radio:not(:defined){display:none}x-radio[size=\"small\"]::part(indicator){width:17px;height:17px}x-radio[size=\"large\"]::part(indicator){width:21px;height:21px}x-radio > x-label{margin:0 0 0 8px;padding:1px 0}x-radio[size=\"small\"] > x-label{margin-left:6px}x-radio[size=\"large\"] > x-label{margin-left:10px}x-radios:not(:defined){display:none}x-switch + x-switch{margin-top:12px}x-switch:not(:defined){display:none}x-switch[size=\"large\"]::part(indicator){width:42px;height:20px}x-switch[size=\"small\"]::part(indicator){width:28px;height:12px}x-switch > x-label{margin:0 0 0 8px;padding:1px 0}x-switch[size=\"small\"] > x-label{margin-left:6px}x-switch[size=\"large\"] > x-label{margin-left:10px}x-select[size=\"small\"]{height:24px}x-select[size=\"large\"]{height:38px}x-select:not(:defined){display:none}x-colorselect[size=\"small\"]{width:24px;height:24px}x-colorselect[size=\"large\"]{width:38px;height:38px}x-colorselect:not(:defined){display:none}x-input[size=\"small\"]{height:24px}x-input[size=\"large\"]{height:38px}x-input:not(:defined){display:none}x-input + x-input{margin-top:20px}x-input > x-icon{width:15px;height:15px;min-width:15px;margin:0 0 0 8px}x-input[size=\"small\"] > x-icon{transform:scale(0.8)}x-input[size=\"large\"] > x-icon{transform:scale(1.1)}x-input > x-icon:hover{cursor:default}x-input > x-label{display:none;position:absolute;top:50%;max-width:100%;padding:0 5px 0 5px;transform:translateY(-50%);font-family:inherit;font-size:inherit;line-height:inherit;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;pointer-events:none}x-input[empty] > x-label{display:block}x-input > x-icon + x-label{padding:0 5px 0 29px}x-numberinput[size=\"small\"]{height:24px}x-numberinput[size=\"large\"]{height:38px}x-numberinput:focus{z-index:10}x-numberinput:not(:defined){display:none}x-numberinput > x-label{display:none;position:absolute;top:50%;max-width:100%;padding:0 5px 0 5px;transform:translateY(-50%);font-family:inherit;font-size:inherit;line-height:inherit;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;pointer-events:none}x-numberinput[empty] > x-label{display:block}x-numberinput[size=\"small\"][error]::before{top:27px}x-numberinput[size=\"large\"][error]::before{top:41px}x-texteditor:focus{z-index:10}x-texteditor:not(:defined){display:none}x-texteditor > x-label{display:none;position:absolute;width:100%;top:0;left:0;padding:2px 6px;font-family:inherit;font-size:inherit;line-height:inherit;pointer-events:none}x-texteditor[empty] > x-label{display:block}x-slider:not(:defined){display:none}x-colorpicker:not(:defined){display:none}x-progressbar[size=\"small\"]{height:6px}x-progressbar[size=\"large\"]{height:10px}x-progressbar:not(:defined){display:none}x-throbber[size=\"small\"]{width:26px;height:26px}x-throbber[size=\"large\"]{width:34px;height:34px}x-throbber:not(:defined){display:none}x-titlebar x-icon + x-label{margin-left:6px}:root{color:var(--material-on-surface-color);background-color:var(--background-color);font-family:\"Roboto Flex\", \"Roboto\", \"Helvetica Neue\", \"Noto Sans\", \"Arial\", sans-serif;font-weight:400;--theme-id:                  \"material\";--preset-accent-colors:       blue     lch(39.4 36.3 272),\n                                purple   lch(39.7 39.4 303),\n                                pink     lch(39.9 35.8 329),\n                                red      lch(40.4 34 8.23),\n                                orange   lch(40.5 47.5 58.6),\n                                yellow   lch(40.2 47 88.5),\n                                green    lch(40 36.9 134),\n                                gray     lch(40.4 7.86 199);--accent-color:               lch(39.4 36.3 272);--background-color:           var(--material-surface-container-color);--foreground-color:           var(--material-surface-color);--border-color:               var(--material-outline-variant-color);--text-color:                 var(--material-on-surface-color);--error-color:                var(--material-error-color);--selection-color:            currentColor;--selection-background-color: var(--material-secondary-fixed-dim-color);--autofill-background-color:  color(srgb 0.95 0.93 0.89);--titlebar-color:             auto;--autocapitalize:             titlecase;--checkboard-background:      linear-gradient( 45deg, #ffffff 25%, #0000   25%)  0px  0px / 10px 10px,\n                                linear-gradient(-45deg, #ffffff 25%, #0000   25%)  0px  5px / 10px 10px,\n                                linear-gradient( 45deg, #0000   75%, #ffffff 75%)  5px -5px / 10px 10px,\n                                linear-gradient(-45deg, #0000   75%, #ffffff 75%) -5px  0px / 10px 10px, var(--material-surface-dim-color);--arrow-right-path-data: M 29.88 90.25 L 29.88 9.75 L 70.12 50 L 29.88 90.25 Z;--arrow-up-path-data: M 9.75 70.12 L 90.25 70.12 L 50 29.88 L 9.75 70.12 Z;--arrow-down-path-data: M 9.75 29.88 L 90.25 29.88 L 50 70.12 L 9.75 29.88 Z;--checkmark-path-data: M 36.76 81.11 L 10.29 54.64 L 19.55 45.36 L 36.76 62.58 L 80.45 18.89 L 89.71 28.16 L 36.76 81.11 Z;--mixed-checkmark-path-data: M 13 50 C 13.1 54.5 16.8 57.2 21.3 57.2 L 78.6 57.2 C 83.1 57.2 86.8 54.5 86.9 50 C 86.9 45.4 83.2 42.7 78.6 42.7 L 21.3 42.7 C 16.7 42.7 13 45.4 13 50 Z;--clear-path-data: M 25 16 L 50 41 L 75 16 L 84 25 L 59 50 L 84 75 L 75 84 L 50 59 L 25 84 L 16 75 L 41 50 L 16 25 Z;--plus-path-data: M 58 10 L 58 42 L 90 42 L 90 58 L 58 58 L 58 90 L 42 90 L 42 58 L 10 58 L 10 42 L 42 42 L 42 10 Z;--minus-path-data: M 10 42 H 90 V 58 H 10 V 42 Z;--minimize-path-data: M 18 72 L 82 72 L 82 82 L 18 82 L 18 72 Z;--maximize-path-data: M 18 18 L 82 18 L 82 82 L 18 82 L 18 18 Z M 72 28 L 28 28 L 28 72 L 72 72 L 72 28 Z;--restore-path-data: M 41.71 21.24 L 85.71 21.24 L 85.71 64.24 L 41.71 64.24 L 41.71 21.24 Z M 75.71 31.24 L 51.71 31.24 L 51.71 54.24 L 75.71 54.24 L 75.71 31.24 Z M 65 73 L 65 83 L 24 83 L 24 42 L 34 42 L 34 73 L 65 73 Z;--close-path-data: M 19.95 72.98 L 42.93 50 L 19.95 27.02 L 27.02 19.95 L 50 42.93 L 72.98 19.95 L 80.05 27.02 L 57.07 50 L 80.05 72.98 L 72.98 80.05 L 50 57.07 L 27.02 80.05 L 19.95 72.98 Z;--material-elevation-1:                  0px 1px  2px 0px rgba(0, 0, 0, 0.30), 0px 1px 3px 1px rgba(0, 0, 0, 0.15);--material-elevation-2:                  0px 1px  2px 0px rgba(0, 0, 0, 0.30), 0px 3px 4px 0px rgba(0, 0, 0, 0.14);--material-elevation-3:                  0px 4px  8px 3px rgba(0, 0, 0, 0.15), 0px 1px 3px 0px rgba(0, 0, 0, 0.30);--material-elevation-4:                  0px 6px 10px 4px rgba(0, 0, 0, 0.15), 0px 2px 3px 0px rgba(0, 0, 0, 0.30);--material-elevation-5:                  0px 8px 12px 6px rgba(0, 0, 0, 0.15), 0px 4px 4px 0px rgba(0, 0, 0, 0.30);--material-easing-emphasized:            cubic-bezier( 0.2, 0.0,   0,  1.0);--material-easing-emphasized-decelerate: cubic-bezier(0.05, 0.7, 0.1,  1.0);--material-easing-emphasized-accelerate: cubic-bezier( 0.3, 0.0, 0.8, 0.15);--material-easing-standard:              cubic-bezier( 0.2, 0.0,   0,  1.0);--material-easing-standard-decelerate:   cubic-bezier(   0,   0,   0,    1);--material-easing-standard-accelerate:   cubic-bezier( 0.3,   0,   1,    1);--material-motion-duration-short-1:        50ms;--material-motion-duration-short-2:       100ms;--material-motion-duration-short-3:       150ms;--material-motion-duration-short-4:       200ms;--material-motion-duration-medium-1:      250ms;--material-motion-duration-medium-2:      300ms;--material-motion-duration-medium-3:      350ms;--material-motion-duration-medium-4:      400ms;--material-motion-duration-long-1:        450ms;--material-motion-duration-long-2:        500ms;--material-motion-duration-long-3:        550ms;--material-motion-duration-long-4:        600ms;--material-motion-duration-extra-long-1:  700ms;--material-motion-duration-extra-long-2:  800ms;--material-motion-duration-extra-long-3:  900ms;--material-motion-duration-extra-long-4: 1000ms;}h1, h2, h3, h4, h5, h6{color:var(--material-on-background-color)}a{color:var(--material-primary-color);text-decoration:underline}a:focus{border-radius:2px;outline-width:3px;outline-style:solid;outline-color:var(--material-primary-color)}a:hover{color:var(--material-on-primary-container-color)}pre, code, var{background-color:var(--material-surface-container-low-color);font-family:\"Roboto Mono\", \"Noto Sans Mono\", ui-monospace, monospace}pre{border-radius:12px}code, var{border-radius:4px}blockquote{border-color:var(--material-tertiary-color)}mark, ::highlight(mark){color:inherit;background-color:color(srgb 0.96 0.83 0.18)}hr{background-color:var(--material-outline-variant-color)}table{border-radius:8px;border-style:hidden;box-shadow:0 0 0 1px var(--material-outline-variant-color)}th, td{border-width:1px;border-style:solid;border-color:var(--material-outline-variant-color)}::selection{color:var(--selection-color);background-color:var(--selection-background-color)}::-webkit-scrollbar{background-color:transparent}::-webkit-scrollbar-thumb{background-color:var(--material-outline-variant-color);border-radius:25px}::-webkit-scrollbar-thumb:hover{background-color:var(--material-outline-color)}@supports not selector(::-webkit-scrollbar){*{scrollbar-color:var(--material-outline-variant-color) transparent}}x-avatar{background-color:var(--material-surface-container-highest-color);border-width:0px;border-radius:999px}x-avatar > x-label{font-weight:700}x-card{background-color:var(--material-surface-color);border-width:1px;border-style:solid;border-color:var(--material-outline-variant-color);border-radius:12px}x-card > footer{background-color:var(--material-surface-container-color);border-top-width:1px;border-top-style:solid;border-top-color:var(--material-outline-variant-color)}x-accordion::part(arrow){color:var(--material-on-surface-variant-color);--path-data: var(--arrow-right-path-data);}x-accordion::part(arrow):focus{border-radius:2px;outline-width:3px;outline-style:solid;outline-color:var(--material-primary-color)}x-accordion > header > x-label{color:var(--material-on-secondary-container-color);font-weight:700}x-tooltip{color:var(--material-on-surface-inverse-color);background-color:var(--material-surface-inverse-color);border-width:0px;border-radius:4px}x-stepper{width:40px;height:70px;background-color:var(--material-surface-container-color);border-radius:4px;box-shadow:var(--material-elevation-2)}x-stepper::part(increment-button), x-stepper::part(decrement-button){color:var(--material-on-surface-variant-color)}x-stepper::part(increment-button):hover, x-stepper::part(decrement-button):hover{background-color:oklch(from var(--material-on-surface-color) l c h / 0.08)}x-stepper[pressed=\"increment\"]::part(increment-button), x-stepper[pressed=\"decrement\"]::part(decrement-button){background-color:oklch(from var(--material-on-secondary-container-color) l c h / 0.1)}x-stepper::part(increment-arrow), x-stepper::part(decrement-arrow){width:18px;height:18px}x-stepper::part(increment-arrow){--path-data: var(--arrow-up-path-data);}x-stepper::part(decrement-arrow){--path-data: var(--arrow-down-path-data);}x-swatch{border-color:var(--material-outline-variant-color);border-radius:99px}x-button:focus{outline-width:3px;outline-style:solid;outline-color:var(--material-primary-color);outline-offset:-1px}x-button::before{display:none;position:absolute;top:0;left:0;width:100%;height:100%;content:\"\";pointer-events:none;border-radius:inherit}x-button > x-label{font-weight:500}x-button[skin=\"normal\"]{color:var(--material-on-surface-color);border-style:solid;border-width:1px;border-color:var(--material-outline-color);border-radius:10px}x-button[skin=\"normal\"][toggled]{color:var(--material-on-primary-color);background-color:var(--material-primary-color);border-color:transparent}x-button[skin=\"normal\"][toggled]:focus{outline-offset:1px}x-button[skin=\"normal\"]:hover::before,x-button[skin=\"normal\"][expanded]::before{display:block;background-color:var(--material-on-surface-color);opacity:0.08}x-button[skin=\"normal\"]:focus::before{display:block;background-color:var(--material-primary-color);opacity:0.1}x-button[skin=\"normal\"][pressed]::before{display:block;background-color:var(--material-on-secondary-container-color);opacity:0.1}x-button[skin=\"normal\"][toggled]:hover::before{display:block;background-color:var(--material-on-secondary-container-color);opacity:0.08}x-button[skin=\"normal\"][toggled][pressed]::before{display:block;background-color:var(--material-on-secondary-container-color);opacity:0.1}:is(x-buttons:not([vertical]) > x-button[skin=\"normal\"]):not(:first-of-type){border-top-left-radius:0;border-bottom-left-radius:0}:is(x-buttons:not([vertical]) > x-button[skin=\"normal\"]):not(:last-of-type){border-top-right-radius:0;border-bottom-right-radius:0}:is(x-buttons:not([vertical]) > x-button[skin=\"normal\"]) + x-button[skin=\"normal\"]{margin-left:-1px}:is(x-buttons[vertical] > x-button[skin=\"normal\"]){border-radius:8px}:is(x-buttons[vertical] > x-button[skin=\"normal\"]):not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}:is(x-buttons[vertical] > x-button[skin=\"normal\"]):not(:last-of-type){border-bottom-left-radius:0;border-bottom-right-radius:0}:is(x-buttons[vertical] > x-button[skin=\"normal\"]) + x-button[skin=\"normal\"]{margin-top:-1px}x-button[skin=\"flat\"]{color:var(--material-on-surface-variant-color)}x-button[skin=\"flat\"]:hover{color:var(--material-on-surface-color)}x-button[skin=\"flat\"][toggled],x-button[skin=\"flat\"][expanded]{color:var(--material-primary-color)}x-button[skin=\"flat\"][pressed]{color:var(--material-on-primary-container-color)}x-button[skin=\"recessed\"]{color:var(--material-on-surface-color);border-radius:8px}x-button[skin=\"recessed\"][toggled]{color:var(--material-on-primary-fixed-color);background-color:var(--material-primary-fixed-dim-color)}x-button[skin=\"recessed\"]:hover::before{display:block;background-color:var(--material-on-secondary-container-color);opacity:0.08}x-button[skin=\"recessed\"][pressed]::before{display:block;background-color:var(--material-on-secondary-container-color);opacity:0.1}x-button[skin=\"recessed\"] > x-label{font-size:0.75rem;text-align:center}x-button[skin=\"dock\"]{color:var(--material-on-surface-color);background-color:var(--material-surface-bright-color);border-width:1px;border-style:solid;border-color:var(--material-outline-variant-color)}x-button[skin=\"dock\"][toggled]{color:var(--material-on-surface-inverse-color);background-color:var(--material-primary-color);border-color:var(--material-on-primary-fixed-variant-color);z-index:1}x-button[skin=\"dock\"]:hover::before{display:block;background-color:var(--material-on-surface-color);opacity:0.08}x-button[skin=\"dock\"][toggled]:hover::before{display:none}x-button[skin=\"dock\"][pressed]::before,x-button[skin=\"dock\"][toggled][pressed]::before{display:block;background-color:var(--material-on-secondary-container-color);opacity:0.1}x-tag{color:var(--material-on-surface-variant-color);background-color:var(--material-surface-container-low-color);border-width:1px;border-tyle:solid;border-color:var(--material-outline-variant-color);border-radius:8px;position:relative}x-tag:hover{color:var(--material-on-surface-color)}x-tag:focus{outline-width:3px;outline-style:solid;outline-color:var(--material-primary-color);outline-offset:-1px}x-tag[scoped]::part(main){background-color:var(--material-surface-container-low-color)}x-tag[toggled]{color:var(--material-on-primary-color);background-color:var(--material-primary-color);border-color:transparent}x-tag[toggled]:hover{filter:brightness(0.95)}x-tag[toggled]:focus{outline-offset:1px}x-tag::before{display:none;position:absolute;top:0;left:0;width:100%;height:100%;content:\"\";pointer-events:none;z-index:1}x-tag:hover::before{display:block;background-color:oklch(from var(--material-on-surface-color) l c h / 0.08)}x-tag:active::before{display:block;background-color:oklch(from var(--material-on-surface-color) l c h / 0.1)}x-tag::part(remove-button){--path-data: var(--clear-path-data);}x-tag::part(scope){border-color:var(--material-outline-variant-color)}x-tag[toggled]::part(scope){color:var(--material-on-surface-color);border-color:var(--material-primary-color)}x-tag > x-icon{color:var(--material-primary-color)}x-tag[toggled] > x-icon{color:var(--material-on-primary-color)}x-tagsinput{color:var(--material-on-surface-color);border-width:1px;border-style:solid;border-color:var(--material-outline-color);border-radius:4px}x-tagsinput:hover{border-color:var(--material-on-surface-color)}x-tagsinput:focus{outline-width:3px;outline-style:solid;outline-color:var(--material-primary-color);outline-offset:-1px}x-tagsinput[error]{outline-width:3px;outline-style:solid;outline-color:var(--material-error-color);outline-offset:-1px;--selection-background-color: oklch(from var(--material-error-color) l c h / 0.2);}x-tagsinput > x-tag{background-color:transparent}x-tagsinput > x-label{color:oklch(from var(--material-on-surface-variant-color) l c h / 0.7);font-weight:400}x-tabs{color:var(--material-on-surface-variant-color);background-color:var(--material-surface-color);border-width:1px;border-style:solid;border-color:var(--material-surface-variant-color)}x-tab:hover, x-tab:focus{color:var(--material-on-surface-color);background-color:oklch(from var(--material-on-surface-color) l c h / 0.08)}x-tab[pressed]{background-color:oklch(from var(--material-on-surface-color) l c h / 0.1)}x-tab[toggled]{color:var(--material-on-surface-color)}x-tab::part(selection-indicator){margin-bottom:-0.5px;width:100%;height:2px;background-color:var(--material-primary-color);transition-timing-function:var(--material-easing-standard);transition-duration:var(--material-motion-duration-short-2)}x-navitem:focus{outline-width:0px}x-navitem::part(button){position:relative;color:var(--material-on-surface-color);border-radius:99px}x-navitem[toggled]::part(button){background-color:var(--material-secondary-container-color)}x-navitem:focus::part(button){outline-width:3px;outline-style:solid;outline-color:var(--material-primary-color);outline-offset:-1px}x-navitem::part(button)::before{display:none;position:absolute;width:100%;height:100%;border-radius:99px;content:\"\";pointer-events:none}x-navitem::part(button):hover::before{display:block;background-color:var(--material-on-surface-color);opacity:0.08}x-navitem[pressed]::part(button):hover::before{display:block;background-color:var(--material-on-secondary-container-color);opacity:0.1}x-navitem[toggled]::part(button):hover::before{display:block;background-color:var(--material-on-secondary-container-color);opacity:0.08}x-navitem[toggled][pressed]::part(button):hover::before{display:block;background-color:var(--material-on-secondary-container-color);opacity:0.1}x-navitem > x-label{color:var(--material-on-surface-variant-color);font-weight:500}x-navitem[toggled] > x-label{color:var(--material-on-secondary-container-color)}x-navitem::part(arrow){color:var(--material-on-surface-variant-color);--path-data: var(--arrow-right-path-data);}x-navitem > x-icon{color:var(--material-on-surface-variant-color)}x-navitem[toggled] > x-icon{color:var(--material-on-secondary-container-color)}x-navitem > x-label + x-icon{color:var(--material-primary-color)}x-menu{background-color:var(--material-surface-container-color);border-radius:4px;box-shadow:var(--material-elevation-2);--open-transition: var(--material-motion-duration-short-2) transform var(--material-easing-standard);--close-transition: var(--material-motion-duration-short-4) opacity var(--material-easing-standard);}x-menuitem{color:var(--material-on-surface-color);--trigger-effect: none;}x-menuitem:hover, x-menuitem:focus, x-menuitem[expanded]{background-color:oklch(from var(--material-on-surface-color) l c h / 0.08)}x-menuitem[pressed]{background-color:oklch(from var(--material-on-surface-color) l c h / 0.1)}x-menuitem[highlighted]{color:var(--material-on-primary-color);background:var(--material-primary-color)}x-menuitem::part(checkmark){color:var(--material-on-surface-variant-color);--path-data: var(--checkmark-path-data);}x-menuitem::part(arrow){color:var(--material-on-surface-variant-color);width:14px;height:14px;--path-data: var(--arrow-right-path-data);}x-menuitem > x-icon{color:var(--material-on-surface-variant-color)}x-menuitem > x-shortcut{color:oklch(from var(--material-on-surface-color) l c h / 0.5)}x-menubar{padding:0 3px}x-menubar > x-menuitem{border-radius:4px}x-menubar > x-menuitem[pressed]{background-color:oklch(from var(--material-on-surface-color) l c h / 0.08)}x-menubar > x-menuitem, x-menubar > x-menuitem[size=\"small\"], x-menubar > x-menuitem[size=\"large\"]{height:calc(100% - 6px)}dialog{color:inherit;background-color:var(--material-surface-container-high-color);border-width:0px;border-radius:28px;box-shadow:var(--material-elevation-3);transition-duration:100ms;transition-timing-function:linear}dialog::backdrop{background-color:oklch(from var(--material-scrim-color) l c h / 0.32)}dialog > footer{background-color:var(--material-surface-container-highest-color);border-top-width:1px;border-top-style:solid;border-top-color:var(--material-outline-variant-color)}x-drawer{box-sizing:border-box;overflow:hidden;background-color:var(--material-surface-container-low-color);box-shadow:var(--material-elevation-1);transition-timing-function:var(--material-easing-standard);transition-duration:var(--material-motion-duration-short-4)}x-drawer[position=\"left\"]{margin:8px 0;height:calc(100% - 16px);border-radius:0 16px 16px 0}x-drawer[position=\"right\"]{margin:8px 0;height:calc(100% - 16px);border-radius:16px 0 0 16px}x-drawer[position=\"top\"]{margin:0 8px;width:calc(100% - 16px);border-radius:0 0 16px 16px}x-drawer[position=\"bottom\"]{margin:0 8px;width:calc(100% - 16px);border-radius:16px 16px 0 0}x-pager::part(item){min-width:30px;color:var(--material-on-surface-color);border-color:transparent;border-radius:99px}x-pager::part(item):hover{background-color:oklch(from var(--material-on-surface-color) l c h / 0.08)}x-pager::part(item):active{background-color:oklch(from var(--material-primary-color) l c h / 0.2)}x-pager::part(item):focus{outline-width:3px;outline-style:solid;outline-color:var(--material-primary-color);outline-offset:-1px}x-pager::part(toggled-item), x-pager::part(toggled-item):hover{color:var(--material-on-primary-color);background-color:var(--material-primary-color)}x-popover{color:var(--material-on-surface-color);background-color:var(--material-surface-container-high-color);border-radius:4px;box-shadow:var(--material-elevation-2);--open-transition: none;}x-popover > footer{background-color:var(--material-surface-container-highest-color);border-top-width:1px;border-top-style:solid;border-top-color:var(--material-outline-variant-color)}x-popover::part(arrow-path){filter:drop-shadow(rgba(0, 0, 0, 0.3) 0px 6px 10px)}x-notification{color:var(--material-on-surface-inverse-color);background-color:var(--material-surface-inverse-color);border-radius:4px;box-shadow:var(--material-elevation-3)}x-notification a{color:var(--material-primary-inverse-color)}x-notification a:hover{color:var(--material-primary-inverse-color)}x-checkbox::part(indicator){overflow:visible;border-width:2px;border-style:solid;border-color:var(--material-on-surface-variant-color);border-radius:2px;--path-data: var(--checkmark-path-data);}x-checkbox:hover::part(indicator){border-color:var(--material-on-surface-color)}x-radio:active::part(indicator){border-color:var(--material-on-surface-color)}x-checkbox[mixed]::part(indicator){--path-data: var(--mixed-checkmark-path-data);}x-checkbox[toggled]::part(indicator){color:var(--material-on-primary-color);background-color:var(--material-primary-color);border-color:var(--material-primary-color)}x-checkbox::part(indicator)::before{display:none;position:absolute;top:50%;left:50%;width:100%;height:100%;margin:-50% 0 0 -50%;transform:scale(1.45);z-index:-1;content:\"\";pointer-events:none}x-checkbox:hover::part(indicator)::before{display:block;transform:scale(1);background-color:var(--material-on-surface-color);opacity:0.08}x-checkbox:active::part(indicator)::before{display:block;transform:scale(1);background-color:var(--material-primary-color);opacity:0.1}x-checkbox:focus::part(indicator)::before{display:block;transform:scale(2.5);background-color:var(--material-on-surface-color);border-radius:99px;opacity:0.1}x-checkbox[toggled]:hover::part(indicator)::before{background-color:var(--material-primary-color)}x-checkbox[toggled]:active::part(indicator)::before{background-color:var(--material-on-surface-color)}x-checkbox[toggled]:focus::part(indicator)::before{background-color:var(--material-primary-color)}x-radio::part(indicator){border-width:2px;border-style:solid;border-color:var(--material-on-surface-variant-color)}x-radio:hover::part(indicator){border-color:var(--material-on-surface-color)}x-radio:active::part(indicator){border-color:var(--material-on-surface-color)}x-radio[toggled]::part(indicator){border-color:var(--material-primary-color)}x-radio::part(indicator-dot){background-color:var(--material-primary-color)}x-radio[toggled]::part(indicator-dot){transform:scale(0.6)}x-radio[toggled][mixed]::part(indicator-dot){transform:scale(0.55);border-radius:3px}x-radio::part(indicator)::before{display:none;position:absolute;top:50%;left:50%;width:100%;height:100%;margin:-50% 0 0 -50%;transform:scale(1.45);z-index:-1;border-radius:99px;content:\"\";pointer-events:none}x-radio:hover::part(indicator)::before{display:block;transform:scale(1);background-color:var(--material-on-surface-color);opacity:0.08}x-radio:active::part(indicator)::before{display:block;transform:scale(1);background-color:var(--material-primary-color);opacity:0.1}x-radio:focus::part(indicator)::before{display:block;transform:scale(2.2);background-color:var(--material-on-surface-color);opacity:0.1}x-radio[toggled]:hover::part(indicator)::before{background-color:var(--material-primary-color)}x-radio[toggled]:active::part(indicator)::before{background-color:var(--material-on-surface-color)}x-radio[toggled]:focus::part(indicator)::before{background-color:var(--material-primary-color)}x-switch::part(indicator-track){height:100%;background-color:var(--material-surface-container-highest-color);border-width:2px;border-style:solid;border-color:var(--material-outline-color)}x-switch[toggled]::part(indicator-track){background-color:var(--material-primary-color);border-color:var(--material-primary-color)}x-switch::part(indicator-thumb){left:2px;width:15px;height:15px;transform:scale(0.6);background-color:var(--material-outline-color)}x-switch:hover::part(indicator-thumb){background-color:var(--material-on-surface-variant-color)}x-switch[toggled]::part(indicator-thumb){left:calc(100% - 17px);transform:scale(0.9);background-color:var(--material-on-primary-color)}x-switch[toggled]:hover::part(indicator-thumb){background-color:var(--material-primary-container-color)}x-switch[size=\"small\"]::part(indicator-thumb){width:12px;height:12px}x-switch[size=\"small\"][toggled]::part(indicator-thumb){left:calc(100% - 14px)}x-switch[size=\"large\"]::part(indicator-thumb){width:18px;height:18px}x-switch[size=\"large\"][toggled]::part(indicator-thumb){left:calc(100% - 21px)}x-switch::part(indicator-thumb)::before{display:none;position:absolute;top:50%;left:50%;width:100%;height:100%;margin:-50% 0 0 -50%;transform:scale(4.5);z-index:-1;border-radius:99px;content:\"\";pointer-events:none}x-switch:focus::part(indicator-thumb)::before{display:block;background-color:var(--material-on-surface-color);opacity:0.12}x-switch[toggled]:focus::part(indicator-thumb)::before{transform:scale(3);background-color:var(--material-primary-color)}x-select{color:var(--material-on-surface-color);border-width:1px;border-style:solid;border-color:var(--material-outline-color);border-radius:4px}x-select:hover{border-color:var(--material-on-surface-color)}x-select:focus{outline-width:3px;outline-style:solid;outline-color:var(--material-primary-color);outline-offset:-1px}x-select::part(arrow){color:var(--material-on-surface-variant-color);margin:0 8px;--path-data: var(--arrow-down-path-data);}x-slider::part(groove-track){height:6px;background-color:var(--material-secondary-container-color);border-radius:99px}x-slider::part(range-track){height:6px;background-color:var(--material-primary-color);border-radius:5px}x-slider::part(thumb){width:5px;background-color:var(--material-primary-color);border-radius:10px;box-shadow:0px 2px 4px 0px color(srgb 0 0 0 / 0.1)}x-slider::part(thumb):focus{outline-width:3px;outline-style:solid;outline-color:var(--material-primary-color);outline-offset:3px}x-slider::part(tick){top:50%;width:3px;height:3px;transform:translate(-50%, -50%);background-color:var(--material-primary-color);border-radius:99px}x-slider::part(range-tick){background-color:var(--material-on-surface-inverse-color)}x-input{color:var(--material-on-surface-color);border-width:1px;border-style:solid;border-color:var(--material-outline-color);border-radius:4px}x-input:hover{border-color:var(--material-on-surface-color)}x-input:focus{outline-width:3px;outline-style:solid;outline-color:var(--material-primary-color);outline-offset:-1px}x-input[error]{outline-width:3px;outline-style:solid;outline-color:var(--material-error-color);outline-offset:-1px;--selection-background-color: oklch(from var(--material-error-color) l c h / 0.2);}x-input > x-icon{color:var(--material-on-surface-variant-color)}x-input > x-label{color:oklch(from var(--material-on-surface-variant-color) l c h / 0.7);font-weight:400}x-input > x-icon + x-label{padding-top:1px}x-numberinput{color:var(--material-on-surface-color);border-width:1px;border-style:solid;border-color:var(--material-outline-color);border-radius:4px}x-numberinput:hover{border-color:var(--material-on-surface-color)}x-numberinput:focus{outline-width:3px;outline-style:solid;outline-color:var(--material-primary-color);outline-offset:-1px}x-numberinput[error]{outline-width:3px;outline-style:solid;outline-color:var(--material-error-color);outline-offset:-1px;--selection-background-color: oklch(from var(--material-error-color) l c h / 0.2);}x-numberinput > x-icon{color:var(--material-on-surface-variant-color)}x-numberinput > x-label{color:oklch(from var(--material-on-surface-variant-color) l c h / 0.7);font-weight:400}x-numberinput > x-icon + x-label{padding-top:1px}x-numberinput > x-stepper{margin:0 -20px 0 0}x-numberinput:focus > x-stepper{transform:scale(1);z-index:1}x-numberinput:not(:focus) > x-stepper{height:20px;margin:0;transform:scale(0.7);transform-origin:100% 50%;background-color:transparent;border-width:0;box-shadow:none;pointer-events:none}x-numberinput[size=\"small\"]:not(:focus) > x-stepper{transform:scale(0.6)}x-numberinput[size=\"large\"]:not(:focus) > x-stepper{transform:scale(0.8)}x-numberinput:not(:focus) > x-stepper::part(increment-button), x-numberinput:not(:focus) > x-stepper::part(decrement-button){opacity:0.5}x-texteditor{color:var(--material-on-surface-color);border-width:1px;border-style:solid;border-color:var(--material-outline-color);border-radius:4px}x-texteditor:hover{border-color:var(--material-on-surface-color)}x-texteditor:focus{outline-width:3px;outline-style:solid;outline-color:var(--material-primary-color);outline-offset:-1px}x-texteditor[error]{outline-width:3px;outline-style:solid;outline-color:var(--material-error-color);outline-offset:-1px;--selection-background-color: oklch(from var(--material-error-color) l c h / 0.2);}x-texteditor > x-label{color:oklch(from var(--material-on-surface-variant-color) l c h / 0.7);font-weight:400}x-colorinput{color:var(--material-on-surface-color);border-width:1px;border-style:solid;border-color:var(--material-outline-color);border-radius:4px}x-colorinput:hover{border-color:var(--material-on-surface-color)}x-colorinput:focus{outline-width:3px;outline-style:solid;outline-color:var(--material-primary-color);outline-offset:-1px}x-colorinput[error]{outline-width:3px;outline-style:solid;outline-color:var(--material-error-color);outline-offset:-1px;--selection-background-color: oklch(from var(--material-error-color) l c h / 0.2);}x-colorinput::part(arrow){padding:8px 4px 8px 2px;--path-data: var(--arrow-down-path-data);}x-colorinput[size=\"small\"]::part(arrow){padding:4px 4px 4px 0}x-colorinput > x-label{color:oklch(from var(--material-on-surface-variant-color) l c h / 0.7);font-weight:400}x-colorpicker::part(slider){border-radius:4px}x-colorselect{border-radius:4px}x-progressbar{background-color:var(--material-secondary-container-color);border-radius:99px}x-progressbar::part(bar){background-color:var(--material-primary-color);border-radius:99px}x-throbber{color:var(--material-primary-color)}x-titlebar{padding-left:8px;justify-content:flex-start}x-titlebar::part(buttons){right:10px;gap:10px}x-titlebar::part(button){width:22px;height:22px;min-width:22px;min-height:22px;color:var(--material-on-surface-variant-color);border-radius:4px}x-titlebar::part(button):hover{background-color:oklch(from var(--material-on-surface-color) l c h / 0.08)}x-titlebar::part(button):active{background-color:oklch(from var(--material-on-secondary-container-color) l c h / 0.1)}x-titlebar::part(minimize-button){--path-data: var(--minimize-path-data);}x-titlebar::part(maximize-button){--path-data: var(--maximize-path-data);}x-titlebar::part(restore-button){--path-data: var(--restore-path-data);}x-titlebar::part(close-button){--path-data: var(--close-path-data);}x-titlebar::part(icon){width:18px;height:18px}x-titlebar x-icon{color:var(--material-primary-color)}x-titlebar x-label{color:var(--material-primary-color);font-weight:700}:root{--theme-id:                   \"material-dark\";--foreground-color:           var(--material-surface-bright-color);--selection-color:            var(--material-on-secondary-fixed-color);--selection-background-color: var(--material-secondary-fixed-dim-color);--autofill-background-color:  color(srgb 0.95 0.93 0.89);--titlebar-color:             auto;--checkboard-background:      linear-gradient( 45deg, var(--material-scrim-color) 25%, #0000   25%)  0px  0px / 10px 10px,\n                                linear-gradient(-45deg, var(--material-scrim-color) 25%, #0000   25%)  0px  5px / 10px 10px,\n                                linear-gradient( 45deg, #0000   75%, var(--material-scrim-color) 75%)  5px -5px / 10px 10px,\n                                linear-gradient(-45deg, #0000   75%, var(--material-scrim-color) 75%) -5px  0px / 10px 10px, var(--material-outline-color);}pre, code, var{background-color:color(srgb 1 1 1 / 0.06)}mark, ::highlight(mark){background-color:color(srgb 0.9 0.65 0.04)}x-input[error]{--selection-background-color: var(--material-error-color);}x-numberinput[error]{--selection-background-color: var(--material-error-color);}x-texteditor[error]{--selection-background-color: var(--material-error-color);}x-colorinput[error]{--selection-background-color: var(--material-error-color);}\n"
  },
  {
    "path": "src/renderer/public/xel/themes/material.css",
    "content": ":root{width:100%;height:100%;margin:0;interpolate-size:allow-keywords;font-family:sans-serif;line-height:1.6}body{width:100vw;height:100%;margin:0;overflow-y:overlay}h1{margin:22px 0 16px;box-sizing:border-box;line-height:1;font-size:3.25rem;font-weight:700}h2{margin:18px 0 14px 0;box-sizing:border-box;line-height:1;font-size:2.125rem;font-weight:700}h3{margin:16px 0 12px 0;box-sizing:border-box;line-height:1.2;font-size:1.75rem;font-weight:700}h4{margin:14px 0 10px 0;box-sizing:border-box;line-height:1.1;font-size:1.5rem;font-weight:700}h5{margin:12px 0 8px 0;box-sizing:border-box;line-height:1.1;font-size:1.25rem;font-weight:700}h6{margin:8px 0 5px 0;box-sizing:border-box;line-height:1.1;font-size:1rem;font-weight:700}h1 em, h2 em, h3 em, h4 em, h5 em, h6 em{font-weight:inherit}h1 strong, h2 strong, h3 strong, h4 strong, h5 strong, h6 strong{font-weight:900}p{margin:16px 0}p:last-child{margin-bottom:0}a{font-weight:500}table{width:100%;margin:16px 0;border-collapse:collapse;border-style:hidden;box-shadow:0 0 0 1px var(--border-color)}th{text-align:start;padding:8px 14px;border-spacing:0}td{padding:8px 14px;border-spacing:0}em{font-weight:500}pre, code, var{font-size:0.875rem;font-style:normal;padding:0 4px}pre{margin:14px 0;padding:4px 6px;white-space:pre-wrap;box-sizing:border-box}pre > code{display:block;padding:0;box-sizing:border-box;background-color:transparent;outline-width:0px;line-height:1.3}hr{width:100%;height:1px;min-height:1px;margin:24px 0;box-sizing:border-box;border:none}blockquote{box-sizing:border-box;margin:16px 0;padding:5px 14px;border-left-width:8px;border-left-style:solid}blockquote > blockquote{margin:6px 0}blockquote > p:first-child{margin-top:0}ul, ol{margin:12px 0;padding:0}p + ul{margin:-10px 0 0 0}li > ul, li > ol{margin:0}li{position:relative;margin:0;padding:0}ul li{margin-left:20px}ol li{margin-left:16px}li > p{margin:4px 0}ol > li::marker{font-weight:700}img{display:block;height:auto;margin:14px auto;max-width:100%;user-select:none;box-sizing:border-box;background:var(--checkboard-background);border-width:1px;border-style:solid;border-color:var(--border-color);-webkit-user-select:none;-webkit-user-modify:read-only}img:active{cursor:-webkit-grabbing}[popover]{color:var(--text-color);background-color:var(--foreground-color)}::-webkit-scrollbar{max-width:6px;max-height:6px}::-webkit-scrollbar-corner{display:none}@supports not selector(::-webkit-scrollbar){*{scrollbar-width:thin}}x-card:not(:defined){display:none}x-card > footer{padding:8px 16px;width:calc(100% + 40px);height:calc(100% + 20px);margin-left:-20px;margin-bottom:-16px;box-sizing:border-box;background:lightgrey}x-card > footer:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}x-card > footer:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}x-card > h1:first-child{margin-top:0}x-card > h2:first-child{margin-top:0}x-card > h3:first-child{margin-top:0}x-card > h4:first-child{margin-top:0}x-card > h5:first-child{margin-top:0}x-card > h6:first-child{margin-top:0}x-avatar[size=\"small\"]{width:28px;height:28px}x-avatar[size=\"large\"]{width:54px;height:54px}x-avatar > img{width:100%;height:100%;-webkit-user-drag:none}x-avatar > x-icon{width:55%;height:55%}x-avatar > x-label{font-size:1rem;pointer-events:none}x-avatar[size=\"small\"] > x-label{font-size:0.75rem}x-avatar[size=\"large\"] > x-label{font-size:1.5rem}x-accordion:not(:defined){display:none}x-accordion[size=\"small\"]::part(arrow){width:14px;height:14px}x-accordion[size=\"large\"]::part(arrow){width:18px;height:18px}x-accordion > header{display:flex;align-items:center;box-sizing:border-box;width:100%;padding:7px 0 7px 20px}x-accordion[size=\"small\"] > header{padding-left:18px}x-accordion[size=\"large\"] > header{padding-left:22px}x-accordion > header > x-label:first-child{flex:1}x-accordion > header > *:not(:last-child){margin-right:20px}x-accordion:not([expanded]):not([animating]) > *:not(header){display:none!important}x-icon[size=\"small\"]{width:15px;height:15px}x-icon[size=\"large\"]{width:21px;height:21px}x-icon:not(:defined){display:none}x-label:not(:defined){display:none}x-shortcut:not(:defined){display:none}x-stepper:not(:defined){display:none}x-swatch[size=\"small\"]{width:16px;height:16px}x-swatch[size=\"large\"]{width:20px;height:20px}x-swatch:not(:defined){display:none}x-button{--min-pressed-time: 150ms;}@media (pointer:coarse){x-button{--min-pressed-time: 600ms;}}a:has(x-button){text-decoration:none}x-button[toggled]{z-index:1}x-button[condensed]{padding:2px 7px}x-button[size=\"small\"]{min-height:24px}x-button[size=\"large\"]{min-height:38px}x-buttons[vertical] > x-button{width:100%;justify-content:flex-start}x-button:not(:defined){display:none}x-button > x-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;text-align:center;min-width:1px;pointer-events:none}x-button > x-label ~ x-icon, x-button > x-icon ~ x-label{margin:0 0 0 6px}x-button > x-menu{font-size:0.875rem}x-button[skin=\"normal\"][size=\"small\"] > x-icon{width:14px;height:14px}x-button[skin=\"normal\"][size=\"large\"] > x-icon{width:20px;height:20px}x-button[skin=\"flat\"]{padding:0}x-buttons:not([vertical]) > x-button[skin=\"flat\"]:not(:first-of-type){margin-left:10px}x-buttons:not([vertical]) > x-button[skin=\"flat\"][size=\"small\"]:not(:first-of-type){margin-left:5px}x-buttons[vertical] > x-button[skin=\"flat\"]:not(:first-of-type){margin-top:10px}x-buttons[vertical] > x-button[skin=\"flat\"][size=\"small\"]:not(:first-of-type){margin-top:5px}x-button[skin=\"flat\"] > x-icon{width:26px;height:26px}x-button[skin=\"flat\"][size=\"small\"] > x-icon{width:22px;height:22px}x-button[skin=\"flat\"][size=\"large\"] > x-icon{width:28px;height:28px}x-button[skin=\"recessed\"]{min-height:18px;padding:4px 8px}x-button[skin=\"recessed\"][size=\"small\"]{padding:3px 8px}x-button[skin=\"recessed\"][size=\"large\"]{padding:5px 8px}x-buttons:not([vertical]) > x-button[skin=\"recessed\"] + x-button[skin=\"recessed\"]{margin-left:4px}x-buttons[vertical] > x-button[skin=\"recessed\"] + x-button[skin=\"recessed\"]{margin-top:4px}x-button[skin=\"recessed\"] > x-icon{width:16px;height:16px}x-button[skin=\"recessed\"][size=\"small\"] > x-icon{width:12px;height:12px}x-button[skin=\"recessed\"][size=\"large\"] > x-icon{width:20px;height:20px}x-button[skin=\"dock\"], x-buttons[vertical] > x-button[skin=\"dock\"]{width:38px;height:38px;min-height:38px;padding:0;justify-content:center}x-button[skin=\"dock\"][size=\"small\"], x-buttons[vertical] > x-button[skin=\"dock\"][size=\"small\"]{width:30px;height:30px;min-height:30px}x-button[skin=\"dock\"][size=\"large\"], x-buttons[vertical] > x-button[skin=\"dock\"][size=\"large\"]{width:45px;height:45px;min-height:45px}x-buttons:not([vertical]) > x-button[skin=\"dock\"] + x-button[skin=\"dock\"]{margin-left:-1px}x-buttons[vertical] > x-button[skin=\"dock\"] + x-button[skin=\"dock\"]{margin-top:-1px}x-button[skin=\"dock\"] > x-icon{width:17px;height:17px}x-button[skin=\"dock\"][size=\"small\"] > x-icon{width:14px;height:14px}x-button[skin=\"dock\"][size=\"large\"] > x-icon{width:20px;height:20px}x-buttons[vertical]{flex-flow:column;align-items:flex-start;justify-content:center}x-buttons:not(:defined){display:none}x-tag[size=\"small\"]{height:18px}x-tag[size=\"large\"]{height:30px}x-tag:not(:defined){display:none}x-tag > x-swatch{width:14px;height:14px}x-tag[size=\"small\"] > x-swatch{width:12px;height:12px}x-tag[size=\"large\"] > x-swatch{width:16px;height:16px}x-tag > x-label{font-size:0.75rem}x-tag :not(x-label) + x-label{margin-left:0.25rem}x-tag[size=\"small\"] > x-label{font-size:0.6875rem}x-tag > x-icon{width:15px;height:15px}x-tags{margin-top:-2px;margin-left:-2px}x-tags:not(:defined){display:none}x-tags x-tag{margin:2px}x-tagsinput[size=\"small\"]{padding:0px;gap:0px}x-tagsinput[size=\"small\"] > x-tag{height:22px;transform:scale(0.92)}x-tagsinput[size=\"large\"]{padding:6px;gap:6px}x-tagsinput:focus-within{z-index:10}x-tagsinput:not(:defined){display:none}x-tagsinput > x-label{position:absolute;top:50%;left:8px;transform:translateY(-50%);pointer-events:none}x-tagsinput[size=\"small\"][error]::before{top:27px}x-tagsinput[size=\"large\"][error]::before{top:41px}x-tab[size=\"small\"]{min-height:24px}x-tab[size=\"large\"]{min-height:38px}x-tab:not(:defined){display:none}x-tab x-icon{width:17px;height:17px;min-width:17px;color:inherit}x-tab[size=\"small\"] x-icon{width:15px;height:15px;min-width:15px}x-tab[size=\"large\"] x-icon{width:19px;height:19px;min-width:19px}x-tab x-label{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;line-height:1.2;cursor:inherit;flex:1}x-tab x-icon + x-label{margin-left:6px}x-tab x-box:is([vertical]) x-icon + x-label{margin-left:0px}x-tabs:not(:defined){display:none}x-menu:not(:defined){display:none}x-menu:has(x-menu[opened]){overflow:-webkit-paged-x}x-menu img{margin:0;background:none;border:none}x-menu hr{width:100%;height:1px;margin:4px 0px;box-sizing:border-box}x-menu hr + hr, x-menu hr:last-child{display:none}x-menuitem[size=\"small\"]{min-height:24px}x-menuitem[size=\"large\"]{min-height:38px}x-menuitem:not(:defined){display:none}x-menuitem[highlighted]{color:white;background:var(--accent-color)}x-menuitem img{width:16px;height:16px}x-menuitem x-icon{width:16px;height:16px}x-menuitem x-label{display:block;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:inherit;line-height:1.4}x-menuitem img + x-label, x-menuitem x-swatch + x-label, x-menuitem x-icon + x-label{margin-left:8px}x-menuitem x-shortcut{margin-left:auto}x-menuitem x-label + x-shortcut{margin-left:8px}x-menubar[size=\"small\"]{height:30px}x-menubar[size=\"large\"]{height:42px}x-menubar:not(:defined){display:none}x-menubar > x-menuitem{height:100%;padding:0 11px;min-height:0}x-menubar > x-menuitem[autohidden]{display:none}x-navitem + x-navitem, a:has(x-navitem) + a:has(x-navitem), a:has(x-navitem) + x-navitem, x-navitem + a:has(x-navitem){margin:3px 0}x-nav x-nav > *:first-child{margin-top:3px}x-nav x-nav > *:last-child{margin-bottom:0}x-nav x-nav > *{margin-left:34px!important}x-nav x-nav > *{max-width:calc(100% - 34px)!important}x-nav > a{display:block;text-decoration:none}x-nav x-label{max-width:100%;flex:1 1 0%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:500;font-size:0.9375rem;text-align:start}x-nav x-icon + x-label{margin-left:14px}x-nav[collapsed] x-navitem > x-label{display:none}x-nav x-icon{width:20px;height:20px}x-nav x-label + x-icon{width:18px;height:18px;margin:0 0 0 10px}x-nav[collapsed] x-navitem > x-label + x-icon{display:none}x-nav[collapsed] x-navitem::part(button){padding:0}x-nav[collapsed] x-navitem::part(arrow){display:none}x-contextmenu:not(:defined){display:none}dialog{overflow:hidden;position:fixed;min-width:200px;min-height:100px;max-height:none;margin:auto;padding:20px 24px;box-sizing:border-box;font-size:0.8125rem;line-height:1.6}dialog:focus{outline:none}dialog:not(:defined){display:none}dialog > footer{display:flex;flex-flow:row;justify-content:flex-end;padding:12px 24px;width:calc(100% + 48px);height:calc(100% + 22px);margin-top:10px;margin-left:-24px;margin-bottom:-20px;box-sizing:border-box;background:lightgrey}dialog > footer:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}dialog > footer:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}dialog > footer x-button + x-button{margin-left:8px}dialog h3{font-size:1.125rem;font-weight:700}dialog > *:first-child{margin-top:0}x-popover{padding:12px;overflow:auto}x-popover:has(footer){overflow:hidden}x-popover:not(:defined){display:none}x-popover > footer{padding:12px;width:calc(100% + 24px);height:calc(100% + 12px);margin-left:-12px;margin-bottom:-12px;margin-top:12px;box-sizing:border-box;background:lightgrey}x-popover > footer:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}x-popover > footer:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}x-notification[size=\"small\"]{padding:3px 12px}x-notification[size=\"large\"]{padding:8px 12px}x-notification:not(:defined){display:none}x-notification > p{margin:0}x-checkbox:not(:defined){display:none}x-checkbox + x-checkbox{margin-top:6px}x-checkbox[size=\"small\"]::part(indicator){width:17px;height:17px}x-checkbox[size=\"large\"]::part(indicator){width:21px;height:21px}x-checkbox > x-label{display:block;margin-left:8px;padding:1px 0}x-radio + x-radio{margin-top:6px}x-radio:not(:defined){display:none}x-radio[size=\"small\"]::part(indicator){width:17px;height:17px}x-radio[size=\"large\"]::part(indicator){width:21px;height:21px}x-radio > x-label{margin:0 0 0 8px;padding:1px 0}x-radio[size=\"small\"] > x-label{margin-left:6px}x-radio[size=\"large\"] > x-label{margin-left:10px}x-radios:not(:defined){display:none}x-switch + x-switch{margin-top:12px}x-switch:not(:defined){display:none}x-switch[size=\"large\"]::part(indicator){width:42px;height:20px}x-switch[size=\"small\"]::part(indicator){width:28px;height:12px}x-switch > x-label{margin:0 0 0 8px;padding:1px 0}x-switch[size=\"small\"] > x-label{margin-left:6px}x-switch[size=\"large\"] > x-label{margin-left:10px}x-select[size=\"small\"]{height:24px}x-select[size=\"large\"]{height:38px}x-select:not(:defined){display:none}x-colorselect[size=\"small\"]{width:24px;height:24px}x-colorselect[size=\"large\"]{width:38px;height:38px}x-colorselect:not(:defined){display:none}x-input[size=\"small\"]{height:24px}x-input[size=\"large\"]{height:38px}x-input:not(:defined){display:none}x-input + x-input{margin-top:20px}x-input > x-icon{width:15px;height:15px;min-width:15px;margin:0 0 0 8px}x-input[size=\"small\"] > x-icon{transform:scale(0.8)}x-input[size=\"large\"] > x-icon{transform:scale(1.1)}x-input > x-icon:hover{cursor:default}x-input > x-label{display:none;position:absolute;top:50%;max-width:100%;padding:0 5px 0 5px;transform:translateY(-50%);font-family:inherit;font-size:inherit;line-height:inherit;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;pointer-events:none}x-input[empty] > x-label{display:block}x-input > x-icon + x-label{padding:0 5px 0 29px}x-numberinput[size=\"small\"]{height:24px}x-numberinput[size=\"large\"]{height:38px}x-numberinput:focus{z-index:10}x-numberinput:not(:defined){display:none}x-numberinput > x-label{display:none;position:absolute;top:50%;max-width:100%;padding:0 5px 0 5px;transform:translateY(-50%);font-family:inherit;font-size:inherit;line-height:inherit;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;pointer-events:none}x-numberinput[empty] > x-label{display:block}x-numberinput[size=\"small\"][error]::before{top:27px}x-numberinput[size=\"large\"][error]::before{top:41px}x-texteditor:focus{z-index:10}x-texteditor:not(:defined){display:none}x-texteditor > x-label{display:none;position:absolute;width:100%;top:0;left:0;padding:2px 6px;font-family:inherit;font-size:inherit;line-height:inherit;pointer-events:none}x-texteditor[empty] > x-label{display:block}x-slider:not(:defined){display:none}x-colorpicker:not(:defined){display:none}x-progressbar[size=\"small\"]{height:6px}x-progressbar[size=\"large\"]{height:10px}x-progressbar:not(:defined){display:none}x-throbber[size=\"small\"]{width:26px;height:26px}x-throbber[size=\"large\"]{width:34px;height:34px}x-throbber:not(:defined){display:none}x-titlebar x-icon + x-label{margin-left:6px}:root{color:var(--material-on-surface-color);background-color:var(--background-color);font-family:\"Roboto Flex\", \"Roboto\", \"Helvetica Neue\", \"Noto Sans\", \"Arial\", sans-serif;font-weight:400;--theme-id:                  \"material\";--preset-accent-colors:       blue     lch(39.4 36.3 272),\n                                purple   lch(39.7 39.4 303),\n                                pink     lch(39.9 35.8 329),\n                                red      lch(40.4 34 8.23),\n                                orange   lch(40.5 47.5 58.6),\n                                yellow   lch(40.2 47 88.5),\n                                green    lch(40 36.9 134),\n                                gray     lch(40.4 7.86 199);--accent-color:               lch(39.4 36.3 272);--background-color:           var(--material-surface-container-color);--foreground-color:           var(--material-surface-color);--border-color:               var(--material-outline-variant-color);--text-color:                 var(--material-on-surface-color);--error-color:                var(--material-error-color);--selection-color:            currentColor;--selection-background-color: var(--material-secondary-fixed-dim-color);--autofill-background-color:  color(srgb 0.95 0.93 0.89);--titlebar-color:             auto;--autocapitalize:             titlecase;--checkboard-background:      linear-gradient( 45deg, #ffffff 25%, #0000   25%)  0px  0px / 10px 10px,\n                                linear-gradient(-45deg, #ffffff 25%, #0000   25%)  0px  5px / 10px 10px,\n                                linear-gradient( 45deg, #0000   75%, #ffffff 75%)  5px -5px / 10px 10px,\n                                linear-gradient(-45deg, #0000   75%, #ffffff 75%) -5px  0px / 10px 10px, var(--material-surface-dim-color);--arrow-right-path-data: M 29.88 90.25 L 29.88 9.75 L 70.12 50 L 29.88 90.25 Z;--arrow-up-path-data: M 9.75 70.12 L 90.25 70.12 L 50 29.88 L 9.75 70.12 Z;--arrow-down-path-data: M 9.75 29.88 L 90.25 29.88 L 50 70.12 L 9.75 29.88 Z;--checkmark-path-data: M 36.76 81.11 L 10.29 54.64 L 19.55 45.36 L 36.76 62.58 L 80.45 18.89 L 89.71 28.16 L 36.76 81.11 Z;--mixed-checkmark-path-data: M 13 50 C 13.1 54.5 16.8 57.2 21.3 57.2 L 78.6 57.2 C 83.1 57.2 86.8 54.5 86.9 50 C 86.9 45.4 83.2 42.7 78.6 42.7 L 21.3 42.7 C 16.7 42.7 13 45.4 13 50 Z;--clear-path-data: M 25 16 L 50 41 L 75 16 L 84 25 L 59 50 L 84 75 L 75 84 L 50 59 L 25 84 L 16 75 L 41 50 L 16 25 Z;--plus-path-data: M 58 10 L 58 42 L 90 42 L 90 58 L 58 58 L 58 90 L 42 90 L 42 58 L 10 58 L 10 42 L 42 42 L 42 10 Z;--minus-path-data: M 10 42 H 90 V 58 H 10 V 42 Z;--minimize-path-data: M 18 72 L 82 72 L 82 82 L 18 82 L 18 72 Z;--maximize-path-data: M 18 18 L 82 18 L 82 82 L 18 82 L 18 18 Z M 72 28 L 28 28 L 28 72 L 72 72 L 72 28 Z;--restore-path-data: M 41.71 21.24 L 85.71 21.24 L 85.71 64.24 L 41.71 64.24 L 41.71 21.24 Z M 75.71 31.24 L 51.71 31.24 L 51.71 54.24 L 75.71 54.24 L 75.71 31.24 Z M 65 73 L 65 83 L 24 83 L 24 42 L 34 42 L 34 73 L 65 73 Z;--close-path-data: M 19.95 72.98 L 42.93 50 L 19.95 27.02 L 27.02 19.95 L 50 42.93 L 72.98 19.95 L 80.05 27.02 L 57.07 50 L 80.05 72.98 L 72.98 80.05 L 50 57.07 L 27.02 80.05 L 19.95 72.98 Z;--material-elevation-1:                  0px 1px  2px 0px rgba(0, 0, 0, 0.30), 0px 1px 3px 1px rgba(0, 0, 0, 0.15);--material-elevation-2:                  0px 1px  2px 0px rgba(0, 0, 0, 0.30), 0px 3px 4px 0px rgba(0, 0, 0, 0.14);--material-elevation-3:                  0px 4px  8px 3px rgba(0, 0, 0, 0.15), 0px 1px 3px 0px rgba(0, 0, 0, 0.30);--material-elevation-4:                  0px 6px 10px 4px rgba(0, 0, 0, 0.15), 0px 2px 3px 0px rgba(0, 0, 0, 0.30);--material-elevation-5:                  0px 8px 12px 6px rgba(0, 0, 0, 0.15), 0px 4px 4px 0px rgba(0, 0, 0, 0.30);--material-easing-emphasized:            cubic-bezier( 0.2, 0.0,   0,  1.0);--material-easing-emphasized-decelerate: cubic-bezier(0.05, 0.7, 0.1,  1.0);--material-easing-emphasized-accelerate: cubic-bezier( 0.3, 0.0, 0.8, 0.15);--material-easing-standard:              cubic-bezier( 0.2, 0.0,   0,  1.0);--material-easing-standard-decelerate:   cubic-bezier(   0,   0,   0,    1);--material-easing-standard-accelerate:   cubic-bezier( 0.3,   0,   1,    1);--material-motion-duration-short-1:        50ms;--material-motion-duration-short-2:       100ms;--material-motion-duration-short-3:       150ms;--material-motion-duration-short-4:       200ms;--material-motion-duration-medium-1:      250ms;--material-motion-duration-medium-2:      300ms;--material-motion-duration-medium-3:      350ms;--material-motion-duration-medium-4:      400ms;--material-motion-duration-long-1:        450ms;--material-motion-duration-long-2:        500ms;--material-motion-duration-long-3:        550ms;--material-motion-duration-long-4:        600ms;--material-motion-duration-extra-long-1:  700ms;--material-motion-duration-extra-long-2:  800ms;--material-motion-duration-extra-long-3:  900ms;--material-motion-duration-extra-long-4: 1000ms;}h1, h2, h3, h4, h5, h6{color:var(--material-on-background-color)}a{color:var(--material-primary-color);text-decoration:underline}a:focus{border-radius:2px;outline-width:3px;outline-style:solid;outline-color:var(--material-primary-color)}a:hover{color:var(--material-on-primary-container-color)}pre, code, var{background-color:var(--material-surface-container-low-color);font-family:\"Roboto Mono\", \"Noto Sans Mono\", ui-monospace, monospace}pre{border-radius:12px}code, var{border-radius:4px}blockquote{border-color:var(--material-tertiary-color)}mark, ::highlight(mark){color:inherit;background-color:color(srgb 0.96 0.83 0.18)}hr{background-color:var(--material-outline-variant-color)}table{border-radius:8px;border-style:hidden;box-shadow:0 0 0 1px var(--material-outline-variant-color)}th, td{border-width:1px;border-style:solid;border-color:var(--material-outline-variant-color)}::selection{color:var(--selection-color);background-color:var(--selection-background-color)}::-webkit-scrollbar{background-color:transparent}::-webkit-scrollbar-thumb{background-color:var(--material-outline-variant-color);border-radius:25px}::-webkit-scrollbar-thumb:hover{background-color:var(--material-outline-color)}@supports not selector(::-webkit-scrollbar){*{scrollbar-color:var(--material-outline-variant-color) transparent}}x-avatar{background-color:var(--material-surface-container-highest-color);border-width:0px;border-radius:999px}x-avatar > x-label{font-weight:700}x-card{background-color:var(--material-surface-color);border-width:1px;border-style:solid;border-color:var(--material-outline-variant-color);border-radius:12px}x-card > footer{background-color:var(--material-surface-container-color);border-top-width:1px;border-top-style:solid;border-top-color:var(--material-outline-variant-color)}x-accordion::part(arrow){color:var(--material-on-surface-variant-color);--path-data: var(--arrow-right-path-data);}x-accordion::part(arrow):focus{border-radius:2px;outline-width:3px;outline-style:solid;outline-color:var(--material-primary-color)}x-accordion > header > x-label{color:var(--material-on-secondary-container-color);font-weight:700}x-tooltip{color:var(--material-on-surface-inverse-color);background-color:var(--material-surface-inverse-color);border-width:0px;border-radius:4px}x-stepper{width:40px;height:70px;background-color:var(--material-surface-container-color);border-radius:4px;box-shadow:var(--material-elevation-2)}x-stepper::part(increment-button), x-stepper::part(decrement-button){color:var(--material-on-surface-variant-color)}x-stepper::part(increment-button):hover, x-stepper::part(decrement-button):hover{background-color:oklch(from var(--material-on-surface-color) l c h / 0.08)}x-stepper[pressed=\"increment\"]::part(increment-button), x-stepper[pressed=\"decrement\"]::part(decrement-button){background-color:oklch(from var(--material-on-secondary-container-color) l c h / 0.1)}x-stepper::part(increment-arrow), x-stepper::part(decrement-arrow){width:18px;height:18px}x-stepper::part(increment-arrow){--path-data: var(--arrow-up-path-data);}x-stepper::part(decrement-arrow){--path-data: var(--arrow-down-path-data);}x-swatch{border-color:var(--material-outline-variant-color);border-radius:99px}x-button:focus{outline-width:3px;outline-style:solid;outline-color:var(--material-primary-color);outline-offset:-1px}x-button::before{display:none;position:absolute;top:0;left:0;width:100%;height:100%;content:\"\";pointer-events:none;border-radius:inherit}x-button > x-label{font-weight:500}x-button[skin=\"normal\"]{color:var(--material-on-surface-color);border-style:solid;border-width:1px;border-color:var(--material-outline-color);border-radius:10px}x-button[skin=\"normal\"][toggled]{color:var(--material-on-primary-color);background-color:var(--material-primary-color);border-color:transparent}x-button[skin=\"normal\"][toggled]:focus{outline-offset:1px}x-button[skin=\"normal\"]:hover::before,x-button[skin=\"normal\"][expanded]::before{display:block;background-color:var(--material-on-surface-color);opacity:0.08}x-button[skin=\"normal\"]:focus::before{display:block;background-color:var(--material-primary-color);opacity:0.1}x-button[skin=\"normal\"][pressed]::before{display:block;background-color:var(--material-on-secondary-container-color);opacity:0.1}x-button[skin=\"normal\"][toggled]:hover::before{display:block;background-color:var(--material-on-secondary-container-color);opacity:0.08}x-button[skin=\"normal\"][toggled][pressed]::before{display:block;background-color:var(--material-on-secondary-container-color);opacity:0.1}:is(x-buttons:not([vertical]) > x-button[skin=\"normal\"]):not(:first-of-type){border-top-left-radius:0;border-bottom-left-radius:0}:is(x-buttons:not([vertical]) > x-button[skin=\"normal\"]):not(:last-of-type){border-top-right-radius:0;border-bottom-right-radius:0}:is(x-buttons:not([vertical]) > x-button[skin=\"normal\"]) + x-button[skin=\"normal\"]{margin-left:-1px}:is(x-buttons[vertical] > x-button[skin=\"normal\"]){border-radius:8px}:is(x-buttons[vertical] > x-button[skin=\"normal\"]):not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}:is(x-buttons[vertical] > x-button[skin=\"normal\"]):not(:last-of-type){border-bottom-left-radius:0;border-bottom-right-radius:0}:is(x-buttons[vertical] > x-button[skin=\"normal\"]) + x-button[skin=\"normal\"]{margin-top:-1px}x-button[skin=\"flat\"]{color:var(--material-on-surface-variant-color)}x-button[skin=\"flat\"]:hover{color:var(--material-on-surface-color)}x-button[skin=\"flat\"][toggled],x-button[skin=\"flat\"][expanded]{color:var(--material-primary-color)}x-button[skin=\"flat\"][pressed]{color:var(--material-on-primary-container-color)}x-button[skin=\"recessed\"]{color:var(--material-on-surface-color);border-radius:8px}x-button[skin=\"recessed\"][toggled]{color:var(--material-on-primary-fixed-color);background-color:var(--material-primary-fixed-dim-color)}x-button[skin=\"recessed\"]:hover::before{display:block;background-color:var(--material-on-secondary-container-color);opacity:0.08}x-button[skin=\"recessed\"][pressed]::before{display:block;background-color:var(--material-on-secondary-container-color);opacity:0.1}x-button[skin=\"recessed\"] > x-label{font-size:0.75rem;text-align:center}x-button[skin=\"dock\"]{color:var(--material-on-surface-color);background-color:var(--material-surface-bright-color);border-width:1px;border-style:solid;border-color:var(--material-outline-variant-color)}x-button[skin=\"dock\"][toggled]{color:var(--material-on-surface-inverse-color);background-color:var(--material-primary-color);border-color:var(--material-on-primary-fixed-variant-color);z-index:1}x-button[skin=\"dock\"]:hover::before{display:block;background-color:var(--material-on-surface-color);opacity:0.08}x-button[skin=\"dock\"][toggled]:hover::before{display:none}x-button[skin=\"dock\"][pressed]::before,x-button[skin=\"dock\"][toggled][pressed]::before{display:block;background-color:var(--material-on-secondary-container-color);opacity:0.1}x-tag{color:var(--material-on-surface-variant-color);background-color:var(--material-surface-container-low-color);border-width:1px;border-tyle:solid;border-color:var(--material-outline-variant-color);border-radius:8px;position:relative}x-tag:hover{color:var(--material-on-surface-color)}x-tag:focus{outline-width:3px;outline-style:solid;outline-color:var(--material-primary-color);outline-offset:-1px}x-tag[scoped]::part(main){background-color:var(--material-surface-container-low-color)}x-tag[toggled]{color:var(--material-on-primary-color);background-color:var(--material-primary-color);border-color:transparent}x-tag[toggled]:hover{filter:brightness(0.95)}x-tag[toggled]:focus{outline-offset:1px}x-tag::before{display:none;position:absolute;top:0;left:0;width:100%;height:100%;content:\"\";pointer-events:none;z-index:1}x-tag:hover::before{display:block;background-color:oklch(from var(--material-on-surface-color) l c h / 0.08)}x-tag:active::before{display:block;background-color:oklch(from var(--material-on-surface-color) l c h / 0.1)}x-tag::part(remove-button){--path-data: var(--clear-path-data);}x-tag::part(scope){border-color:var(--material-outline-variant-color)}x-tag[toggled]::part(scope){color:var(--material-on-surface-color);border-color:var(--material-primary-color)}x-tag > x-icon{color:var(--material-primary-color)}x-tag[toggled] > x-icon{color:var(--material-on-primary-color)}x-tagsinput{color:var(--material-on-surface-color);border-width:1px;border-style:solid;border-color:var(--material-outline-color);border-radius:4px}x-tagsinput:hover{border-color:var(--material-on-surface-color)}x-tagsinput:focus{outline-width:3px;outline-style:solid;outline-color:var(--material-primary-color);outline-offset:-1px}x-tagsinput[error]{outline-width:3px;outline-style:solid;outline-color:var(--material-error-color);outline-offset:-1px;--selection-background-color: oklch(from var(--material-error-color) l c h / 0.2);}x-tagsinput > x-tag{background-color:transparent}x-tagsinput > x-label{color:oklch(from var(--material-on-surface-variant-color) l c h / 0.7);font-weight:400}x-tabs{color:var(--material-on-surface-variant-color);background-color:var(--material-surface-color);border-width:1px;border-style:solid;border-color:var(--material-surface-variant-color)}x-tab:hover, x-tab:focus{color:var(--material-on-surface-color);background-color:oklch(from var(--material-on-surface-color) l c h / 0.08)}x-tab[pressed]{background-color:oklch(from var(--material-on-surface-color) l c h / 0.1)}x-tab[toggled]{color:var(--material-on-surface-color)}x-tab::part(selection-indicator){margin-bottom:-0.5px;width:100%;height:2px;background-color:var(--material-primary-color);transition-timing-function:var(--material-easing-standard);transition-duration:var(--material-motion-duration-short-2)}x-navitem:focus{outline-width:0px}x-navitem::part(button){position:relative;color:var(--material-on-surface-color);border-radius:99px}x-navitem[toggled]::part(button){background-color:var(--material-secondary-container-color)}x-navitem:focus::part(button){outline-width:3px;outline-style:solid;outline-color:var(--material-primary-color);outline-offset:-1px}x-navitem::part(button)::before{display:none;position:absolute;width:100%;height:100%;border-radius:99px;content:\"\";pointer-events:none}x-navitem::part(button):hover::before{display:block;background-color:var(--material-on-surface-color);opacity:0.08}x-navitem[pressed]::part(button):hover::before{display:block;background-color:var(--material-on-secondary-container-color);opacity:0.1}x-navitem[toggled]::part(button):hover::before{display:block;background-color:var(--material-on-secondary-container-color);opacity:0.08}x-navitem[toggled][pressed]::part(button):hover::before{display:block;background-color:var(--material-on-secondary-container-color);opacity:0.1}x-navitem > x-label{color:var(--material-on-surface-variant-color);font-weight:500}x-navitem[toggled] > x-label{color:var(--material-on-secondary-container-color)}x-navitem::part(arrow){color:var(--material-on-surface-variant-color);--path-data: var(--arrow-right-path-data);}x-navitem > x-icon{color:var(--material-on-surface-variant-color)}x-navitem[toggled] > x-icon{color:var(--material-on-secondary-container-color)}x-navitem > x-label + x-icon{color:var(--material-primary-color)}x-menu{background-color:var(--material-surface-container-color);border-radius:4px;box-shadow:var(--material-elevation-2);--open-transition: var(--material-motion-duration-short-2) transform var(--material-easing-standard);--close-transition: var(--material-motion-duration-short-4) opacity var(--material-easing-standard);}x-menuitem{color:var(--material-on-surface-color);--trigger-effect: none;}x-menuitem:hover, x-menuitem:focus, x-menuitem[expanded]{background-color:oklch(from var(--material-on-surface-color) l c h / 0.08)}x-menuitem[pressed]{background-color:oklch(from var(--material-on-surface-color) l c h / 0.1)}x-menuitem[highlighted]{color:var(--material-on-primary-color);background:var(--material-primary-color)}x-menuitem::part(checkmark){color:var(--material-on-surface-variant-color);--path-data: var(--checkmark-path-data);}x-menuitem::part(arrow){color:var(--material-on-surface-variant-color);width:14px;height:14px;--path-data: var(--arrow-right-path-data);}x-menuitem > x-icon{color:var(--material-on-surface-variant-color)}x-menuitem > x-shortcut{color:oklch(from var(--material-on-surface-color) l c h / 0.5)}x-menubar{padding:0 3px}x-menubar > x-menuitem{border-radius:4px}x-menubar > x-menuitem[pressed]{background-color:oklch(from var(--material-on-surface-color) l c h / 0.08)}x-menubar > x-menuitem, x-menubar > x-menuitem[size=\"small\"], x-menubar > x-menuitem[size=\"large\"]{height:calc(100% - 6px)}dialog{color:inherit;background-color:var(--material-surface-container-high-color);border-width:0px;border-radius:28px;box-shadow:var(--material-elevation-3);transition-duration:100ms;transition-timing-function:linear}dialog::backdrop{background-color:oklch(from var(--material-scrim-color) l c h / 0.32)}dialog > footer{background-color:var(--material-surface-container-highest-color);border-top-width:1px;border-top-style:solid;border-top-color:var(--material-outline-variant-color)}x-drawer{box-sizing:border-box;overflow:hidden;background-color:var(--material-surface-container-low-color);box-shadow:var(--material-elevation-1);transition-timing-function:var(--material-easing-standard);transition-duration:var(--material-motion-duration-short-4)}x-drawer[position=\"left\"]{margin:8px 0;height:calc(100% - 16px);border-radius:0 16px 16px 0}x-drawer[position=\"right\"]{margin:8px 0;height:calc(100% - 16px);border-radius:16px 0 0 16px}x-drawer[position=\"top\"]{margin:0 8px;width:calc(100% - 16px);border-radius:0 0 16px 16px}x-drawer[position=\"bottom\"]{margin:0 8px;width:calc(100% - 16px);border-radius:16px 16px 0 0}x-pager::part(item){min-width:30px;color:var(--material-on-surface-color);border-color:transparent;border-radius:99px}x-pager::part(item):hover{background-color:oklch(from var(--material-on-surface-color) l c h / 0.08)}x-pager::part(item):active{background-color:oklch(from var(--material-primary-color) l c h / 0.2)}x-pager::part(item):focus{outline-width:3px;outline-style:solid;outline-color:var(--material-primary-color);outline-offset:-1px}x-pager::part(toggled-item), x-pager::part(toggled-item):hover{color:var(--material-on-primary-color);background-color:var(--material-primary-color)}x-popover{color:var(--material-on-surface-color);background-color:var(--material-surface-container-high-color);border-radius:4px;box-shadow:var(--material-elevation-2);--open-transition: none;}x-popover > footer{background-color:var(--material-surface-container-highest-color);border-top-width:1px;border-top-style:solid;border-top-color:var(--material-outline-variant-color)}x-popover::part(arrow-path){filter:drop-shadow(rgba(0, 0, 0, 0.3) 0px 6px 10px)}x-notification{color:var(--material-on-surface-inverse-color);background-color:var(--material-surface-inverse-color);border-radius:4px;box-shadow:var(--material-elevation-3)}x-notification a{color:var(--material-primary-inverse-color)}x-notification a:hover{color:var(--material-primary-inverse-color)}x-checkbox::part(indicator){overflow:visible;border-width:2px;border-style:solid;border-color:var(--material-on-surface-variant-color);border-radius:2px;--path-data: var(--checkmark-path-data);}x-checkbox:hover::part(indicator){border-color:var(--material-on-surface-color)}x-radio:active::part(indicator){border-color:var(--material-on-surface-color)}x-checkbox[mixed]::part(indicator){--path-data: var(--mixed-checkmark-path-data);}x-checkbox[toggled]::part(indicator){color:var(--material-on-primary-color);background-color:var(--material-primary-color);border-color:var(--material-primary-color)}x-checkbox::part(indicator)::before{display:none;position:absolute;top:50%;left:50%;width:100%;height:100%;margin:-50% 0 0 -50%;transform:scale(1.45);z-index:-1;content:\"\";pointer-events:none}x-checkbox:hover::part(indicator)::before{display:block;transform:scale(1);background-color:var(--material-on-surface-color);opacity:0.08}x-checkbox:active::part(indicator)::before{display:block;transform:scale(1);background-color:var(--material-primary-color);opacity:0.1}x-checkbox:focus::part(indicator)::before{display:block;transform:scale(2.5);background-color:var(--material-on-surface-color);border-radius:99px;opacity:0.1}x-checkbox[toggled]:hover::part(indicator)::before{background-color:var(--material-primary-color)}x-checkbox[toggled]:active::part(indicator)::before{background-color:var(--material-on-surface-color)}x-checkbox[toggled]:focus::part(indicator)::before{background-color:var(--material-primary-color)}x-radio::part(indicator){border-width:2px;border-style:solid;border-color:var(--material-on-surface-variant-color)}x-radio:hover::part(indicator){border-color:var(--material-on-surface-color)}x-radio:active::part(indicator){border-color:var(--material-on-surface-color)}x-radio[toggled]::part(indicator){border-color:var(--material-primary-color)}x-radio::part(indicator-dot){background-color:var(--material-primary-color)}x-radio[toggled]::part(indicator-dot){transform:scale(0.6)}x-radio[toggled][mixed]::part(indicator-dot){transform:scale(0.55);border-radius:3px}x-radio::part(indicator)::before{display:none;position:absolute;top:50%;left:50%;width:100%;height:100%;margin:-50% 0 0 -50%;transform:scale(1.45);z-index:-1;border-radius:99px;content:\"\";pointer-events:none}x-radio:hover::part(indicator)::before{display:block;transform:scale(1);background-color:var(--material-on-surface-color);opacity:0.08}x-radio:active::part(indicator)::before{display:block;transform:scale(1);background-color:var(--material-primary-color);opacity:0.1}x-radio:focus::part(indicator)::before{display:block;transform:scale(2.2);background-color:var(--material-on-surface-color);opacity:0.1}x-radio[toggled]:hover::part(indicator)::before{background-color:var(--material-primary-color)}x-radio[toggled]:active::part(indicator)::before{background-color:var(--material-on-surface-color)}x-radio[toggled]:focus::part(indicator)::before{background-color:var(--material-primary-color)}x-switch::part(indicator-track){height:100%;background-color:var(--material-surface-container-highest-color);border-width:2px;border-style:solid;border-color:var(--material-outline-color)}x-switch[toggled]::part(indicator-track){background-color:var(--material-primary-color);border-color:var(--material-primary-color)}x-switch::part(indicator-thumb){left:2px;width:15px;height:15px;transform:scale(0.6);background-color:var(--material-outline-color)}x-switch:hover::part(indicator-thumb){background-color:var(--material-on-surface-variant-color)}x-switch[toggled]::part(indicator-thumb){left:calc(100% - 17px);transform:scale(0.9);background-color:var(--material-on-primary-color)}x-switch[toggled]:hover::part(indicator-thumb){background-color:var(--material-primary-container-color)}x-switch[size=\"small\"]::part(indicator-thumb){width:12px;height:12px}x-switch[size=\"small\"][toggled]::part(indicator-thumb){left:calc(100% - 14px)}x-switch[size=\"large\"]::part(indicator-thumb){width:18px;height:18px}x-switch[size=\"large\"][toggled]::part(indicator-thumb){left:calc(100% - 21px)}x-switch::part(indicator-thumb)::before{display:none;position:absolute;top:50%;left:50%;width:100%;height:100%;margin:-50% 0 0 -50%;transform:scale(4.5);z-index:-1;border-radius:99px;content:\"\";pointer-events:none}x-switch:focus::part(indicator-thumb)::before{display:block;background-color:var(--material-on-surface-color);opacity:0.12}x-switch[toggled]:focus::part(indicator-thumb)::before{transform:scale(3);background-color:var(--material-primary-color)}x-select{color:var(--material-on-surface-color);border-width:1px;border-style:solid;border-color:var(--material-outline-color);border-radius:4px}x-select:hover{border-color:var(--material-on-surface-color)}x-select:focus{outline-width:3px;outline-style:solid;outline-color:var(--material-primary-color);outline-offset:-1px}x-select::part(arrow){color:var(--material-on-surface-variant-color);margin:0 8px;--path-data: var(--arrow-down-path-data);}x-slider::part(groove-track){height:6px;background-color:var(--material-secondary-container-color);border-radius:99px}x-slider::part(range-track){height:6px;background-color:var(--material-primary-color);border-radius:5px}x-slider::part(thumb){width:5px;background-color:var(--material-primary-color);border-radius:10px;box-shadow:0px 2px 4px 0px color(srgb 0 0 0 / 0.1)}x-slider::part(thumb):focus{outline-width:3px;outline-style:solid;outline-color:var(--material-primary-color);outline-offset:3px}x-slider::part(tick){top:50%;width:3px;height:3px;transform:translate(-50%, -50%);background-color:var(--material-primary-color);border-radius:99px}x-slider::part(range-tick){background-color:var(--material-on-surface-inverse-color)}x-input{color:var(--material-on-surface-color);border-width:1px;border-style:solid;border-color:var(--material-outline-color);border-radius:4px}x-input:hover{border-color:var(--material-on-surface-color)}x-input:focus{outline-width:3px;outline-style:solid;outline-color:var(--material-primary-color);outline-offset:-1px}x-input[error]{outline-width:3px;outline-style:solid;outline-color:var(--material-error-color);outline-offset:-1px;--selection-background-color: oklch(from var(--material-error-color) l c h / 0.2);}x-input > x-icon{color:var(--material-on-surface-variant-color)}x-input > x-label{color:oklch(from var(--material-on-surface-variant-color) l c h / 0.7);font-weight:400}x-input > x-icon + x-label{padding-top:1px}x-numberinput{color:var(--material-on-surface-color);border-width:1px;border-style:solid;border-color:var(--material-outline-color);border-radius:4px}x-numberinput:hover{border-color:var(--material-on-surface-color)}x-numberinput:focus{outline-width:3px;outline-style:solid;outline-color:var(--material-primary-color);outline-offset:-1px}x-numberinput[error]{outline-width:3px;outline-style:solid;outline-color:var(--material-error-color);outline-offset:-1px;--selection-background-color: oklch(from var(--material-error-color) l c h / 0.2);}x-numberinput > x-icon{color:var(--material-on-surface-variant-color)}x-numberinput > x-label{color:oklch(from var(--material-on-surface-variant-color) l c h / 0.7);font-weight:400}x-numberinput > x-icon + x-label{padding-top:1px}x-numberinput > x-stepper{margin:0 -20px 0 0}x-numberinput:focus > x-stepper{transform:scale(1);z-index:1}x-numberinput:not(:focus) > x-stepper{height:20px;margin:0;transform:scale(0.7);transform-origin:100% 50%;background-color:transparent;border-width:0;box-shadow:none;pointer-events:none}x-numberinput[size=\"small\"]:not(:focus) > x-stepper{transform:scale(0.6)}x-numberinput[size=\"large\"]:not(:focus) > x-stepper{transform:scale(0.8)}x-numberinput:not(:focus) > x-stepper::part(increment-button), x-numberinput:not(:focus) > x-stepper::part(decrement-button){opacity:0.5}x-texteditor{color:var(--material-on-surface-color);border-width:1px;border-style:solid;border-color:var(--material-outline-color);border-radius:4px}x-texteditor:hover{border-color:var(--material-on-surface-color)}x-texteditor:focus{outline-width:3px;outline-style:solid;outline-color:var(--material-primary-color);outline-offset:-1px}x-texteditor[error]{outline-width:3px;outline-style:solid;outline-color:var(--material-error-color);outline-offset:-1px;--selection-background-color: oklch(from var(--material-error-color) l c h / 0.2);}x-texteditor > x-label{color:oklch(from var(--material-on-surface-variant-color) l c h / 0.7);font-weight:400}x-colorinput{color:var(--material-on-surface-color);border-width:1px;border-style:solid;border-color:var(--material-outline-color);border-radius:4px}x-colorinput:hover{border-color:var(--material-on-surface-color)}x-colorinput:focus{outline-width:3px;outline-style:solid;outline-color:var(--material-primary-color);outline-offset:-1px}x-colorinput[error]{outline-width:3px;outline-style:solid;outline-color:var(--material-error-color);outline-offset:-1px;--selection-background-color: oklch(from var(--material-error-color) l c h / 0.2);}x-colorinput::part(arrow){padding:8px 4px 8px 2px;--path-data: var(--arrow-down-path-data);}x-colorinput[size=\"small\"]::part(arrow){padding:4px 4px 4px 0}x-colorinput > x-label{color:oklch(from var(--material-on-surface-variant-color) l c h / 0.7);font-weight:400}x-colorpicker::part(slider){border-radius:4px}x-colorselect{border-radius:4px}x-progressbar{background-color:var(--material-secondary-container-color);border-radius:99px}x-progressbar::part(bar){background-color:var(--material-primary-color);border-radius:99px}x-throbber{color:var(--material-primary-color)}x-titlebar{padding-left:8px;justify-content:flex-start}x-titlebar::part(buttons){right:10px;gap:10px}x-titlebar::part(button){width:22px;height:22px;min-width:22px;min-height:22px;color:var(--material-on-surface-variant-color);border-radius:4px}x-titlebar::part(button):hover{background-color:oklch(from var(--material-on-surface-color) l c h / 0.08)}x-titlebar::part(button):active{background-color:oklch(from var(--material-on-secondary-container-color) l c h / 0.1)}x-titlebar::part(minimize-button){--path-data: var(--minimize-path-data);}x-titlebar::part(maximize-button){--path-data: var(--maximize-path-data);}x-titlebar::part(restore-button){--path-data: var(--restore-path-data);}x-titlebar::part(close-button){--path-data: var(--close-path-data);}x-titlebar::part(icon){width:18px;height:18px}x-titlebar x-icon{color:var(--material-primary-color)}x-titlebar x-label{color:var(--material-primary-color);font-weight:700}\n"
  },
  {
    "path": "src/renderer/public/xel/xel.js",
    "content": "if(!1===MouseEvent.prototype.hasOwnProperty(\"pointerType\")&&Object.defineProperty(MouseEvent.prototype,\"pointerType\",{get(){return this.sourceCapabilities.firesTouchEvents?\"touch\":\"mouse\"}}),Element.prototype.setPointerCapture){let t=Element.prototype.setPointerCapture;Element.prototype.setPointerCapture=function(e){if(t.call(this,e),!1!==this.hasPointerCapture(e)){{let t,i,s,n=!1,a=!1,r=()=>{this.removeEventListener(\"pointerup\",t),this.removeEventListener(\"pointercancel\",i),this.removeEventListener(\"lostpointercapture\",s)};this.addEventListener(\"pointerup\",t=t=>{t.pointerId===e&&(n=!0,r())}),this.addEventListener(\"pointercancel\",i=t=>{t.pointerId===e&&(a=!0,r())}),this.addEventListener(\"lostpointercapture\",s=t=>{if(t.pointerId===e&&(r(),!1===n&&!1===a)){let i=new PointerEvent(\"pointercancel\",{pointerId:e,isPrimary:t.isPrimary});this.dispatchEvent(i)}})}{let t,i,s=`* {cursor: ${getComputedStyle(this).cursor} !important; user-select: none !important; -webkit-user-select: none !important;}`,n=[];for(let t=this.parentNode||this.host;t&&t!==document;t=t.parentNode||t.host)if(t.nodeType===document.DOCUMENT_FRAGMENT_NODE){let e=document.createElementNS(t.host.namespaceURI,\"style\");e.textContent=s,t.append(e),n.push(e)}else if(t.nodeType===document.DOCUMENT_NODE){let e=document.createElement(\"style\");e.textContent=s,t.head.append(e),n.push(e)}this.addEventListener(\"lostpointercapture\",t=s=>{if(s.pointerId===e){this.removeEventListener(\"lostpointercapture\",t),window.removeEventListener(\"pointerup\",i,!0);for(let t of n)t.remove()}}),window.addEventListener(\"pointerup\",i=s=>{if(s.pointerId===e){this.removeEventListener(\"lostpointercapture\",t),window.removeEventListener(\"pointerup\",i,!0);for(let t of n)t.remove()}},!0)}}}}Object.defineProperty(Animation.prototype,\"finished\",{get(){return new Promise((t=>{\"finished\"===this.playState?t():this.addEventListener(\"finish\",(()=>t()),{once:!0})}))}}),window.requestIdleCallback||(window.requestIdleCallback=(t,e={})=>{let i=e.timeout||1,s=performance.now();return setTimeout((()=>{t({get didTimeout(){return!e.timeout&&performance.now()-s-1>i},timeRemaining:()=>Math.max(0,performance.now()-s+1)})}),1)}),Node.prototype.append||(Node.prototype.append=function(t){this.appendChild(t)}),Node.prototype.prepend||(Node.prototype.prepend=function(t){this.insertBefore(t,this.firstElementChild)}),Node.prototype.before||(Node.prototype.before=function(t){this.parentElement.insertBefore(t,this)}),Node.prototype.after||(Node.prototype.after=function(t){this.parentElement.insertBefore(t,this.nextElementSibling)}),Node.prototype.closest||(Node.prototype.closest=function(t){return this.parentNode?this.parentNode.closest(t):null}),Node.prototype.replaceWith||(Node.prototype.replaceWith=function(t){this.parentNode.replaceChild(t,this)});const{entries:t,setPrototypeOf:e,isFrozen:i,getPrototypeOf:s,getOwnPropertyDescriptor:n}=Object;let{freeze:a,seal:r,create:o}=Object,{apply:l,construct:h}=\"undefined\"!=typeof Reflect&&Reflect;a||(a=function(t){return t}),r||(r=function(t){return t}),l||(l=function(t,e,i){return t.apply(e,i)}),h||(h=function(t,e){return new t(...e)});const d=E(Array.prototype.forEach),c=E(Array.prototype.lastIndexOf),u=E(Array.prototype.pop),p=E(Array.prototype.push),m=E(Array.prototype.splice),b=E(String.prototype.toLowerCase),g=E(String.prototype.toString),f=E(String.prototype.match),x=E(String.prototype.replace),w=E(String.prototype.indexOf),v=E(String.prototype.trim),k=E(Object.prototype.hasOwnProperty),y=E(RegExp.prototype.test),C=(z=TypeError,function(){for(var t=arguments.length,e=new Array(t),i=0;i<t;i++)e[i]=arguments[i];return h(z,e)});var z;function E(t){return function(e){for(var i=arguments.length,s=new Array(i>1?i-1:0),n=1;n<i;n++)s[n-1]=arguments[n];return l(t,e,s)}}function $(t,s){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:b;e&&e(t,null);let a=s.length;for(;a--;){let e=s[a];if(\"string\"==typeof e){const t=n(e);t!==e&&(i(s)||(s[a]=t),e=t)}t[e]=!0}return t}function S(t){for(let e=0;e<t.length;e++){k(t,e)||(t[e]=null)}return t}function M(e){const i=o(null);for(const[s,n]of t(e)){k(e,s)&&(Array.isArray(n)?i[s]=S(n):n&&\"object\"==typeof n&&n.constructor===Object?i[s]=M(n):i[s]=n)}return i}function L(t,e){for(;null!==t;){const i=n(t,e);if(i){if(i.get)return E(i.get);if(\"function\"==typeof i.value)return E(i.value)}t=s(t)}return function(){return null}}const A=a([\"a\",\"abbr\",\"acronym\",\"address\",\"area\",\"article\",\"aside\",\"audio\",\"b\",\"bdi\",\"bdo\",\"big\",\"blink\",\"blockquote\",\"body\",\"br\",\"button\",\"canvas\",\"caption\",\"center\",\"cite\",\"code\",\"col\",\"colgroup\",\"content\",\"data\",\"datalist\",\"dd\",\"decorator\",\"del\",\"details\",\"dfn\",\"dialog\",\"dir\",\"div\",\"dl\",\"dt\",\"element\",\"em\",\"fieldset\",\"figcaption\",\"figure\",\"font\",\"footer\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"head\",\"header\",\"hgroup\",\"hr\",\"html\",\"i\",\"img\",\"input\",\"ins\",\"kbd\",\"label\",\"legend\",\"li\",\"main\",\"map\",\"mark\",\"marquee\",\"menu\",\"menuitem\",\"meter\",\"nav\",\"nobr\",\"ol\",\"optgroup\",\"option\",\"output\",\"p\",\"picture\",\"pre\",\"progress\",\"q\",\"rp\",\"rt\",\"ruby\",\"s\",\"samp\",\"section\",\"select\",\"shadow\",\"small\",\"source\",\"spacer\",\"span\",\"strike\",\"strong\",\"style\",\"sub\",\"summary\",\"sup\",\"table\",\"tbody\",\"td\",\"template\",\"textarea\",\"tfoot\",\"th\",\"thead\",\"time\",\"tr\",\"track\",\"tt\",\"u\",\"ul\",\"var\",\"video\",\"wbr\"]),R=a([\"svg\",\"a\",\"altglyph\",\"altglyphdef\",\"altglyphitem\",\"animatecolor\",\"animatemotion\",\"animatetransform\",\"circle\",\"clippath\",\"defs\",\"desc\",\"ellipse\",\"filter\",\"font\",\"g\",\"glyph\",\"glyphref\",\"hkern\",\"image\",\"line\",\"lineargradient\",\"marker\",\"mask\",\"metadata\",\"mpath\",\"path\",\"pattern\",\"polygon\",\"polyline\",\"radialgradient\",\"rect\",\"stop\",\"style\",\"switch\",\"symbol\",\"text\",\"textpath\",\"title\",\"tref\",\"tspan\",\"view\",\"vkern\"]),P=a([\"feBlend\",\"feColorMatrix\",\"feComponentTransfer\",\"feComposite\",\"feConvolveMatrix\",\"feDiffuseLighting\",\"feDisplacementMap\",\"feDistantLight\",\"feDropShadow\",\"feFlood\",\"feFuncA\",\"feFuncB\",\"feFuncG\",\"feFuncR\",\"feGaussianBlur\",\"feImage\",\"feMerge\",\"feMergeNode\",\"feMorphology\",\"feOffset\",\"fePointLight\",\"feSpecularLighting\",\"feSpotLight\",\"feTile\",\"feTurbulence\"]),T=a([\"animate\",\"color-profile\",\"cursor\",\"discard\",\"font-face\",\"font-face-format\",\"font-face-name\",\"font-face-src\",\"font-face-uri\",\"foreignobject\",\"hatch\",\"hatchpath\",\"mesh\",\"meshgradient\",\"meshpatch\",\"meshrow\",\"missing-glyph\",\"script\",\"set\",\"solidcolor\",\"unknown\",\"use\"]),D=a([\"math\",\"menclose\",\"merror\",\"mfenced\",\"mfrac\",\"mglyph\",\"mi\",\"mlabeledtr\",\"mmultiscripts\",\"mn\",\"mo\",\"mover\",\"mpadded\",\"mphantom\",\"mroot\",\"mrow\",\"ms\",\"mspace\",\"msqrt\",\"mstyle\",\"msub\",\"msup\",\"msubsup\",\"mtable\",\"mtd\",\"mtext\",\"mtr\",\"munder\",\"munderover\",\"mprescripts\"]),B=a([\"maction\",\"maligngroup\",\"malignmark\",\"mlongdiv\",\"mscarries\",\"mscarry\",\"msgroup\",\"mstack\",\"msline\",\"msrow\",\"semantics\",\"annotation\",\"annotation-xml\",\"mprescripts\",\"none\"]),I=a([\"#text\"]),O=a([\"accept\",\"action\",\"align\",\"alt\",\"autocapitalize\",\"autocomplete\",\"autopictureinpicture\",\"autoplay\",\"background\",\"bgcolor\",\"border\",\"capture\",\"cellpadding\",\"cellspacing\",\"checked\",\"cite\",\"class\",\"clear\",\"color\",\"cols\",\"colspan\",\"controls\",\"controlslist\",\"coords\",\"crossorigin\",\"datetime\",\"decoding\",\"default\",\"dir\",\"disabled\",\"disablepictureinpicture\",\"disableremoteplayback\",\"download\",\"draggable\",\"enctype\",\"enterkeyhint\",\"face\",\"for\",\"headers\",\"height\",\"hidden\",\"high\",\"href\",\"hreflang\",\"id\",\"inputmode\",\"integrity\",\"ismap\",\"kind\",\"label\",\"lang\",\"list\",\"loading\",\"loop\",\"low\",\"max\",\"maxlength\",\"media\",\"method\",\"min\",\"minlength\",\"multiple\",\"muted\",\"name\",\"nonce\",\"noshade\",\"novalidate\",\"nowrap\",\"open\",\"optimum\",\"pattern\",\"placeholder\",\"playsinline\",\"popover\",\"popovertarget\",\"popovertargetaction\",\"poster\",\"preload\",\"pubdate\",\"radiogroup\",\"readonly\",\"rel\",\"required\",\"rev\",\"reversed\",\"role\",\"rows\",\"rowspan\",\"spellcheck\",\"scope\",\"selected\",\"shape\",\"size\",\"sizes\",\"span\",\"srclang\",\"start\",\"src\",\"srcset\",\"step\",\"style\",\"summary\",\"tabindex\",\"title\",\"translate\",\"type\",\"usemap\",\"valign\",\"value\",\"width\",\"wrap\",\"xmlns\",\"slot\"]),H=a([\"accent-height\",\"accumulate\",\"additive\",\"alignment-baseline\",\"amplitude\",\"ascent\",\"attributename\",\"attributetype\",\"azimuth\",\"basefrequency\",\"baseline-shift\",\"begin\",\"bias\",\"by\",\"class\",\"clip\",\"clippathunits\",\"clip-path\",\"clip-rule\",\"color\",\"color-interpolation\",\"color-interpolation-filters\",\"color-profile\",\"color-rendering\",\"cx\",\"cy\",\"d\",\"dx\",\"dy\",\"diffuseconstant\",\"direction\",\"display\",\"divisor\",\"dur\",\"edgemode\",\"elevation\",\"end\",\"exponent\",\"fill\",\"fill-opacity\",\"fill-rule\",\"filter\",\"filterunits\",\"flood-color\",\"flood-opacity\",\"font-family\",\"font-size\",\"font-size-adjust\",\"font-stretch\",\"font-style\",\"font-variant\",\"font-weight\",\"fx\",\"fy\",\"g1\",\"g2\",\"glyph-name\",\"glyphref\",\"gradientunits\",\"gradienttransform\",\"height\",\"href\",\"id\",\"image-rendering\",\"in\",\"in2\",\"intercept\",\"k\",\"k1\",\"k2\",\"k3\",\"k4\",\"kerning\",\"keypoints\",\"keysplines\",\"keytimes\",\"lang\",\"lengthadjust\",\"letter-spacing\",\"kernelmatrix\",\"kernelunitlength\",\"lighting-color\",\"local\",\"marker-end\",\"marker-mid\",\"marker-start\",\"markerheight\",\"markerunits\",\"markerwidth\",\"maskcontentunits\",\"maskunits\",\"max\",\"mask\",\"media\",\"method\",\"mode\",\"min\",\"name\",\"numoctaves\",\"offset\",\"operator\",\"opacity\",\"order\",\"orient\",\"orientation\",\"origin\",\"overflow\",\"paint-order\",\"path\",\"pathlength\",\"patterncontentunits\",\"patterntransform\",\"patternunits\",\"points\",\"preservealpha\",\"preserveaspectratio\",\"primitiveunits\",\"r\",\"rx\",\"ry\",\"radius\",\"refx\",\"refy\",\"repeatcount\",\"repeatdur\",\"restart\",\"result\",\"rotate\",\"scale\",\"seed\",\"shape-rendering\",\"slope\",\"specularconstant\",\"specularexponent\",\"spreadmethod\",\"startoffset\",\"stddeviation\",\"stitchtiles\",\"stop-color\",\"stop-opacity\",\"stroke-dasharray\",\"stroke-dashoffset\",\"stroke-linecap\",\"stroke-linejoin\",\"stroke-miterlimit\",\"stroke-opacity\",\"stroke\",\"stroke-width\",\"style\",\"surfacescale\",\"systemlanguage\",\"tabindex\",\"tablevalues\",\"targetx\",\"targety\",\"transform\",\"transform-origin\",\"text-anchor\",\"text-decoration\",\"text-rendering\",\"textlength\",\"type\",\"u1\",\"u2\",\"unicode\",\"values\",\"viewbox\",\"visibility\",\"version\",\"vert-adv-y\",\"vert-origin-x\",\"vert-origin-y\",\"width\",\"word-spacing\",\"wrap\",\"writing-mode\",\"xchannelselector\",\"ychannelselector\",\"x\",\"x1\",\"x2\",\"xmlns\",\"y\",\"y1\",\"y2\",\"z\",\"zoomandpan\"]),j=a([\"accent\",\"accentunder\",\"align\",\"bevelled\",\"close\",\"columnsalign\",\"columnlines\",\"columnspan\",\"denomalign\",\"depth\",\"dir\",\"display\",\"displaystyle\",\"encoding\",\"fence\",\"frame\",\"height\",\"href\",\"id\",\"largeop\",\"length\",\"linethickness\",\"lspace\",\"lquote\",\"mathbackground\",\"mathcolor\",\"mathsize\",\"mathvariant\",\"maxsize\",\"minsize\",\"movablelimits\",\"notation\",\"numalign\",\"open\",\"rowalign\",\"rowlines\",\"rowspacing\",\"rowspan\",\"rspace\",\"rquote\",\"scriptlevel\",\"scriptminsize\",\"scriptsizemultiplier\",\"selection\",\"separator\",\"separators\",\"stretchy\",\"subscriptshift\",\"supscriptshift\",\"symmetric\",\"voffset\",\"width\",\"xmlns\"]),N=a([\"xlink:href\",\"xml:id\",\"xlink:title\",\"xml:space\",\"xmlns:xlink\"]),F=r(/\\{\\{[\\w\\W]*|[\\w\\W]*\\}\\}/gm),G=r(/<%[\\w\\W]*|[\\w\\W]*%>/gm),X=r(/\\$\\{[\\w\\W]*/gm),_=r(/^data-[\\-\\w.\\u00B7-\\uFFFF]+$/),Z=r(/^aria-[\\-\\w]+$/),U=r(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i),Y=r(/^(?:\\w+script|data):/i),V=r(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g),q=r(/^html$/i),W=r(/^[a-z][.\\w]*(-[.\\w]+)+$/i);var K=Object.freeze({__proto__:null,ARIA_ATTR:Z,ATTR_WHITESPACE:V,CUSTOM_ELEMENT:W,DATA_ATTR:_,DOCTYPE_NAME:q,ERB_EXPR:G,IS_ALLOWED_URI:U,IS_SCRIPT_OR_DATA:Y,MUSTACHE_EXPR:F,TMPLIT_EXPR:X});const J=1,Q=3,tt=7,et=8,it=9,st=function(){return\"undefined\"==typeof window?null:window};var nt=function e(){let i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:st();const s=t=>e(t);if(s.version=\"3.2.4\",s.removed=[],!i||!i.document||i.document.nodeType!==it||!i.Element)return s.isSupported=!1,s;let{document:n}=i;const r=n,l=r.currentScript,{DocumentFragment:h,HTMLTemplateElement:z,Node:E,Element:S,NodeFilter:F,NamedNodeMap:G=i.NamedNodeMap||i.MozNamedAttrMap,HTMLFormElement:X,DOMParser:_,trustedTypes:Z}=i,Y=S.prototype,V=L(Y,\"cloneNode\"),W=L(Y,\"remove\"),nt=L(Y,\"nextSibling\"),at=L(Y,\"childNodes\"),rt=L(Y,\"parentNode\");if(\"function\"==typeof z){const t=n.createElement(\"template\");t.content&&t.content.ownerDocument&&(n=t.content.ownerDocument)}let ot,lt=\"\";const{implementation:ht,createNodeIterator:dt,createDocumentFragment:ct,getElementsByTagName:ut}=n,{importNode:pt}=r;let mt={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]};s.isSupported=\"function\"==typeof t&&\"function\"==typeof rt&&ht&&void 0!==ht.createHTMLDocument;const{MUSTACHE_EXPR:bt,ERB_EXPR:gt,TMPLIT_EXPR:ft,DATA_ATTR:xt,ARIA_ATTR:wt,IS_SCRIPT_OR_DATA:vt,ATTR_WHITESPACE:kt,CUSTOM_ELEMENT:yt}=K;let{IS_ALLOWED_URI:Ct}=K,zt=null;const Et=$({},[...A,...R,...P,...D,...I]);let $t=null;const St=$({},[...O,...H,...j,...N]);let Mt=Object.seal(o(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),Lt=null,At=null,Rt=!0,Pt=!0,Tt=!1,Dt=!0,Bt=!1,It=!0,Ot=!1,Ht=!1,jt=!1,Nt=!1,Ft=!1,Gt=!1,Xt=!0,_t=!1,Zt=!0,Ut=!1,Yt={},Vt=null;const qt=$({},[\"annotation-xml\",\"audio\",\"colgroup\",\"desc\",\"foreignobject\",\"head\",\"iframe\",\"math\",\"mi\",\"mn\",\"mo\",\"ms\",\"mtext\",\"noembed\",\"noframes\",\"noscript\",\"plaintext\",\"script\",\"style\",\"svg\",\"template\",\"thead\",\"title\",\"video\",\"xmp\"]);let Wt=null;const Kt=$({},[\"audio\",\"video\",\"img\",\"source\",\"image\",\"track\"]);let Jt=null;const Qt=$({},[\"alt\",\"class\",\"for\",\"id\",\"label\",\"name\",\"pattern\",\"placeholder\",\"role\",\"summary\",\"title\",\"value\",\"style\",\"xmlns\"]),te=\"http://www.w3.org/1998/Math/MathML\",ee=\"http://www.w3.org/2000/svg\",ie=\"http://www.w3.org/1999/xhtml\";let se=ie,ne=!1,ae=null;const re=$({},[te,ee,ie],g);let oe=$({},[\"mi\",\"mo\",\"mn\",\"ms\",\"mtext\"]),le=$({},[\"annotation-xml\"]);const he=$({},[\"title\",\"style\",\"font\",\"a\",\"script\"]);let de=null;const ce=[\"application/xhtml+xml\",\"text/html\"];let ue=null,pe=null;const me=n.createElement(\"form\"),be=function(t){return t instanceof RegExp||t instanceof Function},ge=function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!pe||pe!==t){if(t&&\"object\"==typeof t||(t={}),t=M(t),de=-1===ce.indexOf(t.PARSER_MEDIA_TYPE)?\"text/html\":t.PARSER_MEDIA_TYPE,ue=\"application/xhtml+xml\"===de?g:b,zt=k(t,\"ALLOWED_TAGS\")?$({},t.ALLOWED_TAGS,ue):Et,$t=k(t,\"ALLOWED_ATTR\")?$({},t.ALLOWED_ATTR,ue):St,ae=k(t,\"ALLOWED_NAMESPACES\")?$({},t.ALLOWED_NAMESPACES,g):re,Jt=k(t,\"ADD_URI_SAFE_ATTR\")?$(M(Qt),t.ADD_URI_SAFE_ATTR,ue):Qt,Wt=k(t,\"ADD_DATA_URI_TAGS\")?$(M(Kt),t.ADD_DATA_URI_TAGS,ue):Kt,Vt=k(t,\"FORBID_CONTENTS\")?$({},t.FORBID_CONTENTS,ue):qt,Lt=k(t,\"FORBID_TAGS\")?$({},t.FORBID_TAGS,ue):{},At=k(t,\"FORBID_ATTR\")?$({},t.FORBID_ATTR,ue):{},Yt=!!k(t,\"USE_PROFILES\")&&t.USE_PROFILES,Rt=!1!==t.ALLOW_ARIA_ATTR,Pt=!1!==t.ALLOW_DATA_ATTR,Tt=t.ALLOW_UNKNOWN_PROTOCOLS||!1,Dt=!1!==t.ALLOW_SELF_CLOSE_IN_ATTR,Bt=t.SAFE_FOR_TEMPLATES||!1,It=!1!==t.SAFE_FOR_XML,Ot=t.WHOLE_DOCUMENT||!1,Nt=t.RETURN_DOM||!1,Ft=t.RETURN_DOM_FRAGMENT||!1,Gt=t.RETURN_TRUSTED_TYPE||!1,jt=t.FORCE_BODY||!1,Xt=!1!==t.SANITIZE_DOM,_t=t.SANITIZE_NAMED_PROPS||!1,Zt=!1!==t.KEEP_CONTENT,Ut=t.IN_PLACE||!1,Ct=t.ALLOWED_URI_REGEXP||U,se=t.NAMESPACE||ie,oe=t.MATHML_TEXT_INTEGRATION_POINTS||oe,le=t.HTML_INTEGRATION_POINTS||le,Mt=t.CUSTOM_ELEMENT_HANDLING||{},t.CUSTOM_ELEMENT_HANDLING&&be(t.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(Mt.tagNameCheck=t.CUSTOM_ELEMENT_HANDLING.tagNameCheck),t.CUSTOM_ELEMENT_HANDLING&&be(t.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(Mt.attributeNameCheck=t.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),t.CUSTOM_ELEMENT_HANDLING&&\"boolean\"==typeof t.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(Mt.allowCustomizedBuiltInElements=t.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),Bt&&(Pt=!1),Ft&&(Nt=!0),Yt&&(zt=$({},I),$t=[],!0===Yt.html&&($(zt,A),$($t,O)),!0===Yt.svg&&($(zt,R),$($t,H),$($t,N)),!0===Yt.svgFilters&&($(zt,P),$($t,H),$($t,N)),!0===Yt.mathMl&&($(zt,D),$($t,j),$($t,N))),t.ADD_TAGS&&(zt===Et&&(zt=M(zt)),$(zt,t.ADD_TAGS,ue)),t.ADD_ATTR&&($t===St&&($t=M($t)),$($t,t.ADD_ATTR,ue)),t.ADD_URI_SAFE_ATTR&&$(Jt,t.ADD_URI_SAFE_ATTR,ue),t.FORBID_CONTENTS&&(Vt===qt&&(Vt=M(Vt)),$(Vt,t.FORBID_CONTENTS,ue)),Zt&&(zt[\"#text\"]=!0),Ot&&$(zt,[\"html\",\"head\",\"body\"]),zt.table&&($(zt,[\"tbody\"]),delete Lt.tbody),t.TRUSTED_TYPES_POLICY){if(\"function\"!=typeof t.TRUSTED_TYPES_POLICY.createHTML)throw C('TRUSTED_TYPES_POLICY configuration option must provide a \"createHTML\" hook.');if(\"function\"!=typeof t.TRUSTED_TYPES_POLICY.createScriptURL)throw C('TRUSTED_TYPES_POLICY configuration option must provide a \"createScriptURL\" hook.');ot=t.TRUSTED_TYPES_POLICY,lt=ot.createHTML(\"\")}else void 0===ot&&(ot=function(t,e){if(\"object\"!=typeof t||\"function\"!=typeof t.createPolicy)return null;let i=null;const s=\"data-tt-policy-suffix\";e&&e.hasAttribute(s)&&(i=e.getAttribute(s));const n=\"dompurify\"+(i?\"#\"+i:\"\");try{return t.createPolicy(n,{createHTML:t=>t,createScriptURL:t=>t})}catch(t){return console.warn(\"TrustedTypes policy \"+n+\" could not be created.\"),null}}(Z,l)),null!==ot&&\"string\"==typeof lt&&(lt=ot.createHTML(\"\"));a&&a(t),pe=t}},fe=$({},[...R,...P,...T]),xe=$({},[...D,...B]),we=function(t){p(s.removed,{element:t});try{rt(t).removeChild(t)}catch(e){W(t)}},ve=function(t,e){try{p(s.removed,{attribute:e.getAttributeNode(t),from:e})}catch(t){p(s.removed,{attribute:null,from:e})}if(e.removeAttribute(t),\"is\"===t)if(Nt||Ft)try{we(e)}catch(t){}else try{e.setAttribute(t,\"\")}catch(t){}},ke=function(t){let e=null,i=null;if(jt)t=\"<remove></remove>\"+t;else{const e=f(t,/^[\\r\\n\\t ]+/);i=e&&e[0]}\"application/xhtml+xml\"===de&&se===ie&&(t='<html xmlns=\"http://www.w3.org/1999/xhtml\"><head></head><body>'+t+\"</body></html>\");const s=ot?ot.createHTML(t):t;if(se===ie)try{e=(new _).parseFromString(s,de)}catch(t){}if(!e||!e.documentElement){e=ht.createDocument(se,\"template\",null);try{e.documentElement.innerHTML=ne?lt:s}catch(t){}}const a=e.body||e.documentElement;return t&&i&&a.insertBefore(n.createTextNode(i),a.childNodes[0]||null),se===ie?ut.call(e,Ot?\"html\":\"body\")[0]:Ot?e.documentElement:a},ye=function(t){return dt.call(t.ownerDocument||t,t,F.SHOW_ELEMENT|F.SHOW_COMMENT|F.SHOW_TEXT|F.SHOW_PROCESSING_INSTRUCTION|F.SHOW_CDATA_SECTION,null)},Ce=function(t){return t instanceof X&&(\"string\"!=typeof t.nodeName||\"string\"!=typeof t.textContent||\"function\"!=typeof t.removeChild||!(t.attributes instanceof G)||\"function\"!=typeof t.removeAttribute||\"function\"!=typeof t.setAttribute||\"string\"!=typeof t.namespaceURI||\"function\"!=typeof t.insertBefore||\"function\"!=typeof t.hasChildNodes)},ze=function(t){return\"function\"==typeof E&&t instanceof E};function Ee(t,e,i){d(t,(t=>{t.call(s,e,i,pe)}))}const $e=function(t){let e=null;if(Ee(mt.beforeSanitizeElements,t,null),Ce(t))return we(t),!0;const i=ue(t.nodeName);if(Ee(mt.uponSanitizeElement,t,{tagName:i,allowedTags:zt}),t.hasChildNodes()&&!ze(t.firstElementChild)&&y(/<[/\\w]/g,t.innerHTML)&&y(/<[/\\w]/g,t.textContent))return we(t),!0;if(t.nodeType===tt)return we(t),!0;if(It&&t.nodeType===et&&y(/<[/\\w]/g,t.data))return we(t),!0;if(!zt[i]||Lt[i]){if(!Lt[i]&&Me(i)){if(Mt.tagNameCheck instanceof RegExp&&y(Mt.tagNameCheck,i))return!1;if(Mt.tagNameCheck instanceof Function&&Mt.tagNameCheck(i))return!1}if(Zt&&!Vt[i]){const e=rt(t)||t.parentNode,i=at(t)||t.childNodes;if(i&&e){for(let s=i.length-1;s>=0;--s){const n=V(i[s],!0);n.o=(t.o||0)+1,e.insertBefore(n,nt(t))}}}return we(t),!0}return t instanceof S&&!function(t){let e=rt(t);e&&e.tagName||(e={namespaceURI:se,tagName:\"template\"});const i=b(t.tagName),s=b(e.tagName);return!!ae[t.namespaceURI]&&(t.namespaceURI===ee?e.namespaceURI===ie?\"svg\"===i:e.namespaceURI===te?\"svg\"===i&&(\"annotation-xml\"===s||oe[s]):Boolean(fe[i]):t.namespaceURI===te?e.namespaceURI===ie?\"math\"===i:e.namespaceURI===ee?\"math\"===i&&le[s]:Boolean(xe[i]):t.namespaceURI===ie?!(e.namespaceURI===ee&&!le[s])&&!(e.namespaceURI===te&&!oe[s])&&!xe[i]&&(he[i]||!fe[i]):!(\"application/xhtml+xml\"!==de||!ae[t.namespaceURI]))}(t)?(we(t),!0):\"noscript\"!==i&&\"noembed\"!==i&&\"noframes\"!==i||!y(/<\\/no(script|embed|frames)/i,t.innerHTML)?(Bt&&t.nodeType===Q&&(e=t.textContent,d([bt,gt,ft],(t=>{e=x(e,t,\" \")})),t.textContent!==e&&(p(s.removed,{element:t.cloneNode()}),t.textContent=e)),Ee(mt.afterSanitizeElements,t,null),!1):(we(t),!0)},Se=function(t,e,i){if(Xt&&(\"id\"===e||\"name\"===e)&&(i in n||i in me))return!1;if(Pt&&!At[e]&&y(xt,e));else if(Rt&&y(wt,e));else if(!$t[e]||At[e]){if(!(Me(t)&&(Mt.tagNameCheck instanceof RegExp&&y(Mt.tagNameCheck,t)||Mt.tagNameCheck instanceof Function&&Mt.tagNameCheck(t))&&(Mt.attributeNameCheck instanceof RegExp&&y(Mt.attributeNameCheck,e)||Mt.attributeNameCheck instanceof Function&&Mt.attributeNameCheck(e))||\"is\"===e&&Mt.allowCustomizedBuiltInElements&&(Mt.tagNameCheck instanceof RegExp&&y(Mt.tagNameCheck,i)||Mt.tagNameCheck instanceof Function&&Mt.tagNameCheck(i))))return!1}else if(Jt[e]);else if(y(Ct,x(i,kt,\"\")));else if(\"src\"!==e&&\"xlink:href\"!==e&&\"href\"!==e||\"script\"===t||0!==w(i,\"data:\")||!Wt[t]){if(Tt&&!y(vt,x(i,kt,\"\")));else if(i)return!1}else;return!0},Me=function(t){return\"annotation-xml\"!==t&&f(t,yt)},Le=function(t){Ee(mt.beforeSanitizeAttributes,t,null);const{attributes:e}=t;if(!e||Ce(t))return;const i={attrName:\"\",attrValue:\"\",keepAttr:!0,allowedAttributes:$t,forceKeepAttr:void 0};let n=e.length;for(;n--;){const a=e[n],{name:r,namespaceURI:o,value:l}=a,h=ue(r);let c=\"value\"===r?l:v(l);if(i.attrName=h,i.attrValue=c,i.keepAttr=!0,i.forceKeepAttr=void 0,Ee(mt.uponSanitizeAttribute,t,i),c=i.attrValue,!_t||\"id\"!==h&&\"name\"!==h||(ve(r,t),c=\"user-content-\"+c),It&&y(/((--!?|])>)|<\\/(style|title)/i,c)){ve(r,t);continue}if(i.forceKeepAttr)continue;if(ve(r,t),!i.keepAttr)continue;if(!Dt&&y(/\\/>/i,c)){ve(r,t);continue}Bt&&d([bt,gt,ft],(t=>{c=x(c,t,\" \")}));const p=ue(t.nodeName);if(Se(p,h,c)){if(ot&&\"object\"==typeof Z&&\"function\"==typeof Z.getAttributeType)if(o);else switch(Z.getAttributeType(p,h)){case\"TrustedHTML\":c=ot.createHTML(c);break;case\"TrustedScriptURL\":c=ot.createScriptURL(c)}try{o?t.setAttributeNS(o,r,c):t.setAttribute(r,c),Ce(t)?we(t):u(s.removed)}catch(t){}}}Ee(mt.afterSanitizeAttributes,t,null)},Ae=function t(e){let i=null;const s=ye(e);for(Ee(mt.beforeSanitizeShadowDOM,e,null);i=s.nextNode();)Ee(mt.uponSanitizeShadowNode,i,null),$e(i),Le(i),i.content instanceof h&&t(i.content);Ee(mt.afterSanitizeShadowDOM,e,null)};return s.sanitize=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=null,n=null,a=null,o=null;if(ne=!t,ne&&(t=\"\\x3c!--\\x3e\"),\"string\"!=typeof t&&!ze(t)){if(\"function\"!=typeof t.toString)throw C(\"toString is not a function\");if(\"string\"!=typeof(t=t.toString()))throw C(\"dirty is not a string, aborting\")}if(!s.isSupported)return t;if(Ht||ge(e),s.removed=[],\"string\"==typeof t&&(Ut=!1),Ut){if(t.nodeName){const e=ue(t.nodeName);if(!zt[e]||Lt[e])throw C(\"root node is forbidden and cannot be sanitized in-place\")}}else if(t instanceof E)i=ke(\"\\x3c!----\\x3e\"),n=i.ownerDocument.importNode(t,!0),n.nodeType===J&&\"BODY\"===n.nodeName||\"HTML\"===n.nodeName?i=n:i.appendChild(n);else{if(!Nt&&!Bt&&!Ot&&-1===t.indexOf(\"<\"))return ot&&Gt?ot.createHTML(t):t;if(i=ke(t),!i)return Nt?null:Gt?lt:\"\"}i&&jt&&we(i.firstChild);const l=ye(Ut?t:i);for(;a=l.nextNode();)$e(a),Le(a),a.content instanceof h&&Ae(a.content);if(Ut)return t;if(Nt){if(Ft)for(o=ct.call(i.ownerDocument);i.firstChild;)o.appendChild(i.firstChild);else o=i;return($t.shadowroot||$t.shadowrootmode)&&(o=pt.call(r,o,!0)),o}let c=Ot?i.outerHTML:i.innerHTML;return Ot&&zt[\"!doctype\"]&&i.ownerDocument&&i.ownerDocument.doctype&&i.ownerDocument.doctype.name&&y(q,i.ownerDocument.doctype.name)&&(c=\"<!DOCTYPE \"+i.ownerDocument.doctype.name+\">\\n\"+c),Bt&&d([bt,gt,ft],(t=>{c=x(c,t,\" \")})),ot&&Gt?ot.createHTML(c):c},s.setConfig=function(){ge(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),Ht=!0},s.clearConfig=function(){pe=null,Ht=!1},s.isValidAttribute=function(t,e,i){pe||ge({});const s=ue(t),n=ue(e);return Se(s,n,i)},s.addHook=function(t,e){\"function\"==typeof e&&p(mt[t],e)},s.removeHook=function(t,e){if(void 0!==e){const i=c(mt[t],e);return-1===i?void 0:m(mt[t],i,1)[0]}return u(mt[t])},s.removeHooks=function(t){mt[t]=[]},s.removeAllHooks=function(){mt={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},s}();class at{#t={};addEventListener(t,e){this.#t||(this.#t={});let i=this.#t[t];i||(this.#t[t]=i=[]),i.push(e),i.length>1e4&&console.warn(`Potential EventEmitter memory leak: ${i.length} listeners subscribed to event \"${t}\"`)}removeEventListener(t,e){if(this.#t&&this.#t[t]){for(var i=[],s=0;s<this.#t[t].length;s+=1)this.#t[t][s]!==e&&i.push(this.#t[t][s]);this.#t[t]=i}}dispatchEvent(t){if(!this.#t)return;let e=this.#t[t.type];if(!e)return;let i=null;for(let s=e.length-1;s>=0;s-=1){let n,a=e[s];try{n=a.call(window,t)}catch(t){null===i&&(i=t)}if(!1===n)break}if(i)throw i}}let rt=(t,e,i=!1)=>{if(t.length!==e.length)return!1;if(i)for(let i in t){if(t[i]!==e[i])return!1}else{for(let i=0;i<t.length;i+=1)if(!e.includes(t[i]))return!1;for(let i=0;i<e.length;i+=1)if(!t.includes(e[i]))return!1}return!0};function ot(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}function lt(t,e,i=[0,0,0]){const s=ot(t,e[0]),n=ot(t,e[1]),a=ot(t,e[2]);return i[0]=s,i[1]=n,i[2]=a,i}function ht(t){return\"string\"===dt(t)}function dt(t){return(Object.prototype.toString.call(t).match(/^\\[object\\s+(.*?)\\]$/)[1]||\"\").toLowerCase()}function ct(t,{precision:e=16,unit:i}){return ut(t)?\"none\":(t=+mt(t,e))+(i??\"\")}function ut(t){return null===t}function pt(t){return ut(t)?0:t}function mt(t,e){if(0===t)return 0;let i=~~t,s=0;i&&e&&(s=1+~~Math.log10(Math.abs(i)));const n=10**(e-s);return Math.floor(t*n+.5)/n}function bt(t,e,i){return isNaN(t)?e:isNaN(e)?t:t+(e-t)*i}function gt(t,e,i){return!t||!e||t===e||t[0]===e[0]&&t[1]===e[1]||isNaN(i)||null===i?i:bt(e[0],e[1],function(t,e,i){return(i-t)/(e-t)}(t[0],t[1],i))}function ft(t,e,i){return Math.max(Math.min(i,e),t)}function xt(t,e){return Math.sign(t)===Math.sign(e)?t:-t}function wt(t,e){return xt(Math.abs(t)**e,t)}function vt(t,e){return 0===e?0:t/e}function kt(t,e){if(t instanceof e)return!0;const i=e.name;for(;t;){const e=Object.getPrototypeOf(t),s=e?.constructor?.name;if(s===i)return!0;if(!s||\"Object\"===s)return!1;t=e}return!1}class yt{type;coordMeta;coordRange;range;constructor(t,e){if(\"object\"==typeof t&&(this.coordMeta=t),e&&(this.coordMeta=e,this.coordRange=e.range??e.refRange),\"string\"==typeof t){let e=t.trim().match(/^(?<type><[a-z]+>)(\\[(?<min>-?[.\\d]+),\\s*(?<max>-?[.\\d]+)\\])?$/);if(!e)throw new TypeError(`Cannot parse ${t} as a type definition.`);this.type=e.groups.type;let{min:i,max:s}=e.groups;(i||s)&&(this.range=[+i,+s])}}get computedRange(){return this.range?this.range:\"<percentage>\"===this.type?this.percentageRange():\"<angle>\"===this.type?[0,360]:null}get unit(){return\"<percentage>\"===this.type?\"%\":\"<angle>\"===this.type?\"deg\":\"\"}resolve(t){if(\"<angle>\"===this.type)return t;let e=this.computedRange,i=this.coordRange;return\"<percentage>\"===this.type&&(i??=this.percentageRange()),gt(e,i,t)}serialize(t,e){let i=\"<percentage>\"===this.type?this.percentageRange(100):this.computedRange,s=this.unit;return ct(t=gt(this.coordRange,i,t),{unit:s,precision:e})}toString(){let t=this.type;if(this.range){let[e=\"\",i=\"\"]=this.range;t+=`[${e},${i}]`}return t}percentageRange(t=1){let e;return e=this.coordMeta&&this.coordMeta.range||this.coordRange&&this.coordRange[0]>=0?[0,1]:[-1,1],[e[0]*t,e[1]*t]}static get(t,...e){return kt(t,this)?t:new this(t,...e)}}const Ct=Symbol(\"instance\");class zt{type;name;spaceCoords;coords;constructor(t,e=t.space){t[Ct]=this,this.type=\"function\",this.name=\"color\",Object.assign(this,t),this.space=e,\"custom\"!==this.type&&(this.spaceCoords=Object.values(e.coords),this.coords||(this.coords=this.spaceCoords.map((t=>{let e=[\"<number>\",\"<percentage>\"];return\"angle\"===t.type&&e.push(\"<angle>\"),e}))),this.coords=this.coords.map(((t,e)=>{let i=this.spaceCoords[e];return\"string\"==typeof t&&(t=t.trim().split(/\\s*\\|\\s*/)),t.map((t=>yt.get(t,i)))})))}serializeCoords(t,e,i){return i=t.map(((t,e)=>yt.get(i?.[e]??this.coords[e][0],this.spaceCoords[e]))),t.map(((t,s)=>i[s].serialize(t,e)))}coerceCoords(t,e){return Object.entries(this.space.coords).map((([i,s],n)=>{let a=t[n];if(ut(a)||isNaN(a))return a;let r=e[n],o=this.coords[n].find((t=>t.type==r));if(!o){let t=s.name||i;throw new TypeError(`${r??a?.raw??a} not allowed for ${t} in ${this.name}()`)}return a=o.resolve(a),o.range&&(e[n]=o.toString()),a}))}canSerialize(){return\"function\"===this.type||this.serialize}static get(t,...e){return!t||kt(t,this)?t:t[Ct]?t[Ct]:new zt(t,...e)}}const Et=new class{add(t,e,i){if(\"string\"==typeof arguments[0])(Array.isArray(t)?t:[t]).forEach((function(t){this[t]=this[t]||[],e&&this[t][i?\"unshift\":\"push\"](e)}),this);else for(var t in arguments[0])this.add(t,arguments[0][t],arguments[1])}run(t,e){this[t]=this[t]||[],this[t].forEach((function(t){t.call(e&&e.context?e.context:e,e)}))}},$t={D50:[.3457/.3585,1,.2958/.3585],D65:[.3127/.329,1,.3583/.329]};function St(t){return Array.isArray(t)?t:$t[t]}function Mt(t,e,i,s={}){if(t=St(t),e=St(e),!t||!e)throw new TypeError(`Missing white point to convert ${t?\"\":\"from\"}${t||e?\"\":\"/\"}${e?\"\":\"to\"}`);if(t===e)return i;let n={W1:t,W2:e,XYZ:i,options:s};if(Et.run(\"chromatic-adaptation-start\",n),n.M||(n.W1===$t.D65&&n.W2===$t.D50?n.M=[[1.0479297925449969,.022946870601609652,-.05019226628920524],[.02962780877005599,.9904344267538799,-.017073799063418826],[-.009243040646204504,.015055191490298152,.7518742814281371]]:n.W1===$t.D50&&n.W2===$t.D65&&(n.M=[[.955473421488075,-.02309845494876471,.06325924320057072],[-.0283697093338637,1.0099953980813041,.021041441191917323],[.012314014864481998,-.020507649298898964,1.330365926242124]])),Et.run(\"chromatic-adaptation-end\",n),n.M)return lt(n.XYZ,n.M);throw new TypeError(\"Only Bradford CAT with white points D50 and D65 supported for now.\")}var Lt={gamut_mapping:\"css\",precision:5,deltaE:\"76\",verbose:\"test\"!==globalThis?.process?.env?.NODE_ENV?.toLowerCase(),warn:function(t){this.verbose&&globalThis?.console?.warn?.(t)}};function At(t,e){let i,s={str:String(t)?.trim(),options:e};if(Et.run(\"parse-start\",s),s.color)return s.color;s.parsed=function(t){if(!t)return;t=t.trim();let e=t.match(Pt.function);if(e){let t=[],i=[],s=!1,n=e[2].replace(Pt.singleArgument,((e,n)=>{let{value:a,meta:r}=function(t){let e={},i=t.match(Pt.unitValue)?.[0],s=e.raw=t;i?(e.type=\"%\"===i?\"<percentage>\":\"<angle>\",e.unit=i,e.unitless=Number(s.slice(0,-i.length)),s=e.unitless*Rt[i]):Pt.number.test(s)?(s=Number(s),e.type=\"<number>\"):\"none\"===s?s=null:\"NaN\"===s||\"calc(NaN)\"===s?(s=NaN,e.type=\"<number>\"):e.type=\"<ident>\";return{value:s,meta:e}}(n);return e.startsWith(\"/\")&&(s=!0),t.push(a),i.push(r),\"\"}));return{name:e[1].toLowerCase(),args:t,argMeta:i,lastAlpha:s,commas:n.includes(\",\"),rawName:e[1],rawArgs:e[2]}}}(s.str);let n=s.options?s.options.parseMeta??s.options.meta:null;if(s.parsed){let e,a,r=s.parsed.name,o=s.parsed.args,l=o.map(((t,e)=>s.parsed.argMeta[e]?.type));if(\"color\"===r){let i=o.shift();l.shift();let n=i.startsWith(\"--\")?i.substring(2):`--${i}`,h=[i,n];if(e=Dt.findFormat({name:r,id:h,type:\"function\"}),!e){let e,a=i in Dt.registry?i:n;if(a in Dt.registry){let s=Dt.registry[a].formats?.color?.id;if(s){e=`Did you mean ${t.replace(\"color(\"+i,\"color(\"+s)}?`}}throw new TypeError(`Cannot parse ${s.str}. `+(e??\"Missing a plugin?\"))}a=e.space,e.id.startsWith(\"--\")&&!i.startsWith(\"--\")&&Lt.warn(`${a.name} is a non-standard space and not currently supported in the CSS spec. Use prefixed color(${e.id}) instead of color(${i}).`),i.startsWith(\"--\")&&!e.id.startsWith(\"--\")&&Lt.warn(`${a.name} is a standard space and supported in the CSS spec. Use color(${e.id}) instead of prefixed color(${i}).`)}else e=Dt.findFormat({name:r,type:\"function\"}),a=e.space;n&&Object.assign(n,{format:e,formatId:e.name,types:l,commas:s.parsed.commas});let h=1;(!0===e.alpha||s.parsed.lastAlpha)&&(h=s.parsed.args.pop(),n&&(n.alphaType=l.pop()));let d=e.coords.length;if(o.length!==d)throw new TypeError(`Expected ${d} coordinates for ${a.id} in ${s.str}), got ${o.length}`);o=e.coerceCoords(o,l),i={spaceId:a.id,coords:o,alpha:h}}else for(let t of Dt.all)for(let e in t.formats){let a=t.formats[e];if(\"custom\"!==a.type)continue;if(a.test&&!a.test(s.str))continue;a=t.getFormat(a);let r=a.parse(s.str);if(r){n&&Object.assign(n,{format:a,formatId:e}),i=r;break}}if(!i)throw new TypeError(`Could not parse ${t} as a color. Missing a plugin?`);return i.alpha=ut(i.alpha)?i.alpha:void 0===i.alpha?1:ft(0,i.alpha,1),i}const Rt={\"%\":.01,deg:1,grad:.9,rad:180/Math.PI,turn:360},Pt={function:/^([a-z]+)\\(((?:calc\\(NaN\\)|.)+?)\\)$/i,number:/^([-+]?(?:[0-9]*\\.)?[0-9]+(e[-+]?[0-9]+)?)$/i,unitValue:RegExp(`(${Object.keys(Rt).join(\"|\")})$`),singleArgument:/\\/?\\s*(none|NaN|calc\\(NaN\\)|[-+\\w.]+(?:%|deg|g?rad|turn)?)/g};function Tt(t,e){if(Array.isArray(t))return t.map((t=>Tt(t,e)));if(!t)throw new TypeError(\"Empty color reference\");ht(t)&&(t=At(t,e));let i=t.space||t.spaceId;return\"string\"==typeof i&&(t.space=Dt.get(i)),void 0===t.alpha&&(t.alpha=1),t}class Dt{constructor(t){this.id=t.id,this.name=t.name,this.base=t.base?Dt.get(t.base):null,this.aliases=t.aliases,this.base&&(this.fromBase=t.fromBase,this.toBase=t.toBase);let e=t.coords??this.base.coords;for(let t in e)\"name\"in e[t]||(e[t].name=t);this.coords=e;let i=t.white??this.base.white??\"D65\";this.white=St(i),this.formats=t.formats??{};for(let t in this.formats){let e=this.formats[t];e.type||=\"function\",e.name||=t}this.formats.color?.id||(this.formats.color={...this.formats.color??{},id:t.cssId||this.id}),t.gamutSpace?this.gamutSpace=\"self\"===t.gamutSpace?this:Dt.get(t.gamutSpace):this.isPolar?this.gamutSpace=this.base:this.gamutSpace=this,this.gamutSpace.isUnbounded&&(this.inGamut=(t,e)=>!0),this.referred=t.referred,Object.defineProperty(this,\"path\",{value:Bt(this).reverse(),writable:!1,enumerable:!0,configurable:!0}),Et.run(\"colorspace-init-end\",this)}inGamut(t,{epsilon:e=75e-6}={}){if(!this.equals(this.gamutSpace))return t=this.to(this.gamutSpace,t),this.gamutSpace.inGamut(t,{epsilon:e});let i=Object.values(this.coords);return t.every(((t,s)=>{let n=i[s];if(\"angle\"!==n.type&&n.range){if(ut(t))return!0;let[i,s]=n.range;return(void 0===i||t>=i-e)&&(void 0===s||t<=s+e)}return!0}))}get isUnbounded(){return Object.values(this.coords).every((t=>!(\"range\"in t)))}get cssId(){return this.formats?.color?.id||this.id}get isPolar(){for(let t in this.coords)if(\"angle\"===this.coords[t].type)return!0;return!1}getFormat(t){if(!t)return null;\"default\"===t?t=Object.values(this.formats)[0]:\"string\"==typeof t&&(t=this.formats[t]);let e=zt.get(t,this);return e!==t&&t.name in this.formats&&(this.formats[t.name]=e),e}equals(t){return!!t&&(this===t||this.id===t||this.id===t.id)}to(t,e){if(1===arguments.length){const i=Tt(t);[t,e]=[i.space,i.coords]}if(t=Dt.get(t),this.equals(t))return e;e=e.map((t=>ut(t)?0:t));let i,s,n=this.path,a=t.path;for(let t=0;t<n.length&&n[t].equals(a[t]);t++)i=n[t],s=t;if(!i)throw new Error(`Cannot convert between color spaces ${this} and ${t}: no connection space was found`);for(let t=n.length-1;t>s;t--)e=n[t].toBase(e);for(let t=s+1;t<a.length;t++)e=a[t].fromBase(e);return e}from(t,e){if(1===arguments.length){const i=Tt(t);[t,e]=[i.space,i.coords]}return(t=Dt.get(t)).to(this,e)}toString(){return`${this.name} (${this.id})`}getMinCoords(){let t=[];for(let e in this.coords){let i=this.coords[e],s=i.range||i.refRange;t.push(s?.min??0)}return t}static registry={};static get all(){return[...new Set(Object.values(Dt.registry))]}static register(t,e){if(1===arguments.length&&(t=(e=arguments[0]).id),e=this.get(e),this.registry[t]&&this.registry[t]!==e)throw new Error(`Duplicate color space registration: '${t}'`);if(this.registry[t]=e,1===arguments.length&&e.aliases)for(let t of e.aliases)this.register(t,e);return e}static get(t,...e){if(!t||kt(t,this))return t;if(\"string\"===dt(t)){let e=Dt.registry[t.toLowerCase()];if(!e)throw new TypeError(`No color space found with id = \"${t}\"`);return e}if(e.length)return Dt.get(...e);throw new TypeError(`${t} is not a valid color space`)}static findFormat(t,e=Dt.all){if(!t)return null;\"string\"==typeof t&&(t={name:t});for(let i of e)for(let[e,s]of Object.entries(i.formats)){s.name??=e,s.type??=\"function\";let n=!(t.name&&s.name!==t.name||t.type&&s.type!==t.type);if(t.id){let e=s.ids||[s.id],i=Array.isArray(t.id)?t.id:[t.id];n&&=i.some((t=>e.includes(t)))}if(n){let t=zt.get(s,i);return t!==s&&(i.formats[s.name]=t),t}}return null}static resolveCoord(t,e){let i,s,n=dt(t);if(\"string\"===n?t.includes(\".\")?[i,s]=t.split(\".\"):[i,s]=[,t]:Array.isArray(t)?[i,s]=t:(i=t.space,s=t.coordId),i=Dt.get(i),i||(i=e),!i)throw new TypeError(`Cannot resolve coordinate reference ${t}: No color space specified and relative references are not allowed here`);if(n=dt(s),\"number\"===n||\"string\"===n&&s>=0){let t=Object.entries(i.coords)[s];if(t)return{space:i,id:t[0],index:s,...t[1]}}i=Dt.get(i);let a=s.toLowerCase(),r=0;for(let t in i.coords){let e=i.coords[t];if(t.toLowerCase()===a||e.name?.toLowerCase()===a)return{space:i,id:t,index:r,...e};r++}throw new TypeError(`No \"${s}\" coordinate found in ${i.name}. Its coordinates are: ${Object.keys(i.coords).join(\", \")}`)}static DEFAULT_FORMAT={type:\"functions\",name:\"color\"}}function Bt(t){let e=[t];for(let i=t;i=i.base;)e.push(i);return e}var It=new Dt({id:\"xyz-d65\",name:\"XYZ D65\",coords:{x:{refRange:[0,1],name:\"X\"},y:{refRange:[0,1],name:\"Y\"},z:{refRange:[0,1],name:\"Z\"}},white:\"D65\",formats:{color:{ids:[\"xyz-d65\",\"xyz\"]}},aliases:[\"xyz\"]}),Ot=new Dt({id:\"xyz-d50\",name:\"XYZ D50\",white:\"D50\",base:It,fromBase:t=>Mt(It.white,\"D50\",t),toBase:t=>Mt(\"D50\",It.white,t)});const Ht=216/24389,jt=24/116,Nt=24389/27;let Ft=$t.D50;var Gt=new Dt({id:\"lab\",name:\"Lab\",coords:{l:{refRange:[0,100],name:\"Lightness\"},a:{refRange:[-125,125]},b:{refRange:[-125,125]}},white:Ft,base:Ot,fromBase(t){let e=t.map(((t,e)=>t/Ft[e])).map((t=>t>Ht?Math.cbrt(t):(Nt*t+16)/116));return[116*e[1]-16,500*(e[0]-e[1]),200*(e[1]-e[2])]},toBase(t){let[e,i,s]=t,n=[];return n[1]=(e+16)/116,n[0]=i/500+n[1],n[2]=n[1]-s/200,[n[0]>jt?Math.pow(n[0],3):(116*n[0]-16)/Nt,t[0]>8?Math.pow((t[0]+16)/116,3):t[0]/Nt,n[2]>jt?Math.pow(n[2],3):(116*n[2]-16)/Nt].map(((t,e)=>t*Ft[e]))},formats:{lab:{coords:[\"<percentage> | <number>\",\"<number> | <percentage>\",\"<number> | <percentage>\"]}}});function Xt(t){return\"number\"!=typeof t?t:(t%360+360)%360}var _t=new Dt({id:\"lch\",name:\"LCH\",coords:{l:{refRange:[0,100],name:\"Lightness\"},c:{refRange:[0,150],name:\"Chroma\"},h:{refRange:[0,360],type:\"angle\",name:\"Hue\"}},base:Gt,fromBase(t){if(void 0===this.ε){let t=Object.values(this.base.coords)[1].refRange,e=t[1]-t[0];this.ε=e/1e5}let[e,i,s]=t,n=Math.abs(i)<this.ε&&Math.abs(s)<this.ε,a=n?null:Xt(180*Math.atan2(s,i)/Math.PI);return[e,n?0:Math.sqrt(i**2+s**2),a]},toBase(t){let[e,i,s]=t,n=null,a=null;return ut(s)||(i=i<0?0:i,n=i*Math.cos(s*Math.PI/180),a=i*Math.sin(s*Math.PI/180)),[e,n,a]},formats:{lch:{coords:[\"<percentage> | <number>\",\"<number> | <percentage>\",\"<number> | <angle>\"]}}});const Zt=25**7,Ut=Math.PI,Yt=180/Ut,Vt=Ut/180;function qt(t){const e=t*t;return e*e*e*t}function Wt(t,e,{kL:i=1,kC:s=1,kH:n=1}={}){[t,e]=Tt([t,e]);let[a,r,o]=Gt.from(t),l=_t.from(Gt,[a,r,o])[1],[h,d,c]=Gt.from(e),u=_t.from(Gt,[h,d,c])[1];l<0&&(l=0),u<0&&(u=0);let p=qt((l+u)/2),m=.5*(1-Math.sqrt(p/(p+Zt))),b=(1+m)*r,g=(1+m)*d,f=Math.sqrt(b**2+o**2),x=Math.sqrt(g**2+c**2),w=0===b&&0===o?0:Math.atan2(o,b),v=0===g&&0===c?0:Math.atan2(c,g);w<0&&(w+=2*Ut),v<0&&(v+=2*Ut),w*=Yt,v*=Yt;let k,y=h-a,C=x-f,z=v-w,E=w+v,$=Math.abs(z);f*x==0?k=0:$<=180?k=z:z>180?k=z-360:z<-180?k=z+360:Lt.warn(\"the unthinkable has happened\");let S,M=2*Math.sqrt(x*f)*Math.sin(k*Vt/2),L=(a+h)/2,A=(f+x)/2,R=qt(A);S=f*x==0?E:$<=180?E/2:E<360?(E+360)/2:(E-360)/2;let P=(L-50)**2,T=1+.015*P/Math.sqrt(20+P),D=1+.045*A,B=1;B-=.17*Math.cos((S-30)*Vt),B+=.24*Math.cos(2*S*Vt),B+=.32*Math.cos((3*S+6)*Vt),B-=.2*Math.cos((4*S-63)*Vt);let I=1+.015*A*B,O=30*Math.exp(-1*((S-275)/25)**2),H=2*Math.sqrt(R/(R+Zt)),j=(y/(i*T))**2;return j+=(C/(s*D))**2,j+=(M/(n*I))**2,j+=-1*Math.sin(2*O*Vt)*H*(C/(s*D))*(M/(n*I)),Math.sqrt(j)}const Kt=[[.819022437996703,.3619062600528904,-.1288737815209879],[.0329836539323885,.9292868615863434,.0361446663506424],[.0481771893596242,.2642395317527308,.6335478284694309]],Jt=[[1.2268798758459243,-.5578149944602171,.2813910456659647],[-.0405757452148008,1.112286803280317,-.0717110580655164],[-.0763729366746601,-.4214933324022432,1.5869240198367816]],Qt=[[.210454268309314,.7936177747023054,-.0040720430116193],[1.9779985324311684,-2.42859224204858,.450593709617411],[.0259040424655478,.7827717124575296,-.8086757549230774]],te=[[1,.3963377773761749,.2158037573099136],[1,-.1055613458156586,-.0638541728258133],[1,-.0894841775298119,-1.2914855480194092]];var ee=new Dt({id:\"oklab\",name:\"Oklab\",coords:{l:{refRange:[0,1],name:\"Lightness\"},a:{refRange:[-.4,.4]},b:{refRange:[-.4,.4]}},white:\"D65\",base:It,fromBase(t){let e=lt(t,Kt);return e[0]=Math.cbrt(e[0]),e[1]=Math.cbrt(e[1]),e[2]=Math.cbrt(e[2]),lt(e,Qt,e)},toBase(t){let e=lt(t,te);return e[0]=e[0]**3,e[1]=e[1]**3,e[2]=e[2]**3,lt(e,Jt,e)},formats:{oklab:{coords:[\"<percentage> | <number>\",\"<number> | <percentage>\",\"<number> | <percentage>\"]}}});function ie(t,e){[t,e]=Tt([t,e]);let[i,s,n]=ee.from(t),[a,r,o]=ee.from(e),l=i-a,h=s-r,d=n-o;return Math.sqrt(l**2+h**2+d**2)}function se(t,e,{epsilon:i=75e-6}={}){t=Tt(t),e||(e=t.space),e=Dt.get(e);let s=t.coords;return e!==t.space&&(s=e.from(t)),e.inGamut(s,{epsilon:i})}function ne(t,e){t=Tt(t);let i,s=Dt.get(e,e?.space),n=e?.precision;return i=!s||t.space.equals(s)?t.coords.slice():s.from(t),void 0===n?i:i.map((t=>mt(t,n)))}function ae(t,e){if(t=Tt(t),\"alpha\"===e)return t.alpha??1;let{space:i,index:s}=Dt.resolveCoord(e,t.space);return ne(t,i)[s]}function re(t,e,i,s){return t=Tt(t),Array.isArray(e)&&([e,i,s]=[t.space,e,i]),e=Dt.get(e),t.coords=e===t.space?i.slice():e.to(t.space,i),void 0!==s&&(t.alpha=s),t}function oe(t,e,i){if(t=Tt(t),2===arguments.length&&\"object\"===dt(arguments[1])){let e=arguments[1];for(let i in e)oe(t,i,e[i])}else if(\"function\"==typeof i&&(i=i(ae(t,e))),\"alpha\"===e)t.alpha=i;else{let{space:s,index:n}=Dt.resolveCoord(e,t.space),a=ne(t,s);a[n]=i,re(t,s,a)}return t}function le(t){return{space:t.space,coords:t.coords.slice(),alpha:t.alpha}}re.returns=\"color\",oe.returns=\"color\";const he=Math.PI/180;var de=new Dt({id:\"xyz-abs-d65\",cssId:\"--xyz-abs-d65\",name:\"Absolute XYZ D65\",coords:{x:{refRange:[0,9504.7],name:\"Xa\"},y:{refRange:[0,1e4],name:\"Ya\"},z:{refRange:[0,10888.3],name:\"Za\"}},base:It,fromBase:t=>t.map((t=>Math.max(203*t,0))),toBase:t=>t.map((t=>Math.max(t/203,0)))});const ce=1.15,ue=.66,pe=2610/16384,me=16384/2610,be=.8359375,ge=2413/128,fe=18.6875,xe=1.7*2523/32,we=32/(1.7*2523),ve=-.56,ke=16295499532821565e-27,ye=[[.41478972,.579999,.014648],[-.20151,1.120649,.0531008],[-.0166008,.2648,.6684799]],Ce=[[1.9242264357876067,-1.0047923125953657,.037651404030618],[.35031676209499907,.7264811939316552,-.06538442294808501],[-.09098281098284752,-.3127282905230739,1.5227665613052603]],ze=[[.5,.5,0],[3.524,-4.066708,.542708],[.199076,1.096799,-1.295875]],Ee=[[1,.1386050432715393,.05804731615611886],[.9999999999999999,-.1386050432715393,-.05804731615611886],[.9999999999999998,-.09601924202631895,-.8118918960560388]];var $e=new Dt({id:\"jzazbz\",name:\"Jzazbz\",coords:{jz:{refRange:[0,1],name:\"Jz\"},az:{refRange:[-.5,.5]},bz:{refRange:[-.5,.5]}},base:de,fromBase(t){let[e,i,s]=t,n=lt([ce*e-(ce-1)*s,ue*i-(ue-1)*e,s],ye).map((function(t){return((be+ge*(t/1e4)**pe)/(1+fe*(t/1e4)**pe))**xe})),[a,r,o]=lt(n,ze);return[(1+ve)*a/(1+ve*a)-ke,r,o]},toBase(t){let[e,i,s]=t,n=lt([(e+ke)/(1+ve-ve*(e+ke)),i,s],Ee).map((function(t){return 1e4*((be-t**we)/(fe*t**we-ge))**me})),[a,r,o]=lt(n,Ce),l=(a+(ce-1)*o)/ce;return[l,(r+(ue-1)*l)/ue,o]},formats:{color:{coords:[\"<number> | <percentage>\",\"<number> | <percentage>\",\"<number> | <percentage>\"]}}}),Se=new Dt({id:\"jzczhz\",name:\"JzCzHz\",coords:{jz:{refRange:[0,1],name:\"Jz\"},cz:{refRange:[0,1],name:\"Chroma\"},hz:{refRange:[0,360],type:\"angle\",name:\"Hue\"}},base:$e,fromBase:_t.fromBase,toBase:_t.toBase});const Me=.8359375,Le=2413/128,Ae=18.6875,Re=2610/16384,Pe=2523/32,Te=16384/2610,De=32/2523,Be=[[.3592832590121217,.6976051147779502,-.035891593232029],[-.1920808463704993,1.100476797037432,.0753748658519118],[.0070797844607479,.0748396662186362,.8433265453898765]],Ie=[[.5,.5,0],[6610/4096,-13613/4096,7003/4096],[17933/4096,-17390/4096,-543/4096]],Oe=[[.9999999999999998,.0086090370379328,.111029625003026],[.9999999999999998,-.0086090370379328,-.1110296250030259],[.9999999999999998,.5600313357106791,-.3206271749873188]],He=[[2.0701522183894223,-1.3263473389671563,.2066510476294053],[.3647385209748072,.6805660249472273,-.0453045459220347],[-.0497472075358123,-.0492609666966131,1.1880659249923042]];var je=new Dt({id:\"ictcp\",name:\"ICTCP\",coords:{i:{refRange:[0,1],name:\"I\"},ct:{refRange:[-.5,.5],name:\"CT\"},cp:{refRange:[-.5,.5],name:\"CP\"}},base:de,fromBase:t=>function(t){let e=t.map((function(t){return((Me+Le*(t/1e4)**Re)/(1+Ae*(t/1e4)**Re))**Pe}));return lt(e,Ie)}(lt(t,Be)),toBase(t){let e=function(t){let e=lt(t,Oe),i=e.map((function(t){return 1e4*(Math.max(t**De-Me,0)/(Le-Ae*t**De))**Te}));return i}(t);return lt(e,He)}});const Ne=$t.D65,Fe=1/.42,Ge=2*Math.PI,Xe=[[.401288,.650173,-.051461],[-.250268,1.204414,.045854],[-.002079,.048952,.953127]],_e=[[1.8620678550872327,-1.0112546305316843,.14918677544445175],[.38752654323613717,.6214474419314753,-.008973985167612518],[-.015841498849333856,-.03412293802851557,1.0499644368778496]],Ze=[[460,451,288],[460,-891,-261],[460,-220,-6300]],Ue={dark:[.8,.525,.8],dim:[.9,.59,.9],average:[1,.69,1]},Ye={h:[20.14,90,164.25,237.53,380.14],e:[.8,.7,1,1.2,.8],H:[0,100,200,300,400]},Ve=180/Math.PI,qe=Math.PI/180;function We(t,e){return t.map((t=>{const i=wt(e*Math.abs(t)*.01,.42);return 400*xt(i,t)/(i+27.13)}))}function Ke(t,e,i,s,n){const a={};a.discounting=n,a.refWhite=t,a.surround=s;const r=t.map((t=>100*t));a.la=e,a.yb=i;const o=r[1],l=lt(r,Xe),h=(s=Ue[a.surround])[0];a.c=s[1],a.nc=s[2];const d=(1/(5*a.la+1))**4;a.fl=d*a.la+.1*(1-d)*(1-d)*Math.cbrt(5*a.la),a.flRoot=a.fl**.25,a.n=a.yb/o,a.z=1.48+Math.sqrt(a.n),a.nbb=.725*a.n**-.2,a.ncb=a.nbb;const c=Math.max(Math.min(h*(1-1/3.6*Math.exp((-a.la-42)/92)),1),0);a.dRgb=l.map((t=>bt(1,o/t,c))),a.dRgbInv=a.dRgb.map((t=>1/t));const u=We(l.map(((t,e)=>t*a.dRgb[e])),a.fl);return a.aW=a.nbb*(2*u[0]+u[1]+.05*u[2]),a}const Je=Ke(Ne,64/Math.PI*.2,20,\"average\",!1);function Qe(t,e){if(!(void 0!==t.J^void 0!==t.Q))throw new Error(\"Conversion requires one and only one: 'J' or 'Q'\");if(!(void 0!==t.C^void 0!==t.M^void 0!==t.s))throw new Error(\"Conversion requires one and only one: 'C', 'M' or 's'\");if(!(void 0!==t.h^void 0!==t.H))throw new Error(\"Conversion requires one and only one: 'h' or 'H'\");if(0===t.J||0===t.Q)return[0,0,0];let i=0;i=void 0!==t.h?Xt(t.h)*qe:function(t){let e=(t%400+400)%400;const i=Math.floor(.01*e);e%=100;const[s,n]=Ye.h.slice(i,i+2),[a,r]=Ye.e.slice(i,i+2);return Xt((e*(r*s-a*n)-100*s*r)/(e*(r-a)-100*r))}(t.H)*qe;const s=Math.cos(i),n=Math.sin(i);let a=0;void 0!==t.J?a=.1*wt(t.J,.5):void 0!==t.Q&&(a=.25*e.c*t.Q/((e.aW+4)*e.flRoot));let r=0;void 0!==t.C?r=t.C/a:void 0!==t.M?r=t.M/e.flRoot/a:void 0!==t.s&&(r=4e-4*t.s**2*(e.aW+4)/e.c);const o=wt(r*Math.pow(1.64-Math.pow(.29,e.n),-.73),10/9),l=.25*(Math.cos(i+2)+3.8),h=e.aW*wt(a,2/e.c/e.z),d=5e4/13*e.nc*e.ncb*l,c=h/e.nbb,u=23*(c+.305)*vt(o,23*d+o*(11*s+108*n)),p=function(t,e){const i=100/e*2588.068098016295;return t.map((t=>{const e=Math.abs(t);return xt(i*wt(e/(400-e),Fe),t)}))}(lt([c,u*s,u*n],Ze).map((t=>1*t/1403)),e.fl);return lt(p.map(((t,i)=>t*e.dRgbInv[i])),_e).map((t=>t/100))}function ti(t,e){const i=We(lt(t.map((t=>100*t)),Xe).map(((t,i)=>t*e.dRgb[i])),e.fl),s=i[0]+(-12*i[1]+i[2])/11,n=(i[0]+i[1]-2*i[2])/9,a=(Math.atan2(n,s)%Ge+Ge)%Ge,r=.25*(Math.cos(a+2)+3.8),o=wt(5e4/13*e.nc*e.ncb*vt(r*Math.sqrt(s**2+n**2),i[0]+i[1]+1.05*i[2]+.305),.9)*Math.pow(1.64-Math.pow(.29,e.n),.73),l=wt(e.nbb*(2*i[0]+i[1]+.05*i[2])/e.aW,.5*e.c*e.z),h=100*wt(l,2),d=4/e.c*l*(e.aW+4)*e.flRoot,c=o*l,u=c*e.flRoot,p=Xt(a*Ve),m=function(t){let e=Xt(t);e<=Ye.h[0]&&(e+=360);const i=function(t,e,i=0,s=t.length){for(;i<s;){const n=i+s>>1;t[n]<e?i=n+1:s=n}return i}(Ye.h,e)-1,[s,n]=Ye.h.slice(i,i+2),[a,r]=Ye.e.slice(i,i+2),o=(e-s)/a;return Ye.H[i]+100*o/(o+(n-e)/r)}(p);return{J:h,C:c,h:p,s:50*wt(e.c*o/(e.aW+4),.5),Q:d,M:u,H:m}}new Dt({id:\"cam16-jmh\",cssId:\"--cam16-jmh\",name:\"CAM16-JMh\",coords:{j:{refRange:[0,100],name:\"J\"},m:{refRange:[0,105],name:\"Colorfulness\"},h:{refRange:[0,360],type:\"angle\",name:\"Hue\"}},base:It,fromBase(t){const e=ti(t,Je);return[e.J,e.M,e.h]},toBase:t=>Qe({J:t[0],M:t[1],h:t[2]},Je)});const ei=216/24389,ii=24389/27;function si(t){return t>8?Math.pow((t+16)/116,3):t/ii}function ni(t,e){const i=116*((s=t[1])>ei?Math.cbrt(s):(ii*s+16)/116)-16;var s;if(0===i)return[0,0,0];const n=ti(t,ai);return[Xt(n.h),n.C,i]}const ai=Ke($t.D65,200/Math.PI*si(50),100*si(50),\"average\",!1);var ri=new Dt({id:\"hct\",name:\"HCT\",coords:{h:{refRange:[0,360],type:\"angle\",name:\"Hue\"},c:{refRange:[0,145],name:\"Colorfulness\"},t:{refRange:[0,100],name:\"Tone\"}},base:It,fromBase:t=>ni(t),toBase:t=>function(t,e){let[i,s,n]=t,a=[],r=0;if(0===n)return[0,0,0];let o=si(n);r=n>0?.00379058511492914*n**2+.608983189401032*n+.9155088574762233:9514440756550361e-21*n**2+.08693057439788597*n-21.928975842194614;let l=0,h=Infinity;for(;l<=15;){a=Qe({J:r,C:s,h:i},e);const t=Math.abs(a[1]-o);if(t<h){if(t<=2e-12)return a;h=t}r-=(a[1]-o)*r/(2*a[1]),l+=1}return Qe({J:r,C:s,h:i},e)}(t,ai),formats:{color:{id:\"--hct\",coords:[\"<number> | <angle>\",\"<percentage> | <number>\",\"<percentage> | <number>\"]}}});const oi=Math.PI/180,li=[1,.007,.0228];function hi(t){t[1]<0&&(t=ri.fromBase(ri.toBase(t)));const e=Math.log(Math.max(1+li[2]*t[1]*ai.flRoot,1))/li[2],i=t[0]*oi,s=e*Math.cos(i),n=e*Math.sin(i);return[t[2],s,n]}var di={deltaE76:function(t,e){return function(t,e,i=\"lab\"){let s=(i=Dt.get(i)).from(t),n=i.from(e);return Math.sqrt(s.reduce(((t,e,i)=>{let s=n[i];return ut(e)||ut(s)?t:t+(s-e)**2}),0))}(t,e,\"lab\")},deltaECMC:function(t,e,{l:i=2,c:s=1}={}){[t,e]=Tt([t,e]);let[n,a,r]=Gt.from(t),[,o,l]=_t.from(Gt,[n,a,r]),[h,d,c]=Gt.from(e),u=_t.from(Gt,[h,d,c])[1];o<0&&(o=0),u<0&&(u=0);let p=n-h,m=o-u,b=(a-d)**2+(r-c)**2-m**2,g=.511;n>=16&&(g=.040975*n/(1+.01765*n));let f,x=.0638*o/(1+.0131*o)+.638;ut(l)&&(l=0),f=l>=164&&l<=345?.56+Math.abs(.2*Math.cos((l+168)*he)):.36+Math.abs(.4*Math.cos((l+35)*he));let w=Math.pow(o,4),v=Math.sqrt(w/(w+1900)),k=(p/(i*g))**2;return k+=(m/(s*x))**2,k+=b/(x*(v*f+1-v))**2,Math.sqrt(k)},deltaE2000:Wt,deltaEJz:function(t,e){[t,e]=Tt([t,e]);let[i,s,n]=Se.from(t),[a,r,o]=Se.from(e),l=i-a,h=s-r;ut(n)&&ut(o)?(n=0,o=0):ut(n)?n=o:ut(o)&&(o=n);let d=n-o,c=2*Math.sqrt(s*r)*Math.sin(d/2*(Math.PI/180));return Math.sqrt(l**2+h**2+c**2)},deltaEITP:function(t,e){[t,e]=Tt([t,e]);let[i,s,n]=je.from(t),[a,r,o]=je.from(e);return 720*Math.sqrt((i-a)**2+.25*(s-r)**2+(n-o)**2)},deltaEOK:ie,deltaEOK2:function(t,e){[t,e]=Tt([t,e]);let[i,s,n]=ee.from(t),[a,r,o]=ee.from(e),l=i-a,h=2*(s-r),d=2*(n-o);return Math.sqrt(l**2+h**2+d**2)},deltaEHCT:function(t,e){[t,e]=Tt([t,e]);let[i,s,n]=hi(ri.from(t)),[a,r,o]=hi(ri.from(e));return Math.sqrt((i-a)**2+(s-r)**2+(n-o)**2)}};const ci={hct:{method:\"hct.c\",jnd:2,deltaEMethod:\"hct\",blackWhiteClamp:{}},\"hct-tonal\":{method:\"hct.c\",jnd:0,deltaEMethod:\"hct\",blackWhiteClamp:{channel:\"hct.t\",min:0,max:100}}};function ui(t,{method:e=Lt.gamut_mapping,space:i,deltaEMethod:s=\"\",jnd:n=2,blackWhiteClamp:a={}}={}){if(t=Tt(t),ht(arguments[1])?i=arguments[1]:i||(i=t.space),se(t,i=Dt.get(i),{epsilon:0}))return t;let r;if(\"css\"===e)r=function(t,{space:e}={}){const i=.02,s=1e-4;t=Tt(t),e||(e=t.space);e=Dt.get(e);const n=Dt.get(\"oklch\");if(e.isUnbounded)return mi(t,e);const a=mi(t,n);let r=a.coords[0];if(r>=1){const i=mi(pi.WHITE,e);return i.alpha=t.alpha,mi(i,e)}if(r<=0){const i=mi(pi.BLACK,e);return i.alpha=t.alpha,mi(i,e)}if(se(a,e,{epsilon:0}))return mi(a,e);function o(t){const i=mi(t,e),s=Object.values(e.coords);return i.coords=i.coords.map(((t,e)=>{if(\"range\"in s[e]){const[i,n]=s[e].range;return ft(i,t,n)}return t})),i}let l=0,h=a.coords[1],d=!0,c=le(a),u=o(c),p=ie(u,c);if(p<i)return u;for(;h-l>s;){const t=(l+h)/2;if(c.coords[1]=t,d&&se(c,e,{epsilon:0}))l=t;else if(u=o(c),p=ie(u,c),p<i){if(i-p<s)break;d=!1,l=t}else h=t}return u}(t,{space:i});else{if(\"clip\"===e||se(t,i))r=mi(t,i);else{Object.prototype.hasOwnProperty.call(ci,e)&&({method:e,jnd:n,deltaEMethod:s,blackWhiteClamp:a}=ci[e]);let o=Wt;if(\"\"!==s)for(let t in di)if(\"deltae\"+s.toLowerCase()===t.toLowerCase()){o=di[t];break}let l=ui(mi(t,i),{method:\"clip\",space:i});if(o(t,l)>n){if(3===Object.keys(a).length){let e=Dt.resolveCoord(a.channel),i=ae(mi(t,e.space),e.id);if(ut(i)&&(i=0),i>=a.max)return mi({space:\"xyz-d65\",coords:$t.D65},t.space);if(i<=a.min)return mi({space:\"xyz-d65\",coords:[0,0,0]},t.space)}let s=Dt.resolveCoord(e),l=s.space,h=s.id,d=mi(t,l);d.coords.forEach(((t,e)=>{ut(t)&&(d.coords[e]=0)}));let c=(s.range||s.refRange)[0],u=function(t){const e=t?Math.floor(Math.log10(Math.abs(t))):0;return Math.max(parseFloat(\"1e\"+(e-2)),1e-6)}(n),p=c,m=ae(d,h);for(;m-p>u;){let t=le(d);t=ui(t,{space:i,method:\"clip\"}),o(d,t)-n<u?p=ae(d,h):m=ae(d,h),oe(d,h,(p+m)/2)}r=mi(d,i)}else r=l}if(\"clip\"===e||!se(r,i,{epsilon:0})){let t=Object.values(i.coords).map((t=>t.range||[]));r.coords=r.coords.map(((e,i)=>{let[s,n]=t[i];return void 0!==s&&(e=Math.max(s,e)),void 0!==n&&(e=Math.min(e,n)),e}))}}return i!==t.space&&(r=mi(r,t.space)),t.coords=r.coords,t}ui.returns=\"color\";const pi={WHITE:{space:ee,coords:[1,0,0],alpha:1},BLACK:{space:ee,coords:[0,0,0],alpha:1}};function mi(t,e,{inGamut:i}={}){t=Tt(t);let s=(e=Dt.get(e)).from(t),n={space:e,coords:s,alpha:t.alpha};return i&&(n=ui(n,!0===i?void 0:i)),n}function bi(t,e={}){let i,{precision:s=Lt.precision,format:n,inGamut:a=!0,coords:r,alpha:o,commas:l}=e,h=n;(t=Tt(t)).parseMeta&&!n&&(t.parseMeta.format.canSerialize()&&(n=t.parseMeta.format,h=t.parseMeta.formatId),r??=t.parseMeta.types,o??=t.parseMeta.alphaType,l??=t.parseMeta.commas),h&&(n=t.space.getFormat(n)??Dt.findFormat(h)),n||(n=t.space.getFormat(\"default\")??Dt.DEFAULT_FORMAT,h=n.name),n&&n.space&&n.space!==t.space&&(t=mi(t,n.space));let d=t.coords.slice();if(a||=n.toGamut,a&&!se(t)&&(d=ui(le(t),!0===a?void 0:a).coords),\"custom\"===n.type){if(!n.serialize)throw new TypeError(`format ${h} can only be used to parse colors, not for serialization`);i=n.serialize(d,t.alpha,e)}else{let e=n.name||\"color\",a=n.serializeCoords(d,s,r);if(\"color\"===e){let e=n.id||n.ids?.[0]||t.space.cssId||t.space.id;a.unshift(e)}let h=t.alpha;void 0!==o&&\"object\"!=typeof o&&(o=\"string\"==typeof o?{type:o}:{include:o});let c=o?.type??\"<number>\",u=!0===o?.include||!0===n.alpha||!1!==o?.include&&!1!==n.alpha&&h<1,p=\"\";if(l??=n.commas,u){if(null!==s){let t;\"<percentage>\"===c&&(t=\"%\",h*=100),h=ct(h,{precision:s,unit:t})}p=`${l?\",\":\" /\"} ${h}`}i=`${e}(${a.join(l?\", \":\" \")}${p})`}return i}mi.returns=\"color\";let{pow:gi,sqrt:fi,PI:xi}=Math,wi=(t,e=0)=>{let i=gi(10,e);return Math.round(t*i)/i},vi=(t,e=0)=>new DOMRect(wi(t.x,e),wi(t.y,e),wi(t.width,e),wi(t.height,e)),ki=(t,e,i=Infinity,s=null)=>(null!==s&&(t=wi(t,s)),t<e?t=e:t>i&&(t=i),t),yi=(t,e)=>{t=+t,e=+e;let i=(Math.floor(t)+\"\").length;if(e>i)return+t.toFixed(e-i);{let s=10**(i-e);return Math.round(t/s)*s}},Ci=t=>{if(isFinite(t)){let e=1,i=0;for(;Math.round(t*e)/e!==t;)e*=10,i+=1;return i}return 0},zi=(t,e)=>{let i=e.x-t.x;i*=i;let s=e.y-t.y;return s*=s,fi(i+s)},Ei=(t,e)=>e.x>=t.x&&e.x<=t.x+t.width&&e.y>=t.y&&e.y<=t.y+t.height,$i=(t,e,i)=>{let[s,n]=[t.x,t.y],[a,r]=[e.x,e.y],o=Math.PI/180*i,l=Math.cos(o),h=Math.sin(o);return new DOMPoint(l*(s-a)-h*(n-r)+a,l*(n-r)+h*(s-a)+r)};class Si extends Dt{constructor(t){t.coords||(t.coords={r:{range:[0,1],name:\"Red\"},g:{range:[0,1],name:\"Green\"},b:{range:[0,1],name:\"Blue\"}}),t.base||(t.base=It),t.toXYZ_M&&t.fromXYZ_M&&(t.toBase??=e=>{let i=lt(e,t.toXYZ_M);return this.white!==this.base.white&&(i=Mt(this.white,this.base.white,i)),i},t.fromBase??=e=>lt(e=Mt(this.base.white,this.white,e),t.fromXYZ_M)),t.referred??=\"display\",super(t)}}var Mi=new Si({id:\"a98rgb-linear\",cssId:\"--a98-rgb-linear\",name:\"Linear Adobe® 98 RGB compatible\",white:\"D65\",toXYZ_M:[[.5766690429101305,.1855582379065463,.1882286462349947],[.29734497525053605,.6273635662554661,.07529145849399788],[.02703136138641234,.07068885253582723,.9913375368376388]],fromXYZ_M:[[2.0415879038107465,-.5650069742788596,-.34473135077832956],[-.9692436362808795,1.8759675015077202,.04155505740717557],[.013444280632031142,-.11836239223101838,1.0151749943912054]]}),Li=new Si({id:\"a98rgb\",cssId:\"a98-rgb\",name:\"Adobe® 98 RGB compatible\",base:Mi,toBase:t=>t.map((t=>Math.pow(Math.abs(t),563/256)*Math.sign(t))),fromBase:t=>t.map((t=>Math.pow(Math.abs(t),256/563)*Math.sign(t)))});const Ai=[[3.2409699419045226,-1.537383177570094,-.4986107602930034],[-.9692436362808796,1.8759675015077202,.04155505740717559],[.05563007969699366,-.20397695888897652,1.0569715142428786]];var Ri=new Si({id:\"srgb-linear\",name:\"Linear sRGB\",white:\"D65\",toXYZ_M:[[.41239079926595934,.357584339383878,.1804807884018343],[.21263900587151027,.715168678767756,.07219231536073371],[.01933081871559182,.11919477979462598,.9505321522496607]],fromXYZ_M:Ai}),Pi={aliceblue:[240/255,248/255,1],antiquewhite:[250/255,235/255,215/255],aqua:[0,1,1],aquamarine:[127/255,1,212/255],azure:[240/255,1,1],beige:[245/255,245/255,220/255],bisque:[1,228/255,196/255],black:[0,0,0],blanchedalmond:[1,235/255,205/255],blue:[0,0,1],blueviolet:[138/255,43/255,226/255],brown:[165/255,42/255,42/255],burlywood:[222/255,184/255,135/255],cadetblue:[95/255,158/255,160/255],chartreuse:[127/255,1,0],chocolate:[210/255,105/255,30/255],coral:[1,127/255,80/255],cornflowerblue:[100/255,149/255,237/255],cornsilk:[1,248/255,220/255],crimson:[220/255,20/255,60/255],cyan:[0,1,1],darkblue:[0,0,139/255],darkcyan:[0,139/255,139/255],darkgoldenrod:[184/255,134/255,11/255],darkgray:[169/255,169/255,169/255],darkgreen:[0,100/255,0],darkgrey:[169/255,169/255,169/255],darkkhaki:[189/255,183/255,107/255],darkmagenta:[139/255,0,139/255],darkolivegreen:[85/255,107/255,47/255],darkorange:[1,140/255,0],darkorchid:[.6,50/255,.8],darkred:[139/255,0,0],darksalmon:[233/255,150/255,122/255],darkseagreen:[143/255,188/255,143/255],darkslateblue:[72/255,61/255,139/255],darkslategray:[47/255,79/255,79/255],darkslategrey:[47/255,79/255,79/255],darkturquoise:[0,206/255,209/255],darkviolet:[148/255,0,211/255],deeppink:[1,20/255,147/255],deepskyblue:[0,191/255,1],dimgray:[105/255,105/255,105/255],dimgrey:[105/255,105/255,105/255],dodgerblue:[30/255,144/255,1],firebrick:[178/255,34/255,34/255],floralwhite:[1,250/255,240/255],forestgreen:[34/255,139/255,34/255],fuchsia:[1,0,1],gainsboro:[220/255,220/255,220/255],ghostwhite:[248/255,248/255,1],gold:[1,215/255,0],goldenrod:[218/255,165/255,32/255],gray:[128/255,128/255,128/255],green:[0,128/255,0],greenyellow:[173/255,1,47/255],grey:[128/255,128/255,128/255],honeydew:[240/255,1,240/255],hotpink:[1,105/255,180/255],indianred:[205/255,92/255,92/255],indigo:[75/255,0,130/255],ivory:[1,1,240/255],khaki:[240/255,230/255,140/255],lavender:[230/255,230/255,250/255],lavenderblush:[1,240/255,245/255],lawngreen:[124/255,252/255,0],lemonchiffon:[1,250/255,205/255],lightblue:[173/255,216/255,230/255],lightcoral:[240/255,128/255,128/255],lightcyan:[224/255,1,1],lightgoldenrodyellow:[250/255,250/255,210/255],lightgray:[211/255,211/255,211/255],lightgreen:[144/255,238/255,144/255],lightgrey:[211/255,211/255,211/255],lightpink:[1,182/255,193/255],lightsalmon:[1,160/255,122/255],lightseagreen:[32/255,178/255,170/255],lightskyblue:[135/255,206/255,250/255],lightslategray:[119/255,136/255,.6],lightslategrey:[119/255,136/255,.6],lightsteelblue:[176/255,196/255,222/255],lightyellow:[1,1,224/255],lime:[0,1,0],limegreen:[50/255,205/255,50/255],linen:[250/255,240/255,230/255],magenta:[1,0,1],maroon:[128/255,0,0],mediumaquamarine:[.4,205/255,170/255],mediumblue:[0,0,205/255],mediumorchid:[186/255,85/255,211/255],mediumpurple:[147/255,112/255,219/255],mediumseagreen:[60/255,179/255,113/255],mediumslateblue:[123/255,104/255,238/255],mediumspringgreen:[0,250/255,154/255],mediumturquoise:[72/255,209/255,.8],mediumvioletred:[199/255,21/255,133/255],midnightblue:[25/255,25/255,112/255],mintcream:[245/255,1,250/255],mistyrose:[1,228/255,225/255],moccasin:[1,228/255,181/255],navajowhite:[1,222/255,173/255],navy:[0,0,128/255],oldlace:[253/255,245/255,230/255],olive:[128/255,128/255,0],olivedrab:[107/255,142/255,35/255],orange:[1,165/255,0],orangered:[1,69/255,0],orchid:[218/255,112/255,214/255],palegoldenrod:[238/255,232/255,170/255],palegreen:[152/255,251/255,152/255],paleturquoise:[175/255,238/255,238/255],palevioletred:[219/255,112/255,147/255],papayawhip:[1,239/255,213/255],peachpuff:[1,218/255,185/255],peru:[205/255,133/255,63/255],pink:[1,192/255,203/255],plum:[221/255,160/255,221/255],powderblue:[176/255,224/255,230/255],purple:[128/255,0,128/255],rebeccapurple:[.4,.2,.6],red:[1,0,0],rosybrown:[188/255,143/255,143/255],royalblue:[65/255,105/255,225/255],saddlebrown:[139/255,69/255,19/255],salmon:[250/255,128/255,114/255],sandybrown:[244/255,164/255,96/255],seagreen:[46/255,139/255,87/255],seashell:[1,245/255,238/255],sienna:[160/255,82/255,45/255],silver:[192/255,192/255,192/255],skyblue:[135/255,206/255,235/255],slateblue:[106/255,90/255,205/255],slategray:[112/255,128/255,144/255],slategrey:[112/255,128/255,144/255],snow:[1,250/255,250/255],springgreen:[0,1,127/255],steelblue:[70/255,130/255,180/255],tan:[210/255,180/255,140/255],teal:[0,128/255,128/255],thistle:[216/255,191/255,216/255],tomato:[1,99/255,71/255],turquoise:[64/255,224/255,208/255],violet:[238/255,130/255,238/255],wheat:[245/255,222/255,179/255],white:[1,1,1],whitesmoke:[245/255,245/255,245/255],yellow:[1,1,0],yellowgreen:[154/255,205/255,50/255]};let Ti=Array(3).fill(\"<percentage> | <number>[0, 255]\"),Di=Array(3).fill(\"<number>[0, 255]\");var Bi=new Si({id:\"srgb\",name:\"sRGB\",base:Ri,fromBase:t=>t.map((t=>{let e=t<0?-1:1,i=t*e;return i>.0031308?e*(1.055*i**(1/2.4)-.055):12.92*t})),toBase:t=>t.map((t=>{let e=t<0?-1:1,i=t*e;return i<=.04045?t/12.92:e*((i+.055)/1.055)**2.4})),formats:{rgb:{coords:Ti},rgb_number:{name:\"rgb\",commas:!0,coords:Di,alpha:!1},color:{},rgba:{coords:Ti,commas:!0,alpha:!0},rgba_number:{name:\"rgba\",commas:!0,coords:Di},hex:{type:\"custom\",toGamut:!0,test:t=>/^#(([a-f0-9]{2}){3,4}|[a-f0-9]{3,4})$/i.test(t),parse(t){t.length<=5&&(t=t.replace(/[a-f0-9]/gi,\"$&$&\"));let e=[];return t.replace(/[a-f0-9]{2}/gi,(t=>{e.push(parseInt(t,16)/255)})),{spaceId:\"srgb\",coords:e.slice(0,3),alpha:e.slice(3)[0]}},serialize:(t,e,{collapse:i=!0,alpha:s}={})=>{(!1!==s&&e<1||!0===s)&&t.push(e),t=t.map((t=>Math.round(255*t)));let n=i&&t.every((t=>t%17==0));return\"#\"+t.map((t=>n?(t/17).toString(16):t.toString(16).padStart(2,\"0\"))).join(\"\")}},keyword:{type:\"custom\",test:t=>/^[a-z]+$/i.test(t),parse(t){let e={spaceId:\"srgb\",coords:null,alpha:1};if(\"transparent\"===(t=t.toLowerCase())?(e.coords=Pi.black,e.alpha=0):e.coords=Pi[t],e.coords)return e}}}}),Ii=new Dt({id:\"hsl\",name:\"HSL\",coords:{h:{refRange:[0,360],type:\"angle\",name:\"Hue\"},s:{range:[0,100],name:\"Saturation\"},l:{range:[0,100],name:\"Lightness\"}},base:Bi,fromBase:t=>{let e=Math.max(...t),i=Math.min(...t),[s,n,a]=t,[r,o,l]=[null,0,(i+e)/2],h=e-i;if(0!==h){switch(o=0===l||1===l?0:(e-l)/Math.min(l,1-l),e){case s:r=(n-a)/h+(n<a?6:0);break;case n:r=(a-s)/h+2;break;case a:r=(s-n)/h+4}r*=60}return o<0&&(r+=180,o=Math.abs(o)),r>=360&&(r-=360),[r,100*o,100*l]},toBase:t=>{let[e,i,s]=t;function n(t){let n=(t+e/30)%12,a=i*Math.min(s,1-s);return s-a*Math.max(-1,Math.min(n-3,9-n,1))}return e%=360,e<0&&(e+=360),i/=100,s/=100,[n(0),n(8),n(4)]},formats:{hsl:{coords:[\"<number> | <angle>\",\"<percentage>\",\"<percentage>\"]},hsla:{coords:[\"<number> | <angle>\",\"<percentage>\",\"<percentage>\"],commas:!0,alpha:!0}}});function Oi(t){let[e,i,s]=ne(t,It),n=e+15*i+3*s;return[4*e/n,9*i/n]}let Hi=$t.D65;const ji=216/24389,Ni=24389/27,[Fi,Gi]=Oi({space:It,coords:Hi});var Xi=new Dt({id:\"luv\",name:\"Luv\",coords:{l:{refRange:[0,100],name:\"Lightness\"},u:{refRange:[-215,215]},v:{refRange:[-215,215]}},white:Hi,base:It,fromBase(t){let e=[pt(t[0]),pt(t[1]),pt(t[2])],i=e[1],[s,n]=Oi({space:It,coords:e});if(!Number.isFinite(s)||!Number.isFinite(n))return[0,0,0];let a=i<=ji?Ni*i:116*Math.cbrt(i)-16;return[a,13*a*(s-Fi),13*a*(n-Gi)]},toBase(t){let[e,i,s]=t;if(0===e||ut(e))return[0,0,0];i=pt(i),s=pt(s);let n=i/(13*e)+Fi,a=s/(13*e)+Gi,r=e<=8?e/Ni:Math.pow((e+16)/116,3);return[r*(9*n/(4*a)),r,r*((12-3*n-20*a)/(4*a))]},formats:{color:{id:\"--luv\",coords:[\"<number> | <percentage>\",\"<number> | <percentage>\",\"<number> | <percentage>\"]}}}),_i=new Dt({id:\"lchuv\",name:\"LChuv\",coords:{l:{refRange:[0,100],name:\"Lightness\"},c:{refRange:[0,220],name:\"Chroma\"},h:{refRange:[0,360],type:\"angle\",name:\"Hue\"}},base:Xi,fromBase:_t.fromBase,toBase:_t.toBase,formats:{color:{id:\"--lchuv\",coords:[\"<number> | <percentage>\",\"<number> | <percentage>\",\"<number> | <angle>\"]}}});const Zi=216/24389,Ui=24389/27,Yi=Ai[0][0],Vi=Ai[0][1],qi=Ai[0][2],Wi=Ai[1][0],Ki=Ai[1][1],Ji=Ai[1][2],Qi=Ai[2][0],ts=Ai[2][1],es=Ai[2][2];function is(t,e,i){const s=e/(Math.sin(i)-t*Math.cos(i));return s<0?Infinity:s}function ss(t){const e=Math.pow(t+16,3)/1560896,i=e>Zi?e:t/Ui,s=i*(284517*Yi-94839*qi),n=i*(838422*qi+769860*Vi+731718*Yi),a=i*(632260*qi-126452*Vi),r=i*(284517*Wi-94839*Ji),o=i*(838422*Ji+769860*Ki+731718*Wi),l=i*(632260*Ji-126452*Ki),h=i*(284517*Qi-94839*es),d=i*(838422*es+769860*ts+731718*Qi),c=i*(632260*es-126452*ts);return{r0s:s/a,r0i:n*t/a,r1s:s/(a+126452),r1i:(n-769860)*t/(a+126452),g0s:r/l,g0i:o*t/l,g1s:r/(l+126452),g1i:(o-769860)*t/(l+126452),b0s:h/c,b0i:d*t/c,b1s:h/(c+126452),b1i:(d-769860)*t/(c+126452)}}function ns(t,e){const i=e/360*Math.PI*2,s=is(t.r0s,t.r0i,i),n=is(t.r1s,t.r1i,i),a=is(t.g0s,t.g0i,i),r=is(t.g1s,t.g1i,i),o=is(t.b0s,t.b0i,i),l=is(t.b1s,t.b1i,i);return Math.min(s,n,a,r,o,l)}var as=new Dt({id:\"hsluv\",name:\"HSLuv\",coords:{h:{refRange:[0,360],type:\"angle\",name:\"Hue\"},s:{range:[0,100],name:\"Saturation\"},l:{range:[0,100],name:\"Lightness\"}},base:_i,gamutSpace:Bi,fromBase(t){let e,[i,s,n]=[pt(t[0]),pt(t[1]),pt(t[2])];if(i>99.9999999)e=0,i=100;else if(i<1e-8)e=0,i=0;else{e=s/ns(ss(i),n)*100}return[n,e,i]},toBase(t){let e,[i,s,n]=[pt(t[0]),pt(t[1]),pt(t[2])];if(n>99.9999999)n=100,e=0;else if(n<1e-8)n=0,e=0;else{e=ns(ss(n),i)/100*s}return[n,e,i]},formats:{color:{id:\"--hsluv\",coords:[\"<number> | <angle>\",\"<percentage> | <number>\",\"<percentage> | <number>\"]}}}),rs=new Dt({id:\"hsv\",name:\"HSV\",coords:{h:{refRange:[0,360],type:\"angle\",name:\"Hue\"},s:{range:[0,100],name:\"Saturation\"},v:{range:[0,100],name:\"Value\"}},base:Bi,fromBase(t){let e=Math.max(...t),i=Math.min(...t),[s,n,a]=t,[r,o,l]=[null,0,e],h=e-i;if(0!==h){switch(e){case s:r=(n-a)/h+(n<a?6:0);break;case n:r=(a-s)/h+2;break;case a:r=(s-n)/h+4}r*=60}return l&&(o=h/l),r>=360&&(r-=360),[r,100*o,100*l]},toBase(t){let[e,i,s]=t;function n(t){let n=(t+e/60)%6;return s-s*i*Math.max(0,Math.min(n,4-n,1))}return e%=360,e<0&&(e+=360),i/=100,s/=100,[n(5),n(3),n(1)]},formats:{color:{id:\"--hsv\",coords:[\"<number> | <angle>\",\"<percentage> | <number>\",\"<percentage> | <number>\"]}}}),os=new Dt({id:\"hwb\",name:\"HWB\",coords:{h:{refRange:[0,360],type:\"angle\",name:\"Hue\"},w:{range:[0,100],name:\"Whiteness\"},b:{range:[0,100],name:\"Blackness\"}},base:rs,fromBase(t){let[e,i,s]=t;return[e,s*(100-i)/100,100-s]},toBase(t){let[e,i,s]=t;i/=100,s/=100;let n=i+s;if(n>=1){return[e,0,100*(i/n)]}let a=1-s;return[e,100*(0===a?0:1-i/a),100*a]},formats:{hwb:{coords:[\"<number> | <angle>\",\"<percentage> | <number>\",\"<percentage> | <number>\"]}}});const ls=2*Math.PI,hs=[[4.076741636075958,-3.307711539258063,.2309699031821043],[-1.2684379732850315,2.609757349287688,-.341319376002657],[-.0041960761386756,-.7034186179359362,1.7076146940746117]],ds=[[[-1.8817031,-.80936501],[1.19086277,1.76576728,.59662641,.75515197,.56771245]],[[1.8144408,-1.19445267],[.73956515,-.45954404,.08285427,.12541073,-.14503204]],[[.13110758,1.81333971],[1.35733652,-.00915799,-1.1513021,-.50559606,.00692167]]],cs=Number.MAX_VALUE,us=.206,ps=.03,ms=(1+us)/1.03;function bs(t,e){let i=t.length;if(i!==e.length)throw new Error(`Vectors of size ${i} and ${e.length} are not aligned`);let s=0;return t.forEach(((t,i)=>{s+=t*e[i]})),s}function gs(t){return.5*(ms*t-us+Math.sqrt((ms*t-us)*(ms*t-us)+.12*ms*t))}function fs(t){return(t**2+us*t)/(ms*(t+ps))}function xs(t){let[e,i]=t;return[i/e,i/(1-e)]}function ws(t,e){let i=lt(t,te);return i[0]=i[0]**3,i[1]=i[1]**3,i[2]=i[2]**3,lt(i,e,i)}function vs(t,e,i,s){let n=function(t,e,i,s){let n,a,r,o,l,h,d,c;bs(s[0][0],[t,e])>1?([n,a,r,o,l]=s[0][1],[h,d,c]=i[0]):bs(s[1][0],[t,e])>1?([n,a,r,o,l]=s[1][1],[h,d,c]=i[1]):([n,a,r,o,l]=s[2][1],[h,d,c]=i[2]);let u=n+a*t+r*e+o*t**2+l*t*e,p=bs(te[0].slice(1),[t,e]),m=bs(te[1].slice(1),[t,e]),b=bs(te[2].slice(1),[t,e]),g=1+u*p,f=1+u*m,x=1+u*b,w=h*g**3+d*f**3+c*x**3,v=h*(3*p*g**2)+d*(3*m*f**2)+c*(3*b*x**2);return u-=w*v/(v**2-.5*w*(h*(6*p**2*g)+d*(6*m**2*f)+c*(6*b**2*x))),u}(t,e,i,s),a=ws([1,n*t,n*e],i),r=wt(1/Math.max(...a),1/3);return[r,r*n]}function ks(t,e,i){let[s,n,a]=t,r=vs(n,a,e,i),o=function(t,e,i,s,n,a,r,o){let l;if(void 0===o&&(o=vs(t,e,a,r)),(i-n)*o[1]-(o[0]-n)*s<=0)l=o[1]*n/(s*o[0]+o[1]*(n-i));else{l=o[1]*(n-1)/(s*(o[0]-1)+o[1]*(n-i));let r=i-n,h=s,d=bs(te[0].slice(1),[t,e]),c=bs(te[1].slice(1),[t,e]),u=bs(te[2].slice(1),[t,e]),p=r+h*d,m=r+h*c,b=r+h*u,g=n*(1-l)+l*i,f=l*s,x=g+f*d,w=g+f*c,v=g+f*u,k=x**3,y=w**3,C=v**3,z=3*p*x**2,E=3*m*w**2,$=3*b*v**2,S=6*p**2*x,M=6*m**2*w,L=6*b**2*v,A=bs(a[0],[k,y,C])-1,R=bs(a[0],[z,E,$]),P=R/(R*R-.5*A*bs(a[0],[S,M,L])),T=-A*P,D=bs(a[1],[k,y,C])-1,B=bs(a[1],[z,E,$]),I=B/(B*B-.5*D*bs(a[1],[S,M,L])),O=-D*I,H=bs(a[2],[k,y,C])-1,j=bs(a[2],[z,E,$]),N=j/(j*j-.5*H*bs(a[2],[S,M,L])),F=-H*N;T=P>=0?T:cs,O=I>=0?O:cs,F=N>=0?F:cs,l+=Math.min(T,Math.min(O,F))}return l}(n,a,s,1,s,e,i,r),l=xs(r),h=o/Math.min(s*l[0],(1-s)*l[1]),d=function(t,e){return[.11516993+1/(7.4477897+4.1590124*e+t*(1.75198401*e-2.19557347+t*(-2.13704948-10.02301043*e+t*(5.38770819*e-4.24894561+4.69891013*t)))),.11239642+1/(1.6132032-.68124379*e+t*(.40370612+.90148123*e+t*(.6122399*e-.27087943+t*(.00299215-.45399568*e-.14661872*t))))]}(n,a),c=s*d[0],u=(1-s)*d[1],p=.9*h*Math.sqrt(Math.sqrt(1/(1/c**4+1/u**4)));return c=.4*s,u=.8*(1-s),[Math.sqrt(1/(1/c**2+1/u**2)),p,o]}var ys=new Dt({id:\"okhsl\",name:\"Okhsl\",coords:{h:{refRange:[0,360],type:\"angle\",name:\"Hue\"},s:{range:[0,1],name:\"Saturation\"},l:{range:[0,1],name:\"Lightness\"}},base:ee,gamutSpace:\"self\",fromBase:t=>function(t,e,i){let s=t[0],n=0,a=gs(s),r=Math.sqrt(t[1]**2+t[2]**2),o=.5+Math.atan2(-t[2],-t[1])/ls;if(0!==a&&1!==a&&0!==r){let a,o,l,h,d=t[1]/r,c=t[2]/r,[u,p,m]=ks([s,d,c],e,i),b=.8;r<p?(o=b*u,l=1-o/p,h=r/(o+l*r),n=h*b):(a=p,o=.2*p**2*1.5625/u,l=1-o/(m-p),h=(r-a)/(o+l*(r-a)),n=b+.2*h)}const l=Math.abs(n)<1e-4;return l||0===a||Math.abs(1-a)<1e-7?(o=null,l||(n=0)):o=Xt(360*o),[o,n,a]}(t,hs,ds),toBase:t=>function(t,e,i){let[s,n,a]=t,r=fs(a),o=null,l=null;if(s=Xt(s)/360,0!==r&&1!==r&&0!==n){let t,a,h,d,c=Math.cos(ls*s),u=Math.sin(ls*s),[p,m,b]=ks([r,c,u],e,i),g=.8;n<g?(t=1.25*n,a=0,h=g*p,d=1-h/m):(t=5*(n-.8),a=m,h=.2*m**2*1.5625/p,d=1-h/(b-m));let f=a+t*h/(1-d*t);o=f*c,l=f*u}return[r,o,l]}(t,hs,ds),formats:{color:{id:\"--okhsl\",coords:[\"<number> | <angle>\",\"<percentage> | <number>\",\"<percentage> | <number>\"]}}});var Cs=new Dt({id:\"okhsv\",name:\"Okhsv\",coords:{h:{refRange:[0,360],type:\"angle\",name:\"Hue\"},s:{range:[0,1],name:\"Saturation\"},v:{range:[0,1],name:\"Value\"}},base:ee,gamutSpace:\"self\",fromBase:t=>function(t,e,i){let s=t[0],n=0,a=gs(s),r=Math.sqrt(t[1]**2+t[2]**2),o=.5+Math.atan2(-t[2],-t[1])/ls;if(0!==s&&1!==s&&0!==r){let o=t[1]/r,l=t[2]/r,h=vs(o,l,e,i),[d,c]=xs(h),u=.5,p=1-u/d,m=c/(r+s*c),b=m*s,g=m*r,f=fs(b),x=g*f/b,[w,v,k]=ws([f,o*x,l*x],e),y=wt(1/Math.max(Math.max(w,v),Math.max(k,0)),1/3);s/=y,r/=y,r=r*gs(s)/s,s=gs(s),a=s/b,n=(u+c)*g/(c*u+c*p*g)}return o=Math.abs(n)<1e-4||0===a?null:Xt(360*o),[o,n,a]}(t,hs,ds),toBase:t=>function(t,e,i){let[s,n,a]=t;s=Xt(s)/360;let r=fs(a),o=null,l=null;if(0!==r&&0!==n){let t=Math.cos(ls*s),h=Math.sin(ls*s),d=vs(t,h,e,i),[c,u]=xs(d),p=.5,m=1-p/c,b=1-n*p/(p+u-u*m*n),g=n*u*p/(p+u-u*m*n);r=a*b;let f=a*g,x=fs(b),w=g*x/b,v=fs(r);f=f*v/r,r=v;let[k,y,C]=ws([x,t*w,h*w],e),z=wt(1/Math.max(Math.max(k,y),Math.max(C,0)),1/3);r*=z,f*=z,o=f*t,l=f*h}return[r,o,l]}(t,hs,ds),formats:{color:{id:\"--okhsv\",coords:[\"<number> | <angle>\",\"<percentage> | <number>\",\"<percentage> | <number>\"]}}}),zs=new Dt({id:\"oklch\",name:\"OkLCh\",coords:{l:{refRange:[0,1],name:\"Lightness\"},c:{refRange:[0,.4],name:\"Chroma\"},h:{refRange:[0,360],type:\"angle\",name:\"Hue\"}},white:\"D65\",base:ee,fromBase:_t.fromBase,toBase:_t.toBase,formats:{oklch:{coords:[\"<percentage> | <number>\",\"<number> | <percentage>\",\"<number> | <angle>\"]}}});var Es=new Si({id:\"p3-linear\",cssId:\"--display-p3-linear\",name:\"Linear P3\",white:\"D65\",toXYZ_M:[[.4865709486482162,.26566769316909306,.1982172852343625],[.2289745640697488,.6917385218365064,.079286914093745],[0,.04511338185890264,1.043944368900976]],fromXYZ_M:[[2.493496911941425,-.9313836179191239,-.40271078445071684],[-.8294889695615747,1.7626640603183463,.023624685841943577],[.03584583024378447,-.07617238926804182,.9568845240076872]]}),$s=new Si({id:\"p3\",cssId:\"display-p3\",name:\"P3\",base:Es,fromBase:Bi.fromBase,toBase:Bi.toBase});var Ss=new Si({id:\"prophoto-linear\",cssId:\"--prophoto-rgb-linear\",name:\"Linear ProPhoto\",white:\"D50\",base:Ot,toXYZ_M:[[.7977666449006423,.13518129740053308,.0313477341283922],[.2880748288194013,.711835234241873,8993693872564e-17],[0,0,.8251046025104602]],fromXYZ_M:[[1.3457868816471583,-.25557208737979464,-.05110186497554526],[-.5446307051249019,1.5082477428451468,.02052744743642139],[0,0,1.2119675456389452]]});const Ms=1/512;var Ls=new Si({id:\"prophoto\",cssId:\"prophoto-rgb\",name:\"ProPhoto\",base:Ss,toBase:t=>t.map((t=>t<.03125?t/16:t**1.8)),fromBase:t=>t.map((t=>t>=Ms?t**(1/1.8):16*t))});var As=new Si({id:\"rec2020-linear\",cssId:\"--rec2020-linear\",name:\"Linear REC.2020\",white:\"D65\",toXYZ_M:[[.6369580483012914,.14461690358620832,.1688809751641721],[.2627002120112671,.6779980715188708,.05930171646986196],[0,.028072693049087428,1.060985057710791]],fromXYZ_M:[[1.716651187971268,-.355670783776392,-.25336628137366],[-.666684351832489,1.616481236634939,.0157685458139111],[.017639857445311,-.042770613257809,.942103121235474]]});const Rs=1.09929682680944,Ps=.018053968510807;var Ts=new Si({id:\"rec2020\",name:\"REC.2020\",base:As,toBase:t=>t.map((function(t){return t<4.5*Ps?t/4.5:Math.pow((t+Rs-1)/Rs,1/.45)})),fromBase:t=>t.map((function(t){return t>=Ps?Rs*Math.pow(t,.45)-(Rs-1):4.5*t}))});let{isNaN:Ds}=Number;Dt.register(Li),Dt.register(ri),Dt.register(Ii),Dt.register(as),Dt.register(rs),Dt.register(os),Dt.register(_t),Dt.register(Gt),Dt.register(Cs),Dt.register(ys),Dt.register(ee),Dt.register(zs),Dt.register($s),Dt.register(Ls),Dt.register(Ts),Dt.register(Bi),Dt.register(Ri),Dt.register(Ot),Dt.register(It),Dt.register(de);const Bs=[[\"primary\",[\"primary\",40],[\"primary\",80]],[\"on-primary\",[\"greyscale\",100],[\"primary\",20]],[\"primary-container\",[\"primary\",90],[\"primary\",30]],[\"on-primary-container\",[\"primary\",10],[\"primary\",90]],[\"primary-inverse\",[\"primary\",80],[\"primary\",40]],[\"primary-fixed\",[\"primary\",90],[\"primary\",90]],[\"primary-fixed-dim\",[\"primary\",80],[\"primary\",80]],[\"on-primary-fixed\",[\"primary\",10],[\"primary\",10]],[\"on-primary-fixed-variant\",[\"primary\",30],[\"primary\",30]],[\"secondary\",[\"secondary\",40],[\"secondary\",80]],[\"on-secondary\",[\"greyscale\",100],[\"secondary\",20]],[\"secondary-container\",[\"secondary\",90],[\"secondary\",30]],[\"on-secondary-container\",[\"secondary\",10],[\"secondary\",90]],[\"secondary-fixed\",[\"secondary\",90],[\"secondary\",90]],[\"secondary-fixed-dim\",[\"secondary\",80],[\"secondary\",80]],[\"on-secondary-fixed\",[\"secondary\",10],[\"secondary\",10]],[\"on-secondary-fixed-variant\",[\"secondary\",30],[\"secondary\",30]],[\"tertiary\",[\"tertiary\",40],[\"tertiary\",80]],[\"on-tertiary\",[\"greyscale\",100],[\"tertiary\",20]],[\"tertiary-container\",[\"tertiary\",90],[\"tertiary\",30]],[\"on-tertiary-container\",[\"tertiary\",10],[\"tertiary\",90]],[\"tertiary-fixed\",[\"tertiary\",90],[\"tertiary\",90]],[\"tertiary-fixed-dim\",[\"tertiary\",80],[\"tertiary\",80]],[\"on-tertiary-fixed\",[\"tertiary\",10],[\"tertiary\",10]],[\"on-tertiary-fixed-variant\",[\"tertiary\",30],[\"tertiary\",30]],[\"error\",[\"error\",40],[\"error\",80]],[\"on-error\",[\"greyscale\",100],[\"error\",20]],[\"error-container\",[\"error\",90],[\"error\",30]],[\"on-error-container\",[\"error\",10],[\"error\",90]],[\"outline\",[\"neutralVariant\",50],[\"neutralVariant\",60]],[\"outline-variant\",[\"neutralVariant\",80],[\"neutralVariant\",30]],[\"background\",[\"neutral\",98],[\"neutral\",6]],[\"on-background\",[\"neutral\",10],[\"neutral\",90]],[\"surface\",[\"neutral\",98],[\"neutral\",6]],[\"on-surface\",[\"neutral\",10],[\"neutral\",90]],[\"surface-variant\",[\"neutralVariant\",90],[\"neutralVariant\",30]],[\"on-surface-variant\",[\"neutralVariant\",30],[\"neutralVariant\",80]],[\"surface-inverse\",[\"neutral\",20],[\"neutral\",90]],[\"on-surface-inverse\",[\"neutral\",95],[\"neutral\",20]],[\"surface-bright\",[\"neutral\",98],[\"neutral\",24]],[\"surface-dim\",[\"neutral\",87],[\"neutral\",6]],[\"surface-container\",[\"neutral\",94],[\"neutral\",12]],[\"surface-container-low\",[\"neutral\",96],[\"neutral\",10]],[\"surface-container-lowest\",[\"greyscale\",100],[\"neutral\",4]],[\"surface-container-high\",[\"neutral\",92],[\"neutral\",17]],[\"surface-container-highest\",[\"neutral\",90],[\"neutral\",22]],[\"scrim\",[\"greyscale\",0],[\"greyscale\",0]]];let Is=(t,e=\"hex\",i=3)=>{if(void 0===t.spaceId&&(t.spaceId=t.space.id),\"hex\"===e||\"hex-alt\"===e){let i=bi(mi(t,\"srgb\"),{format:\"hex\"});return\"hex-alt\"===e?i.toUpperCase():i}if(\"hsl\"===e||\"hsl-alt\"===e){let[s,n,a]=mi(t,\"hsl\").coords,r=t.alpha;if((null===s||Ds(s))&&(s=0),s=yi(s,i),n=yi(n,i),a=yi(a,i),\"hsl\"===e)return r=yi(100*r,i),100===r?`hsl(${s}deg ${n}% ${a}%)`:`hsl(${s}deg ${n}% ${a}% / ${r}%)`;if(\"hsl-alt\"===e)return r=yi(r,i),1===r?`hsl(${s} ${n}% ${a}%)`:`hsl(${s} ${n}% ${a}% / ${r})`}else if(\"hwb\"===e||\"hwb-alt\"===e){let[s,n,a]=mi(t,\"hwb\").coords,r=t.alpha;if((null===s||Ds(s))&&(s=0),s=yi(s,i),n=yi(n,i),a=yi(a,i),\"hwb\"===e)return r=yi(100*r,i),100===r?`hwb(${s}deg ${n}% ${a}%)`:`hwb(${s}deg ${n}% ${a}% / ${r}%)`;if(\"hwb-alt\"===e)return r=yi(r,i),1===r?`hwb(${s} ${n}% ${a}%)`:`hwb(${s} ${n}% ${a}% / ${r})`}else if(\"rgb\"===e||\"rgb-alt\"===e){let[s,n,a]=mi(t,\"srgb\").coords,r=t.alpha;if(\"rgb\"===e)return s=yi(100*s,i),n=yi(100*n,i),a=yi(100*a,i),r=yi(100*r,i),100===r?`rgb(${s}% ${n}% ${a}%)`:`rgb(${s}% ${n}% ${a}% / ${r}%)`;if(\"rgb-alt\"===e)return s=yi(255*s,i),n=yi(255*n,i),a=yi(255*a,i),r=yi(r,i),1===r?`rgb(${s} ${n} ${a})`:`rgb(${s} ${n} ${a} / ${r})`}else if(\"color\"===e||\"color-alt\"===e)if([\"srgb\",\"srgb-linear\",\"a98rgb\",\"prophoto\",\"p3\",\"rec2020\",\"hsl\",\"hwb\"].includes(t.spaceId)){\"hsl\"!==t.spaceId&&\"hwb\"!==t.spaceId||void 0===(t=mi(t,\"srgb\")).spaceId&&(t.spaceId=t.space.id);let[s,n,a]=t.coords,r=t.alpha,o=Os(t.spaceId,\"css\");if(\"color\"===e)return s=yi(100*s,i),n=yi(100*n,i),a=yi(100*a,i),r=yi(100*r,i),100===r?`color(${o} ${s}% ${n}% ${a}%)`:`color(${o} ${s}% ${n}% ${a}% / ${r}%)`;if(\"color-alt\"===e)return s=yi(s,i),n=yi(n,i),a=yi(a,i),r=yi(r,i),1===r?`color(${o} ${s} ${n} ${a})`:`color(${o} ${s} ${n} ${a} / ${r})`}else{if(![\"xyz\",\"xyz-d50\",\"xyz-d65\"].includes(t.spaceId))throw new Error(`\"Color in \"${t.spaceId}\" space can't be serialized to \"${e}\" format.`);{let[s,n,a]=t.coords,r=t.alpha,o=t.spaceId;if(\"color\"===e)return s=yi(100*s,i),n=yi(100*n,i),a=yi(100*a,i),r=yi(100*r,i),\"xyz\"===o&&(o=\"xyz-d65\"),100===r?`color(${o} ${s}% ${n}% ${a}%)`:`color(${o} ${s}% ${n}% ${a}% / ${r}%)`;if(\"color-alt\"===e)return s=yi(s,i),n=yi(n,i),a=yi(a,i),r=yi(r,i),\"xyz-d65\"===o&&(o=\"xyz\"),1===r?`color(${o} ${s} ${n} ${a})`:`color(${o} ${s} ${n} ${a} / ${r})`}}else if(\"oklch\"===e||\"oklch-alt\"===e){let[s,n,a]=mi(t,\"oklch\").coords,r=t.alpha;if(\"oklch\"===e)return s=yi(100*s,i),n=yi(n/.4*100,i),a=yi(a,i),r=yi(100*r,i),100===r?`oklch(${s}% ${n}% ${a}deg)`:`oklch(${s}% ${n}% ${a}deg / ${r}%)`;if(\"oklch-alt\"===e)return s=yi(s,i),n=yi(n,i),a=yi(a,i),r=yi(r,i),1===r?`oklch(${s} ${n} ${a})`:`oklch(${s} ${n} ${a} / ${r})`}else if(\"oklab\"===e||\"oklab-alt\"===e){let[s,n,a]=mi(t,\"oklab\").coords,r=t.alpha;if(\"oklab\"===e)return s=yi(100*s,i),n=yi(n/.4*100,i),a=yi(a/.4*100,i),r=yi(100*r,i),100===r?`oklab(${s}% ${n}% ${a}%)`:`oklab(${s}% ${n}% ${a}% / ${r}%)`;if(\"oklab-alt\"===e)return s=yi(s,i),n=yi(n,i),a=yi(a,i),r=yi(r,i),1===r?`oklab(${s} ${n} ${a})`:`oklab(${s} ${n} ${a} / ${r})`}else if(\"lch\"===e||\"lch-alt\"===e){let[s,n,a]=mi(t,\"lch\").coords,r=t.alpha;if(\"lch\"===e)return s=yi(s,i),n=yi(n/150*100,i),a=yi(a,i),r=yi(100*r,i),100===r?`lch(${s}% ${n}% ${a}deg)`:`lch(${s}% ${n}% ${a}deg / ${r}%)`;if(\"lch-alt\"===e)return s=yi(s,i),n=yi(n,i),a=yi(a,i),r=yi(r,i),1===r?`lch(${s} ${n} ${a})`:`lch(${s} ${n} ${a} / ${r})`}else{if(\"lab\"!==e&&\"lab-alt\"!==e)throw new Error(`Unknown color format \"${e}\".`);{let[s,n,a]=mi(t,\"lab\").coords,r=t.alpha;if(\"lab\"===e)return s=yi(s,i),n=yi(n/125*100,i),a=yi(a/125*100,i),r=yi(100*r,i),100===r?`lab(${s}% ${n}% ${a}%)`:`lab(${s}% ${n}% ${a}% / ${r}%)`;if(\"lab-alt\"===e)return s=yi(s,i),n=yi(n,i),a=yi(a,i),r=yi(r,i),1===r?`lab(${s} ${n} ${a})`:`lab(${s} ${n} ${a} / ${r})`}}},Os=(t,e=\"css\")=>(\"css\"===e?\"p3\"===t?t=\"display-p3\":\"a98rgb\"===t?t=\"a98-rgb\":\"prophoto\"===t&&(t=\"prophoto-rgb\"):\"color.js\"===e&&(\"display-p3\"===t?t=\"p3\":\"a98-rgb\"===t?t=\"a98rgb\":\"prophoto-rgb\"===t&&(t=\"prophoto\")),\"xyz\"===t&&(t=\"xyz-d65\"),t),Hs=t=>{try{At(t)}catch(t){return!1}return!0},js=document.createElement(\"template\"),Ns=(t,...e)=>{let i=[];for(let s=0;s<t.length;s+=1)i.push(t[s]),void 0!==e[s]&&i.push(e[s]);let s=i.join(\"\");js.innerHTML=s;let n=document.importNode(js.content,!0);return 1===n.children.length?n.firstElementChild:n},Fs=(t,...e)=>{let i=[];for(let s=0;s<t.length;s+=1)i.push(t[s]),void 0!==e[s]&&i.push(e[s]);let s=i.join(\"\"),n=new CSSStyleSheet;return n.replaceSync(s),n},Gs=(t,...e)=>{let i=[];for(let s=0;s<t.length;s+=1)i.push(t[s]),void 0!==e[s]&&i.push(e[s]);let s=`<svg id=\"x-stub\" xmlns=\"http://www.w3.org/2000/svg\">${i.join(\"\")}</svg>`;js.innerHTML=s;let n=document.importNode(js.content,!0),a=n.querySelector(\"svg#x-stub\");if(1===a.children.length)return a.firstElementChild;for(let t of[...a.childNodes])n.appendChild(t);return a.remove(),n},Xs={},_s=t=>new Promise((async e=>{if(Xs[t])Xs[t].icons?e(Xs[t].icons):Xs[t].callbacks.push(e);else{Xs[t]={callbacks:[e],icons:null};let i=null;try{i=await(await fetch(t)).text()}catch(t){i=null}if(i){Xs[t].icons=Gs`${i}`;for(let e of Xs[t].callbacks)e(Xs[t].icons)}else console.error(`Xel failed to fetch the icons: ${t}`)}}));class Zs{constructor(t){this.value=t}valueOf(){return this.value}}class Us extends Zs{constructor(t=\"???\"){super(t)}toString(t){return`{${this.value}}`}}class Ys extends Zs{constructor(t,e={}){super(t),this.opts=e}toString(t){try{return t.memoizeIntlObject(Intl.NumberFormat,this.opts).format(this.value)}catch(e){return t.reportError(e),this.value.toString(10)}}}class Vs extends Zs{constructor(t,e={}){super(t),this.opts=e}toString(t){try{return t.memoizeIntlObject(Intl.DateTimeFormat,this.opts).format(this.value)}catch(e){return t.reportError(e),new Date(this.value).toISOString()}}}function qs(t,e,i){if(i===e)return!0;if(i instanceof Ys&&e instanceof Ys&&i.value===e.value)return!0;if(e instanceof Ys&&\"string\"==typeof i){if(i===t.memoizeIntlObject(Intl.PluralRules,e.opts).select(e.value))return!0}return!1}function Ws(t,e,i){return e[i]?tn(t,e[i].value):(t.reportError(new RangeError(\"No default\")),new Us)}function Ks(t,e){const i=[],s=Object.create(null);for(const n of e)\"narg\"===n.type?s[n.name]=Js(t,n.value):i.push(Js(t,n));return{positional:i,named:s}}function Js(t,e){switch(e.type){case\"str\":return e.value;case\"num\":return new Ys(e.value,{minimumFractionDigits:e.precision});case\"var\":return function(t,{name:e}){let i;if(t.params){if(!Object.prototype.hasOwnProperty.call(t.params,e))return new Us(`$${e}`);i=t.params[e]}else{if(!t.args||!Object.prototype.hasOwnProperty.call(t.args,e))return t.reportError(new ReferenceError(`Unknown variable: $${e}`)),new Us(`$${e}`);i=t.args[e]}if(i instanceof Zs)return i;switch(typeof i){case\"string\":return i;case\"number\":return new Ys(i);case\"object\":if(i instanceof Date)return new Vs(i.getTime());default:return t.reportError(new TypeError(`Variable type not supported: $${e}, ${typeof i}`)),new Us(`$${e}`)}}(t,e);case\"mesg\":return function(t,{name:e,attr:i}){const s=t.bundle.p.get(e);if(!s)return t.reportError(new ReferenceError(`Unknown message: ${e}`)),new Us(e);if(i){const n=s.attributes[i];return n?tn(t,n):(t.reportError(new ReferenceError(`Unknown attribute: ${i}`)),new Us(`${e}.${i}`))}if(s.value)return tn(t,s.value);return t.reportError(new ReferenceError(`No value: ${e}`)),new Us(e)}(t,e);case\"term\":return function(t,{name:e,attr:i,args:s}){const n=`-${e}`,a=t.bundle.k.get(n);if(!a)return t.reportError(new ReferenceError(`Unknown term: ${n}`)),new Us(n);if(i){const e=a.attributes[i];if(e){t.params=Ks(t,s).named;const i=tn(t,e);return t.params=null,i}return t.reportError(new ReferenceError(`Unknown attribute: ${i}`)),new Us(`${n}.${i}`)}t.params=Ks(t,s).named;const r=tn(t,a.value);return t.params=null,r}(t,e);case\"func\":return function(t,{name:e,args:i}){let s=t.bundle.$[e];if(!s)return t.reportError(new ReferenceError(`Unknown function: ${e}()`)),new Us(`${e}()`);if(\"function\"!=typeof s)return t.reportError(new TypeError(`Function ${e}() is not callable`)),new Us(`${e}()`);try{let e=Ks(t,i);return s(e.positional,e.named)}catch(i){return t.reportError(i),new Us(`${e}()`)}}(t,e);case\"select\":return function(t,{selector:e,variants:i,star:s}){let n=Js(t,e);if(n instanceof Us)return Ws(t,i,s);for(const e of i){if(qs(t,n,Js(t,e.key)))return tn(t,e.value)}return Ws(t,i,s)}(t,e);default:return new Us}}function Qs(t,e){if(t.dirty.has(e))return t.reportError(new RangeError(\"Cyclic reference\")),new Us;t.dirty.add(e);const i=[],s=t.bundle.S&&e.length>1;for(const n of e)if(\"string\"!=typeof n){if(t.placeables++,t.placeables>100)throw t.dirty.delete(e),new RangeError(`Too many placeables expanded: ${t.placeables}, max allowed is 100`);s&&i.push(\"⁨\"),i.push(Js(t,n).toString(t)),s&&i.push(\"⁩\")}else i.push(t.bundle.L(n));return t.dirty.delete(e),i.join(\"\")}function tn(t,e){return\"string\"==typeof e?t.bundle.L(e):Qs(t,e)}class en{constructor(t,e,i){this.dirty=new WeakSet,this.params=null,this.placeables=0,this.bundle=t,this.errors=e,this.args=i}reportError(t){if(!(this.errors&&t instanceof Error))throw t;this.errors.push(t)}memoizeIntlObject(t,e){let i=this.bundle.A.get(t);i||(i={},this.bundle.A.set(t,i));let s=JSON.stringify(e);return i[s]||(i[s]=new t(this.bundle.locales,e)),i[s]}}function sn(t,e){const i=Object.create(null);for(const[s,n]of Object.entries(t))e.includes(s)&&(i[s]=n.valueOf());return i}const nn=[\"unitDisplay\",\"currencyDisplay\",\"useGrouping\",\"minimumIntegerDigits\",\"minimumFractionDigits\",\"maximumFractionDigits\",\"minimumSignificantDigits\",\"maximumSignificantDigits\"];function an(t,e){let i=t[0];if(i instanceof Us)return new Us(`NUMBER(${i.valueOf()})`);if(i instanceof Ys)return new Ys(i.valueOf(),{...i.opts,...sn(e,nn)});if(i instanceof Vs)return new Ys(i.valueOf(),{...sn(e,nn)});throw new TypeError(\"Invalid argument to NUMBER\")}const rn=[\"dateStyle\",\"timeStyle\",\"fractionalSecondDigits\",\"dayPeriod\",\"hour12\",\"weekday\",\"era\",\"year\",\"month\",\"day\",\"hour\",\"minute\",\"second\",\"timeZoneName\"];function on(t,e){let i=t[0];if(i instanceof Us)return new Us(`DATETIME(${i.valueOf()})`);if(i instanceof Vs)return new Vs(i.valueOf(),{...i.opts,...sn(e,rn)});if(i instanceof Ys)return new Vs(i.valueOf(),{...sn(e,rn)});throw new TypeError(\"Invalid argument to DATETIME\")}const ln=new Map;class hn{constructor(t,{functions:e,useIsolating:i=!0,transform:s=t=>t}={}){this.k=new Map,this.p=new Map,this.locales=Array.isArray(t)?t:[t],this.$={NUMBER:an,DATETIME:on,...e},this.S=i,this.L=s,this.A=function(t){const e=Array.isArray(t)?t.join(\" \"):t;let i=ln.get(e);return void 0===i&&(i=new Map,ln.set(e,i)),i}(t)}hasMessage(t){return this.p.has(t)}getMessage(t){return this.p.get(t)}addResource(t,{allowOverrides:e=!1}={}){const i=[];for(let s=0;s<t.body.length;s++){let n=t.body[s];if(n.id.startsWith(\"-\")){if(!1===e&&this.k.has(n.id)){i.push(new Error(`Attempt to override an existing term: \"${n.id}\"`));continue}this.k.set(n.id,n)}else{if(!1===e&&this.p.has(n.id)){i.push(new Error(`Attempt to override an existing message: \"${n.id}\"`));continue}this.p.set(n.id,n)}}return i}formatPattern(t,e=null,i=null){if(\"string\"==typeof t)return this.L(t);let s=new en(this,i,e);try{return Qs(s,t).toString(s)}catch(t){if(s.errors&&t instanceof Error)return s.errors.push(t),(new Us).toString(s);throw t}}}const dn=/^(-?[a-zA-Z][\\w-]*) *= */gm,cn=/\\.([a-zA-Z][\\w-]*) *= */y,un=/\\*?\\[/y,pn=/(-?[0-9]+(?:\\.([0-9]+))?)/y,mn=/([a-zA-Z][\\w-]*)/y,bn=/([$-])?([a-zA-Z][\\w-]*)(?:\\.([a-zA-Z][\\w-]*))?/y,gn=/^[A-Z][A-Z0-9_-]*$/,fn=/([^{}\\n\\r]+)/y,xn=/([^\\\\\"\\n\\r]*)/y,wn=/\\\\([\\\\\"])/y,vn=/\\\\u([a-fA-F0-9]{4})|\\\\U([a-fA-F0-9]{6})/y,kn=/^\\n+/,yn=/ +$/,Cn=/ *\\r?\\n/g,zn=/( *)$/,En=/{\\s*/y,$n=/\\s*}/y,Sn=/\\[\\s*/y,Mn=/\\s*] */y,Ln=/\\s*\\(\\s*/y,An=/\\s*->\\s*/y,Rn=/\\s*:\\s*/y,Pn=/\\s*,?\\s*/y,Tn=/\\s+/y;class Dn{constructor(t){this.body=[],dn.lastIndex=0;let e=0;for(;;){let i=dn.exec(t);if(null===i)break;e=dn.lastIndex;try{this.body.push(o(i[1]))}catch(t){if(t instanceof SyntaxError)continue;throw t}}function i(i){return i.lastIndex=e,i.test(t)}function s(i,s){if(t[e]===i)return e++,!0;if(s)throw new s(`Expected ${i}`);return!1}function n(t,s){if(i(t))return e=t.lastIndex,!0;if(s)throw new s(`Expected ${t.toString()}`);return!1}function a(i){i.lastIndex=e;let s=i.exec(t);if(null===s)throw new SyntaxError(`Expected ${i.toString()}`);return e=i.lastIndex,s}function r(t){return a(t)[1]}function o(t){let e=l(),s=function(){let t=Object.create(null);for(;i(cn);){let e=r(cn),i=l();if(null===i)throw new SyntaxError(\"Expected attribute value\");t[e]=i}return t}();if(null===e&&0===Object.keys(s).length)throw new SyntaxError(\"Expected message value or attributes\");return{id:t,value:e,attributes:s}}function l(){let s;if(i(fn)&&(s=r(fn)),\"{\"===t[e]||\"}\"===t[e])return h(s?[s]:[],Infinity);let n=f();return n?s?h([s,n],n.length):(n.value=x(n.value,kn),h([n],n.length)):s?x(s,yn):null}function h(s=[],n){for(;;){if(i(fn)){s.push(r(fn));continue}if(\"{\"===t[e]){s.push(d());continue}if(\"}\"===t[e])throw new SyntaxError(\"Unbalanced closing brace\");let a=f();if(!a)break;s.push(a),n=Math.min(n,a.length)}let a=s.length-1,o=s[a];\"string\"==typeof o&&(s[a]=x(o,yn));let l=[];for(let t of s)t instanceof Bn&&(t=t.value.slice(0,t.value.length-n)),t&&l.push(t);return l}function d(){n(En,SyntaxError);let t=c();if(n($n))return t;if(n(An)){let e=function(){let t,e=[],n=0;for(;i(un);){s(\"*\")&&(t=n);let i=p(),a=l();if(null===a)throw new SyntaxError(\"Expected variant value\");e[n++]={key:i,value:a}}if(0===n)return null;if(void 0===t)throw new SyntaxError(\"Expected default variant\");return{variants:e,star:t}}();return n($n,SyntaxError),{type:\"select\",selector:t,...e}}throw new SyntaxError(\"Unclosed placeable\")}function c(){if(\"{\"===t[e])return d();if(i(bn)){let[,i,s,r=null]=a(bn);if(\"$\"===i)return{type:\"var\",name:s};if(n(Ln)){let a=function(){let i=[];for(;;){switch(t[e]){case\")\":return e++,i;case void 0:throw new SyntaxError(\"Unclosed argument list\")}i.push(u()),n(Pn)}}();if(\"-\"===i)return{type:\"term\",name:s,attr:r,args:a};if(gn.test(s))return{type:\"func\",name:s,args:a};throw new SyntaxError(\"Function names must be all upper-case\")}return\"-\"===i?{type:\"term\",name:s,attr:r,args:[]}:{type:\"mesg\",name:s,attr:r}}return m()}function u(){let t=c();return\"mesg\"!==t.type?t:n(Rn)?{type:\"narg\",name:t.name,value:m()}:t}function p(){let t;return n(Sn,SyntaxError),t=i(pn)?b():{type:\"str\",value:r(mn)},n(Mn,SyntaxError),t}function m(){if(i(pn))return b();if('\"'===t[e])return function(){s('\"',SyntaxError);let i=\"\";for(;;){if(i+=r(xn),\"\\\\\"!==t[e]){if(s('\"'))return{type:\"str\",value:i};throw new SyntaxError(\"Unclosed string literal\")}i+=g()}}();throw new SyntaxError(\"Invalid expression\")}function b(){let[,t,e=\"\"]=a(pn),i=e.length;return{type:\"num\",value:parseFloat(t),precision:i}}function g(){if(i(wn))return r(wn);if(i(vn)){let[,t,e]=a(vn),i=parseInt(t||e,16);return i<=55295||57344<=i?String.fromCodePoint(i):\"�\"}throw new SyntaxError(\"Unknown escape sequence\")}function f(){let i=e;switch(n(Tn),t[e]){case\".\":case\"[\":case\"*\":case\"}\":case void 0:return!1;case\"{\":return w(t.slice(i,e))}return\" \"===t[e-1]&&w(t.slice(i,e))}function x(t,e){return t.replace(e,\"\")}function w(t){let e=t.replace(Cn,\"\\n\"),i=zn.exec(t)[1].length;return new Bn(e,i)}}}class Bn{constructor(t,e){this.value=t,this.length=e}}let In,On,Hn=()=>(void 0===On&&(On=navigator.userAgent.indexOf(\"Firefox/\")>-1?\"gecko\":navigator.userAgent.indexOf(\"Chrome\")>-1?\"chromium\":navigator.userAgent.indexOf(\"Safari/\")>-1?\"webkit\":\"other\"),On),jn=t=>new Promise(((e,i)=>{setTimeout((()=>e()),t)})),Nn=()=>Date.now(),Fn=(t,e=500,i)=>{let s=null,n=null,a=null,r=0,o=()=>{r=new Date,n=null,a=t.apply(i,s)};return(...l)=>{let h=new Date,d=e-(h-r);return s=l,d<=0?(clearTimeout(n),n=null,r=h,a=t.apply(i,s)):n||(n=setTimeout(o,d)),a}};var Gn=new class extends at{get theme(){return this.#e}set theme(t){let e=document.head.querySelector(':scope > meta[name=\"xel-theme\"]');e||(e=document.createElement(\"meta\"),e.setAttribute(\"name\",\"xel-theme\"),document.head.append(e)),e.setAttribute(\"content\",t)}get icons(){return[...this.#i]}set icons(t){let e=document.head.querySelector(':scope > meta[name=\"xel-icons\"]');e||(e=document.head.querySelector(':scope > meta[name=\"xel-iconsets\"]'),e&&console.warn('<meta name=\"xel-iconsets\"> has been deprecated. Please use <meta name=\"xel-icons\"> instead.'),e||(e=document.createElement(\"meta\"),e.setAttribute(\"name\",\"xel-icons\"),document.head.append(e))),e.setAttribute(\"content\",t.join(\", \"))}get locales(){return[...this.#s]}set locales(t){let e=document.head.querySelector(':scope > meta[name=\"xel-locales\"]');e||(e=document.createElement(\"meta\"),e.setAttribute(\"name\",\"xel-locales\"),document.head.append(e)),e.setAttribute(\"content\",t.join(\", \"))}get locale(){return this.#n[0]||\"en\"}get accentColor(){return this.#a}set accentColor(t){let e=document.head.querySelector(':scope > meta[name=\"xel-accent-color\"]');e||(e=document.createElement(\"meta\"),e.setAttribute(\"name\",\"xel-accent-color\"),document.head.append(e)),e.setAttribute(\"content\",t)}get configStorage(){return this.#r}set configStorage(t){this.#r=t}get whenThemeReady(){return new Promise((t=>{null===this.#o?t():this.#o.push(t)}))}get whenIconsReady(){return new Promise((t=>{null===this.#l?t():this.#l.push(t)}))}get whenLocalesReady(){return new Promise((t=>{null===this.#h?t():this.#h.push(t)}))}get themeStyleSheet(){return this.#d}get presetAccentColors(){let t={};for(let e of this.#d.cssRules)if(1===e.type&&\":root\"===e.selectorText){let i=e.style.getPropertyValue(\"--preset-accent-colors\");if(\"\"!==i){let e=i.split(\",\").map((t=>t.trim()));for(let i of e){let e=i.substring(0,i.indexOf(\" \")),s=i.substring(i.indexOf(\" \")+1).trim();t[e]=s}break}}return t}get autocapitalize(){return this.#c}queryIcon(t){t=!1===t.startsWith(\"#\")?\"#\"+t:t;let e=null;for(let i of this.#u){let s=i.querySelector(t);if(s){e=s;break}}return e}queryMessage(t,e={}){t=t.startsWith(\"#\")?t.substring(1):t;let[i,s]=t.split(\".\"),n=this.#p.getMessage(i),a=null,r=!1,o=\"text\";if(void 0===e.os&&(e.os=(void 0===In&&(In=!0===navigator.platform.startsWith(\"Mac\")?\"macos\":-1!==[\"iPhone\",\"iPad\",\"iPod\"].indexOf(navigator.platform)?\"ios\":-1!==[\"Win32\",\"Win64\",\"Windows\",\"WinCE\"].indexOf(navigator.platform)?\"windows\":/CrOS/.test(navigator.userAgent)?\"chromeos\":/Android/.test(navigator.userAgent)?\"android\":/Linux/.test(navigator.platform)?\"linux\":null),In)),void 0===s&&(s=null),n)if(null===s){if(n.value){if(Array.isArray(n.value))for(let t of n.value)\"select\"===t.type&&void 0===e[t.selector.name]&&(e[t.selector.name]=\"unknown\");a=this.#p.formatPattern(n.value,e)}}else n.attributes?.[s]&&(a=this.#p.formatPattern(n.attributes[s],e));return null===a?(a=null===s?i:`${i}.${s}`,r=!0):/<|&#?\\w+;/.test(a)&&(o=\"html\",a=nt.sanitize(a,{USE_PROFILES:{html:!0}})),{id:i,attribute:s,format:o,content:a,fallback:r}}getConfig(t,e=null){let i=this.#r.getItem(t);return null===i?e:JSON.parse(i)}setConfig(t,e){let i=this.#r.getItem(t);null===e?delete this.#r[t]:this.#r.setItem(t,JSON.stringify(e)),i!==this.#r.getItem(t)&&this.dispatchEvent(new CustomEvent(\"configchange\",{detail:{key:t,value:e,origin:\"self\"}}))}clearConfig(){if(this.#r.length>0){let t=Object.keys(this.#r);this.#r.clear();for(let e of t)this.dispatchEvent(new CustomEvent(\"configchange\",{detail:{key:e,value:null,origin:\"self\"}}))}}#e=null;#a=null;#i=[];#s=[];#n=[];#c=\"none\";#d=new CSSStyleSheet;#u=[];#p=null;#r=localStorage;#o=[];#l=[];#h=[];constructor(){super(),document.adoptedStyleSheets=[this.#d];let{theme:t,accentColor:e,icons:i,locales:s}=this.#m();this.#e=t,this.#a=e,this.#i=i,this.#s=s,this.#n=this.#s.map((t=>{let e=t.substring(t.lastIndexOf(\"/\")+1);return e.substring(0,e.indexOf(\".\"))})),null!==this.#e&&this.#b(this.#e),this.#i.length>0&&this.#g(this.#i),this.#s.length>0&&this.#f(this.#s);new MutationObserver((t=>this.#x(t))).observe(document.head,{attributes:!0,subtree:!0});window.addEventListener(\"storage\",(t=>this.#w(t)))}#x(t){let e=this.#e,i=this.#a,s=this.#i,n=this.#s,{theme:a,accentColor:r,icons:o,locales:l}=this.#m();this.#e=a,this.#a=r,this.#i=o,this.#s=l,this.#n=this.#s.map((t=>{let e=t.substring(t.lastIndexOf(\"/\")+1);return e.substring(0,e.indexOf(\".\"))})),this.#e!==e&&this.#b(this.#e).then((()=>{this.dispatchEvent(new CustomEvent(\"themechange\"))})),this.#a!==i&&(this.#v(),this.dispatchEvent(new CustomEvent(\"accentcolorchange\"))),!1===rt(this.#i,s,!0)&&this.#g(this.#i).then((()=>{this.dispatchEvent(new CustomEvent(\"iconschange\")),this.dispatchEvent(new CustomEvent(\"iconsetschange\"))})),!1===rt(this.#s,n,!0)&&this.#f(this.#s).then((()=>{this.dispatchEvent(new CustomEvent(\"localeschange\"))}))}#w(t){if(t.storageArea===this.#r){let e=t.key,i=null===t.newValue?null:JSON.parse(t.newValue);this.dispatchEvent(new CustomEvent(\"configchange\",{detail:{key:e,value:i,origin:\"other\"}}))}}#k(t){return new Promise((async e=>{let i=await fetch(t),s=await i.text();for(let[t,e]of this.#y(s)){let i=await this.#k(t);s=s.replace(e,i)}e(s)}))}#b(t){return new Promise((async e=>{null===this.#o&&(this.#o=[]);let i=await this.#k(t);if(this.#d.replaceSync(i),this.#C(),this.#v(),null!==this.#o){for(let t of this.#o)t();this.#o=null}e()}))}#g(t){return new Promise((async e=>{null===this.#l&&(this.#l=[]),this.#u=[];for(let e of t){let t=await _s(e);this.#u.push(t)}for(let t of this.#l)t();this.#l=null,e()}))}#f(t){return new Promise((async e=>{null===this.#h&&(this.#h=[]);let i=t.map((t=>{if(t.startsWith(\"blob:\")){return t.substring(t.lastIndexOf(\"#\")+1)}{let e=t.substring(t.lastIndexOf(\"/\")+1);return e.substring(0,e.indexOf(\".\"))}}));0===i.length&&i.push(\"en\");let s=new hn([i[0]],{useIsolating:!1,functions:{RELDATETIME:(t=[],e={})=>{let s;if(t[0]instanceof Ys)s=new Date(t[0].value);else{if(\"string\"!=typeof t[0])throw new TypeError(\"Invalid argument to RELDATETIME\");s=new Date(parseInt(t[0]))}return((t,e=new Date,i=[\"en\"])=>{let s,n=3600,a=86400,r=604800,o=t.getTime(),l=e.getTime(),h=new Intl.RelativeTimeFormat(i,{numeric:\"always\"}),d=Math.round((l-o)/1e3);if(d<0?(s=1,d=-d):s=-1,d<60)return h.format(d*s,\"seconds\");if(d<n)return h.format(Math.round(d*s/60),\"minutes\");if(d<a)return h.format(Math.round(d*s/n),\"hours\");if(d<r)return h.format(Math.round(d*s/a),\"days\");if(d<4233600)return h.format(Math.round(d*s/r),\"weeks\");{let i=12*(t.getFullYear()-e.getFullYear());return i-=e.getMonth(),i+=t.getMonth(),Math.abs(i)>12?i<0?h.format(Math.ceil(i/12),\"years\"):h.format(Math.floor(i/12),\"years\"):h.format(i,\"months\")}})(s,new Date,i)}}});for(let e=t.length-1;e>=0;e-=1){let i=t[e],n=await(await fetch(i)).text(),a=new Dn(n),r=s.addResource(a,{allowOverrides:!0});r.length&&console.info(\"Found localization syntax errors\",r)}this.#p=s,this.#C();for(let t of this.#h)t();this.#h=null,e()}))}#C(){if(this.#p?.locales[0]?.startsWith(\"en\")){let t=getComputedStyle(document.documentElement);this.#c=t.getPropertyValue(\"--autocapitalize\").trim()||\"none\"}else this.#c=\"none\"}async#v(){await this.whenThemeReady;let t=this.#a||this.presetAccentColors.blue,e=this.presetAccentColors[t]?this.presetAccentColors[t]:t,i=\"\",s=[...this.#d.cssRules].filter((t=>1===t.type&&\":root\"===t.selectorText));for(let t of s){let e=t.style.getPropertyValue(\"--theme-id\");\"\"!==e&&(i=e)}if(s.at(-1).style.setProperty(\"--accent-color\",i.includes(\"material\")?\"var(--material-primary-color)\":e),i.includes(\"material\")){let n=((t,e=!1,i=!1)=>{let s=mi(At(t),\"hct\"),n={};for(let t of Bs){let[a,r]=e?t[2]:t[1],[o,l,h]=s.coords;i&&(a=\"greyscale\"),\"primary\"===a?(l=Math.max(48,l),h=r):\"secondary\"===a?(l=16,h=r):\"tertiary\"===a?(o+=60,l=24,h=r):\"neutral\"===a?(l=4,h=r):\"neutralVariant\"===a?(l=8,h=r):\"error\"===a?(o=25,l=84,h=r):\"greyscale\"===a&&(o=0,l=0,h=r);let d=mi({space:\"hct\",coords:[o,l,h]},\"oklch\");n[`--material-${t[0]}-color`]=bi(d,\"oklch\")}return n})(e,i.includes(\"-dark\"),\"gray\"===t);for(let[t,e]of Object.entries(n))s.at(-1).style.setProperty(t,e)}{let t=document.head.querySelector('meta[name=\"theme-color\"]'),e=getComputedStyle(document.documentElement).getPropertyValue(\"--titlebar-color\").trim()||\"auto\";\"auto\"===e?t&&t.remove():(null===t&&(t=document.createElement(\"meta\"),t.setAttribute(\"name\",\"theme-color\"),document.head.append(t)),t.setAttribute(\"content\",e))}}#m(){let t=document.head.querySelector(':scope > meta[name=\"xel-theme\"]'),e=document.head.querySelector(':scope > meta[name=\"xel-accent-color\"]'),i=document.head.querySelector(':scope > meta[name=\"xel-icons\"]'),s=document.head.querySelector(':scope > meta[name=\"xel-locales\"]');i||(i=document.head.querySelector(':scope > meta[name=\"xel-iconsets\"]'),i&&console.warn('<meta name=\"xel-iconsets\"> has been deprecated in in Xel 0.27.0. Please use <meta name=\"xel-icons\"> instead.'));let n=null,a=null,r=[],o=[];return t&&\"\"!==t.content&&(n=t.content),e&&\"\"!==e.content&&(a=Hs(e.content)?e.content:\"#000\"),i&&(r=i.content.split(\",\").map((t=>t.trim())).filter((t=>\"\"!==t))),s&&(o=s.content.split(\",\").map((t=>t.trim())).filter((t=>\"\"!==t))),{theme:n,accentColor:a,icons:r,locales:o}}#y(t){let e=[],i=-1;for(;;){let s=t.indexOf(\"@import\",i);if(!(s>-1))break;{let n=t.indexOf(\";\",s),a=0,r=t.indexOf(\".css\",s)+4,o=t.indexOf(\"'\",s),l=t.indexOf('\"',s);if(o>s&&o<n)a=o+1;else if(l>s&&l<n)a=l+1;else{let e=t.indexOf(\"url(\",s);e>s&&e<n&&(a=e+4)}let h=t.substring(a,r);e.push([h,t.substring(s,n+1)]),i=r}}return e}get iconsets(){return console.warn('\"Xel.iconsets\" has been deprecated in Xel 0.27.0. Please use \"Xel.icons\" instead.'),this.icons}set iconsets(t){console.warn('\"Xel.iconsets\" has been deprecated in Xel 0.27.0. Please use \"Xel.icons\" instead.'),this.icons=t}get whenIconsetsReady(){return console.warn('\"Xel.whenIconsetsReady\" has been deprecated in Xel 0.27.0. Please use \"Xel.whenIconsReady\" instead.'),this.whenIconsReady}};let Xn=(t,e=null)=>{let i=t.split(\":\"),s=null;if(1===i.length){let[t]=i;s=null===e?document.createElement(t):document.createElement(t,e)}else if(2===i.length){let[t,e]=i;\"svg\"===t&&(s=document.createElementNS(\"http://www.w3.org/2000/svg\",e))}return s},_n=(t,e)=>{let i=e.getBoundingClientRect();return t.clientX>=i.x&&t.clientX<=i.x+i.width&&t.clientY>=i.y&&t.clientY<=i.y+i.height},Zn=(t,e,i=!0)=>{let s=t.closest(e);return i&&!s&&t.getRootNode().host?Zn(t.getRootNode().host,e):s},Un=t=>{let e=t=>t&&t!==document.body?(t=>{let e=getComputedStyle(t,null);return/(auto|scroll)/.test(e.getPropertyValue(\"overflow\")+e.getPropertyValue(\"overflow-y\")+e.getPropertyValue(\"overflow-x\"))})(t)&&\"x-texteditor\"!==t.localName?t:e(t.parentElement||t.parentNode.host):document.body;return e(t.parentElement||t.parentNode.host)},Yn=t=>{let e=null,i=[],s=t;for(;s&&\"\"!==s.href.baseVal;){null===e&&(e=t.ownerSVGElement);let n=e.querySelector(s.href.baseVal);if(!n||\"linearGradient\"!==n.localName&&\"radialGradient\"!==n.localName||n===t||!1!==i.includes(n))break;i.push(n),s=n}return i},Vn=HTMLDialogElement.prototype.showModal,qn=HTMLDialogElement.prototype.close,Wn=[],Kn={get open(){return this.hasAttribute(\"open\")},showModal(){return new Promise((async t=>{if(!0!==this.open&&!1!==this.isConnected){this.R&&await this.R.finished,this.P&&await this.P.finished,Vn.apply(this,arguments);{let t,e={html:document.documentElement.style.overflow,body:document.body.style.overflow};document.documentElement.style.overflow=\"hidden\",document.body.style.overflow=\"hidden\",Wn.push(this),this.addEventListener(\"close\",t=i=>{i.target===this&&(this.removeEventListener(\"close\",t),Wn=Wn.filter((t=>t!==this)),0===Wn.length&&(document.documentElement.style.overflow=e.html,document.body.style.overflow=e.body))})}{let t=this.querySelector(\"[autofocus]\");t?t.focus():this.focus()}if(!1===this.hasAttribute(\"hidden\")){let t=getComputedStyle(this),e=1e3*parseFloat(t.getPropertyValue(\"transition-duration\")||\"0s\"),i=t.getPropertyValue(\"transition-timing-function\"),s=t.getPropertyValue(\"--transition-type\")||\"stretch\";this.R=this.animate({transform:\"grow\"===s?[\"scale(0.9)\",\"scale(1)\"]:[\"scaleY(0)\",\"scaleY(1)\"],opacity:[\"0\",\"1\"]},{duration:e,easing:i})}{let t,e,i;this.addEventListener(\"keydown\",t=t=>{\"Escape\"===t.code&&t.preventDefault()}),document.addEventListener(\"keydown\",e=t=>{\"Escape\"===t.code&&t.target===document.body&&t.preventDefault()}),this.addEventListener(\"close\",i=s=>{s.target===this&&(this.removeEventListener(\"close\",i),this.removeEventListener(\"keydown\",t),document.removeEventListener(\"keydown\",e))})}{let t,e,i,s=!0;this.addEventListener(\"pointerdown\",t=t=>{s=!1===_n(t,this)}),this.addEventListener(\"click\",e=t=>{t.target===this&&!0===t.isTrusted&&!1===t.defaultPrevented&&!0===s&&!1===_n(t,this)&&!0===this.hasAttribute(\"open\")&&(this.close(),this.dispatchEvent(new CustomEvent(\"userclose\")))}),this.addEventListener(\"close\",i=s=>{s.target===this&&(this.removeEventListener(\"pointerdown\",t),this.removeEventListener(\"click\",e),this.removeEventListener(\"close\",i))})}this.R&&(await this.R.finished,this.R=null),t()}else t()}))},close(){return new Promise((async t=>{if(this.R&&await this.R.finished,this.P&&await this.P.finished,!1===this.hasAttribute(\"hidden\")){let t=getComputedStyle(this),e=1e3*parseFloat(t.getPropertyValue(\"transition-duration\")||\"0s\"),i=t.getPropertyValue(\"transition-timing-function\")||\"ease\",s=t.getPropertyValue(\"--transition-type\")||\"stretch\";this.P=this.animate({transform:\"grow\"===s?[\"scale(1)\",\"scale(0.9)\"]:[\"scaleY(1)\",\"scaleY(0)\"],opacity:[\"1\",\"0\"]},{duration:e,easing:i})}this.P&&(await this.P.finished,this.P=null),this.hasAttribute(\"open\")&&qn.apply(this,arguments),t()}))}};for(let[t,e]of Object.entries(Object.getOwnPropertyDescriptors(Kn)))Object.defineProperty(HTMLDialogElement.prototype,t,e);class Jn extends HTMLElement{static#z=Ns`<template><div id=\"main\"><div id=\"arrow\" part=\"arrow\" tabindex=\"1\"><svg id=\"arrow-svg\" viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\"><path id=\"arrow-path\"></path></svg></div><slot></slot></div></template>`;static#E=Fs`:host{display:block;width:100%;margin:10px 0;box-sizing:border-box}:host([disabled]){pointer-events:none;opacity:0.5}:host([animating]){overflow:hidden}#main{position:relative;width:100%;height:100%}#arrow{position:absolute;top:0;display:flex;align-items:center;justify-content:flex-start;pointer-events:none;transform:translateY(-50%);--path-data: M 26 20 L 26 80 L 74 50 Z;}:host([animating]) #arrow{outline:none!important}#arrow-svg{display:flex;width:16px;height:16px;transform:rotate(0deg);color:currentColor}#arrow-svg:focus{background:transparent;outline:none}:host([expanded]) #arrow-svg{transform:rotate(90deg)}#arrow-path{fill:currentColor}\n`;get expanded(){return this.hasAttribute(\"expanded\")}set expanded(t){t?this.setAttribute(\"expanded\",\"\"):this.removeAttribute(\"expanded\")}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}get size(){let t=this.getAttribute(\"size\");return\"small\"===t||\"large\"===t?t:null}set size(t){\"small\"===t||\"large\"===t?this.setAttribute(\"size\",t):this.removeAttribute(\"size\")}#$=null;#S=null;#M=null;#L=null;#A=[];#R=null;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.adoptedStyleSheets=[Jn.#E],this.#$.append(document.importNode(Jn.#z.content,!0));for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t;this.addEventListener(\"click\",(t=>this.#P(t))),this[\"#arrow\"].addEventListener(\"keydown\",(t=>this.#T(t)))}async connectedCallback(){await Gn.whenThemeReady,this.#M=new ResizeObserver((()=>this.#D())),this.#L=new MutationObserver((t=>this.#B(t))),this.#L.observe(this,{childList:!0}),Gn.addEventListener(\"themechange\",this.#R=()=>this.#I()),this.#I(),this.#O(),this.#B()}disconnectedCallback(){Gn.removeEventListener(\"themechange\",this.#R),this.#S&&(this.#M.unobserve(this.#S),this.#S=null),this.#M.disconnect(),this.#L.disconnect()}expand(t=!0){return new Promise((async e=>{if(!1===this.expanded)if(!1===t)this.#H(),this.removeAttribute(\"animating\"),this.expanded=!0;else if(!0===t){let t=this.getBoundingClientRect();this.#H(),this.removeAttribute(\"animating\"),this.expanded=!0;let e=this.getBoundingClientRect();this.setAttribute(\"animating\",\"\");let i=[this.animate({height:[`${t.height}px`,`${e.height}px`]},{duration:200,easing:\"cubic-bezier(0.4, 0, 0.2, 1)\"}),this[\"#arrow-svg\"].animate({transform:[\"rotate(0deg)\",\"rotate(90deg)\"]},{duration:200,easing:\"cubic-bezier(0.4, 0, 0.2, 1)\"})];this.#A=i,await Promise.all(i.map((t=>t.finished))),this.#A===i&&(this.#A=[],this.removeAttribute(\"animating\"))}e()}))}collapse(t=!0){return new Promise((async e=>{if(!0===this.expanded)if(!1===t)this.#H(),this.removeAttribute(\"animating\"),this.expanded=!1;else if(!0===t){let t=this.getBoundingClientRect();this.#H(),this.removeAttribute(\"animating\"),this.expanded=!1;let e=this.getBoundingClientRect();this.setAttribute(\"animating\",\"\");let i=[this.animate({height:[`${t.height}px`,`${e.height}px`]},{duration:200,easing:\"cubic-bezier(0.4, 0, 0.2, 1)\"}),this[\"#arrow-svg\"].animate({transform:[\"rotate(90deg)\",\"rotate(0deg)\"]},{duration:200,easing:\"cubic-bezier(0.4, 0, 0.2, 1)\"})];this.#A=i,await Promise.all(i.map((t=>t.finished))),this.#A===i&&(this.#A=[],this.removeAttribute(\"animating\"))}e()}))}#H(){this.#A.length>0&&(this.#A.map((t=>t.finish())),this.#A=[])}#O(){let t=this.querySelector(\":scope > header\");t?this[\"#arrow\"].style.top=t.getBoundingClientRect().height/2+\"px\":this[\"#arrow\"].style.height=null}#I(){let t=getComputedStyle(this[\"#arrow\"]).getPropertyValue(\"--path-data\");this[\"#arrow-path\"].setAttribute(\"d\",t)}#B(){let t=this.querySelector(\":scope > header\");t!==this.#S&&(null===t?(this.#M.unobserve(this.#S),this.#S=null):(this.#S=t,this.#M.observe(this.#S)))}#D(){this.#O()}#T(t){\"Enter\"!==t.code&&\"NumpadEnter\"!==t.code||this.querySelector(\"header\").click()}#P(t){let e=this.querySelector(\"header\"),i=t.target.closest(\"[tabindex]\");e.contains(t.target)&&!1===this.contains(i)&&(this.expanded?(this.collapse(),this.dispatchEvent(new CustomEvent(\"collapse\"))):(this.expand(),this.dispatchEvent(new CustomEvent(\"expand\"))))}}customElements.define(\"x-accordion\",Jn);class Qn extends HTMLElement{static#z=Ns`<template><slot></slot></template>`;static#E=Fs`:host{display:block flex;width:40px;height:40px;box-sizing:border-box;align-items:center;justify-content:center;overflow:hidden;border-width:1px;border-style:solid;user-select:none;-webkit-user-select:none}:host([hidden]){display:none}\n`;get size(){let t=this.getAttribute(\"size\");return\"small\"===t||\"large\"===t?t:null}set size(t){\"small\"===t||\"large\"===t?this.setAttribute(\"size\",t):this.removeAttribute(\"size\")}#$;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.adoptedStyleSheets=[Qn.#E],this.#$.append(document.importNode(Qn.#z.content,!0))}}customElements.define(\"x-avatar\",Qn);class ta extends HTMLElement{static#E=Fs`:host{display:block;position:fixed;top:0;left:0;width:100vw;height:100vh;z-index:1000;touch-action:none;cursor:default;background:rgba(0, 0, 0, 0.5)}:host([hidden]){display:none}\n`;get ownerElement(){return this.#j?this.#j:document.body.firstElementChild}set ownerElement(t){this.#j=t}#$=null;#j=null;#N=null;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.adoptedStyleSheets=[ta.#E],this.addEventListener(\"pointerdown\",(t=>t.preventDefault()))}connectedCallback(){this.addEventListener(\"wheel\",this.#N=t=>t.preventDefault())}disconnectedCallback(){this.removeEventListener(\"wheel\",this.#N)}show(t=!0){this.title=\"\",this.style.top=\"0px\",this.style.left=\"0px\",this.ownerElement.before(this),this.hidden=!1;let e=this.getBoundingClientRect(),i=0,s=0;0===e.top&&0===e.left||(i=-e.top,s=-e.left);{let t=parseFloat(getComputedStyle(this.ownerElement).zIndex);this.style.zIndex=t-1}if(this.style.top=i+\"px\",this.style.left=s+\"px\",t){return this.animate({opacity:[\"0\",\"1\"]},{duration:100,easing:\"ease-out\"}).finished}}hide(t=!0){if(t){let t=this.animate({opacity:[\"1\",\"0\"]},{duration:100,easing:\"ease-in\"});return t.finished.then((()=>{this.remove()})),t.finished}this.remove()}}customElements.define(\"x-backdrop\",ta);class ea extends HTMLElement{static#z=Ns`<template><slot></slot></template>`;static#E=Fs`:host{display:flex;box-sizing:border-box;align-items:center;justify-content:flex-start}:host([vertical]){flex-flow:column;align-items:flex-start;justify-content:center}:host([hidden]){display:none}\n`;get vertical(){return this.hasAttribute(\"vertical\")}set vertical(t){t?this.setAttribute(\"vertical\",\"\"):this.removeAttribute(\"vertical\")}#$=null;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.adoptedStyleSheets=[ea.#E],this.#$.append(document.importNode(ea.#z.content,!0))}}customElements.define(\"x-box\",ea);class ia extends HTMLElement{static observedAttributes=[\"disabled\",\"skin\"];static#z=Ns`<template><slot></slot></template>`;static#E=Fs`:host{display:flex;align-items:center;justify-content:center;width:fit-content;height:fit-content;min-height:32px;padding:2px 14px;box-sizing:border-box;opacity:1;position:relative}:host(:focus){outline:none}:host(:focus:not(:active)){z-index:1}:host([mixed]){opacity:0.75}:host([disabled]){pointer-events:none;opacity:0.5}:host([hidden]){display:none}\n`;get value(){return this.hasAttribute(\"value\")?this.getAttribute(\"value\"):null}set value(t){null===t?this.removeAttribute(\"value\"):this.setAttribute(\"value\",t)}get toggled(){return this.hasAttribute(\"toggled\")}set toggled(t){t?this.setAttribute(\"toggled\",\"\"):this.removeAttribute(\"toggled\")}get togglable(){return this.hasAttribute(\"togglable\")}set togglable(t){t?this.setAttribute(\"togglable\",\"\"):this.removeAttribute(\"togglable\")}get mixed(){return this.hasAttribute(\"mixed\")}set mixed(t){t?this.setAttribute(\"mixed\",\"\"):this.removeAttribute(\"mixed\")}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}get condensed(){return this.hasAttribute(\"condensed\")}set condensed(t){t?this.setAttribute(\"condensed\",\"\"):this.removeAttribute(\"condensed\")}get skin(){return this.hasAttribute(\"skin\")?this.getAttribute(\"skin\"):\"normal\"}set skin(t){this.setAttribute(\"skin\",t)}get size(){let t=this.getAttribute(\"size\");return\"small\"===t||\"large\"===t?t:\"normal\"}set size(t){\"small\"===t||\"large\"===t?this.setAttribute(\"size\",t):this.removeAttribute(\"size\")}get expanded(){return this.hasAttribute(\"expanded\")}get expandable(){return this.#F()||this.#G()}get ownerButtons(){if(this.parentElement){if(\"x-buttons\"===this.parentElement?.localName)return this.parentElement;if([\"a\",\"x-box\"].includes(this.parentElement.localName)&&this.parentElement.parentElement&&\"x-buttons\"===this.parentElement.parentElement.localName)return this.parentElement.parentElement}return null}#$=null;#X=!1;#_=!1;#Z=null;#U=0;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.adoptedStyleSheets=[ia.#E],this.#$.append(document.importNode(ia.#z.content,!0));for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t;this.addEventListener(\"pointerdown\",(t=>this.#Y(t))),this.addEventListener(\"pointerenter\",(()=>this.#V())),this.addEventListener(\"pointerleave\",(()=>this.#q())),this.addEventListener(\"click\",(t=>this.#P(t))),this.addEventListener(\"keydown\",(t=>this.#W(t))),this.addEventListener(\"close\",(t=>this.#K(t))),(async()=>{await customElements.whenDefined(\"x-backdrop\"),this[\"#backdrop\"]=Xn(\"x-backdrop\"),this[\"#backdrop\"].style.background=\"rgba(0, 0, 0, 0)\"})()}connectedCallback(){this.parentElement&&\"a\"===this.parentElement.localName&&-1!==this.parentElement.tabIndex&&(this.parentElement.tabIndex=-1),this.#J(),this.#Q()}disconnectedCallback(){this.#_=!1}attributeChangedCallback(t,e,i){e!==i&&!1!==this.isConnected&&(\"disabled\"===t?this.#J():\"skin\"===t&&this.#Q())}expand(){return new Promise((async t=>{this.#F()?await this.#tt():this.#G()&&await this.#et(),t()}))}collapse(t=null){return new Promise((async e=>{this.#it()?await this.#st(t):this.#nt()&&await this.#at(t),e()}))}#tt(){return new Promise((async t=>{if(this.#F()){let t=this.querySelector(\":scope > x-menu\"),e=this.querySelector(\":scope > x-tooltip\");e&&e.close(!1),this.#X=this.matches(\":focus\"),this.setAttribute(\"expanded\",\"\"),this[\"#backdrop\"].ownerElement=t,this[\"#backdrop\"].show(!1),await t.openNextToElement(this,\"vertical\",3),t.focus()}t()}))}#st(t=null){return new Promise((async e=>{if(this.#it()){let e=this.querySelector(\":scope > x-menu\");if(e.setAttribute(\"closing\",\"\"),await t,e.close(),this[\"#backdrop\"].hide(!1),this.removeAttribute(\"expanded\"),\"chromium\"===Hn()&&this.replaceWith(this),this.#X)this.focus();else{let t=Zn(this.parentNode,\"[tabindex]\");t&&t.focus()}e.removeAttribute(\"closing\")}e()}))}#F(){let t=!1;if(!1===this.disabled){let e=this.querySelector(\":scope > x-menu\");if(e&&!1===e.hasAttribute(\"opened\")&&!1===e.hasAttribute(\"closing\")){null!==e.querySelector(\"x-menuitem\")&&(t=!0)}}return t}#it(){let t=!1;if(!1===this.disabled){let e=this.querySelector(\":scope > x-menu\");e&&e.opened&&(t=!0)}return t}#et(){return new Promise((async t=>{if(this.#G()){let t=this.querySelector(\":scope > x-popover\"),e=this.querySelector(\":scope > x-tooltip\");e&&e.close(!1),this.#X=this.matches(\":focus\"),this.setAttribute(\"expanded\",\"\"),await t.open(this)}t()}))}#at(t=null){return new Promise((async e=>{if(this.#nt()){let e=this.querySelector(\":scope > x-popover\");if(e.setAttribute(\"closing\",\"\"),await t,await e.close(),this.removeAttribute(\"expanded\"),e.modal&&\"chromium\"===Hn()&&this.replaceWith(this),this.#X)this.focus();else{let t=Zn(this.parentNode,\"[tabindex]\");t&&t.focus()}e.removeAttribute(\"closing\")}e()}))}#G(){let t=!1;if(!1===this.disabled){let e=this.querySelector(\":scope > x-popover\");e&&!1===e.hasAttribute(\"opened\")&&(t=!0)}return t}#nt(){let t=!1;if(!1===this.disabled){let e=this.querySelector(\":scope > x-popover\");e&&e.opened&&(t=!0)}return t}#rt(){return new Promise((t=>{if(this.#ot()){this.querySelector(\":scope > dialog\").showModal()}t()}))}#ot(){let t=!1;if(!1===this.disabled){let e=this.querySelector(\":scope > dialog\");e&&!1===e.hasAttribute(\"open\")&&!1===e.hasAttribute(\"closing\")&&(t=!0)}return t}#lt(){return new Promise((t=>{if(this.#ht()){this.querySelector(\":scope > x-drawer\").open()}t()}))}#ht(){let t=!1;if(!1===this.disabled){let e=this.querySelector(\":scope > x-drawer\");e&&!1===e.matches(\":popover-open\")&&!1===e.hasAttribute(\"closing\")&&(t=!0)}return t}#dt(){return new Promise((t=>{if(this.#ct()){this.querySelector(\":scope > x-notification\").opened=!0}t()}))}#ct(){let t=!1;if(!1===this.disabled){let e=this.querySelector(\":scope > x-notification\");!e||e.hasAttribute(\"opened\")||e.hasAttribute(\"closing\")||(t=!0)}return t}#J(){this.setAttribute(\"role\",\"button\"),this.setAttribute(\"aria-disabled\",this.disabled),this.disabled?(this.#U=this.tabIndex>0?this.tabIndex:0,this.tabIndex=-1):(this.tabIndex<0&&(this.tabIndex=this.#U>0?this.#U:0),this.#U=0)}#Q(){!1===this.hasAttribute(\"skin\")&&this.setAttribute(\"skin\",\"normal\")}#Y(t){let e=this.querySelector(\":scope > x-menu[opened]\"),i=this.querySelector(\":scope > x-popover[opened]\"),s=this.querySelector(\":scope > dialog[open]\"),n=this.querySelector(\":scope > x-drawer[open]\"),a=this.querySelector(\":scope > x-notification[opened]\");if(this.#Z=t,t.target===this[\"#backdrop\"])this.#ut(t);else{if(e&&e.contains(t.target))return;if(i&&i.contains(t.target))return;if(s&&s.contains(t.target))return;if(n&&n.contains(t.target))return;if(a&&a.contains(t.target))return;this.#pt(t)}}#K(t){t.target.parentElement===this&&[\"x-menu\",\"x-popover\"].includes(t.target.localName)&&this.#Z&&!1===_n(this.#Z,this)&&(this.#_=!1)}#V(){let t=this.querySelector(\":scope > x-tooltip\");if(t&&!1===t.disabled&&!1===this.expanded&&!1===this.#_){if(this.parentElement&&\"x-buttons\"===this.parentElement.localName)for(let t of this.parentElement.children)if(t!==this&&\"x-button\"===t.localName){let e=t.querySelector(\":scope > x-tooltip\");e&&e.close(!1)}t.open(this)}}#q(){let t=this.querySelector(\":scope > x-tooltip\");t&&t.close(),this.#_=!1}#P(t){let e=this.querySelector(\":scope > x-menu[opened]\"),i=this.querySelector(\":scope > x-popover[opened]\"),s=this.querySelector(\":scope > dialog[open]\"),n=this.querySelector(\":scope > x-drawer[open]\"),a=this.querySelector(\":scope > x-notification[opened]\");if(t.target!==this[\"#backdrop\"])if(e&&e.contains(t.target))!1===e.hasAttribute(\"closing\")&&t.target.closest(\"x-menuitem\")&&this.#mt(t);else{if(i&&i.contains(t.target))return;if(s&&s.contains(t.target))return;if(n&&n.contains(t.target))return;if(a&&a.contains(t.target))return;this.#_=!0,this.#bt(t)}}#ut(t){this.collapse()}async#pt(t){if(t.buttons>1)t.preventDefault();else if(this.querySelector(\":scope > dialog[open], :scope > x-drawer[open]\"))t.preventDefault();else if(!1!==this.contains(t.target)){if(this.setPointerCapture(t.pointerId),t.preventDefault(),!1===this.matches(\":focus\")){let t,e=Zn(this.parentNode,\"*[tabindex]:not(a)\");this.addEventListener(\"pointerup\",t=()=>{this.removeEventListener(\"pointerup\",t),this.removeEventListener(\"pointercancel\",t),e?e.focus():(this.focus(),this.blur())}),this.addEventListener(\"pointercancel\",t)}if(!1===this.#F()&&!1===this.#G()&&!1===this.#nt()){let t,e=Date.now(),i=!0,s=parseInt(getComputedStyle(this).getPropertyValue(\"--min-pressed-time\")||\"150ms\");this.addEventListener(\"pointerup\",t=async()=>{this.removeEventListener(\"pointerup\",t),this.removeEventListener(\"pointercancel\",t),i=!1;let n=Date.now()-e;n<s&&await jn(s-n),this.removeAttribute(\"pressed\")}),this.addEventListener(\"pointercancel\",t),(async()=>{if(this.ownerButtons)if(0===this.ownerButtons.tracking||2===this.ownerButtons.tracking)await jn(10);else if(1!==this.ownerButtons.tracking||!1!==this.toggled&&!this.mixed){if(3===this.ownerButtons.tracking){let t=[...this.ownerButtons.querySelectorAll(\":scope > x-button, :scope > x-box > x-button\")].filter((t=>t.toggled));(!1===this.toggled||t.length>1)&&await jn(10)}}else await jn(10);else this.togglable&&await jn(10);i&&this.setAttribute(\"pressed\",\"\")})()}this.#F()?\"touch\"!==t.pointerType&&this.#tt():this.#G()?\"touch\"!==t.pointerType&&this.#et():this.#nt()&&this.#at()}}async#bt(t){let e=this.querySelector(\":scope > x-menu, :scope > x-popover\");if(e){if(e.hasAttribute(\"closing\"))return;e.focus()}!1===this.#nt()&&(this.#ot()?this.#rt():this.#ht()?this.#lt():this.#ct()&&this.#dt()),this.#Z&&\"touch\"===this.#Z.pointerType&&(this.#F()?this.#tt():this.#G()&&this.#et()),this.togglable&&!1===t.defaultPrevented&&(this.removeAttribute(\"pressed\"),this.toggled=!this.toggled,this.dispatchEvent(new CustomEvent(\"toggle\")))}#mt(t){let e=t.target.closest(\"x-menuitem\");this.querySelector(\":scope > x-menu\").hasAttribute(\"closing\")||this.collapse(e.whenTriggerEnd)}#W(t){!1===t.defaultPrevented&&(\"Enter\"===t.code||\"NumpadEnter\"===t.code||\"Space\"===t.code?this.#F()?(t.preventDefault(),this.#tt().then((()=>this.querySelector(\":scope > x-menu\").focusFirstMenuItem()))):this.#G()?(t.preventDefault(),this.#et()):this.#ot()?(t.preventDefault(),this.#rt()):this.#ht()?(t.preventDefault(),this.#lt()):this.#ct()?(t.preventDefault(),this.#dt()):this.matches(\":focus\")&&(this.#nt()?this.#at():this.#it()?this.#st():(t.preventDefault(),this.click())):\"ArrowDown\"===t.code?this.#F()?(this.querySelector(\":scope > x-menu\"),t.preventDefault(),this.#tt().then((()=>this.querySelector(\":scope > x-menu\").focusFirstMenuItem()))):this.#G()?(t.preventDefault(),this.#et()):(t.preventDefault(),this.click()):\"ArrowUp\"===t.code?this.#F()?(t.preventDefault(),this.#tt().then((()=>this.querySelector(\":scope > x-menu\").focusLastMenuItem()))):this.#G()?(t.preventDefault(),this.#et()):(t.preventDefault(),this.click()):\"Escape\"===t.code&&(this.#it()||this.#nt())&&(t.preventDefault(),this.collapse()))}}customElements.define(\"x-button\",ia);let{isArray:sa}=Array;class na extends HTMLElement{static#z=Ns`<template><slot></slot></template>`;static#E=Fs`:host{display:flex;flex-flow:row;align-items:center;justify-content:flex-start;box-sizing:border-box;width:fit-content}:host([hidden]){display:none}\n`;get tracking(){return this.hasAttribute(\"tracking\")?parseInt(this.getAttribute(\"tracking\")):-1}set tracking(t){this.setAttribute(\"tracking\",t)}get vertical(){return this.hasAttribute(\"vertical\")}set vertical(t){!0===t?this.setAttribute(\"vertical\",\"\"):this.removeAttribute(\"vertical\")}get value(){if(2===this.tracking||3===this.tracking){return this.#gt().filter((t=>t.toggled)).map((t=>t.value)).filter((t=>null!=t))}if(1===this.tracking||0===this.tracking){let t=this.#gt().find((t=>t.toggled));return t&&void 0!==t.value?t.value:null}if(-1===this.tracking)return null}set value(t){if(2===this.tracking||3===this.tracking){let e=this.#gt();if(sa(t))for(let i of e)i.toggled=t.includes(i.value);else for(let i of e)i.toggled=i.value===t}else if(1===this.tracking||0===this.tracking){let e=this.#gt(),i=e.find((e=>e.value===t));for(let t of e)t.toggled=t===i}}#$=null;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.adoptedStyleSheets=[na.#E],this.#$.append(document.importNode(na.#z.content,!0)),this.addEventListener(\"click\",(t=>this.#P(t)),!0),this.addEventListener(\"keydown\",(t=>this.#W(t)))}connectedCallback(){for(let t of this.children)if(\"x-button\"===t.localName){\"none\"!==getComputedStyle(t).boxShadow?this.setAttribute(\"hasboxshadow\",\"\"):this.removeAttribute(\"hasboxshadow\");break}}#gt(){return[...this.querySelectorAll(\":scope > x-button, :scope > x-box > x-button\")]}#P(t){if(t.buttons>1)return;let e=t.target.closest(\"x-button\");if(e&&!1===e.disabled&&!1===e.expandable){let t=this.#gt().filter((t=>t!==e));if(0===this.tracking){e.mixed||(e.toggled=!e.toggled),e.mixed=!1;for(let e of t)e.toggled=!1,e.mixed=!1;this.dispatchEvent(new CustomEvent(\"toggle\",{bubbles:!0,detail:e}))}else if(1===this.tracking){if(!1===e.toggled||!0===e.mixed){e.toggled=!0,e.mixed=!1;for(let e of t)e.toggled=!1,e.mixed=!1;this.dispatchEvent(new CustomEvent(\"toggle\",{bubbles:!0,detail:e}))}}else if(2===this.tracking)e.mixed?e.mixed=!1:e.toggled=!e.toggled,this.dispatchEvent(new CustomEvent(\"toggle\",{bubbles:!0,detail:e}));else if(3===this.tracking){let i=t.filter((t=>!0===t.toggled));(!1===e.toggled||i.length>0)&&(e.mixed?e.mixed=!1:e.toggled=!e.toggled,this.dispatchEvent(new CustomEvent(\"toggle\",{bubbles:!0,detail:e})))}}}#W(t){if(\"ArrowRight\"===t.code){let t=[...this.children].find((t=>t.matches(\":focus\")));t&&(t.nextElementSibling?t.nextElementSibling.focus():t!==t.parentElement.firstElementChild&&t.parentElement.firstElementChild.focus())}else if(\"ArrowLeft\"===t.code){let t=[...this.children].find((t=>t.matches(\":focus\")));t&&(t.previousElementSibling?t.previousElementSibling.focus():t!==t.parentElement.lastElementChild&&t.parentElement.lastElementChild.focus())}}}customElements.define(\"x-buttons\",na);class aa extends HTMLElement{static#z=Ns`<template><slot></slot></template>`;static#E=Fs`:host{display:block;width:100%;min-width:20px;min-height:48px;box-sizing:border-box;margin:30px 0;padding:16px 20px}:host([hidden]){display:none}slot{border-radius:inherit}\n`;#$=null;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.adoptedStyleSheets=[aa.#E],this.#$.append(document.importNode(aa.#z.content,!0))}}customElements.define(\"x-card\",aa);class ra extends HTMLElement{static observedAttributes=[\"toggled\",\"mixed\",\"disabled\"];static#z=Ns`<template><div id=\"main\"><div id=\"indicator\" part=\"indicator\"><svg id=\"checkmark\" viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\"><path id=\"checkmark-path\"></path></svg></div><div id=\"description\"><slot></slot></div></div></template>`;static#E=Fs`:host{display:block;width:fit-content}:host([disabled]){opacity:0.4;pointer-events:none}:host([hidden]){display:none}:host(:focus){outline:none}#main{display:flex;align-items:center}#indicator{position:relative;width:19px;height:19px;box-sizing:border-box;border:2px solid currentColor;overflow:hidden;--path-data: M 95 23 L 86 13 L 37 66 L 13.6 41 L 4.5 51 L 37 85 L 95 23 Z;}:host([mixed]) #indicator{--path-data: M 87 42.6 L 13 42.6 L 13 57.4 L 87 57.4 L 87 42.6 Z;}#checkmark{position:absolute;top:0;left:0;width:100%;height:100%;opacity:0;overflow:visible;transition-property:opacity;transition-timing-function:inherit;transition-duration:inherit}:host([mixed]) #checkmark{opacity:1}:host([toggled]) #checkmark{opacity:1}#checkmark-path{fill:currentColor}#description{flex:1}\n`;get value(){return this.hasAttribute(\"value\")?this.getAttribute(\"value\"):null}set value(t){null===t?this.removeAttribute(\"value\"):this.setAttribute(\"value\",t)}get toggled(){return this.hasAttribute(\"toggled\")}set toggled(t){t?this.setAttribute(\"toggled\",\"\"):this.removeAttribute(\"toggled\")}get mixed(){return this.hasAttribute(\"mixed\")}set mixed(t){t?this.setAttribute(\"mixed\",\"\"):this.removeAttribute(\"mixed\")}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}get size(){let t=this.getAttribute(\"size\");return\"small\"===t||\"large\"===t?t:null}set size(t){\"small\"===t||\"large\"===t?this.setAttribute(\"size\",t):this.removeAttribute(\"size\")}#$=null;#U=0;#R=null;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.adoptedStyleSheets=[ra.#E],this.#$.append(document.importNode(ra.#z.content,!0));for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t;this.addEventListener(\"pointerdown\",(t=>this.#Y(t))),this.addEventListener(\"pointerenter\",(()=>this.#V())),this.addEventListener(\"pointerleave\",(()=>this.#q())),this.addEventListener(\"click\",(t=>this.#P(t))),this.addEventListener(\"keydown\",(t=>this.#W(t)))}async connectedCallback(){Gn.addEventListener(\"themechange\",this.#R=()=>this.#ft()),this.#J(),\"webkit\"===Hn()&&(await jn(10),!1===this.isConnected)||Gn.whenThemeReady.then((()=>{this.#ft()}))}disconnectedCallback(){Gn.removeEventListener(\"themechange\",this.#R)}attributeChangedCallback(t,e,i){e!==i&&(\"toggled\"===t?this.#xt():\"mixed\"===t?this.#wt():\"disabled\"===t&&this.#vt())}#ft(){let t=getComputedStyle(this[\"#indicator\"]).getPropertyValue(\"--path-data\");this[\"#checkmark-path\"].setAttribute(\"d\",t)}#J(){this.setAttribute(\"role\",\"checkbox\"),this.setAttribute(\"aria-checked\",this.mixed?\"mixed\":this.toggled),this.setAttribute(\"aria-disabled\",this.disabled),this.disabled?(this.#U=this.tabIndex>0?this.tabIndex:0,this.tabIndex=-1):(this.tabIndex<0&&(this.tabIndex=this.#U>0?this.#U:0),this.#U=0)}#xt(){this.#ft(),this.setAttribute(\"aria-toggled\",this.mixed?\"mixed\":this.toggled)}#wt(){this.#ft()}#vt(){this.#J()}#Y(t){if(t.buttons>1)t.preventDefault();else if(!1===this.matches(\":focus\")){t.preventDefault();let e=Zn(this.parentNode,\"[tabindex]\");e&&e.focus()}}#V(){let t=this.querySelector(\":scope > x-tooltip\");t&&!1===t.disabled&&t.open(this)}#q(){let t=this.querySelector(\":scope > x-tooltip\");t&&t.close()}async#P(t){this.mixed?this.mixed=!1:this.toggled=!this.toggled,this.dispatchEvent(new CustomEvent(\"toggle\",{bubbles:!0}))}#W(t){\"Enter\"!==t.code&&\"NumpadEnter\"!==t.code&&\"Space\"!==t.code||(t.preventDefault(),this.click())}}customElements.define(\"x-checkbox\",ra);class oa extends HTMLElement{static observedAttributes=[\"value\",\"space\",\"disabled\"];static#z=Ns`<template><div id=\"main\"><slot></slot><input id=\"input\" type=\"text\" spellcheck=\"false\" autocomplete=\"false\" part=\"input\"><div id=\"arrow-container\"><svg id=\"arrow\" width=\"10\" height=\"10\" viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\" part=\"arrow\"><path id=\"arrow-path\"></path></svg></div><slot></slot></div></template>`;static#E=Fs`:host{display:block;position:relative;max-width:160px;height:32px;padding:0 2px 0 8px;box-sizing:border-box;font-size:0.875rem}:host([size=\"small\"]){height:24px;padding:0 2px 0 6px;font-size:0.8rem}:host([size=\"large\"]){height:38px}:host(:focus){z-index:10}:host([mixed]){color:rgba(0, 0, 0, 0.7)}:host([disabled]){pointer-events:none;opacity:0.5}:host([hidden]){display:none}#main{display:flex;align-items:center;width:100%;height:100%}#input{width:100%;padding:0;box-sizing:border-box;color:inherit;background:none;border:none;outline:none;font-family:inherit;font-size:inherit;font-weight:inherit;text-align:inherit;text-overflow:ellipsis}::selection{color:var(--selection-color);background-color:var(--selection-background-color)}:host(:not(:focus)) ::selection{color:inherit;background:transparent}#arrow-container{display:flex;align-items:center;justify-content:center;height:100%;margin-left:4px;min-width:fit-content}#arrow{display:block;box-sizing:border-box;width:auto;min-width:fit-content;height:calc(100% - 4px);color:currentColor;cursor:default;--text-color: 50%;--path-data: M 25 41 L 50 16 L 75 41 L 83 34 L 50 1 L 17 34 Z M 17 66 L 50 100 L 83 66 L 75 59 L 50 84 L 25 59 Z;}:host([size=\"small\"]) #arrow{padding:2px 2px}:host([size=\"large\"]) #arrow{padding:0px 1px}#arrow path{fill:currentColor}\n`;get value(){return this.#kt}set value(t){t=Is(mi(At(t),this.space),this.#yt),this.#kt===t||this.matches(\":focus\")||(this.#kt=t,this.isConnected&&(this.#Ct(),this.#zt(),this.#Et&&this.reportValidity()))}get space(){return this.hasAttribute(\"space\")?this.getAttribute(\"space\"):\"srgb\"}set space(t){this.setAttribute(\"space\",t)}get alpha(){return this.hasAttribute(\"alpha\")}set alpha(t){t?this.setAttribute(\"alpha\",\"\"):this.removeAttribute(\"alpha\")}get required(){return this.hasAttribute(\"required\")}set required(t){t?this.setAttribute(\"required\",\"\"):this.removeAttribute(\"required\")}get mixed(){return this.hasAttribute(\"mixed\")}set mixed(t){t?this.setAttribute(\"mixed\",\"\"):this.removeAttribute(\"mixed\")}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}get size(){let t=this.getAttribute(\"size\");return\"small\"===t||\"large\"===t?t:null}set size(t){\"small\"===t||\"large\"===t?this.setAttribute(\"size\",t):this.removeAttribute(\"size\")}get empty(){return this.hasAttribute(\"empty\")}get error(){return this.hasAttribute(\"error\")}#kt=\"#000000\";#yt=\"hex\";#$=null;#U=0;#Et=null;#X=!1;#$t;#St;#Mt;#Lt;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\",delegatesFocus:!0}),this.#$.adoptedStyleSheets=[Gn.themeStyleSheet,oa.#E],this.#$.append(document.importNode(oa.#z.content,!0));for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t;this[\"#format-menu\"]=Xn(\"x-menu\"),this[\"#backdrop\"]=Xn(\"x-backdrop\"),this[\"#backdrop\"].style.opacity=\"0\",this[\"#backdrop\"].ownerElement=this,this[\"#backdrop\"].addEventListener(\"click\",(t=>this.#At(t))),this.addEventListener(\"click\",(t=>this.#P(t))),this.addEventListener(\"pointerenter\",(()=>this.#V())),this.addEventListener(\"pointerleave\",(()=>this.#q())),this.addEventListener(\"focusin\",(t=>this.#Rt(t))),this.addEventListener(\"focusout\",(t=>this.#Pt(t))),this.addEventListener(\"keydown\",(t=>this.#W(t))),this[\"#input\"].addEventListener(\"input\",(t=>this.#Tt(t))),this[\"#input\"].addEventListener(\"blur\",(t=>this.#Dt(t))),this[\"#input\"].addEventListener(\"search\",(t=>this.#Bt(t))),this[\"#input\"].addEventListener(\"pointerdown\",(t=>this.#It(t))),this[\"#input\"].addEventListener(\"contextmenu\",(()=>this.#Ot())),this[\"#arrow\"].addEventListener(\"pointerdown\",(t=>this.#Ht(t))),this[\"#arrow\"].addEventListener(\"click\",(t=>this.#jt(t))),this[\"#format-menu\"].addEventListener(\"toggle\",(t=>this.#Nt(t))),this[\"#format-menu\"].addEventListener(\"click\",(t=>this.#Ft(t)))}connectedCallback(){this.#yt=Gn.getConfig(`x-colorinput:${this.space}Format`,this.#Gt(this.space)),this.#Xt(),this.#Et&&this.reportValidity(),Gn.addEventListener(\"configchange\",this.#$t=t=>this.#_t(t)),Gn.addEventListener(\"themechange\",this.#St=()=>this.#I())}disconnectedCallback(){Gn.removeEventListener(\"configchange\",this.#$t),Gn.removeEventListener(\"themechange\",this.#St)}attributeChangedCallback(t,e,i){e!==i&&(\"value\"===t?this.#Zt():\"space\"===t?this.#Ut():\"disabled\"===t&&this.#vt())}selectAll(){this[\"#input\"].select()}clear(){this.value=\"\",this.#Et=null,this.#Yt()}reportValidity(){let t=this[\"#input\"].value;return this.required&&0===t.length?this.#Et={href:\"#required-field\"}:!1===Hs(t)&&!1===Hs(\"#\"+t)?this.#Et={href:\"#invalid-color\"}:this.#Et=null,this.#Yt(),null===this.#Et}async#Vt(){if(!1===this.#qt())return;let t=this[\"#format-menu\"];window.addEventListener(\"resize\",this.#Mt=()=>this.#Wt()),window.addEventListener(\"blur\",this.#Lt=()=>this.#Wt());{let e=At(this.value);e.spaceId!==this.space&&(e=mi(e,this.space),void 0===e.spaceId&&(e.spaceId=e.space.id)),[\"srgb\",\"hwb\",\"hsl\"].includes(e.spaceId)?t.innerHTML=`\\n          <x-menuitem value=\"hex\">\\n            <x-label>${Is(e,\"hex\")}</x-label>\\n          </x-menuitem>\\n\\n          <x-menuitem value=\"hex-alt\">\\n            <x-label>${Is(e,\"hex\").toUpperCase()}</x-label>\\n          </x-menuitem>\\n\\n          <hr/>\\n\\n          <x-menuitem value=\"color\">\\n            <x-label>${Is(e,\"color\")}</x-label>\\n          </x-menuitem>\\n\\n          <x-menuitem value=\"color-alt\">\\n            <x-label>${Is(e,\"color-alt\")}</x-label>\\n          </x-menuitem>\\n\\n          <hr/>\\n\\n          <x-menuitem value=\"rgb\">\\n            <x-label>${Is(e,\"rgb\")}</x-label>\\n          </x-menuitem>\\n\\n          <x-menuitem value=\"rgb-alt\">\\n            <x-label>${Is(e,\"rgb-alt\")}</x-label>\\n          </x-menuitem>\\n\\n          <hr/>\\n\\n          <x-menuitem value=\"hsl\">\\n            <x-label>${Is(e,\"hsl\")}</x-label>\\n          </x-menuitem>\\n\\n          <x-menuitem value=\"hsl-alt\">\\n            <x-label>${Is(e,\"hsl-alt\")}</x-label>\\n          </x-menuitem>\\n\\n          <hr/>\\n\\n          <x-menuitem value=\"hwb\">\\n            <x-label>${Is(e,\"hwb\")}</x-label>\\n          </x-menuitem>\\n\\n          <x-menuitem value=\"hwb-alt\">\\n            <x-label>${Is(e,\"hwb-alt\")}</x-label>\\n          </x-menuitem>\\n        `:[\"srgb-linear\",\"p3\",\"rec2020\",\"prophoto\",\"a98rgb\",\"xyz\",\"xyz-d65\",\"xyz-d50\"].includes(e.spaceId)?t.innerHTML=`\\n          <x-menuitem value=\"color\">\\n            <x-label>${Is(e,\"color\")}</x-label>\\n          </x-menuitem>\\n\\n          <x-menuitem value=\"color-alt\">\\n            <x-label>${Is(e,\"color-alt\")}</x-label>\\n          </x-menuitem>\\n        `:\"oklch\"===e.spaceId?t.innerHTML=`\\n          <x-menuitem value=\"oklch\">\\n            <x-label>${Is(e,\"oklch\")}</x-label>\\n          </x-menuitem>\\n\\n          <x-menuitem value=\"oklch-alt\">\\n            <x-label>${Is(e,\"oklch-alt\")}</x-label>\\n          </x-menuitem>\\n        `:\"oklab\"===e.spaceId?t.innerHTML=`\\n          <x-menuitem value=\"oklab\">\\n            <x-label>${Is(e,\"oklab\")}</x-label>\\n          </x-menuitem>\\n\\n          <x-menuitem value=\"oklab-alt\">\\n            <x-label>${Is(e,\"oklab-alt\")}</x-label>\\n          </x-menuitem>\\n        `:\"lch\"===e.spaceId?t.innerHTML=`\\n          <x-menuitem value=\"lch\">\\n            <x-label>${Is(e,\"lch\")}</x-label>\\n          </x-menuitem>\\n\\n          <x-menuitem value=\"lch-alt\">\\n            <x-label>${Is(e,\"lch-alt\")}</x-label>\\n          </x-menuitem>\\n        `:\"lab\"===e.spaceId&&(t.innerHTML=`\\n          <x-menuitem value=\"lab\">\\n            <x-label>${Is(e,\"lab\")}</x-label>\\n          </x-menuitem>\\n\\n          <x-menuitem value=\"lab-alt\">\\n            <x-label>${Is(e,\"lab-alt\")}</x-label>\\n          </x-menuitem>\\n        `)}{let e=t.querySelector(`[value=\"${this.#yt}\"]`);e&&(e.toggled=!0)}{let e=t.querySelector(\"x-menuitem[toggled]\"),i=t.querySelector(\"x-menuitem\").firstElementChild;this.append(t),this[\"#backdrop\"].show(!1),e?t.openOverElement(this[\"#input\"],e.querySelector(\"x-label\")):t.openOverElement(this[\"#input\"],i)}{let e=t.getBoundingClientRect(),i=this.getBoundingClientRect(),s=parseFloat(getComputedStyle(this).paddingRight);e.right-s<i.right&&(t.style.minWidth=i.right-e.left+s+\"px\")}{let t=this.getBoundingClientRect();t.right+7>window.innerWidth&&(this.style.maxWidth=window.innerWidth-t.left-7+\"px\")}}async#Wt(t=null){if(!1===this.#Kt())return;let e=this[\"#format-menu\"];if(e.setAttribute(\"closing\",\"\"),await t,this[\"#backdrop\"].hide(!1),this.#X)this.focus(),this.selectAll();else{let t=Zn(this.parentNode,\"[tabindex]\");t&&t.focus()}window.removeEventListener(\"resize\",this.#Mt),window.removeEventListener(\"blur\",this.#Lt),await e.close(),e.removeAttribute(\"closing\"),e.remove()}#qt(){if(this.disabled)return!1;{let t=this[\"#format-menu\"];return t.querySelector(\"x-menuitem\"),null!==t&&!1===t.opened&&!1===t.hasAttribute(\"closing\")}}#Kt(){if(this.disabled)return!1;{let t=this[\"#format-menu\"];return t.querySelector(\"x-menuitem\"),null!==t&&!0===t.opened&&!1===t.hasAttribute(\"closing\")}}#Jt(t=\"increment\",e=1){let{value:i}=this[\"#input\"],s=this.#Qt();if(s){let[n,a]=s,r=i.substring(n,a),o=\"\",l=1;r.endsWith(\"%\")?o=\"%\":r.endsWith(\"deg\")&&(o=\"deg\"),l=\"%\"===o||\"deg\"===o?1:i.indexOf(\"/\")>-1&&i.indexOf(\"/\")<n||\"color-alt\"===this.#yt?.01:1,l*=e,\"decrement\"===t&&(l*=-1);let h=wi(parseFloat(r)+l,5)+o;this[\"#input\"].value=i.substring(0,n)+h+i.substring(a),this[\"#input\"].selectionStart=n,this[\"#input\"].selectionEnd=n+h.length,this.dispatchEvent(new CustomEvent(\"input\",{bubbles:!0}))}}#te(){let{value:t,selectionStart:e,selectionEnd:i}=this[\"#input\"],s=[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"a\",\"b\",\"c\",\"d\",\"e\",\"f\"],n=-1,a=-1;t=t.toLowerCase();for(let i=e-1;i>=0;i-=1){let e=t[i];if(!s.includes(e)){if(\"#\"===e){n=i;break}return null}n=i}for(let n=e;n<t.length;n+=1){let e=t[n];if(!s.includes(e)){if(\" \"!==e||i>n)return null;break}a=n+1}return-1===n&&-1!==a?n=e:-1===a&&-1!==n&&(a=i),[n,a]}#Qt(){let{value:t,selectionStart:e,selectionEnd:i}=this[\"#input\"],s=[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\".\",\"+\",\"-\",\"%\",\"d\",\"e\",\"g\"],n=-1,a=-1;t=t.toLowerCase();for(let i=e-1;i>=0;i-=1){let e=t[i];if(!s.includes(e)){if(!1===[\" \",\"(\",\"/\"].includes(e))return null;break}n=i}for(let n=e;n<=t.length;n+=1){let e=t[n];if(!s.includes(e)){if(!1===[\" \",\")\",\"/\"].includes(e)||i>n)return null;break}a=n+1}return-1===n&&-1!==a?n=e:-1===a&&-1!==n&&(a=i),[n,a]}#ee(){let t,e=this[\"#input\"].value;try{t=At(e)}catch(i){t=At(\"#\"+e)}return!1===this.alpha&&(t.alpha=1),e=Is(mi(t,this.space),this.#yt),e}#Gt(t){let e=\"color\";return\"srbg\"===t?e=\"hex\":\"oklch\"===t?e=\"oklch\":\"oklab\"===t?e=\"oklab\":\"lch\"===t?e=\"lch\":\"lab\"===t&&(e=\"lab\"),e}#_t(t){let{key:e,value:i,origin:s}=t.detail;e===`x-colorinput:${this.space}Format`&&(this.#yt=i||this.#Gt(this.space),this.#kt=Is(mi(At(this[\"#input\"].value),this.space),this.#yt),this.#Ct())}#Ut(){this.#yt=Gn.getConfig(`x-colorinput:${this.space}Format`,this.#Gt(this.space)),this.isConnected&&this.#Ct()}#Zt(){this.value=this.hasAttribute(\"value\")?this.getAttribute(\"value\"):\"\",this.matches(\":focus\")&&this.selectAll()}#vt(){this[\"#input\"].disabled=this.disabled,this.#J()}#P(t){if(2===t.detail){let t=this.#Qt(),e=this.#te();if(t){let[e,i]=t;this[\"#input\"].setSelectionRange(e,i)}else if(e){let[t,i]=e;this[\"#input\"].setSelectionRange(t,i)}}this.#Yt()}#At(t){this.#Wt()}#V(){let t=this.querySelector(\":scope > x-tooltip\");t&&!1===t.disabled&&t.open(this)}#q(){let t=this.querySelector(\":scope > x-tooltip\");t&&t.close()}#Rt(){this.#Yt(),this.dispatchEvent(new CustomEvent(\"textinputmodestart\",{bubbles:!0,composed:!0}))}#Pt(){this.dispatchEvent(new CustomEvent(\"textinputmodeend\",{bubbles:!0,composed:!0})),this.reportValidity()}#W(t){if(\"Enter\"===t.code||\"NumpadEnter\"===t.code){if(t.preventDefault(),this.reportValidity(),null===this.#Et){let t=this.#ee();t!==this.#kt&&(this.#kt=t,this.#Ct(),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0}))),this.#Ct(),this.selectAll()}}else\"ArrowUp\"===t.code?(t.preventDefault(),t.stopPropagation(),this.#Jt(\"increment\",t.shiftKey?10:1)):\"ArrowDown\"===t.code?(t.preventDefault(),t.stopPropagation(),this.#Jt(\"decrement\",t.shiftKey?10:1)):\"Backspace\"===t.code&&t.stopPropagation()}#Dt(){if(this.reportValidity(),null===this.#Et){let t=this.#ee();t!==this.#kt&&(this.#kt=t,this.#Ct(),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0}))),this.#Ct()}}#Tt(t){this.#Et&&this.reportValidity(),t.stopPropagation(),this.#zt(),this.dispatchEvent(new CustomEvent(\"input\",{bubbles:!0}))}#Bt(){this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0}))}#It(t){!1===this[\"#input\"].matches(\":focus\")&&(t.preventDefault(),this[\"#input\"].focus(),this.selectAll())}#Ot(){this[\"#input\"].selectionStart===this[\"#input\"].selectionEnd&&this.selectAll()}#Ht(t){this.#X=this.matches(\":focus\")}#jt(t){this.#Vt()}#Ft(t){let e=t.target.closest(\"x-menuitem\");if(e){if(!1===e.toggled){for(let t of this[\"#format-menu\"].querySelectorAll(\"x-menuitem\"))t.toggled=t===e;Gn.setConfig(`x-colorinput:${this.space}Format`,e.value)}this.#Wt(e.whenTriggerEnd)}}#Nt(t){t.preventDefault()}#Xt(){this.#Ct(),this.#I(),this.#zt(),this.#J()}#Ct(){let t=At(this.#kt);!1===this.alpha&&(t.alpha=1);let e=Is(mi(t,this.space),this.#yt);this.matches(\":focus\")?(this[\"#input\"].selectionStart=0,this[\"#input\"].selectionEnd=this[\"#input\"].value.length,document.execCommand(\"insertText\",!1,e)):this[\"#input\"].value=e}#I(){Gn.whenThemeReady.then((()=>{let t=getComputedStyle(this[\"#arrow\"]).getPropertyValue(\"--path-data\");this[\"#arrow-path\"].setAttribute(\"d\",t)}))}#Yt(){let t=this.#Et;t?this.setAttribute(\"error\",\"\"):this.removeAttribute(\"error\");{let e=this.querySelector(':scope > x-tooltip[type=\"error\"]');if(t&&this.matches(\":focus\")){if(e||(e=Xn(\"x-tooltip\"),e.setAttribute(\"type\",\"error\"),this.append(e)),t.href){let i=t.args?Object.entries(t.args).map((([t,e])=>`${t}:${e}`)).join(\",\"):\"\";e.innerHTML=`<x-message href=\"${t.href}\" args=\"${i}\"></x-message>`}else e.innerHTML=t;jn(10).then((()=>{e.open(this)}))}else e&&e.close().then((()=>e.remove()))}}#zt(){0===this.value.length?this.setAttribute(\"empty\",\"\"):this.removeAttribute(\"empty\")}#J(){this.setAttribute(\"role\",\"input\"),this.setAttribute(\"aria-disabled\",this.disabled),this.disabled?(this.#U=this.tabIndex>0?this.tabIndex:0,this.tabIndex=-1):(this.tabIndex<0&&(this.tabIndex=this.#U>0?this.#U:0),this.#U=0)}}customElements.define(\"x-colorinput\",oa);let{PI:la,sin:ha,cos:da,pow:ca,atan2:ua,sqrt:pa,min:ma,max:ba}=Math,{isNaN:ga}=Number;const fa=150,xa=.4;class wa extends HTMLElement{static observedAttributes=[\"value\",\"alpha\",\"spaces\",\"disabled\"];static#z=Ns`<template><header id=\"header\"><x-select id=\"space-select\" size=\"small\"><x-menu id=\"space-select-menu\"><x-menuitem value=\"srgb\"><x-label>sRGB</x-label></x-menuitem><x-menuitem value=\"srgb-linear\"><x-label><x-message href=\"#color-space.srgb-linear\">Linear sRGB</x-message></x-label></x-menuitem><x-menuitem value=\"a98rgb\"><x-label>Adobe RGB</x-label></x-menuitem><x-menuitem value=\"p3\"><x-label>Display P3</x-label></x-menuitem><x-menuitem value=\"rec2020\"><x-label>Rec. 2020</x-label></x-menuitem><x-menuitem value=\"prophoto\"><x-label>ProPhoto RGB</x-label></x-menuitem><hr><x-menuitem value=\"lch\"><x-label>CIE LCH</x-label></x-menuitem><x-menuitem value=\"oklch\"><x-label>OK LCH</x-label></x-menuitem><hr><x-menuitem value=\"lab\"><x-label>CIE LAB</x-label></x-menuitem><x-menuitem value=\"oklab\"><x-label>OK LAB</x-label></x-menuitem><hr><x-menuitem value=\"xyz-d65\"><x-label>CIE XYZ D65</x-label></x-menuitem><x-menuitem value=\"xyz-d50\"><x-label>CIE XYZ D50</x-label></x-menuitem></x-menu></x-select><x-buttons id=\"type-buttons\" tracking=\"1\"><x-button value=\"planar\" skin=\"flat\"><x-icon href=\"#square\"></x-icon></x-button><x-button value=\"polar\" skin=\"flat\"><x-icon href=\"#circle\"></x-icon></x-button><x-button value=\"linear\" skin=\"flat\"><x-icon href=\"#bars\"></x-icon></x-button></x-buttons></header><div id=\"main\"></div><footer id=\"footer\"><x-colorinput id=\"input\" space=\"srgb\" size=\"small\"></x-colorinput><x-button id=\"grab-button\" part=\"grab-button\" size=\"small\" condensed togglable><x-icon href=\"#eye-dropper\"></x-icon></x-button></footer></template>`;static#E=Fs`:host{display:block;width:200px;box-sizing:border-box}:host([hidden]){display:none}#header{display:flex;align-items:center}#space-select{min-width:110px;font-size:0.8125rem}#space-select x-menuitem[data-warn] x-label::after{content:\" ⚠\"}#type-buttons{margin-left:auto}#type-buttons x-button{margin-left:4px;min-height:1px}#type-buttons x-button x-icon{width:18px;height:18px}#main{margin-top:10px}#sliders{width:100%}:host([context~=\"x-popover\"]) #sliders{height:250px}:host([context~=\"x-popover\"]):host([alpha]) #sliders{height:290px}#footer{display:flex;margin-top:10px}#input{max-width:none;min-height:1px;flex:1}#input:focus{z-index:1}#grab-button{margin:0 0 0 5px;padding:0px 6px}#grab-button x-icon{width:14px;height:14px}\n`;get value(){return this.hasAttribute(\"value\")?this.getAttribute(\"value\"):\"#000000\"}set value(t){this.setAttribute(\"value\",t)}get alpha(){return this.hasAttribute(\"alpha\")}set alpha(t){t?this.setAttribute(\"alpha\",\"\"):this.removeAttribute(\"alpha\")}get spaces(){return this.hasAttribute(\"spaces\")?this.getAttribute(\"spaces\").replace(/\\s+/g,\" \").split(\" \"):[\"srgb\",\"srgb-linear\",\"a98rgb\",\"p3\",\"rec2020\",\"prophoto\",\"lch\",\"oklch\",\"lab\",\"oklab\",\"xyz-d65\",\"xyz-d50\"]}set spaces(t){this.setAttribute(\"spaces\",t.join(\" \"))}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}#$;#$t;#ie=!1;constructor(){super(),this.#$=this.attachShadow({mode:\"open\"}),this.#$.adoptedStyleSheets=[Gn.themeStyleSheet,wa.#E],this.#$.append(document.importNode(wa.#z.content,!0));for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t;this[\"#space-select\"].addEventListener(\"change\",(()=>this.#se())),this[\"#space-select\"].addEventListener(\"open\",(()=>this.#ne())),this[\"#type-buttons\"].addEventListener(\"toggle\",(t=>this.#ae())),this[\"#main\"].addEventListener(\"pointerdown\",(t=>this.#re(t)),!0),this[\"#main\"].addEventListener(\"changestart\",(t=>this.#oe(t))),this[\"#main\"].addEventListener(\"change\",(t=>this.#le(t))),this[\"#main\"].addEventListener(\"changeend\",(t=>this.#he(t))),this[\"#input\"].addEventListener(\"change\",(t=>this.#de(t))),this[\"#input\"].addEventListener(\"keydown\",(t=>this.#ce(t))),this[\"#grab-button\"].addEventListener(\"toggle\",(()=>this.#ue()))}connectedCallback(){Gn.addEventListener(\"configchange\",this.#$t=t=>{this.#_t(t)}),\"x-popover\"===this.parentElement?.localName?this.setAttribute(\"context\",\"x-popover\"):this.removeAttribute(\"context\"),this[\"#type-buttons\"].value=Gn.getConfig(`${this.localName}:type`,\"planar\"),this.#Xt()}disconnectedCallback(){Gn.removeEventListener(\"configchange\",this.#$t)}attributeChangedCallback(t,e,i){e!==i&&(\"value\"===t?this.#Zt():\"alpha\"===t?this.#pe():\"spaces\"===t?this.#me():\"disabled\"===t&&this.#vt())}grab(){return new Promise((async t=>{if(void 0===window.EyeDropper)window.alert(\"Your web browser does not support Eye Dropper API\"),t(null);else{let e,i=new EyeDropper,s=new AbortController;try{e=await i.open({signal:s.signal})}catch(t){e=null}t(e?.sRGBHex||null)}}))}#Zt(){this.isConnected&&(this.#ie?this.#be():this.#Xt())}#pe(){for(let t of this[\"#main\"].children)this.alpha?t.setAttribute(\"alpha\",\"\"):t.removeAttribute(\"alpha\");this.alpha?this[\"#input\"].setAttribute(\"alpha\",\"\"):this[\"#input\"].removeAttribute(\"alpha\")}#me(){this.isConnected&&this.#Xt()}#vt(){this.isConnected&&this.#Xt()}#_t(t){let{key:e,value:i,origin:s}=t.detail;if(\"self\"===s&&e===`${this.localName}:type`){let t=i||\"planar\";null===this.offsetParent&&this[\"#type-buttons\"].value!==t&&(this[\"#type-buttons\"].value=t,this.#Xt())}}#se(){let t=At(this.value);if(this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0})),\"srgb\"===this[\"#space-select\"].value)this.value=bi(mi(t,\"srgb\",{inGamut:!0}),{format:\"hex\"});else{let e=mi(t,this[\"#space-select\"].value,{inGamut:!0});for(let t=0;t<e.coords.length;t+=1)(null===e.coords[t]||ga(e.coords[t]))&&(e.coords[t]=0);this.value=bi(e,{precision:3})}this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})),this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0}))}#ae(t){Gn.setConfig(`${this.localName}:type`,this[\"#type-buttons\"].value),this.#Xt()}#re(t){this[\"#input\"].matches(\":focus\")&&t.stopImmediatePropagation()}#oe(t){this.#ie=!0,this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0}))}#le(t){let e=t.target;if(\"srgb\"===e.space){let[e,i,s,n]=t.target.value;this.value=bi({space:\"srgb\",coords:[e,i,s],alpha:n},{format:\"hex\"})}else if([\"srgb-linear\",\"a98rgb\",\"p3\",\"rec2020\",\"prophoto\"].includes(e.space)){let[i,s,n,a]=t.target.value;this.value=bi({space:e.space,coords:[i,s,n],alpha:a},{format:\"default\",precision:3})}else if(\"lch\"===e.space||\"oklch\"===e.space){let[i,s,n,a]=t.target.value;this.value=bi({space:e.space,coords:[i,s,n],alpha:a},{format:\"default\",precision:3})}else if(\"lab\"===e.space||\"oklab\"===e.space){let[i,s,n,a]=t.target.value;this.value=bi({space:e.space,coords:[i,s,n],alpha:a},{format:\"default\",precision:3})}else if(\"xyz-d65\"===e.space||\"xyz-d50\"===e.space){let[i,s,n,a]=t.target.value;this.value=bi({space:e.space,coords:[i,s,n],alpha:a},{format:\"default\",precision:3})}this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0}))}#he(t){this.#ie=!1,this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0}))}#de(t){this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0}));let e=At(this[\"#input\"].value);\"srgb\"===this[\"#space-select\"].value?this.value=bi(mi(e,\"srgb\",{inGamut:!0}),{format:\"hex\"}):this.value=bi(mi(e,this[\"#space-select\"].value,{inGamut:!0}),{precision:3}),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})),this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0}))}#ce(t){\"Enter\"!==t.key&&\"Space\"!==t.code||this.closest(\"x-popover\")&&t.stopPropagation()}#ue(){return new Promise((async t=>{let e=await this.grab();this[\"#grab-button\"].toggled=!1,null!==e&&(this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0})),\"srgb\"===this[\"#space-select\"].value?this.value=e:this.value=bi(mi(At(e),this[\"#space-select\"].value,{inGamut:!0}),{precision:3}),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})),this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0})))}))}#Xt(){let t=this.#ge();this.#fe(t),this.#xe(t),this.#we(t),this.#Ct(t),this.#ve()}#fe(t=this.#ge()){return new Promise((async e=>{let i=this.spaces;if(await customElements.whenDefined(\"x-select\"),this[\"#space-select\"].value=t.spaceId,1===i.length)this[\"#space-select\"].hidden=!0;else{this[\"#space-select\"].hidden=!1,this[\"#space-select\"].disabled=this.disabled;for(let t of this[\"#space-select-menu\"].children)\"x-menuitem\"===t.localName&&(t.disabled=!i.includes(t.value))}}))}#ne(){let t=this.#ge();for(let e of this[\"#space-select-menu\"].children)if(\"x-menuitem\"===e.localName){se(t,e.value)?e.removeAttribute(\"data-warn\"):e.setAttribute(\"data-warn\",\"\")}}#xe(t=this.#ge()){let e;[\"srgb\",\"srgb-linear\",\"a98rgb\",\"p3\",\"rec2020\",\"prophoto\"].includes(t.spaceId)?e=[\"planar\",\"polar\",\"linear\"]:[\"lch\",\"oklch\",\"lab\",\"oklab\",\"xyz-d65\",\"xyz-d50\"].includes(t.spaceId)&&(e=[\"planar\",\"linear\"]),!1===e.includes(this[\"#type-buttons\"].value)&&(this[\"#type-buttons\"].value=e[0]);for(let t of this[\"#type-buttons\"].children)t.disabled=this.disabled,t.hidden=!1===e.includes(t.value)||e.length<=1}#we(t=this.#ge()){return new Promise((async e=>{let i,s=this[\"#type-buttons\"].value,n=t.spaceId,a=[...t.coords,t.alpha];[\"srgb\",\"srgb-linear\",\"a98rgb\",\"p3\",\"rec2020\",\"prophoto\"].includes(n)?\"linear\"===s?i=\"x-rgblinearsliders\":\"planar\"===s?i=\"x-rgbplanarsliders\":\"polar\"===s&&(i=\"x-rgbpolarsliders\"):\"lch\"===n||\"oklch\"===n?\"linear\"===s?i=\"x-lchlinearsliders\":\"planar\"===s&&(i=\"x-lchplanarsliders\"):\"lab\"===n||\"oklab\"===n?\"linear\"===s?i=\"x-lablinearsliders\":\"planar\"===s&&(i=\"x-labplanarsliders\"):\"xyz-d65\"!==n&&\"xyz-d50\"!==n||(\"linear\"===s?i=\"x-xyzlinearsliders\":\"planar\"===s&&(i=\"x-xyzplanarsliders\")),this[\"#main\"].firstElementChild?.localName!==i&&(this[\"#main\"].innerHTML=\"\",this[\"#sliders\"]=Xn(i),this[\"#sliders\"].setAttribute(\"id\",\"sliders\"),this[\"#sliders\"].setAttribute(\"exportparts\",\"slider\"),this[\"#main\"].append(this[\"#sliders\"])),await customElements.whenDefined(i),this[\"#sliders\"].space=n,this[\"#sliders\"].value=a,this[\"#sliders\"].alpha=this.alpha,this[\"#sliders\"].disabled=this.disabled,e()}))}#Ct(t=this.#ge()){this[\"#input\"].space=t.spaceId,this[\"#input\"].alpha=this.alpha,this[\"#input\"].value=bi(t),this[\"#input\"].disabled=this.disabled}#be=Fn(this.#Ct,50,this);#ve(){this[\"#grab-button\"].disabled=this.disabled}#ge(){let t=At(this.value);!1===this.spaces.includes(t.spaceId)&&(t=\"hsl\"===t.spaceId||\"hwb\"===t.spaceId?mi(t,\"srgb\",{inGamut:!0}):mi(t,\"p3\",{inGamut:!0}));for(let e=0;e<t.coords.length;e+=1)(null===t.coords[e]||ga(t.coords[e]))&&(t.coords[e]=0);return void 0===t.spaceId&&(t.spaceId=t.space.id),t.coords=t.coords.map((t=>1*t)),t}}void 0===customElements.get(\"x-colorpicker\")&&customElements.define(\"x-colorpicker\",wa);class va extends HTMLElement{static#z=Ns`<template><div id=\"coord-0-slider\" class=\"slider\" part=\"slider\"><div id=\"coord-0-slider-track\" class=\"slider-track\"><svg id=\"coord-0-slider-gamut-svg\" class=\"slider-gamut-svg\" viewBox=\"0 0 100 35\" preserveAspectRatio=\"none\"><path id=\"coord-0-slider-gamut-path\" class=\"slider-gamut-path\"></path></svg><div id=\"coord-0-slider-marker\" class=\"slider-marker\"><span id=\"coord-0-slider-label\" class=\"slider-label\"></span></div></div></div><div id=\"coord-1-slider\" class=\"slider\" part=\"slider\"><div id=\"coord-1-slider-track\" class=\"slider-track\"><svg id=\"coord-1-slider-gamut-svg\" class=\"slider-gamut-svg\" viewBox=\"0 0 100 35\" preserveAspectRatio=\"none\"><path id=\"coord-1-slider-gamut-path\" class=\"slider-gamut-path\"></path></svg><div id=\"coord-1-slider-marker\" class=\"slider-marker\"><span id=\"coord-1-slider-label\" class=\"slider-label\"></span></div></div></div><div id=\"coord-2-slider\" class=\"slider\" part=\"slider\"><div id=\"coord-2-slider-track\" class=\"slider-track\"><svg id=\"coord-2-slider-gamut-svg\" class=\"slider-gamut-svg\" viewBox=\"0 0 100 35\" preserveAspectRatio=\"none\"><path id=\"coord-2-slider-gamut-path\" class=\"slider-gamut-path\"></path></svg><div id=\"coord-2-slider-marker\" class=\"slider-marker\"><span id=\"coord-2-slider-label\" class=\"slider-label\"></span></div></div></div><div id=\"alpha-slider\" class=\"slider\" part=\"slider\"><div id=\"alpha-slider-gradient\"></div><div id=\"alpha-slider-track\" class=\"slider-track\"><div id=\"alpha-slider-marker\" class=\"slider-marker\"><span id=\"alpha-slider-label\" class=\"slider-label\">α</span></div></div></div><x-contextmenu id=\"context-menu\"><x-menu><x-menuitem><x-label><x-message href=\"#color-model\" autocapitalize>Color Model</x-message></x-label><x-menu id=\"color-model-menu\"><x-menuitem value=\"hsv\"><x-label>HSV</x-label></x-menuitem><x-menuitem value=\"hsl\"><x-label>HSL</x-label></x-menuitem><x-menuitem value=\"hwb\"><x-label>HWB</x-label></x-menuitem><hr><x-menuitem value=\"okhsv\" data-srgb-only><x-label>OK HSV</x-label></x-menuitem><x-menuitem value=\"okhsl\" data-srgb-only><x-label>OK HSL</x-label></x-menuitem><x-menuitem value=\"hsluv\" data-srgb-only><x-label>HSLuv</x-label></x-menuitem><hr><x-menuitem value=\"rgb\"><x-label>RGB</x-label></x-menuitem></x-menu></x-menuitem><x-menuitem><x-label><x-message href=\"#gamut-hints\" autocapitalize>Gamut Hints</x-message></x-label><x-menu id=\"gamut-hints-menu\"><x-menuitem value=\"none\"><x-label><x-message href=\"#gamut-hints.none\">None</x-message></x-label></x-menuitem><hr><x-menuitem value=\"srgb\" toggled><x-label>sRGB</x-label></x-menuitem><x-menuitem value=\"a98rgb\"><x-label>Adobe RGB</x-label></x-menuitem><x-menuitem value=\"p3\"><x-label>Display P3</x-label></x-menuitem><x-menuitem value=\"rec2020\"><x-label>Rec. 2020</x-label></x-menuitem><x-menuitem value=\"prophoto\"><x-label>ProPhoto RGB</x-label></x-menuitem></x-menu></x-menuitem><hr><x-menuitem id=\"labels-menu-item\" value=\"labels\"><x-label><x-message href=\"#labels\" autocapitalize>Labels</x-message></x-label></x-menuitem></x-menu></x-contextmenu></template>`;static#E=Fs`:host{display:block;user-select:none;-webkit-user-select:none;--marker-width: 18px;}:host([disabled]){pointer-events:none;opacity:0.5}.slider{width:100%;height:35px;margin-top:10px;padding:0 calc(var(--marker-width) / 2);box-sizing:border-box;touch-action:pinch-zoom}.slider-track{position:relative;width:100%;height:100%;display:flex;align-items:center}.slider-marker{position:absolute;left:0%;width:var(--marker-width);height:calc(100% + 6px);box-sizing:border-box;display:flex;align-items:center;justify-content:center;transform:translateX(calc((var(--marker-width) / 2) * -1));background:rgba(0, 0, 0, 0.2);border:3px solid white;box-shadow:0 0 3px black}.slider-marker[data-warn]::after{content:\"⚠\";position:absolute;right:-26px;color:rgba(255, 255, 255, 0.9);filter:drop-shadow(1px 1px 1px black);pointer-events:none;font-size:1.125rem}.slider-gamut-svg{width:100%;height:100%}.slider-gamut-path{fill:none;stroke:white;stroke-width:1px;vector-effect:non-scaling-stroke;stroke-dasharray:2px;opacity:0.8}.slider-label{font-weight:700;color:rgba(255, 255, 255, 0.9);font-size:0.625rem}#alpha-slider{display:none;margin-top:10px;position:relative;background:var(--checkboard-background)}:host([alpha]) #alpha-slider{display:block}#alpha-slider-gradient{position:absolute;top:0;left:0;width:100%;height:100%;border-radius:inherit}\n`;get value(){let t=this.#ke();if(\"rgb\"===t){let[t,e,i]=this.#ye;return[t,e,i,this.#Ce]}if(\"hsv\"===t){let[e,i,s]=this.#ye,[n,a,r]=mi({space:t,coords:[360*e,100*i,100*s]},\"srgb\").coords;return[n,a,r,this.#Ce]}if(\"okhsv\"===t){let[e,i,s]=this.#ye,[n,a,r]=mi({space:t,coords:[360*e,i,s]},\"srgb\").coords;return[n,a,r,this.#Ce]}if(\"hsl\"===t||\"hsluv\"===t){let[e,i,s]=this.#ye,[n,a,r]=mi({space:t,coords:[360*e,100*i,100*s]},\"srgb\").coords;return[n,a,r,this.#Ce]}if(\"okhsl\"===t){let[e,i,s]=this.#ye,[n,a,r]=mi({space:t,coords:[360*e,i,s]},\"srgb\").coords;return[n,a,r,this.#Ce]}if(\"hwb\"===t){let[t,e,i]=this.#ye,[s,n,a]=mi({space:\"hwb\",coords:[360*t,100*e,100*i]},\"srgb\").coords;return[s,n,a,this.#Ce]}}set value([t,e,i,s]){let n=this.#ke();if(\"rgb\"===n)this.#ye=[t,e,i],this.#Ce=s;else if(\"hsv\"===n){let[a,r,o]=mi({space:\"srgb\",coords:[t,e,i]},n).coords;this.#ye=[a/360,r/100,o/100],this.#Ce=s}else if(\"okhsv\"===n){let[a,r,o]=mi({space:\"srgb\",coords:[t,e,i]},n).coords;this.#ye=[a/360,r,o],this.#Ce=s}else if(\"hsl\"===n||\"hsluv\"===n){let[a,r,o]=mi({space:\"srgb\",coords:[t,e,i]},n).coords;this.#ye=[a/360,r/100,o/100],this.#Ce=s}else if(\"okhsl\"===n){let[a,r,o]=mi({space:\"srgb\",coords:[t,e,i]},n).coords;this.#ye=[a/360,r,o],this.#Ce=s}else if(\"hwb\"===n){let[n,a,r]=mi({space:\"srgb\",coords:[t,e,i]},\"hwb\").coords;this.#ye=[n/360,a/100,r/100],this.#Ce=s}for(let t=0;t<this.#ye.length;t+=1)(null===this.#ye[t]||ga(this.#ye[t]))&&(this.#ye[t]=0);this.#Xt()}get space(){return this.#ze}set space(t){this.#ze!==t&&(this.#ze=t,this.#Xt())}get alpha(){return this.hasAttribute(\"alpha\")}set alpha(t){t?this.setAttribute(\"alpha\",\"\"):this.removeAttribute(\"alpha\")}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}#$=null;#$t;#ie=!1;#ze=\"srgb\";#Ee=\"hsv\";#$e=\"srgb\";#Se=!0;#ye=[0,0,0];#Ce=1;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.append(document.importNode(va.#z.content,!0)),this.#$.adoptedStyleSheets=[Gn.themeStyleSheet,va.#E];for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t;this[\"#coord-0-slider\"].addEventListener(\"pointerdown\",(t=>this.#Me(t))),this[\"#coord-1-slider\"].addEventListener(\"pointerdown\",(t=>this.#Le(t))),this[\"#coord-2-slider\"].addEventListener(\"pointerdown\",(t=>this.#Ae(t))),this[\"#alpha-slider\"].addEventListener(\"pointerdown\",(t=>this.#Re(t))),this[\"#context-menu\"].addEventListener(\"click\",(t=>this.#Pe(t))),this[\"#context-menu\"].addEventListener(\"open\",(t=>this.#Te(t)))}connectedCallback(){this.#Ee=Gn.getConfig(`${this.localName}:model`,\"hsv\"),this.#$e=Os(Gn.getConfig(\"x-colorpicker:gamutHints\",\"srgb\"),\"color.js\"),this.#Se=Gn.getConfig(\"x-colorpicker:labels\",!0),Gn.addEventListener(\"configchange\",this.#$t=t=>this.#_t(t))}disconnectedCallback(){Gn.removeEventListener(\"configchange\",this.#$t)}#ke(){return this.#Ee,\"okhsv\"===this.#Ee?\"srgb\"===this.#ze?\"okhsv\":\"hsv\":\"okhsl\"===this.#Ee?\"srgb\"===this.#ze?\"okhsl\":\"hsl\":\"hsluv\"===this.#Ee?\"srgb\"===this.#ze?\"hsluv\":\"hsl\":this.#Ee}#De(){return\"none\"===this.#$e||\"srgb\"===this.#$e&&[\"srgb\",\"srgb-linear\"].includes(this.#ze)||\"p3\"===this.#$e&&[\"srgb\",\"srgb-linear\",\"p3\"].includes(this.#ze)||\"a98rgb\"===this.#$e&&[\"srgb\",\"srgb-linear\",\"a98rgb\"].includes(this.#ze)||\"rec2020\"===this.#$e&&[\"srgb\",\"srgb-linear\",\"a98rgb\",\"p3\",\"rec2020\"].includes(this.#ze)||\"prophoto\"===this.#$e?\"none\":this.#$e}#_t(t){let{key:e,value:i,origin:s}=t.detail;if(\"self\"===s)if(e===`${this.localName}:model`){let t=i||\"hsv\";if(t!==this.#Ee){let[e,i,s]=this.value;this.#Ee=t,this.value=[e,i,s,this.#Ce]}}else if(\"x-colorpicker:gamutHints\"===e){let t=Os(i||\"srgb\",\"color.js\");t!==this.#$e&&(this.#$e=t,this.#Xt())}else if(\"x-colorpicker:labels\"===e){let t=null!==i&&i;t!==this.#Se&&(this.#Se=t,this.#Be())}}#Pe(t){let e=t.target.closest(\"x-menuitem\");if(e)if(e.parentElement===this[\"#color-model-menu\"]){let t=e.value,[i,s,n]=this.value;this.#Ee=t,Gn.setConfig(`${this.localName}:model`,t),this.value=[i,s,n,this.#Ce]}else e.parentElement===this[\"#gamut-hints-menu\"]?e.value!==this.#$e&&(this.#$e=e.value,this.#Xt(),Gn.setConfig(\"x-colorpicker:gamutHints\",Os(this.#$e,\"css\"))):\"labels\"===e.value&&(this.#Se=!e.toggled,Gn.setConfig(\"x-colorpicker:labels\",this.#Se),this.#Xt())}#Te(){this.#Ie()}#Me(t){if(t.button>0||this.#ie)return;let e,i,s=this[\"#coord-0-slider-track\"].getBoundingClientRect();this.#ie=!0,this[\"#coord-0-slider\"].setPointerCapture(t.pointerId),this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0}));let n=t=>{let e=(t-s.x)/s.width;e=ki(e,0,1),e!==this.#ye[0]&&(this.#ye[0]=e,this.#Oe(),this.#He(),this.#je(),this.#Ne(),this.#Fe(),this.#Ge(),this.#Xe(),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})))};n(t.clientX),this[\"#coord-0-slider\"].addEventListener(\"pointermove\",e=e=>{e.pointerId===t.pointerId&&n(e.clientX)}),this[\"#coord-0-slider\"].addEventListener(\"pointerup\",i=()=>{this[\"#coord-0-slider\"].removeEventListener(\"pointermove\",e),this[\"#coord-0-slider\"].removeEventListener(\"pointerup\",i),this[\"#coord-0-slider\"].removeEventListener(\"pointercancel\",i),this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0})),this.#ie=!1}),this[\"#coord-0-slider\"].addEventListener(\"pointercancel\",i)}#Le(t){if(t.button>0||this.#ie)return;let e,i,s=this.#ke(),n=this[\"#coord-1-slider-track\"].getBoundingClientRect();this.#ie=!0,this[\"#coord-1-slider\"].setPointerCapture(t.pointerId),this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0}));let a=t=>{let e=(t-n.x)/n.width;e=ki(e,0,1),e!==this.#ye[1]&&(this.#ye[1]=e,\"rgb\"===s&&this.#_e(),this.#Ze(),this.#Ue(),this.#He(),this.#Ne(),this.#Fe(),this.#Ge(),this.#Xe(),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})))};a(t.clientX),this[\"#coord-1-slider\"].addEventListener(\"pointermove\",e=e=>{e.pointerId===t.pointerId&&a(e.clientX)}),this[\"#coord-1-slider\"].addEventListener(\"pointerup\",i=()=>{this[\"#coord-1-slider\"].removeEventListener(\"pointermove\",e),this[\"#coord-1-slider\"].removeEventListener(\"pointerup\",i),this[\"#coord-1-slider\"].removeEventListener(\"pointercancel\",i),this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0})),this.#ie=!1}),this[\"#coord-1-slider\"].addEventListener(\"pointercancel\",i)}#Ae(t){if(t.button>0||this.#ie)return;let e,i,s=this.#ke(),n=this[\"#coord-2-slider-track\"].getBoundingClientRect();this.#ie=!0,this[\"#coord-2-slider\"].setPointerCapture(t.pointerId),this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0}));let a=t=>{let e=(t-n.x)/n.width;e=ki(e,0,1),e!==this.#ye[2]&&(this.#ye[2]=e,\"rgb\"===s&&(this.#_e(),this.#He()),this.#Ze(),this.#je(),this.#Ye(),this.#Ge(),this.#Xe(),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})))};a(t.clientX),this[\"#coord-2-slider\"].addEventListener(\"pointermove\",e=e=>{e.pointerId===t.pointerId&&a(e.clientX)}),this[\"#coord-2-slider\"].addEventListener(\"pointerup\",i=()=>{this[\"#coord-2-slider\"].removeEventListener(\"pointermove\",e),this[\"#coord-2-slider\"].removeEventListener(\"pointerup\",i),this[\"#coord-2-slider\"].removeEventListener(\"pointercancel\",i),this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0})),this.#ie=!1}),this[\"#coord-2-slider\"].addEventListener(\"pointercancel\",i)}#Re(t){if(t.button>0||this.#ie)return;let e,i,s=this[\"#alpha-slider-track\"].getBoundingClientRect();this.#ie=!0,this[\"#alpha-slider\"].setPointerCapture(t.pointerId),this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0}));let n=t=>{let e=(t-s.x)/s.width;e=ki(e,0,1),e!==this.#Ce&&(this.#Ce=e,this.#Ve(),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})))};n(t.clientX),this[\"#alpha-slider\"].addEventListener(\"pointermove\",e=e=>{e.pointerId===t.pointerId&&n(e.clientX)}),this[\"#alpha-slider\"].addEventListener(\"pointerup\",i=()=>{this[\"#alpha-slider\"].removeEventListener(\"pointermove\",e),this[\"#alpha-slider\"].removeEventListener(\"pointerup\",i),this[\"#alpha-slider\"].removeEventListener(\"pointercancel\",i),this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0})),this.#ie=!1}),this[\"#alpha-slider\"].addEventListener(\"pointercancel\",i)}#Xt(){this.#Oe(),this.#_e(),this.#Ze(),this.#Ue(),this.#He(),this.#je(),this.#Ye(),this.#Ne(),this.#Fe(),this.#Ve(),this.#Ge(),this.#Xe(),this.#Be()}#Oe(){this[\"#coord-0-slider-marker\"].style.left=100*this.#ye[0]+\"%\"}#_e(){let t=this.#ke();if(\"rgb\"===t){let[,t,e]=this.#ye,i=\"srgb-linear\"===this.#ze?\"srgb-linear\":\"srgb\",s=[{space:this.#ze,coords:[0,t,e]},{space:this.#ze,coords:[1,t,e]}];s=s.map((t=>bi(t))).join(\",\"),this[\"#coord-0-slider\"].style.background=`linear-gradient(in ${i} to right, ${s})`}else if(\"hsv\"===t||\"hsl\"===t||\"hwb\"===t){let t=\"srgb-linear\"===this.#ze?\"srgb-linear\":\"srgb\",e=[{space:this.#ze,coords:[1,0,0]},{space:this.#ze,coords:[1,1,0]},{space:this.#ze,coords:[0,1,0]},{space:this.#ze,coords:[0,1,1]},{space:this.#ze,coords:[0,0,1]},{space:this.#ze,coords:[1,0,1]},{space:this.#ze,coords:[1,0,0]}];e=e.map((t=>bi(t))).join(\",\"),this[\"#coord-0-slider\"].style.background=`linear-gradient(in ${t} to right, ${e})`}else if(\"okhsv\"===t||\"okhsl\"===t){let t=[];for(let e=0;e<=360;e+=60)t.push({space:\"okhsv\",coords:[e,1,1]});t=t.map((t=>bi(mi(t,\"srgb\")))).join(\",\"),this[\"#coord-0-slider\"].style.background=`linear-gradient(in srgb to right, ${t})`}else if(\"hsluv\"===t){let t=[];for(let e=0;e<=360;e+=60)t.push({space:\"okhsv\",coords:[e,1,1]});t=t.map((t=>bi(mi(t,\"srgb\")))).join(\",\"),this[\"#coord-0-slider\"].style.background=`linear-gradient(in srgb to right, ${t})`}}#Ze(){let t=this.#De();if(\"none\"===t)this[\"#coord-0-slider-gamut-path\"].removeAttribute(\"d\");else{let e=[];{let i=this.#ke(),s=this[\"#coord-0-slider\"].clientWidth,n=1/window.devicePixelRatio,[,a,r]=this.#ye,o=null;for(let l=0;l<=s;l+=n){let n,h=l/s;\"hsv\"===i||\"hsl\"===i||\"hwb\"===i?n={space:this.#ze,coords:mi({space:i,coords:[360*h,100*a,100*r]},\"srgb\").coords}:\"rgb\"===i&&(n={space:this.#ze,coords:[h,a,r]}),se(n,t)?(null===o&&(o=[],e.push(o)),o.push(100*h)):o=null}e=e.map((t=>[t.at(0),t.at(-1)]))}if(e.length>0){let t=e.map((([t,e])=>`M ${t} 35 L ${t} 17 L ${e} 17 L ${e} 35`));this[\"#coord-0-slider-gamut-path\"].setAttribute(\"d\",t.join(\" \"))}else this[\"#coord-0-slider-gamut-path\"].removeAttribute(\"d\")}}#Ue(){this[\"#coord-1-slider-marker\"].style.left=100*this.#ye[1]+\"%\"}#He(){let t=this.#ke();if(\"rgb\"===t){let[t,,e]=this.#ye,i=\"srgb-linear\"===this.#ze?\"srgb-linear\":\"srgb\",s=[{space:this.#ze,coords:[t,0,e]},{space:this.#ze,coords:[t,1,e]}];s=s.map((t=>bi(t))).join(\",\"),this[\"#coord-1-slider\"].style.background=`linear-gradient(in ${i} to right, ${s})`}else if(\"hsv\"===t||\"hsl\"===t||\"hwb\"===t){let e,[i]=this.#ye,s=\"srgb-linear\"===this.#ze?\"srgb\":this.space,n=\"srgb-linear\"===this.#ze?\"srgb-linear\":\"srgb\";\"hsv\"===t?e=[{space:this.#ze,coords:mi({space:\"hsv\",coords:[360*i,0,100]},s).coords},{space:this.#ze,coords:mi({space:\"hsv\",coords:[360*i,100,100]},s).coords}]:\"hsl\"===t?e=[{space:this.#ze,coords:mi({space:\"hsl\",coords:[360*i,0,50]},s).coords},{space:this.#ze,coords:mi({space:\"hsl\",coords:[360*i,100,50]},s).coords}]:\"hwb\"===t&&(e=[{space:this.#ze,coords:mi({space:\"hwb\",coords:[360*i,0,0]},s).coords},{space:this.#ze,coords:mi({space:\"hwb\",coords:[360*i,100,0]},s).coords}]),e=e.map((t=>bi(t))).join(\",\"),this[\"#coord-1-slider\"].style.background=`linear-gradient(in ${n} to right, ${e})`}else if(\"okhsv\"===t||\"okhsl\"===t){let[e]=this.#ye,i=[];for(let s=0;s<=1;s+=.01)i.push({space:t,coords:[360*e,s,\"okhsv\"===t?1:.65]});i=i.map((t=>bi(mi(t,\"srgb\")))).join(\",\"),this[\"#coord-1-slider\"].style.background=`linear-gradient(in srgb to right, ${i})`}else if(\"hsluv\"===t){let[e]=this.#ye,i=[];for(let s=0;s<=100;s+=1)i.push({space:t,coords:[360*e,s,65]});i=i.map((t=>bi(mi(t,\"srgb\")))).join(\",\"),this[\"#coord-1-slider\"].style.background=`linear-gradient(in srgb to right, ${i})`}}#je(){let t=this.#De();if(\"none\"===t)this[\"#coord-1-slider-gamut-path\"].removeAttribute(\"d\");else{let e=[];{let i=this.#ke(),s=this[\"#coord-1-slider\"].clientWidth,n=1/window.devicePixelRatio,[a,,r]=this.#ye,o=null;for(let l=0;l<=s;l+=n){let n,h=l/s;\"hsv\"===i||\"hsl\"===i||\"hwb\"===i?n={space:this.#ze,coords:mi({space:i,coords:[360*a,100*h,100*r]},\"srgb\").coords}:\"rgb\"===i&&(n={space:this.#ze,coords:[a,h,r]}),se(n,t)?(null===o&&(o=[],e.push(o)),o.push(100*h)):o=null}e=e.map((t=>[t.at(0),t.at(-1)]))}if(e.length>0){let t=e.map((([t,e])=>`M ${t} 35 L ${t} 17 L ${e} 17 L ${e} 35`));this[\"#coord-1-slider-gamut-path\"].setAttribute(\"d\",t.join(\" \"))}else this[\"#coord-1-slider-gamut-path\"].removeAttribute(\"d\")}}#Ye(){this[\"#coord-2-slider-marker\"].style.left=100*this.#ye[2]+\"%\"}#Ne(){let t=this.#ke();if(\"rgb\"===t){let[t,e]=this.#ye,i=\"srgb-linear\"===this.#ze?\"srgb-linear\":\"srgb\",s=[{space:this.#ze,coords:[t,e,0]},{space:this.#ze,coords:[t,e,1]}];s=s.map((t=>bi(t))).join(\",\"),this[\"#coord-2-slider\"].style.background=`linear-gradient(in ${i} to right, ${s})`}else if(\"hsv\"===t||\"hsl\"===t||\"hwb\"===t){let e=\"srgb-linear\"===this.#ze?\"srgb\":this.#ze,i=\"srgb-linear\"===this.#ze?\"srgb-linear\":\"srgb\",s=[];if(\"hsv\"===t){let[t,i]=this.#ye;s=[{space:this.#ze,coords:mi({space:\"hsv\",coords:[360*t,100*i,0]},e).coords},{space:this.#ze,coords:mi({space:\"hsv\",coords:[360*t,100*i,100]},e).coords}]}else if(\"hsl\"===t){let[t,i]=this.#ye;s=[{space:this.#ze,coords:mi({space:\"hsl\",coords:[360*t,100*i,0]},e).coords},{space:this.#ze,coords:mi({space:\"hsl\",coords:[360*t,100*i,50]},e).coords},{space:this.#ze,coords:mi({space:\"hsl\",coords:[360*t,100*i,100]},e).coords}]}else if(\"hwb\"===t){let[t,i]=this.#ye;for(let n=0;n<=100;n+=10)s.push({space:this.#ze,coords:mi({space:\"hwb\",coords:[360*t,100*i,n]},e).coords})}s=s.map((t=>bi(t))).join(\",\"),this[\"#coord-2-slider\"].style.background=`linear-gradient(in ${i} to right, ${s})`}else if(\"okhsv\"===t||\"okhsl\"===t){let[e,i]=this.#ye,s=[];for(let n=0;n<=1;n+=.01)s.push({space:t,coords:[360*e,i,n]});s=s.map((t=>bi(mi(t,\"srgb\")))).join(\",\"),this[\"#coord-2-slider\"].style.background=`linear-gradient(in srgb to right, ${s})`}else if(\"hsluv\"===t){let[e,i]=this.#ye,s=[];for(let n=0;n<=100;n+=1)s.push({space:t,coords:[360*e,100*i,n]});s=s.map((t=>bi(mi(t,\"srgb\")))).join(\",\"),this[\"#coord-2-slider\"].style.background=`linear-gradient(in srgb to right, ${s})`}}#Fe(){let t=this.#De();if(\"none\"===t)this[\"#coord-2-slider-gamut-path\"].removeAttribute(\"d\");else{let e=[];{let i=this.#ke(),s=this[\"#coord-2-slider\"].clientWidth,n=1/window.devicePixelRatio,[a,r]=this.#ye,o=null;for(let l=0;l<=s;l+=n){let n,h=l/s;\"hsv\"===i||\"hsl\"===i||\"hwb\"===i?n={space:this.#ze,coords:mi({space:i,coords:[360*a,100*r,100*h]},\"srgb\").coords}:\"rgb\"===i&&(n={space:this.#ze,coords:[a,r,h]}),se(n,t)?(null===o&&(o=[],e.push(o)),o.push(100*h)):o=null}e=e.map((t=>[t.at(0),t.at(-1)]))}if(e.length>0){let t=e.map((([t,e])=>`M ${t} 35 L ${t} 17 L ${e} 17 L ${e} 35`));this[\"#coord-2-slider-gamut-path\"].setAttribute(\"d\",t.join(\" \"))}else this[\"#coord-2-slider-gamut-path\"].removeAttribute(\"d\")}}#Ve(){this[\"#alpha-slider-marker\"].style.left=100*this.#Ce+\"%\"}#Ge(){let t=this.#ke();if(\"rgb\"===t){let[t,e,i]=this.#ye,s=[{space:this.#ze,coords:[t,e,i],alpha:0},{space:this.#ze,coords:[t,e,i],alpha:1}];s=s.map((t=>bi(t))).join(\",\"),this[\"#alpha-slider-gradient\"].style.background=`linear-gradient(to right, ${s})`}else if(\"okhsv\"===t||\"okhsl\"===t){let[e,i,s]=this.#ye,n=\"srgb-linear\"===this.#ze?\"srgb\":this.#ze,a=[];for(let r of[0,1])a.push({space:this.#ze,coords:mi({space:t,coords:[360*e,i,s]},n).coords,alpha:r});a=a.map((t=>bi(t))).join(\",\"),this[\"#alpha-slider-gradient\"].style.background=`linear-gradient(to right, ${a})`}else{let[e,i,s]=this.#ye,n=\"srgb-linear\"===this.#ze?\"srgb\":this.#ze,a=[];for(let r of[0,1])a.push({space:this.#ze,coords:mi({space:t,coords:[360*e,100*i,100*s]},n).coords,alpha:r});a=a.map((t=>bi(t))).join(\",\"),this[\"#alpha-slider-gradient\"].style.background=`linear-gradient(to right, ${a})`}}#Xe(){let t=this.#De();if(\"none\"===t)this[\"#coord-0-slider-marker\"].removeAttribute(\"data-warn\"),this[\"#coord-1-slider-marker\"].removeAttribute(\"data-warn\"),this[\"#coord-2-slider-marker\"].removeAttribute(\"data-warn\");else{let e,i=this.#ke();if(\"hsv\"===i||\"hsl\"===i||\"hwb\"===i){let[t,s,n]=this.#ye;e={space:this.#ze,coords:mi({space:i,coords:[360*t,100*s,100*n]},\"srgb\").coords}}else if(\"rgb\"===i){let[t,i,s]=this.#ye;e={space:this.#ze,coords:[...this.#ye]}}se(e,t)?(this[\"#coord-0-slider-marker\"].removeAttribute(\"data-warn\"),this[\"#coord-1-slider-marker\"].removeAttribute(\"data-warn\"),this[\"#coord-2-slider-marker\"].removeAttribute(\"data-warn\")):(this[\"#coord-0-slider-marker\"].setAttribute(\"data-warn\",\"\"),this[\"#coord-1-slider-marker\"].setAttribute(\"data-warn\",\"\"),this[\"#coord-2-slider-marker\"].setAttribute(\"data-warn\",\"\"))}}#Be(){if(this.#Se){let t=this.#ke();\"hsv\"===t||\"okhsv\"===t?(this[\"#coord-0-slider-label\"].textContent=\"H\",this[\"#coord-1-slider-label\"].textContent=\"S\",this[\"#coord-2-slider-label\"].textContent=\"V\"):\"hsl\"===t||\"okhsl\"===t||\"hsluv\"===t?(this[\"#coord-0-slider-label\"].textContent=\"H\",this[\"#coord-1-slider-label\"].textContent=\"S\",this[\"#coord-2-slider-label\"].textContent=\"L\"):\"hwb\"===t?(this[\"#coord-0-slider-label\"].textContent=\"H\",this[\"#coord-1-slider-label\"].textContent=\"W\",this[\"#coord-2-slider-label\"].textContent=\"B\"):\"rgb\"===t&&(this[\"#coord-0-slider-label\"].textContent=\"R\",this[\"#coord-1-slider-label\"].textContent=\"G\",this[\"#coord-2-slider-label\"].textContent=\"B\"),this[\"#alpha-slider-label\"].textContent=\"α\"}else this[\"#coord-0-slider-label\"].textContent=\"\",this[\"#coord-1-slider-label\"].textContent=\"\",this[\"#coord-2-slider-label\"].textContent=\"\",this[\"#alpha-slider-label\"].textContent=\"\"}#Ie(){let t=this.#ke();for(let e of this[\"#color-model-menu\"].querySelectorAll(\"x-menuitem\"))e.toggled=e.value===t,e.hidden=e.hasAttribute(\"data-srgb-only\")&&\"srgb\"!==this.#ze;for(let t of this[\"#color-model-menu\"].querySelectorAll(\"hr\"))t.hidden=\"srgb\"!==this.#ze&&\"rgb\"!==t.nextElementSibling?.value;for(let t of this[\"#gamut-hints-menu\"].querySelectorAll(\"x-menuitem\"))t.toggled=t.value===this.#$e;this[\"#labels-menu-item\"].toggled=this.#Se}}void 0===customElements.get(\"x-rgblinearsliders\")&&customElements.define(\"x-rgblinearsliders\",va);class ka extends HTMLElement{static#z=Ns`<template><div id=\"hue-slider\" class=\"slider\" part=\"slider\"><div id=\"hue-slider-track\" class=\"slider-track\"><svg id=\"hue-slider-gamut-svg\" class=\"slider-gamut-svg\" viewBox=\"0 0 100 35\" preserveAspectRatio=\"none\"><path id=\"hue-slider-gamut-path\" class=\"slider-gamut-path\"></path></svg><div id=\"hue-slider-marker\" class=\"slider-marker\"><span id=\"hue-slider-label\" class=\"slider-label\">H</span></div></div></div><div id=\"chroma-slider\" class=\"slider\" part=\"slider\"><div id=\"chroma-slider-track\" class=\"slider-track\"><svg id=\"chroma-slider-gamut-svg\" class=\"slider-gamut-svg\" viewBox=\"0 0 100 35\" preserveAspectRatio=\"none\"><path id=\"chroma-slider-gamut-path\" class=\"slider-gamut-path\"></path></svg><div id=\"chroma-slider-marker\" class=\"slider-marker\"><span id=\"chroma-slider-label\" class=\"slider-label\">C</span></div></div></div><div id=\"lightness-slider\" class=\"slider\" part=\"slider\"><div id=\"lightness-slider-track\" class=\"slider-track\"><svg id=\"lightness-slider-gamut-svg\" class=\"slider-gamut-svg\" viewBox=\"0 0 100 35\" preserveAspectRatio=\"none\"><path id=\"lightness-slider-gamut-path\" class=\"slider-gamut-path\"></path></svg><div id=\"lightness-slider-marker\" class=\"slider-marker\"><span id=\"lightness-slider-label\" class=\"slider-label\">L</span></div></div></div><div id=\"alpha-slider\" class=\"slider\" part=\"slider\"><div id=\"alpha-slider-gradient\"></div><div id=\"alpha-slider-track\" class=\"slider-track\"><div id=\"alpha-slider-marker\" class=\"slider-marker\"><span id=\"alpha-slider-label\" class=\"slider-label\">α</span></div></div></div><x-contextmenu id=\"context-menu\"><x-menu><x-menuitem><x-label><x-message href=\"#gamut-hints\" autocapitalize>Gamut Hints</x-message></x-label><x-menu id=\"gamut-hints-menu\"><x-menuitem value=\"none\"><x-label><x-message href=\"#gamut-hints.none\">None</x-message></x-label></x-menuitem><hr><x-menuitem value=\"srgb\" toggled><x-label>sRGB</x-label></x-menuitem><x-menuitem value=\"a98rgb\"><x-label>Adobe RGB</x-label></x-menuitem><x-menuitem value=\"p3\"><x-label>Display P3</x-label></x-menuitem><x-menuitem value=\"rec2020\"><x-label>Rec. 2020</x-label></x-menuitem><x-menuitem value=\"prophoto\"><x-label>ProPhoto RGB</x-label></x-menuitem></x-menu></x-menuitem><hr><x-menuitem id=\"labels-menu-item\" value=\"labels\"><x-label><x-message href=\"#labels\" autocapitalize>Labels</x-message></x-label></x-menuitem></x-menu></x-contextmenu></template>`;static#E=Fs`:host{display:block;user-select:none;-webkit-user-select:none;--marker-width: 18px;}:host([disabled]){pointer-events:none;opacity:0.5}.slider{width:100%;height:35px;margin-top:10px;padding:0 calc(var(--marker-width) / 2);box-sizing:border-box;touch-action:pinch-zoom}.slider-track{position:relative;width:100%;height:100%;display:flex;align-items:center}.slider-marker{position:absolute;left:0%;width:var(--marker-width);height:calc(100% + 6px);box-sizing:border-box;display:flex;align-items:center;justify-content:center;transform:translateX(calc((var(--marker-width) / 2) * -1));background:rgba(0, 0, 0, 0.2);border:3px solid white;box-shadow:0 0 3px black}.slider-marker[data-warn]::after{content:\"⚠\";position:absolute;right:-26px;color:rgba(255, 255, 255, 0.9);filter:drop-shadow(1px 1px 1px black);pointer-events:none;font-size:1.125rem}.slider-gamut-svg{width:100%;height:100%}.slider-gamut-path{fill:none;stroke:white;stroke-width:1px;vector-effect:non-scaling-stroke;stroke-dasharray:2px;opacity:0.8}.slider-label{font-weight:700;color:rgba(255, 255, 255, 0.9);font-size:0.625rem}#alpha-slider{display:none;margin-top:10px;position:relative;background:var(--checkboard-background)}:host([alpha]) #alpha-slider{display:block}#alpha-slider-gradient{position:absolute;top:0;left:0;width:100%;height:100%;border-radius:inherit}\n`;get value(){let[t,e,i]=this.#ye;return[t,e,i,this.#Ce]}set value([t,e,i,s]){this.#ye=[t,e,i],this.#Ce=s,this.#Xt()}get space(){return this.#ze}set space(t){this.#ze!==t&&(this.#ze=t,this.#Xt())}get alpha(){return this.hasAttribute(\"alpha\")}set alpha(t){t?this.setAttribute(\"alpha\",\"\"):this.removeAttribute(\"alpha\")}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}#$=null;#$t;#ie=!1;#ze=\"lch\";#$e=\"srgb\";#Se=!0;#ye=[0,0,0];#Ce=1;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.append(document.importNode(ka.#z.content,!0)),this.#$.adoptedStyleSheets=[Gn.themeStyleSheet,ka.#E];for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t;this[\"#hue-slider\"].addEventListener(\"pointerdown\",(t=>this.#qe(t))),this[\"#chroma-slider\"].addEventListener(\"pointerdown\",(t=>this.#We(t))),this[\"#lightness-slider\"].addEventListener(\"pointerdown\",(t=>this.#Ke(t))),this[\"#alpha-slider\"].addEventListener(\"pointerdown\",(t=>this.#Re(t))),this[\"#context-menu\"].addEventListener(\"click\",(t=>this.#Pe(t))),this[\"#context-menu\"].addEventListener(\"open\",(t=>this.#Te(t)))}connectedCallback(){this.#$e=Os(Gn.getConfig(\"x-colorpicker:gamutHints\",\"srgb\"),\"color.js\"),this.#Se=Gn.getConfig(\"x-colorpicker:labels\",!0),Gn.addEventListener(\"configchange\",this.#$t=t=>this.#_t(t))}disconnectedCallback(){Gn.removeEventListener(\"configchange\",this.#$t)}#_t(t){let{key:e,value:i,origin:s}=t.detail;if(\"self\"===s)if(\"x-colorpicker:gamutHints\"===e){let t=Os(i||\"srgb\",\"color.js\");t!==this.#$e&&(this.#$e=t,this.#Xt())}else if(\"x-colorpicker:labels\"===e){let t=null!==i&&i;t!==this.#Se&&(this.#Se=t,this.#Be())}}#Pe(t){let e=t.target.closest(\"x-menuitem\");e&&(e.parentElement===this[\"#gamut-hints-menu\"]?e.value!==this.#$e&&(this.#$e=e.value,this.#Xt(),Gn.setConfig(\"x-colorpicker:gamutHints\",Os(this.#$e,\"css\"))):\"labels\"===e.value&&(this.#Se=!e.toggled,Gn.setConfig(\"x-colorpicker:labels\",this.#Se),this.#Xt()))}#Te(){this.#Ie()}#qe(t){if(t.button>0||this.#ie)return;let e,i,s=this[\"#hue-slider-track\"].getBoundingClientRect();this.#ie=!0,this[\"#hue-slider\"].setPointerCapture(t.pointerId),this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0}));let n=t=>{let e=(t-s.x)/s.width;e=ki(e,0,1),360*e!==this.#ye[2]&&(this.#ye[2]=360*e,this.#Je(),this.#Qe(),this.#ti(),this.#ei(),this.#ii(),this.#Ge(),this.#Xe(),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})))};n(t.clientX),this[\"#hue-slider\"].addEventListener(\"pointermove\",e=e=>{e.pointerId===t.pointerId&&n(e.clientX)}),this[\"#hue-slider\"].addEventListener(\"pointerup\",i=()=>{this[\"#hue-slider\"].removeEventListener(\"pointermove\",e),this[\"#hue-slider\"].removeEventListener(\"pointerup\",i),this[\"#hue-slider\"].removeEventListener(\"pointercancel\",i),this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0})),this.#ie=!1}),this[\"#hue-slider\"].addEventListener(\"pointercancel\",i)}#We(t){if(t.button>0||this.#ie)return;let e,i,s=this[\"#chroma-slider-track\"].getBoundingClientRect();this.#ie=!0,this[\"#chroma-slider\"].setPointerCapture(t.pointerId),this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0}));let n=t=>{let e=(t-s.x)/s.width;\"oklch\"===this.#ze?e=ki(e*xa,0,xa):\"lch\"===this.#ze&&(e=ki(e*fa,0,fa)),e!==this.#ye[1]&&(this.#ye[1]=e,this.#si(),this.#ni(),this.#ei(),this.#ii(),this.#Ge(),this.#Xe(),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})))};n(t.clientX),this[\"#chroma-slider\"].addEventListener(\"pointermove\",e=e=>{e.pointerId===t.pointerId&&n(e.clientX)}),this[\"#chroma-slider\"].addEventListener(\"pointerup\",i=()=>{this[\"#chroma-slider\"].removeEventListener(\"pointermove\",e),this[\"#chroma-slider\"].removeEventListener(\"pointerup\",i),this[\"#chroma-slider\"].removeEventListener(\"pointercancel\",i),this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0})),this.#ie=!1}),this[\"#chroma-slider\"].addEventListener(\"pointercancel\",i)}#Ke(t){if(t.button>0||this.#ie)return;let e,i,s=this[\"#lightness-slider-track\"].getBoundingClientRect();this.#ie=!0,this[\"#lightness-slider\"].setPointerCapture(t.pointerId),this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0}));let n=t=>{let e=(t-s.x)/s.width;\"oklch\"===this.#ze?e=ki(e,0,1):\"lch\"===this.#ze&&(e=ki(100*e,0,100)),e!==this.#ye[0]&&(this.#ye[0]=e,this.#si(),this.#ti(),this.#ai(),this.#Ge(),this.#Xe(),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})))};n(t.clientX),this[\"#lightness-slider\"].addEventListener(\"pointermove\",e=e=>{e.pointerId===t.pointerId&&n(e.clientX)}),this[\"#lightness-slider\"].addEventListener(\"pointerup\",i=()=>{this[\"#lightness-slider\"].removeEventListener(\"pointermove\",e),this[\"#lightness-slider\"].removeEventListener(\"pointerup\",i),this[\"#lightness-slider\"].removeEventListener(\"pointercancel\",i),this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0})),this.#ie=!1}),this[\"#lightness-slider\"].addEventListener(\"pointercancel\",i)}#Re(t){if(t.button>0||this.#ie)return;let e,i,s=this[\"#alpha-slider-track\"].getBoundingClientRect();this.#ie=!0,this[\"#alpha-slider\"].setPointerCapture(t.pointerId),this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0}));let n=t=>{let e=(t-s.x)/s.width;e=ki(e,0,1),e!==this.#Ce&&(this.#Ce=e,this.#Ve(),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})))};n(t.clientX),this[\"#alpha-slider\"].addEventListener(\"pointermove\",e=e=>{e.pointerId===t.pointerId&&n(e.clientX)}),this[\"#alpha-slider\"].addEventListener(\"pointerup\",i=()=>{this[\"#alpha-slider\"].removeEventListener(\"pointermove\",e),this[\"#alpha-slider\"].removeEventListener(\"pointerup\",i),this[\"#alpha-slider\"].removeEventListener(\"pointercancel\",i),this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0})),this.#ie=!1}),this[\"#alpha-slider\"].addEventListener(\"pointercancel\",i)}#Xt(){this.#Je(),this.#ri(),this.#si(),this.#ni(),this.#Qe(),this.#ti(),this.#ai(),this.#ei(),this.#ii(),this.#Ve(),this.#Ge(),this.#Xe(),this.#Be()}#Je(){let[t,e,i]=this.#ye;this[\"#hue-slider-marker\"].style.left=i/360*100+\"%\"}#ri(){let t=[];if(\"oklch\"===this.#ze)for(let e=0;e<=360;e+=5)t.push({space:\"oklch\",coords:[.8,xa,e]});else if(\"lch\"===this.#ze)for(let e=0;e<=360;e+=5)t.push({space:\"lch\",coords:[75,fa,e]});t=t.map((t=>bi(t))),this[\"#hue-slider\"].style.background=`linear-gradient(in ${this.#ze} to right, ${t.join(\",\")})`}#si(){if(\"none\"===this.#$e)this[\"#hue-slider-gamut-path\"].removeAttribute(\"d\");else{let t=[];{let e=this[\"#hue-slider\"].clientWidth,i=1/window.devicePixelRatio,[s,n]=this.#ye,a=null;for(let r=0;r<=e;r+=i){let i=r/e;se({space:this.#ze,coords:[s,n,360*i]},this.#$e)?(null===a&&(a=[],t.push(a)),a.push(100*i)):a=null}t=t.map((t=>[t.at(0),t.at(-1)]))}if(t.length>0){let e=t.map((([t,e])=>`M ${t} 35 L ${t} 17 L ${e} 17 L ${e} 35`));this[\"#hue-slider-gamut-path\"].setAttribute(\"d\",e.join(\" \"))}else this[\"#hue-slider-gamut-path\"].removeAttribute(\"d\")}}#ni(){let[t,e,i]=this.#ye;\"oklch\"===this.#ze?this[\"#chroma-slider-marker\"].style.left=e>xa?\"calc(100% + 18px)\":e/xa*100+\"%\":\"lch\"===this.#ze&&(this[\"#chroma-slider-marker\"].style.left=e>fa?\"calc(100% + 18px)\":e/fa*100+\"%\")}#Qe(){let[,,t]=this.#ye,e=[];if(\"oklch\"===this.#ze)for(let i=0;i<=xa;i+=.03)e.push({space:\"oklch\",coords:[.75,i,t]});else if(\"lch\"===this.#ze)for(let i=0;i<=fa;i+=10)e.push({space:\"lch\",coords:[75,i,t]});e=e.map((t=>bi(t))),this[\"#chroma-slider\"].style.background=`linear-gradient(in ${this.#ze} to right, ${e.join(\",\")})`}#ti(){if(\"none\"===this.#$e)this[\"#chroma-slider-gamut-path\"].removeAttribute(\"d\");else{let t=[];{let e=this[\"#chroma-slider\"].clientWidth,i=1/window.devicePixelRatio,[s,,n]=this.#ye,a=null;for(let r=0;r<=e;r+=i){let i=r/e,o=\"lch\"===this.#ze?fa:xa;se({space:this.#ze,coords:[s,i*o,n]},this.#$e)?(null===a&&(a=[],t.push(a)),a.push(100*i)):a=null}t=t.map((t=>[t.at(0),t.at(-1)]))}if(t.length>0){let e=t.map((([t,e])=>`M ${t} 35 L ${t} 17 L ${e} 17 L ${e} 35`));this[\"#chroma-slider-gamut-path\"].setAttribute(\"d\",e.join(\" \"))}else this[\"#chroma-slider-gamut-path\"].removeAttribute(\"d\")}}#ai(){let[t,e,i]=this.#ye;\"oklch\"===this.#ze?this[\"#lightness-slider-marker\"].style.left=100*t+\"%\":\"lch\"===this.#ze&&(this[\"#lightness-slider-marker\"].style.left=t+\"%\")}#ei(){let[,t,e]=this.#ye,i=[];if(\"oklch\"===this.#ze)for(let s=0;s<=1;s+=.02)i.push({space:\"oklch\",coords:[s,t,e]});else if(\"lch\"===this.#ze)for(let s=0;s<=100;s+=2)i.push({space:\"lch\",coords:[s,t,e]});i=i.map((t=>bi(t))),this[\"#lightness-slider\"].style.background=`linear-gradient(in ${this.#ze} to right, ${i.join(\",\")})`}#ii(){if(\"none\"===this.#$e)this[\"#lightness-slider-gamut-path\"].removeAttribute(\"d\");else{let t=[];{let e=this[\"#lightness-slider\"].clientWidth,i=1/window.devicePixelRatio,[,s,n]=this.#ye,a=null;for(let r=0;r<=e;r+=i){let i=r/e;se({space:this.#ze,coords:[\"oklch\"===this.#ze?i:100*i,s,n]},this.#$e)?(null===a&&(a=[],t.push(a)),a.push(100*i)):a=null}t=t.map((t=>[t.at(0),t.at(-1)]))}if(t.length>0){let e=t.map((([t,e])=>`M ${t} 35 L ${t} 17 L ${e} 17 L ${e} 35`));this[\"#lightness-slider-gamut-path\"].setAttribute(\"d\",e.join(\" \"))}else this[\"#lightness-slider-gamut-path\"].removeAttribute(\"d\")}}#Ve(){this[\"#alpha-slider-marker\"].style.left=100*this.#Ce+\"%\"}#Ge(){let[t,e,i]=this.#ye,s=[{space:this.#ze,coords:[t,e,i],alpha:0},{space:this.#ze,coords:[t,e,i],alpha:1}];s=s.map((t=>bi(t))),this[\"#alpha-slider-gradient\"].style.background=`linear-gradient(in ${this.#ze} to right, ${s.join(\",\")})`}#Xe(){if(\"none\"===this.#$e)this[\"#hue-slider-marker\"].removeAttribute(\"data-warn\"),this[\"#chroma-slider-marker\"].removeAttribute(\"data-warn\"),this[\"#lightness-slider-marker\"].removeAttribute(\"data-warn\");else{se({space:this.#ze,coords:this.#ye},this.#$e)?(this[\"#hue-slider-marker\"].removeAttribute(\"data-warn\"),this[\"#chroma-slider-marker\"].removeAttribute(\"data-warn\"),this[\"#lightness-slider-marker\"].removeAttribute(\"data-warn\")):(this[\"#hue-slider-marker\"].setAttribute(\"data-warn\",\"\"),this[\"#chroma-slider-marker\"].setAttribute(\"data-warn\",\"\"),this[\"#lightness-slider-marker\"].setAttribute(\"data-warn\",\"\"))}}#Be(){this[\"#hue-slider-label\"].hidden=!this.#Se,this[\"#chroma-slider-label\"].hidden=!this.#Se,this[\"#lightness-slider-label\"].hidden=!this.#Se,this[\"#alpha-slider-label\"].hidden=!this.#Se}#Ie(){for(let t of this[\"#gamut-hints-menu\"].querySelectorAll(\"x-menuitem\"))t.toggled=t.value===this.#$e;this[\"#labels-menu-item\"].toggled=this.#Se}}void 0===customElements.get(\"x-lchlinearsliders\")&&customElements.define(\"x-lchlinearsliders\",ka);class ya extends HTMLElement{static#z=Ns`<template><div id=\"lightness-slider\" class=\"slider\" part=\"slider\"><div id=\"lightness-slider-track\" class=\"slider-track\"><svg id=\"lightness-slider-gamut-svg\" class=\"slider-gamut-svg\" viewBox=\"0 0 100 35\" preserveAspectRatio=\"none\"><path id=\"lightness-slider-gamut-path\" class=\"slider-gamut-path\"></path></svg><div id=\"lightness-slider-marker\" class=\"slider-marker\"><span id=\"lightness-slider-label\" class=\"slider-label\">L</span></div></div></div><div id=\"a-slider\" class=\"slider\" part=\"slider\"><div id=\"a-slider-track\" class=\"slider-track\"><svg id=\"a-slider-gamut-svg\" class=\"slider-gamut-svg\" viewBox=\"0 0 100 35\" preserveAspectRatio=\"none\"><path id=\"a-slider-gamut-path\" class=\"slider-gamut-path\"></path></svg><div id=\"a-slider-marker\" class=\"slider-marker\"><span id=\"a-slider-label\" class=\"slider-label\">A</span></div></div></div><div id=\"b-slider\" class=\"slider\" part=\"slider\"><div id=\"b-slider-track\" class=\"slider-track\"><svg id=\"b-slider-gamut-svg\" class=\"slider-gamut-svg\" viewBox=\"0 0 100 35\" preserveAspectRatio=\"none\"><path id=\"b-slider-gamut-path\" class=\"slider-gamut-path\"></path></svg><div id=\"b-slider-marker\" class=\"slider-marker\"><span id=\"b-slider-label\" class=\"slider-label\">B</span></div></div></div><div id=\"alpha-slider\" class=\"slider\" part=\"slider\"><div id=\"alpha-slider-gradient\"></div><div id=\"alpha-slider-track\" class=\"slider-track\"><div id=\"alpha-slider-marker\" class=\"slider-marker\"><span id=\"alpha-slider-label\" class=\"slider-label\">α</span></div></div></div><x-contextmenu id=\"context-menu\"><x-menu><x-menuitem><x-label><x-message href=\"#gamut-hints\" autocapitalize>Gamut Hints</x-message></x-label><x-menu id=\"gamut-hints-menu\"><x-menuitem value=\"none\"><x-label><x-message href=\"#gamut-hints.none\">None</x-message></x-label></x-menuitem><hr><x-menuitem value=\"srgb\" toggled><x-label>sRGB</x-label></x-menuitem><x-menuitem value=\"a98rgb\"><x-label>Adobe RGB</x-label></x-menuitem><x-menuitem value=\"p3\"><x-label>Display P3</x-label></x-menuitem><x-menuitem value=\"rec2020\"><x-label>Rec. 2020</x-label></x-menuitem><x-menuitem value=\"prophoto\"><x-label>ProPhoto RGB</x-label></x-menuitem></x-menu></x-menuitem><hr><x-menuitem id=\"labels-menu-item\" value=\"labels\"><x-label><x-message href=\"#labels\" autocapitalize>Labels</x-message></x-label></x-menuitem></x-menu></x-contextmenu></template>`;static#E=Fs`:host{display:block;user-select:none;-webkit-user-select:none;--marker-width: 18px;}:host([disabled]){pointer-events:none;opacity:0.5}.slider{width:100%;height:35px;margin-top:10px;padding:0 calc(var(--marker-width) / 2);box-sizing:border-box;touch-action:pinch-zoom}.slider-track{position:relative;width:100%;height:100%;display:flex;align-items:center}.slider-marker{position:absolute;left:0%;width:var(--marker-width);height:calc(100% + 6px);box-sizing:border-box;display:flex;align-items:center;justify-content:center;transform:translateX(calc((var(--marker-width) / 2) * -1));background:rgba(0, 0, 0, 0.2);border:3px solid white;box-shadow:0 0 3px black}.slider-marker[data-warn]::after{content:\"⚠\";position:absolute;right:-26px;color:rgba(255, 255, 255, 0.9);filter:drop-shadow(1px 1px 1px black);pointer-events:none;font-size:1.125rem}.slider-gamut-svg{width:100%;height:100%}.slider-gamut-path{fill:none;stroke:white;stroke-width:1px;vector-effect:non-scaling-stroke;stroke-dasharray:2px;opacity:0.8}.slider-label{font-weight:700;color:rgba(255, 255, 255, 0.9);font-size:0.625rem}#alpha-slider{display:none;margin-top:10px;position:relative;background:var(--checkboard-background)}:host([alpha]) #alpha-slider{display:block}#alpha-slider-gradient{position:absolute;top:0;left:0;width:100%;height:100%;border-radius:inherit}\n`;get value(){let[t,e,i]=this.#ye;return[t,e,i,this.#Ce]}set value([t,e,i,s]){this.#ye=[t,e,i],this.#Ce=s,this.#Xt()}get space(){return this.#ze}set space(t){this.#ze!==t&&(this.#ze=t,this.#Xt())}get alpha(){return this.hasAttribute(\"alpha\")}set alpha(t){t?this.setAttribute(\"alpha\",\"\"):this.removeAttribute(\"alpha\")}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}#$=null;#$t;#ie=!1;#ze=\"lab\";#$e=\"srgb\";#Se=!0;#ye=[0,0,0];#Ce=1;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.append(document.importNode(ya.#z.content,!0)),this.#$.adoptedStyleSheets=[Gn.themeStyleSheet,ya.#E];for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t;this[\"#lightness-slider\"].addEventListener(\"pointerdown\",(t=>this.#Ke(t))),this[\"#a-slider\"].addEventListener(\"pointerdown\",(t=>this.#oi(t))),this[\"#b-slider\"].addEventListener(\"pointerdown\",(t=>this.#li(t))),this[\"#alpha-slider\"].addEventListener(\"pointerdown\",(t=>this.#Re(t))),this[\"#context-menu\"].addEventListener(\"click\",(t=>this.#Pe(t))),this[\"#context-menu\"].addEventListener(\"open\",(t=>this.#Te(t)))}connectedCallback(){this.#$e=Os(Gn.getConfig(\"x-colorpicker:gamutHints\",\"srgb\"),\"color.js\"),this.#Se=Gn.getConfig(\"x-colorpicker:labels\",!0),Gn.addEventListener(\"configchange\",this.#$t=t=>this.#_t(t))}disconnectedCallback(){Gn.removeEventListener(\"configchange\",this.#$t)}#_t(t){let{key:e,value:i,origin:s}=t.detail;if(\"self\"===s)if(\"x-colorpicker:gamutHints\"===e){let t=Os(i||\"srgb\",\"color.js\");t!==this.#$e&&(this.#$e=t,this.#Xt())}else if(\"x-colorpicker:labels\"===e){let t=null!==i&&i;t!==this.#Se&&(this.#Se=t,this.#Be())}}#Pe(t){let e=t.target.closest(\"x-menuitem\");e&&(e.parentElement===this[\"#gamut-hints-menu\"]?e.value!==this.#$e&&(this.#$e=e.value,this.#Xt(),Gn.setConfig(\"x-colorpicker:gamutHints\",Os(this.#$e,\"css\"))):\"labels\"===e.value&&(this.#Se=!e.toggled,Gn.setConfig(\"x-colorpicker:labels\",this.#Se),this.#Xt()))}#Te(){this.#Ie()}#Ke(t){if(t.button>0||this.#ie)return;let e,i,s=this[\"#lightness-slider-track\"].getBoundingClientRect();this.#ie=!0,this[\"#lightness-slider\"].setPointerCapture(t.pointerId),this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0}));let n=t=>{let e=(t-s.x)/s.width;\"oklab\"===this.#ze?e=ki(e,0,1):\"lab\"===this.#ze&&(e=ki(100*e,0,100)),e!==this.#ye[0]&&(this.#ye[0]=e,this.#hi(),this.#di(),this.#ci(),this.#ui(),this.#ai(),this.#Ge(),this.#Xe(),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})))};n(t.clientX),this[\"#lightness-slider\"].addEventListener(\"pointermove\",e=e=>{e.pointerId===t.pointerId&&n(e.clientX)}),this[\"#lightness-slider\"].addEventListener(\"pointerup\",i=()=>{this[\"#lightness-slider\"].removeEventListener(\"pointermove\",e),this[\"#lightness-slider\"].removeEventListener(\"pointerup\",i),this[\"#lightness-slider\"].removeEventListener(\"pointercancel\",i),this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0})),this.#ie=!1}),this[\"#lightness-slider\"].addEventListener(\"pointercancel\",i)}#oi(t){if(t.button>0||this.#ie)return;let e,i,s=this[\"#a-slider-track\"].getBoundingClientRect();this.#ie=!0,this[\"#a-slider\"].setPointerCapture(t.pointerId),this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0}));let n=t=>{let e=(t-s.x)/s.width;e=ki(e,0,1),\"oklab\"===this.#ze?e=.8*e-.4:\"lab\"===this.#ze&&(e=250*e-125),e!==this.#ye[1]&&(this.#ye[1]=e,this.#ei(),this.#ii(),this.#pi(),this.#ci(),this.#ui(),this.#Ge(),this.#Xe(),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})))};n(t.clientX),this[\"#a-slider\"].addEventListener(\"pointermove\",e=e=>{e.pointerId===t.pointerId&&n(e.clientX)}),this[\"#a-slider\"].addEventListener(\"pointerup\",i=()=>{this[\"#a-slider\"].removeEventListener(\"pointermove\",e),this[\"#a-slider\"].removeEventListener(\"pointerup\",i),this[\"#a-slider\"].removeEventListener(\"pointercancel\",i),this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0})),this.#ie=!1}),this[\"#a-slider\"].addEventListener(\"pointercancel\",i)}#li(t){if(t.button>0||this.#ie)return;let e,i,s=this[\"#b-slider-track\"].getBoundingClientRect();this.#ie=!0,this[\"#b-slider\"].setPointerCapture(t.pointerId),this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0}));let n=t=>{let e=(t-s.x)/s.width;e=ki(e,0,1),\"oklab\"===this.#ze?e=.8*e-.4:\"lab\"===this.#ze&&(e=250*e-125),e!==this.#ye[2]&&(this.#ye[2]=e,this.#ei(),this.#ii(),this.#hi(),this.#di(),this.#mi(),this.#ci(),this.#Ge(),this.#Xe(),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})))};n(t.clientX),this[\"#b-slider\"].addEventListener(\"pointermove\",e=e=>{e.pointerId===t.pointerId&&n(e.clientX)}),this[\"#b-slider\"].addEventListener(\"pointerup\",i=()=>{this[\"#b-slider\"].removeEventListener(\"pointermove\",e),this[\"#b-slider\"].removeEventListener(\"pointerup\",i),this[\"#b-slider\"].removeEventListener(\"pointercancel\",i),this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0})),this.#ie=!1}),this[\"#b-slider\"].addEventListener(\"pointercancel\",i)}#Re(t){if(t.button>0||this.#ie)return;let e,i,s=this[\"#alpha-slider-track\"].getBoundingClientRect();this.#ie=!0,this[\"#alpha-slider\"].setPointerCapture(t.pointerId),this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0}));let n=t=>{let e=(t-s.x)/s.width;e=ki(e,0,1),e!==this.#Ce&&(this.#Ce=e,this.#Ve(),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})))};n(t.clientX),this[\"#alpha-slider\"].addEventListener(\"pointermove\",e=e=>{e.pointerId===t.pointerId&&n(e.clientX)}),this[\"#alpha-slider\"].addEventListener(\"pointerup\",i=()=>{this[\"#alpha-slider\"].removeEventListener(\"pointermove\",e),this[\"#alpha-slider\"].removeEventListener(\"pointerup\",i),this[\"#alpha-slider\"].removeEventListener(\"pointercancel\",i),this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0})),this.#ie=!1}),this[\"#alpha-slider\"].addEventListener(\"pointercancel\",i)}#Xt(){this.#ai(),this.#ei(),this.#ii(),this.#pi(),this.#hi(),this.#di(),this.#mi(),this.#ci(),this.#ui(),this.#Ve(),this.#Ge(),this.#Xe(),this.#Be()}#ai(){let[t,e,i]=this.#ye;\"oklab\"===this.#ze?this[\"#lightness-slider-marker\"].style.left=100*t+\"%\":\"lab\"===this.#ze&&(this[\"#lightness-slider-marker\"].style.left=t+\"%\")}#ei(){let t=[],[e,i,s]=this.#ye;if(\"oklab\"===this.#ze)for(let e=0;e<=1;e+=.02)t.push({space:\"oklab\",coords:[e,i,s]});else if(\"lab\"===this.#ze)for(let e=0;e<=100;e+=2)t.push({space:\"lab\",coords:[e,i,s]});t=t.map((t=>bi(t))),this[\"#lightness-slider\"].style.background=`linear-gradient(in ${this.#ze} to right, ${t.join(\",\")})`}#ii(){if(\"none\"===this.#$e)this[\"#lightness-slider-gamut-path\"].removeAttribute(\"d\");else{let t=[];{let e=this[\"#lightness-slider\"].clientWidth,i=1/window.devicePixelRatio,[,s,n]=this.#ye,a=null;for(let r=0;r<=e;r+=i){let i,o=r/e;\"lab\"===this.#ze?i={space:this.#ze,coords:[100*o,s,n]}:\"oklab\"===this.#ze&&(i={space:this.#ze,coords:[o,s,n]}),se(i,this.#$e)?(null===a&&(a=[],t.push(a)),a.push(100*o)):a=null}t=t.map((t=>[t.at(0),t.at(-1)]))}if(t.length>0){let e=t.map((([t,e])=>`M ${t} 35 L ${t} 17 L ${e} 17 L ${e} 35`));this[\"#lightness-slider-gamut-path\"].setAttribute(\"d\",e.join(\" \"))}else this[\"#lightness-slider-gamut-path\"].removeAttribute(\"d\")}}#pi(){let[t,e,i]=this.#ye;\"oklab\"===this.#ze?this[\"#a-slider-marker\"].style.left=e<-.4?\"calc(0% - 18px)\":e>.4?\"calc(100% + 18px)\":(e+.4)/.8*100+\"%\":\"lab\"===this.#ze&&(this[\"#a-slider-marker\"].style.left=e<-125?\"calc(0% - 18px)\":e>125?\"calc(100% + 18px)\":(e+125)/250*100+\"%\")}#hi(){let[t,,e]=this.#ye,i=[];if(\"oklab\"===this.#ze)for(let s=-.4;s<=.4;s+=.05)i.push({space:\"oklab\",coords:[t,s,e]});else if(\"lab\"===this.#ze)for(let s=-125;s<=125;s+=5)i.push({space:\"lab\",coords:[t,s,e]});i=i.map((t=>bi(t))),this[\"#a-slider\"].style.background=`linear-gradient(in ${this.#ze} to right, ${i.join(\",\")})`}#di(){if(\"none\"===this.#$e)this[\"#a-slider-gamut-path\"].removeAttribute(\"d\");else{let t=[];{let e=this[\"#a-slider\"].clientWidth,i=1/window.devicePixelRatio,[s,,n]=this.#ye,a=null;for(let r=0;r<=e;r+=i){let i,o=r/e;\"lab\"===this.#ze?i={space:this.#ze,coords:[s,250*o-125,n]}:\"oklab\"===this.#ze&&(i={space:this.#ze,coords:[s,.8*o-.4,n]}),se(i,this.#$e)?(null===a&&(a=[],t.push(a)),a.push(100*o)):a=null}t=t.map((t=>[t.at(0),t.at(-1)]))}if(t.length>0){let e=t.map((([t,e])=>`M ${t} 35 L ${t} 17 L ${e} 17 L ${e} 35`));this[\"#a-slider-gamut-path\"].setAttribute(\"d\",e.join(\" \"))}else this[\"#a-slider-gamut-path\"].removeAttribute(\"d\")}}#mi(){let[t,e,i]=this.#ye;\"oklab\"===this.#ze?this[\"#b-slider-marker\"].style.left=i<-.4?\"calc(0% - 18px)\":i>.4?\"calc(100% + 18px)\":(i+.4)/.8*100+\"%\":\"lab\"===this.#ze&&(this[\"#b-slider-marker\"].style.left=i<-125?\"calc(0% - 18px)\":i>125?\"calc(100% + 18px)\":(i+125)/250*100+\"%\")}#ci(){let[t,e]=this.#ye,i=[];if(\"oklab\"===this.#ze)for(let s=-.4;s<=.4;s+=.05)i.push({space:\"oklab\",coords:[t,e,s]});else if(\"lab\"===this.#ze)for(let s=-125;s<=125;s+=5)i.push({space:\"lab\",coords:[t,e,s]});i=i.map((t=>bi(t))),this[\"#b-slider\"].style.background=`linear-gradient(in ${this.#ze} to right, ${i.join(\",\")})`}#ui(){if(\"none\"===this.#$e)this[\"#b-slider-gamut-path\"].removeAttribute(\"d\");else{let t=[];{let e=this[\"#b-slider\"].clientWidth,i=1/window.devicePixelRatio,[s,n]=this.#ye,a=null;for(let r=0;r<=e;r+=i){let i,o=r/e;\"lab\"===this.#ze?i={space:this.#ze,coords:[s,n,250*o-125]}:\"oklab\"===this.#ze&&(i={space:this.#ze,coords:[s,n,.8*o-.4]}),se(i,this.#$e)?(null===a&&(a=[],t.push(a)),a.push(100*o)):a=null}t=t.map((t=>[t.at(0),t.at(-1)]))}if(t.length>0){let e=t.map((([t,e])=>`M ${t} 35 L ${t} 17 L ${e} 17 L ${e} 35`));this[\"#b-slider-gamut-path\"].setAttribute(\"d\",e.join(\" \"))}else this[\"#b-slider-gamut-path\"].removeAttribute(\"d\")}}#Ve(){this[\"#alpha-slider-marker\"].style.left=100*this.#Ce+\"%\"}#Ge(){let[t,e,i]=this.#ye,s=[{space:this.#ze,coords:[t,e,i],alpha:0},{space:this.#ze,coords:[t,e,i],alpha:1}];s=s.map((t=>bi(t))),this[\"#alpha-slider-gradient\"].style.background=`linear-gradient(in ${this.#ze} to right, ${s.join(\",\")})`}#Xe(){if(\"none\"===this.#$e)this[\"#a-slider-marker\"].removeAttribute(\"data-warn\"),this[\"#b-slider-marker\"].removeAttribute(\"data-warn\"),this[\"#lightness-slider-marker\"].removeAttribute(\"data-warn\");else{se({space:this.#ze,coords:this.#ye},this.#$e)?(this[\"#a-slider-marker\"].removeAttribute(\"data-warn\"),this[\"#b-slider-marker\"].removeAttribute(\"data-warn\"),this[\"#lightness-slider-marker\"].removeAttribute(\"data-warn\")):(this[\"#a-slider-marker\"].setAttribute(\"data-warn\",\"\"),this[\"#b-slider-marker\"].setAttribute(\"data-warn\",\"\"),this[\"#lightness-slider-marker\"].setAttribute(\"data-warn\",\"\"))}}#Be(){this[\"#a-slider-label\"].hidden=!this.#Se,this[\"#b-slider-label\"].hidden=!this.#Se,this[\"#lightness-slider-label\"].hidden=!this.#Se,this[\"#alpha-slider-label\"].hidden=!this.#Se}#Ie(){for(let t of this[\"#gamut-hints-menu\"].querySelectorAll(\"x-menuitem\"))t.toggled=t.value===this.#$e;this[\"#labels-menu-item\"].toggled=this.#Se}}void 0===customElements.get(\"x-lablinearsliders\")&&customElements.define(\"x-lablinearsliders\",ya);class Ca extends HTMLElement{static#z=Ns`<template><div id=\"x-slider\" class=\"slider\" part=\"slider\"><div id=\"x-slider-track\" class=\"slider-track\"><svg id=\"x-slider-gamut-svg\" class=\"slider-gamut-svg\" viewBox=\"0 0 100 35\" preserveAspectRatio=\"none\"><path id=\"x-slider-gamut-path\" class=\"slider-gamut-path\"></path></svg><div id=\"x-slider-marker\" class=\"slider-marker\"><span id=\"x-slider-label\" class=\"slider-label\">X</span></div></div></div><div id=\"y-slider\" class=\"slider\" part=\"slider\"><div id=\"y-slider-track\" class=\"slider-track\"><svg id=\"y-slider-gamut-svg\" class=\"slider-gamut-svg\" viewBox=\"0 0 100 35\" preserveAspectRatio=\"none\"><path id=\"y-slider-gamut-path\" class=\"slider-gamut-path\"></path></svg><div id=\"y-slider-marker\" class=\"slider-marker\"><span id=\"y-slider-label\" class=\"slider-label\">Y</span></div></div></div><div id=\"z-slider\" class=\"slider\" part=\"slider\"><div id=\"z-slider-track\" class=\"slider-track\"><svg id=\"z-slider-gamut-svg\" class=\"slider-gamut-svg\" viewBox=\"0 0 100 35\" preserveAspectRatio=\"none\"><path id=\"z-slider-gamut-path\" class=\"slider-gamut-path\"></path></svg><div id=\"z-slider-marker\" class=\"slider-marker\"><span id=\"z-slider-label\" class=\"slider-label\">Z</span></div></div></div><div id=\"alpha-slider\" class=\"slider\" part=\"slider\"><div id=\"alpha-slider-gradient\"></div><div id=\"alpha-slider-track\" class=\"slider-track\"><div id=\"alpha-slider-marker\" class=\"slider-marker\"><span id=\"alpha-slider-label\" class=\"slider-label\">α</span></div></div></div><x-contextmenu id=\"context-menu\"><x-menu><x-menuitem><x-label><x-message href=\"#gamut-hints\" autocapitalize>Gamut Hints</x-message></x-label><x-menu id=\"gamut-hints-menu\"><x-menuitem value=\"none\"><x-label><x-message href=\"#gamut-hints.none\">None</x-message></x-label></x-menuitem><hr><x-menuitem value=\"srgb\" toggled><x-label>sRGB</x-label></x-menuitem><x-menuitem value=\"a98rgb\"><x-label>Adobe RGB</x-label></x-menuitem><x-menuitem value=\"p3\"><x-label>Display P3</x-label></x-menuitem><x-menuitem value=\"rec2020\"><x-label>Rec. 2020</x-label></x-menuitem><x-menuitem value=\"prophoto\"><x-label>ProPhoto RGB</x-label></x-menuitem></x-menu></x-menuitem><hr><x-menuitem id=\"labels-menu-item\" value=\"labels\"><x-label><x-message href=\"#labels\" autocapitalize>Labels</x-message></x-label></x-menuitem></x-menu></x-contextmenu></template>`;static#E=Fs`:host{display:block;user-select:none;-webkit-user-select:none;--marker-width: 18px;}:host([disabled]){pointer-events:none;opacity:0.5}.slider{width:100%;height:35px;margin-top:10px;padding:0 calc(var(--marker-width) / 2);box-sizing:border-box;touch-action:pinch-zoom}.slider-track{position:relative;width:100%;height:100%;display:flex;align-items:center}.slider-marker{position:absolute;left:0%;width:var(--marker-width);height:calc(100% + 6px);box-sizing:border-box;display:flex;align-items:center;justify-content:center;transform:translateX(calc((var(--marker-width) / 2) * -1));background:rgba(0, 0, 0, 0.2);border:3px solid white;box-shadow:0 0 3px black}.slider-marker[data-warn]::after{content:\"⚠\";position:absolute;right:-26px;color:rgba(255, 255, 255, 0.9);filter:drop-shadow(1px 1px 1px black);pointer-events:none;font-size:1.125rem}.slider-label{font-weight:700;color:rgba(255, 255, 255, 0.9);font-size:0.625rem}.slider-gamut-svg{width:100%;height:100%}.slider-gamut-path{fill:none;stroke:white;stroke-width:1px;vector-effect:non-scaling-stroke;stroke-dasharray:2px;opacity:0.8}#alpha-slider{display:none;margin-top:10px;position:relative;background:var(--checkboard-background)}:host([alpha]) #alpha-slider{display:block}#alpha-slider-gradient{position:absolute;top:0;left:0;width:100%;height:100%;border-radius:inherit}\n`;get value(){let[t,e,i]=this.#ye;return[t,e,i,this.#Ce]}set value([t,e,i,s]){this.#ye=[t,e,i],this.#Ce=s,this.#Xt()}get space(){return this.#ze}set space(t){this.#ze!==t&&(this.#ze=t,this.#Xt())}get alpha(){return this.hasAttribute(\"alpha\")}set alpha(t){t?this.setAttribute(\"alpha\",\"\"):this.removeAttribute(\"alpha\")}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}#$=null;#$t;#ie=!1;#ze=\"xyz-d65\";#$e=\"srgb\";#Se=!0;#ye=[0,0,0];#Ce=1;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.append(document.importNode(Ca.#z.content,!0)),this.#$.adoptedStyleSheets=[Gn.themeStyleSheet,Ca.#E];for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t;this[\"#x-slider\"].addEventListener(\"pointerdown\",(t=>this.#bi(t))),this[\"#y-slider\"].addEventListener(\"pointerdown\",(t=>this.#gi(t))),this[\"#z-slider\"].addEventListener(\"pointerdown\",(t=>this.#fi(t))),this[\"#alpha-slider\"].addEventListener(\"pointerdown\",(t=>this.#Re(t))),this[\"#context-menu\"].addEventListener(\"click\",(t=>this.#Pe(t))),this[\"#context-menu\"].addEventListener(\"open\",(t=>this.#Te(t)))}connectedCallback(){this.#$e=Os(Gn.getConfig(\"x-colorpicker:gamutHints\",\"srgb\"),\"color.js\"),this.#Se=Gn.getConfig(\"x-colorpicker:labels\",!0),Gn.addEventListener(\"configchange\",this.#$t=t=>this.#_t(t))}disconnectedCallback(){Gn.removeEventListener(\"configchange\",this.#$t)}#_t(t){let{key:e,value:i,origin:s}=t.detail;if(\"self\"===s)if(\"x-colorpicker:gamutHints\"===e){let t=Os(i||\"srgb\",\"color.js\");t!==this.#$e&&(this.#$e=t,this.#Xt())}else if(\"x-colorpicker:labels\"===e){let t=null!==i&&i;t!==this.#Se&&(this.#Se=t,this.#Be())}}#Pe(t){let e=t.target.closest(\"x-menuitem\");e&&(e.parentElement===this[\"#gamut-hints-menu\"]?e.value!==this.#$e&&(this.#$e=e.value,this.#Xt(),Gn.setConfig(\"x-colorpicker:gamutHints\",Os(this.#$e,\"css\"))):\"labels\"===e.value&&(this.#Se=!e.toggled,Gn.setConfig(\"x-colorpicker:labels\",this.#Se),this.#Xt()))}#Te(){this.#Ie()}#bi(t){if(t.button>0||this.#ie)return;let e,i,s=this[\"#x-slider-track\"].getBoundingClientRect();this.#ie=!0,this[\"#x-slider\"].setPointerCapture(t.pointerId),this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0}));let n=t=>{let e=(t-s.x)/s.width;e=ki(e,0,1),e!==this.#ye[0]&&(this.#ye[0]=e,this.#xi(),this.#wi(),this.#vi(),this.#ki(),this.#yi(),this.#Ge(),this.#Xe(),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})))};n(t.clientX),this[\"#x-slider\"].addEventListener(\"pointermove\",e=e=>{e.pointerId===t.pointerId&&n(e.clientX)}),this[\"#x-slider\"].addEventListener(\"pointerup\",i=()=>{this[\"#x-slider\"].removeEventListener(\"pointermove\",e),this[\"#x-slider\"].removeEventListener(\"pointerup\",i),this[\"#x-slider\"].removeEventListener(\"pointercancel\",i),this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0})),this.#ie=!1}),this[\"#x-slider\"].addEventListener(\"pointercancel\",i)}#gi(t){if(t.button>0||this.#ie)return;let e,i,s=this[\"#y-slider-track\"].getBoundingClientRect();this.#ie=!0,this[\"#y-slider\"].setPointerCapture(t.pointerId),this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0}));let n=t=>{let e=(t-s.x)/s.width;e=ki(e,0,1),e!==this.#ye[1]&&(this.#ye[1]=e,this.#Ci(),this.#zi(),this.#Ei(),this.#wi(),this.#ki(),this.#yi(),this.#Ge(),this.#Xe(),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})))};n(t.clientX),this[\"#y-slider\"].addEventListener(\"pointermove\",e=e=>{e.pointerId===t.pointerId&&n(e.clientX)}),this[\"#y-slider\"].addEventListener(\"pointerup\",i=()=>{this[\"#y-slider\"].removeEventListener(\"pointermove\",e),this[\"#y-slider\"].removeEventListener(\"pointerup\",i),this[\"#y-slider\"].removeEventListener(\"pointercancel\",i),this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0})),this.#ie=!1}),this[\"#y-slider\"].addEventListener(\"pointercancel\",i)}#fi(t){if(t.button>0||this.#ie)return;let e,i,s=this[\"#z-slider-track\"].getBoundingClientRect();this.#ie=!0,this[\"#z-slider\"].setPointerCapture(t.pointerId),this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0}));let n=t=>{let e=(t-s.x)/s.width;e=ki(e,0,1),e!==this.#ye[2]&&(this.#ye[2]=e,this.#Ci(),this.#zi(),this.#wi(),this.#vi(),this.#$i(),this.#ki(),this.#Ge(),this.#Xe(),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})))};n(t.clientX),this[\"#z-slider\"].addEventListener(\"pointermove\",e=e=>{e.pointerId===t.pointerId&&n(e.clientX)}),this[\"#z-slider\"].addEventListener(\"pointerup\",i=()=>{this[\"#z-slider\"].removeEventListener(\"pointermove\",e),this[\"#z-slider\"].removeEventListener(\"pointerup\",i),this[\"#z-slider\"].removeEventListener(\"pointercancel\",i),this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0})),this.#ie=!1}),this[\"#z-slider\"].addEventListener(\"pointercancel\",i)}#Re(t){if(t.button>0||this.#ie)return;let e,i,s=this[\"#alpha-slider-track\"].getBoundingClientRect();this.#ie=!0,this[\"#alpha-slider\"].setPointerCapture(t.pointerId),this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0}));let n=t=>{let e=(t-s.x)/s.width;e=ki(e,0,1),e!==this.#Ce&&(this.#Ce=e,this.#Ve(),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})))};n(t.clientX),this[\"#alpha-slider\"].addEventListener(\"pointermove\",e=e=>{e.pointerId===t.pointerId&&n(e.clientX)}),this[\"#alpha-slider\"].addEventListener(\"pointerup\",i=()=>{this[\"#alpha-slider\"].removeEventListener(\"pointermove\",e),this[\"#alpha-slider\"].removeEventListener(\"pointerup\",i),this[\"#alpha-slider\"].removeEventListener(\"pointercancel\",i),this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0})),this.#ie=!1}),this[\"#alpha-slider\"].addEventListener(\"pointercancel\",i)}#Xt(){this.#xi(),this.#Ci(),this.#zi(),this.#Ei(),this.#wi(),this.#vi(),this.#$i(),this.#ki(),this.#yi(),this.#Ve(),this.#Ge(),this.#Xe(),this.#Be()}#xi(){let[t]=this.#ye;this[\"#x-slider-marker\"].style.left=t<0?\"calc(0% - 18px)\":t>1?\"calc(100% + 18px)\":100*t+\"%\"}#Ci(){let[,t,e]=this.#ye,i=[];for(let s=0;s<=1;s+=.05)i.push({space:this.#ze,coords:[s,t,e]});i=i.map((t=>bi(t))),this[\"#x-slider\"].style.background=`linear-gradient(in ${this.#ze} to right, ${i.join(\",\")})`}#zi(){if(\"none\"===this.#$e)this[\"#x-slider-gamut-path\"].removeAttribute(\"d\");else{let t=[];{let e=this[\"#x-slider\"].clientWidth,i=1/window.devicePixelRatio,[,s,n]=this.#ye,a=null;for(let r=0;r<=e;r+=i){let i=r/e;se({space:this.#ze,coords:[i,s,n]},this.#$e)?(null===a&&(a=[],t.push(a)),a.push(100*i)):a=null}t=t.map((t=>[t.at(0),t.at(-1)]))}if(t.length>0){let e=t.map((([t,e])=>`M ${t} 35 L ${t} 17 L ${e} 17 L ${e} 35`));this[\"#x-slider-gamut-path\"].setAttribute(\"d\",e.join(\" \"))}else this[\"#x-slider-gamut-path\"].removeAttribute(\"d\")}}#Ei(){let[,t]=this.#ye;this[\"#y-slider-marker\"].style.left=t<0?\"calc(0% - 18px)\":t>1?\"calc(100% + 18px)\":100*t+\"%\"}#wi(){let[t,,e]=this.#ye,i=[];for(let s=0;s<=1;s+=.05)i.push({space:this.#ze,coords:[t,s,e]});i=i.map((t=>bi(t))),this[\"#y-slider\"].style.background=`linear-gradient(in ${this.#ze} to right, ${i.join(\",\")})`}#vi(){if(\"none\"===this.#$e)this[\"#y-slider-gamut-path\"].removeAttribute(\"d\");else{let t=[];{let e=this[\"#y-slider\"].clientWidth,i=1/window.devicePixelRatio,[s,,n]=this.#ye,a=null;for(let r=0;r<=e;r+=i){let i=r/e;se({space:this.#ze,coords:[s,i,n]},this.#$e)?(null===a&&(a=[],t.push(a)),a.push(100*i)):a=null}t=t.map((t=>[t.at(0),t.at(-1)]))}if(t.length>0){let e=t.map((([t,e])=>`M ${t} 35 L ${t} 17 L ${e} 17 L ${e} 35`));this[\"#y-slider-gamut-path\"].setAttribute(\"d\",e.join(\" \"))}else this[\"#y-slider-gamut-path\"].removeAttribute(\"d\")}}#$i(){let[,,t]=this.#ye;this[\"#z-slider-marker\"].style.left=t<0?\"calc(0% - 18px)\":t>1?\"calc(100% + 18px)\":100*t+\"%\"}#ki(){let[t,e]=this.#ye,i=[];for(let s=0;s<=1;s+=.05)i.push({space:this.#ze,coords:[t,e,s]});i=i.map((t=>bi(t))),this[\"#z-slider\"].style.background=`linear-gradient(in ${this.#ze} to right, ${i.join(\",\")})`}#yi(){if(\"none\"===this.#$e)this[\"#z-slider-gamut-path\"].removeAttribute(\"d\");else{let t=[];{let e=this[\"#z-slider\"].clientWidth,i=1/window.devicePixelRatio,[s,n]=this.#ye,a=null;for(let r=0;r<=e;r+=i){let i=r/e;se({space:this.#ze,coords:[s,n,i]},this.#$e)?(null===a&&(a=[],t.push(a)),a.push(100*i)):a=null}t=t.map((t=>[t.at(0),t.at(-1)]))}if(t.length>0){let e=t.map((([t,e])=>`M ${t} 35 L ${t} 17 L ${e} 17 L ${e} 35`));this[\"#z-slider-gamut-path\"].setAttribute(\"d\",e.join(\" \"))}else this[\"#z-slider-gamut-path\"].removeAttribute(\"d\")}}#Ve(){this[\"#alpha-slider-marker\"].style.left=100*this.#Ce+\"%\"}#Ge(){let[t,e,i]=this.#ye,s=[{space:this.#ze,coords:[t,e,i],alpha:0},{space:this.#ze,coords:[t,e,i],alpha:1}];s=s.map((t=>bi(t))),this[\"#alpha-slider-gradient\"].style.background=`linear-gradient(in ${this.#ze} to right, ${s.join(\",\")})`}#Xe(){if(\"none\"===this.#$e)this[\"#x-slider-marker\"].removeAttribute(\"data-warn\"),this[\"#y-slider-marker\"].removeAttribute(\"data-warn\"),this[\"#z-slider-marker\"].removeAttribute(\"data-warn\");else{se({space:this.#ze,coords:this.#ye},this.#$e)?(this[\"#x-slider-marker\"].removeAttribute(\"data-warn\"),this[\"#y-slider-marker\"].removeAttribute(\"data-warn\"),this[\"#z-slider-marker\"].removeAttribute(\"data-warn\")):(this[\"#x-slider-marker\"].setAttribute(\"data-warn\",\"\"),this[\"#y-slider-marker\"].setAttribute(\"data-warn\",\"\"),this[\"#z-slider-marker\"].setAttribute(\"data-warn\",\"\"))}}#Be(){this[\"#x-slider-label\"].hidden=!this.#Se,this[\"#y-slider-label\"].hidden=!this.#Se,this[\"#z-slider-label\"].hidden=!this.#Se,this[\"#alpha-slider-label\"].hidden=!this.#Se}#Ie(){for(let t of this[\"#gamut-hints-menu\"].querySelectorAll(\"x-menuitem\"))t.toggled=t.value===this.#$e;this[\"#labels-menu-item\"].toggled=this.#Se}}void 0===customElements.get(\"x-xyzlinearsliders\")&&customElements.define(\"x-xyzlinearsliders\",Ca);class za extends HTMLElement{static#z=Ns`<template><div id=\"hue-slider\" part=\"slider\"><div id=\"hue-slider-track\"><svg id=\"hue-slider-gamut-svg\" viewBox=\"0 0 100 35\" preserveAspectRatio=\"none\"><path id=\"hue-slider-gamut-path\"></path></svg><div id=\"hue-slider-marker\"><span id=\"hue-slider-label\">H</span></div></div></div><div id=\"planar-slider\" part=\"slider\"><svg id=\"planar-slider-gamut-svg\" viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\"><path id=\"planar-slider-gamut-path\"></path></svg><div id=\"planar-slider-marker\"></div></div><div id=\"alpha-slider\" part=\"slider\"><div id=\"alpha-slider-gradient\"></div><div id=\"alpha-slider-track\"><div id=\"alpha-slider-marker\"><span id=\"alpha-slider-label\">α</span></div></div></div><x-contextmenu id=\"context-menu\"><x-menu><x-menuitem><x-label><x-message href=\"#color-model\" autocapitalize>Color Model</x-message></x-label><x-menu id=\"color-model-menu\"><x-menuitem value=\"hsv\"><x-label>HSV</x-label></x-menuitem><x-menuitem value=\"hsl\"><x-label>HSL</x-label></x-menuitem></x-menu></x-menuitem><x-menuitem><x-label><x-message href=\"#gamut-hints\" autocapitalize>Gamut Hints</x-message></x-label><x-menu id=\"gamut-hints-menu\"><x-menuitem value=\"none\"><x-label><x-message href=\"#gamut-hints.none\">None</x-message></x-label></x-menuitem><hr><x-menuitem value=\"srgb\" toggled><x-label>sRGB</x-label></x-menuitem><x-menuitem value=\"a98rgb\"><x-label>Adobe RGB</x-label></x-menuitem><x-menuitem value=\"p3\"><x-label>Display P3</x-label></x-menuitem><x-menuitem value=\"rec2020\"><x-label>Rec. 2020</x-label></x-menuitem><x-menuitem value=\"prophoto\"><x-label>ProPhoto RGB</x-label></x-menuitem></x-menu></x-menuitem><hr><x-menuitem id=\"labels-menu-item\" value=\"labels\"><x-label><x-message href=\"#labels\" autocapitalize>Labels</x-message></x-label></x-menuitem></x-menu></x-contextmenu></template>`;static#E=Fs`:host{display:block;user-select:none;-webkit-user-select:none;--marker-width: 18px;}:host([disabled]){pointer-events:none;opacity:0.5}#hue-slider{width:100%;height:35px;padding:0 calc(var(--marker-width) / 2);box-sizing:border-box;touch-action:pinch-zoom}#hue-slider-track{position:relative;width:100%;height:100%;display:flex;align-items:center}#hue-slider-marker{position:absolute;left:0%;width:var(--marker-width);height:calc(100% + 6px);box-sizing:border-box;display:flex;align-items:center;justify-content:center;transform:translateX(calc((var(--marker-width) / 2) * -1));background:rgba(0, 0, 0, 0.2);border:3px solid white;box-shadow:0 0 3px black}#hue-slider-marker[data-warn]::after{content:\"⚠\";position:absolute;right:-26px;color:rgba(255, 255, 255, 0.9);filter:drop-shadow(1px 1px 1px black);pointer-events:none;font-size:1.125rem}#hue-slider-gamut-svg{width:100%;height:100%}#hue-slider-gamut-path{fill:none;stroke:white;stroke-width:1px;vector-effect:non-scaling-stroke;stroke-dasharray:2px;opacity:0.8}#hue-slider-label{font-weight:700;color:rgba(255, 255, 255, 0.9);font-size:0.625rem}#planar-slider{width:100%;height:200px;margin-top:10px;position:relative;touch-action:pinch-zoom}#planar-slider-marker{position:absolute;top:0%;left:0%;width:var(--marker-size);height:var(--marker-size);display:flex;align-items:center;justify-content:center;box-sizing:border-box;transform:translate(calc(var(--marker-size) / -2), calc(var(--marker-size) / -2));background:rgba(0, 0, 0, 0.3);border:3px solid white;border-radius:999px;box-shadow:0 0 3px black;--marker-size: 20px;}#planar-slider-marker[data-warn]::after{content:\"⚠\";position:absolute;top:-30px;color:rgba(255, 255, 255, 0.9);font-size:1.125rem;filter:drop-shadow(1px 1px 1px black);pointer-events:none}#planar-slider-gamut-svg{width:100%;height:100%}#planar-slider-gamut-path{fill:none;stroke:white;stroke-width:1px;vector-effect:non-scaling-stroke;stroke-dasharray:2px;opacity:0.8}#alpha-slider{display:none;width:100%;height:35px;margin-top:10px;padding:0 calc(var(--marker-width) / 2);position:relative;box-sizing:border-box;touch-action:pinch-zoom;background:var(--checkboard-background)}:host([alpha]) #alpha-slider{display:block}#alpha-slider-track{position:relative;width:100%;height:100%;display:flex;align-items:center}#alpha-slider-marker{position:absolute;left:0%;width:var(--marker-width);height:calc(100% + 6px);box-sizing:border-box;display:flex;align-items:center;justify-content:center;transform:translateX(calc((var(--marker-width) / 2) * -1));background:rgba(0, 0, 0, 0.2);border:3px solid white;box-shadow:0 0 3px black}#alpha-slider-gradient{position:absolute;top:0;left:0;width:100%;height:100%;border-radius:inherit}#alpha-slider-label{font-weight:700;color:rgba(255, 255, 255, 0.9);font-size:0.625rem}\n`;get value(){if(\"hsv\"===this.#Ee||\"hsl\"===this.#Ee){let[t,e,i]=this.#ye,[s,n,a]=mi({space:this.#Ee,coords:[360*t,100*e,100*i]},\"srgb\").coords;return[s,n,a,this.#Ce]}}set value([t,e,i,s]){if(\"hsv\"===this.#Ee||\"hsl\"===this.#Ee){let[n,a,r]=mi({space:\"srgb\",coords:[t,e,i]},this.#Ee).coords;this.#ye=[n/360,a/100,r/100],this.#Ce=s}for(let t=0;t<this.#ye.length;t+=1)(null===this.#ye[t]||ga(this.#ye[t]))&&(this.#ye[t]=0);this.#Xt()}get space(){return this.#ze}set space(t){this.#ze!==t&&(this.#ze=t,this.#Xt())}get alpha(){return this.hasAttribute(\"alpha\")}set alpha(t){t?this.setAttribute(\"alpha\",\"\"):this.removeAttribute(\"alpha\")}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}#$=null;#$t;#Si=new ResizeObserver((()=>this.#Mi()));#ie=!1;#ze=\"srgb\";#Ee=\"hsv\";#$e=\"srgb\";#Se=!0;#ye=[0,0,0];#Ce=1;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.append(document.importNode(za.#z.content,!0)),this.#$.adoptedStyleSheets=[Gn.themeStyleSheet,za.#E];for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t;this[\"#hue-slider\"].addEventListener(\"pointerdown\",(t=>this.#qe(t))),this[\"#planar-slider\"].addEventListener(\"pointerdown\",(t=>this.#Li(t))),this[\"#alpha-slider\"].addEventListener(\"pointerdown\",(t=>this.#Re(t))),this[\"#context-menu\"].addEventListener(\"click\",(t=>this.#Pe(t))),this[\"#context-menu\"].addEventListener(\"open\",(t=>this.#Te(t)))}connectedCallback(){this.#Ee=Gn.getConfig(`${this.localName}:model`,\"hsv\"),this.#$e=Os(Gn.getConfig(\"x-colorpicker:gamutHints\",\"srgb\"),\"color.js\"),this.#Se=Gn.getConfig(\"x-colorpicker:labels\",!0),this.#Si.observe(this),Gn.addEventListener(\"configchange\",this.#$t=t=>this.#_t(t))}disconnectedCallback(){this.#Si.unobserve(this),Gn.removeEventListener(\"configchange\",this.#$t)}#De(){return\"none\"===this.#$e||\"srgb\"===this.#$e&&[\"srgb\",\"srgb-linear\"].includes(this.#ze)||\"p3\"===this.#$e&&[\"srgb\",\"srgb-linear\",\"p3\"].includes(this.#ze)||\"a98rgb\"===this.#$e&&[\"srgb\",\"srgb-linear\",\"a98rgb\"].includes(this.#ze)||\"rec2020\"===this.#$e&&[\"srgb\",\"srgb-linear\",\"a98rgb\",\"p3\",\"rec2020\"].includes(this.#ze)||\"prophoto\"===this.#$e?\"none\":this.#$e}#_t(t){let{key:e,value:i,origin:s}=t.detail;if(\"self\"===s)if(e===`${this.localName}:model`){let t=i||\"hsv\";if(t!==this.#Ee){let[e,i,s]=this.value;this.#Ee=t,this.value=[e,i,s,this.#Ce]}}else if(\"x-colorpicker:gamutHints\"===e){let t=Os(i||\"srgb\",\"color.js\");t!==this.#$e&&(this.#$e=t,this.#Xt())}else if(\"x-colorpicker:labels\"===e){let t=null!==i&&i;t!==this.#Se&&(this.#Se=t,this.#Be())}}#Pe(t){let e=t.target.closest(\"x-menuitem\");if(e)if(e.parentElement===this[\"#gamut-hints-menu\"])e.value!==this.#$e&&(this.#$e=e.value,this.#Xt(),Gn.setConfig(\"x-colorpicker:gamutHints\",Os(this.#$e,\"css\")));else if(e.parentElement===this[\"#color-model-menu\"]){if(e.value!==this.#Ee){let[t,i,s]=this.value;this.#Ee=e.value,this.value=[t,i,s,this.#Ce],Gn.setConfig(`${this.localName}:model`,e.value)}}else\"labels\"===e.value&&(this.#Se=!e.toggled,Gn.setConfig(\"x-colorpicker:labels\",this.#Se),this.#Xt())}#Te(){this.#Ie()}#Mi(){this.#Ai()}#qe(t){if(t.button>0||this.#ie)return;let e,i,s=this[\"#hue-slider-track\"].getBoundingClientRect();this.#ie=!0,this[\"#hue-slider\"].setPointerCapture(t.pointerId),this[\"#planar-slider-gamut-path\"].style.transition=\"d 60ms ease\",this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0}));let n=t=>{let e=(t-s.x)/s.width;e=ki(e,0,1),e!==this.#ye[0]&&(this.#ye[0]=e,this.#Je(),this.#si(),this.#Ri(),this.#Pi(),this.#Ai(),this.#Ge(),this.#Xe(),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})))};n(t.clientX),this[\"#hue-slider\"].addEventListener(\"pointermove\",e=e=>{e.pointerId===t.pointerId&&n(e.clientX)}),this[\"#hue-slider\"].addEventListener(\"pointerup\",i=()=>{this[\"#hue-slider\"].removeEventListener(\"pointermove\",e),this[\"#hue-slider\"].removeEventListener(\"pointerup\",i),this[\"#hue-slider\"].removeEventListener(\"pointercancel\",i),this[\"#planar-slider-gamut-path\"].style.transition=\"none\",this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0})),this.#ie=!1}),this[\"#hue-slider\"].addEventListener(\"pointercancel\",i)}#Li(t){if(t.button>0||this.#ie)return;let e,i,s=this[\"#planar-slider\"].getBoundingClientRect();this.#ie=!0,this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0})),this[\"#planar-slider\"].setPointerCapture(t.pointerId);let n=(t,e)=>{let i=(t-s.left)/s.width,n=(e-s.top)/s.height;if(i=ki(i,0,1),n=ki(n,0,1),\"hsv\"===this.#Ee){let[t,e,s]=this.#ye;e=i,s=1-n,this.#ye=[t,e,s]}else if(\"hsl\"===this.#Ee){let[t,e,s]=this.#ye;e=i,s=1-n,this.#ye=[t,e,s]}this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})),this.#si(),this.#Ri(),this.#Ge(),this.#Xe()};n(t.clientX,t.clientY),this[\"#planar-slider\"].addEventListener(\"pointermove\",e=e=>{e.pointerId===t.pointerId&&n(e.clientX,e.clientY)}),this[\"#planar-slider\"].addEventListener(\"pointerup\",i=()=>{this[\"#planar-slider\"].removeEventListener(\"pointermove\",e),this[\"#planar-slider\"].removeEventListener(\"pointerup\",i),this[\"#planar-slider\"].removeEventListener(\"pointercancel\",i),this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0})),this.#ie=!1}),this[\"#planar-slider\"].addEventListener(\"pointercancel\",i)}#Re(t){if(t.button>0||this.#ie)return;let e,i,s=this[\"#alpha-slider-track\"].getBoundingClientRect();this.#ie=!0,this[\"#alpha-slider\"].setPointerCapture(t.pointerId),this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0}));let n=t=>{let e=(t-s.x)/s.width;e=ki(e,0,1),e!==this.#Ce&&(this.#Ce=e,this.#Ve(),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})))};n(t.clientX),this[\"#alpha-slider\"].addEventListener(\"pointermove\",e=e=>{e.pointerId===t.pointerId&&n(e.clientX)}),this[\"#alpha-slider\"].addEventListener(\"pointerup\",i=()=>{this[\"#alpha-slider\"].removeEventListener(\"pointermove\",e),this[\"#alpha-slider\"].removeEventListener(\"pointerup\",i),this[\"#alpha-slider\"].removeEventListener(\"pointercancel\",i),this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0})),this.#ie=!1}),this[\"#alpha-slider\"].addEventListener(\"pointercancel\",i)}#Xt(){this.#Je(),this.#ri(),this.#si(),this.#Ri(),this.#Pi(),this.#Ti(),this.#Ve(),this.#Ge(),this.#Xe(),this.#Be()}#Je(){if(\"hsv\"===this.#Ee||\"hsl\"===this.#Ee){let[t]=this.#ye;this[\"#hue-slider-marker\"].style.left=100*t+\"%\"}}#ri(){if(\"hsv\"===this.#Ee||\"hsl\"===this.#Ee){let t=\"srgb-linear\"===this.#ze?\"srgb-linear\":\"srgb\",e=[{space:this.#ze,coords:[1,0,0]},{space:this.#ze,coords:[1,1,0]},{space:this.#ze,coords:[0,1,0]},{space:this.#ze,coords:[0,1,1]},{space:this.#ze,coords:[0,0,1]},{space:this.#ze,coords:[1,0,1]},{space:this.#ze,coords:[1,0,0]}];e=e.map((t=>bi(t))).join(\",\"),this[\"#hue-slider\"].style.background=`linear-gradient(in ${t} to right, ${e})`}}#si(){let t=this.#De();if(\"none\"===t)this[\"#hue-slider-gamut-path\"].removeAttribute(\"d\");else if(\"hsv\"===this.#Ee||\"hsl\"===this.#Ee){let[e,i,s]=this.#ye,n=this[\"#hue-slider\"].clientWidth,a=1/window.devicePixelRatio,r=[];{let e=null;for(let o=0;o<=n;o+=a){let a=o/n;se({space:this.#ze,coords:mi({space:this.#Ee,coords:[360*a,100*i,100*s]},\"srgb\").coords},t)?(null===e&&(e=[],r.push(e)),e.push(100*a)):e=null}r=r.map((t=>[t.at(0),t.at(-1)]))}if(r.length>0){let t=r.map((([t,e])=>`M ${t} 35 L ${t} 17 L ${e} 17 L ${e} 35`));this[\"#hue-slider-gamut-path\"].setAttribute(\"d\",t.join(\" \"))}else this[\"#hue-slider-gamut-path\"].removeAttribute(\"d\")}}#Ri(){if(\"hsv\"===this.#Ee||\"hsl\"===this.#Ee){let[t,e,i]=this.#ye,s=100*e,n=100-100*i;this[\"#planar-slider-marker\"].style.left=`${s}%`,this[\"#planar-slider-marker\"].style.top=`${n}%`}}#Pi(){let[t]=this.#ye,e=\"srgb-linear\"===this.#ze?\"srgb-linear\":\"srgb\",i=\"srgb-linear\"===this.#ze?\"srgb\":this.#ze;if(\"hsv\"===this.#Ee){let s=[{space:this.#ze,coords:mi({space:\"hsv\",coords:[360*t,0,100]},i).coords},{space:this.#ze,coords:mi({space:\"hsv\",coords:[360*t,100,100]},i).coords}],n=[{space:this.#ze,coords:mi({space:\"hsv\",coords:[360*t,0,100]},i).coords},{space:this.#ze,coords:mi({space:\"hsv\",coords:[360*t,0,0]},i).coords}];this[\"#planar-slider\"].style.background=`\\n        linear-gradient(in ${e} to bottom, ${n.map((t=>bi(t))).join(\",\")}),\\n        linear-gradient(in ${e} to right,  ${s.map((t=>bi(t))).join(\",\")})\\n      `,this[\"#planar-slider\"].style.backgroundBlendMode=\"multiply, normal\"}else if(\"hsl\"===this.#Ee){let s=[{space:this.#ze,coords:mi({space:\"hsl\",coords:[360*t,0,50]},i).coords},{space:this.#ze,coords:mi({space:\"hsl\",coords:[360*t,100,50]},i).coords}],n=[{space:this.#ze,coords:mi({space:\"hsl\",coords:[360*t,0,100]},i).coords},{space:this.#ze,coords:mi({space:\"hsl\",coords:[360*t,0,100]},i).coords},{space:this.#ze,coords:mi({space:\"hsl\",coords:[360*t,0,0]},i).coords}],a=[{space:this.#ze,coords:mi({space:\"hsl\",coords:[360*t,0,100]},i).coords},{space:this.#ze,coords:mi({space:\"hsl\",coords:[360*t,0,0]},i).coords,alpha:0},{space:this.#ze,coords:mi({space:\"hsl\",coords:[360*t,0,0]},i).coords,alpha:0}];s=s.map((t=>bi(t))),n=n.map((t=>bi(t))),a=a.map((t=>bi(t))),this[\"#planar-slider\"].style.background=`\\n        linear-gradient(in ${e} to bottom, ${a.join(\",\")}),\\n        linear-gradient(in ${e} to bottom, ${n.join(\",\")}),\\n        linear-gradient(in ${e} to right, ${s.join(\",\")})\\n      `,this[\"#planar-slider\"].style.backgroundBlendMode=\"normal, multiply, normal\"}}#Ti(){let t=this.#De();if(\"none\"===t)this[\"#planar-slider-gamut-path\"].removeAttribute(\"d\");else{let e=this[\"#planar-slider\"].clientWidth,i=this[\"#planar-slider\"].clientHeight,s=1/window.devicePixelRatio,[n]=this.#ye,a=[],r=(e,i,s)=>se({space:this.#ze,coords:mi({space:this.#Ee,coords:[360*e,100*i,100*s]},\"srgb\").coords},t);if(\"hsv\"===this.#Ee){let t=0;for(let o=0;o<i;o+=s)for(;t<=e;){if(!1===r(n,t/e,1-o/i)){a.push([t,o]);break}t+=s}a.length>0&&a.at(-1)[0]<e&&a.push([e,a.at(-1)[1]])}else if(\"hsl\"===this.#Ee)for(let t=0;t<i;t+=s){let o=e;for(;o>=0&&!r(n,o/e,1-t/i);)o-=10;let l=ma(o+10,e);for(;o<=l&&(o+=s,!1!==r(n,o/e,1-t/i)););a.push([o,t])}if(0===a.length)this[\"#planar-slider-gamut-path\"].removeAttribute(\"d\");else{let t=a.map((([t,e],i)=>`${0===i?\"M\":\"L\"} ${t} ${e}`)).join(\" \");this[\"#planar-slider-gamut-path\"].setAttribute(\"d\",t),this[\"#planar-slider-gamut-svg\"].setAttribute(\"viewBox\",`0 0 ${e} ${i}`)}}}#Ai=Fn(this.#Ti,40,this);#Ve(){this[\"#alpha-slider-marker\"].style.left=100*this.#Ce+\"%\"}#Ge(){if(\"hsv\"===this.#Ee||\"hsl\"===this.#Ee){let[t,e,i]=this.#ye,s=\"srgb-linear\"===this.#ze?\"srgb\":this.#ze,n=[{space:this.#ze,coords:mi({space:this.#Ee,coords:[360*t,100*e,100*i]},s).coords,alpha:0},{space:this.#ze,coords:mi({space:this.#Ee,coords:[360*t,100*e,100*i]},s).coords,alpha:1}];n=n.map((t=>bi(t))).join(\",\"),this[\"#alpha-slider-gradient\"].style.background=`linear-gradient(in srgb to right, ${n})`}}#Xe(){let t=this.#De();if(\"none\"===t)this[\"#hue-slider-marker\"].removeAttribute(\"data-warn\"),this[\"#planar-slider-marker\"].removeAttribute(\"data-warn\");else if(\"hsv\"===this.#Ee||\"hsl\"===this.#Ee){let[e,i,s]=this.#ye;se({space:this.#ze,coords:mi({space:this.#Ee,coords:[360*e,100*i,100*s]},\"srgb\").coords},t)?(this[\"#hue-slider-marker\"].removeAttribute(\"data-warn\"),this[\"#planar-slider-marker\"].removeAttribute(\"data-warn\")):(this[\"#hue-slider-marker\"].setAttribute(\"data-warn\",\"\"),this[\"#planar-slider-marker\"].setAttribute(\"data-warn\",\"\"))}}#Be(){this[\"#hue-slider-label\"].hidden=!this.#Se,this[\"#alpha-slider-label\"].hidden=!this.#Se}#Ie(){for(let t of this[\"#color-model-menu\"].querySelectorAll(\"x-menuitem\"))t.toggled=t.value===this.#Ee;for(let t of this[\"#gamut-hints-menu\"].querySelectorAll(\"x-menuitem\"))t.toggled=t.value===this.#$e;this[\"#labels-menu-item\"].toggled=this.#Se}}void 0===customElements.get(\"x-rgbplanarsliders\")&&customElements.define(\"x-rgbplanarsliders\",za);class Ea extends HTMLElement{static#z=Ns`<template><div id=\"hue-slider\" part=\"slider\"><div id=\"hue-slider-track\"><svg id=\"hue-slider-gamut-svg\" viewBox=\"0 0 100 35\" preserveAspectRatio=\"none\"><path id=\"hue-slider-gamut-path\"></path></svg><div id=\"hue-slider-marker\"><span id=\"hue-slider-label\">H</span></div></div></div><div id=\"planar-slider\" part=\"slider\"><canvas id=\"planar-slider-canvas\" width=\"100\" height=\"100\"></canvas><svg id=\"planar-slider-gamut-svg\" viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\"><path id=\"planar-slider-gamut-path\"></path></svg><div id=\"planar-slider-marker\"></div></div><div id=\"alpha-slider\" part=\"slider\"><div id=\"alpha-slider-gradient\"></div><div id=\"alpha-slider-track\"><div id=\"alpha-slider-marker\"><span id=\"alpha-slider-label\">α</span></div></div></div><x-contextmenu id=\"context-menu\"><x-menu><x-menuitem><x-label><x-message href=\"#gamut-hints\" autocapitalize>Gamut Hints</x-message></x-label><x-menu id=\"gamut-hints-menu\"><x-menuitem value=\"none\"><x-label><x-message href=\"#gamut-hints.none\">None</x-message></x-label></x-menuitem><hr><x-menuitem value=\"srgb\" toggled><x-label>sRGB</x-label></x-menuitem><x-menuitem value=\"a98rgb\"><x-label>Adobe RGB</x-label></x-menuitem><x-menuitem value=\"p3\"><x-label>Display P3</x-label></x-menuitem><x-menuitem value=\"rec2020\"><x-label>Rec. 2020</x-label></x-menuitem><x-menuitem value=\"prophoto\"><x-label>ProPhoto RGB</x-label></x-menuitem></x-menu></x-menuitem><hr><x-menuitem id=\"labels-menu-item\" value=\"labels\"><x-label><x-message href=\"#labels\" autocapitalize>Labels</x-message></x-label></x-menuitem></x-menu></x-contextmenu></template>`;static#E=Fs`:host{display:block;user-select:none;-webkit-user-select:none;--marker-width: 18px;}:host([disabled]){pointer-events:none;opacity:0.5}#hue-slider{width:100%;height:35px;padding:0 calc(var(--marker-width) / 2);box-sizing:border-box;touch-action:pinch-zoom}#hue-slider-track{position:relative;width:100%;height:100%;display:flex;align-items:center}#hue-slider-marker{position:absolute;left:0%;width:var(--marker-width);height:calc(100% + 6px);box-sizing:border-box;display:flex;align-items:center;justify-content:center;transform:translateX(calc((var(--marker-width) / 2) * -1));background:rgba(0, 0, 0, 0.2);border:3px solid white;box-shadow:0 0 3px black}#hue-slider-marker[data-warn]::after{content:\"⚠\";position:absolute;right:-26px;color:rgba(255, 255, 255, 0.9);filter:drop-shadow(1px 1px 1px black);pointer-events:none;font-size:1.125rem}#hue-slider-gamut-svg{width:100%;height:100%}#hue-slider-gamut-path{fill:none;stroke:white;stroke-width:1px;vector-effect:non-scaling-stroke;stroke-dasharray:2px;opacity:0.8}#hue-slider-label{font-weight:700;color:rgba(255, 255, 255, 0.9);font-size:0.625rem}#planar-slider{width:100%;height:200px;margin-top:10px;position:relative;touch-action:pinch-zoom}#planar-slider-marker{position:absolute;top:0%;left:0%;width:var(--marker-size);height:var(--marker-size);display:flex;align-items:center;justify-content:center;box-sizing:border-box;transform:translate(calc(var(--marker-size) / -2), calc(var(--marker-size) / -2));background:rgba(0, 0, 0, 0.3);border:3px solid white;border-radius:999px;box-shadow:0 0 3px black;--marker-size: 20px;}#planar-slider-marker[data-warn]::after{content:\"⚠\";position:absolute;top:-30px;color:rgba(255, 255, 255, 0.9);font-size:1.125rem;filter:drop-shadow(1px 1px 1px black);pointer-events:none}#planar-slider-canvas{position:absolute;width:100%;height:100%;overflow:hidden;border-radius:inherit}#planar-slider-gamut-svg{position:absolute;top:0;left:0;width:100%;height:100%}#planar-slider-gamut-path{fill:none;stroke:white;stroke-width:1px;vector-effect:non-scaling-stroke;stroke-dasharray:2px;opacity:0.8}#alpha-slider{display:none;width:100%;height:35px;margin-top:10px;padding:0 calc(var(--marker-width) / 2);position:relative;box-sizing:border-box;touch-action:pinch-zoom;background:var(--checkboard-background)}:host([alpha]) #alpha-slider{display:block}#alpha-slider-track{position:relative;width:100%;height:100%;display:flex;align-items:center}#alpha-slider-marker{position:absolute;left:0%;width:var(--marker-width);height:calc(100% + 6px);box-sizing:border-box;display:flex;align-items:center;justify-content:center;transform:translateX(calc((var(--marker-width) / 2) * -1));background:rgba(0, 0, 0, 0.2);border:3px solid white;box-shadow:0 0 3px black}#alpha-slider-gradient{position:absolute;top:0;left:0;width:100%;height:100%;border-radius:inherit}#alpha-slider-label{font-weight:700;color:rgba(255, 255, 255, 0.9);font-size:0.625rem}\n`;get value(){let[t,e,i]=this.#ye;return[t,e,i,this.#Ce]}set value([t,e,i,s]){this.#ye=[t,e,i],this.#Ce=s,this.#Xt()}get space(){return this.#ze}set space(t){this.#ze!==t&&(this.#ze=t,this.#Xt())}get alpha(){return this.hasAttribute(\"alpha\")}set alpha(t){t?this.setAttribute(\"alpha\",\"\"):this.removeAttribute(\"alpha\")}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}#$=null;#$t;#Si=new ResizeObserver((()=>this.#Mi()));#ie=!1;#ze=\"lch\";#$e=\"srgb\";#Se=!0;#ye=[0,0,0];#Ce=1;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.append(document.importNode(Ea.#z.content,!0)),this.#$.adoptedStyleSheets=[Gn.themeStyleSheet,Ea.#E];for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t;this[\"#hue-slider\"].addEventListener(\"pointerdown\",(t=>this.#qe(t))),this[\"#planar-slider\"].addEventListener(\"pointerdown\",(t=>this.#Li(t))),this[\"#alpha-slider\"].addEventListener(\"pointerdown\",(t=>this.#Re(t))),this[\"#context-menu\"].addEventListener(\"click\",(t=>this.#Pe(t))),this[\"#context-menu\"].addEventListener(\"open\",(t=>this.#Te(t)))}connectedCallback(){this.#$e=Os(Gn.getConfig(\"x-colorpicker:gamutHints\",\"srgb\"),\"color.js\"),this.#Se=Gn.getConfig(\"x-colorpicker:labels\",!0),this.#Si.observe(this),Gn.addEventListener(\"configchange\",this.#$t=t=>this.#_t(t))}disconnectedCallback(){this.#Si.unobserve(this),Gn.removeEventListener(\"configchange\",this.#$t)}#_t(t){let{key:e,value:i,origin:s}=t.detail;if(\"self\"===s)if(\"x-colorpicker:gamutHints\"===e){let t=Os(i||\"srgb\",\"color.js\");t!==this.#$e&&(this.#$e=t,this.#Xt())}else if(\"x-colorpicker:labels\"===e){let t=null!==i&&i;t!==this.#Se&&(this.#Se=t,this.#Be())}}#Pe(t){let e=t.target.closest(\"x-menuitem\");e&&(e.parentElement===this[\"#gamut-hints-menu\"]?e.value!==this.#$e&&(this.#$e=e.value,this.#Xt(),Gn.setConfig(\"x-colorpicker:gamutHints\",Os(this.#$e,\"css\"))):\"labels\"===e.value&&(this.#Se=!e.toggled,Gn.setConfig(\"x-colorpicker:labels\",this.#Se),this.#Xt()))}#Te(){this.#Ie()}#Mi(){this.#Ai()}#qe(t){if(t.button>0||this.#ie)return;let e,i,s=this[\"#hue-slider-track\"].getBoundingClientRect();this.#ie=!0,this[\"#hue-slider\"].setPointerCapture(t.pointerId),this[\"#planar-slider-gamut-path\"].style.transition=\"d 60ms ease\",this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0}));let n=t=>{let e=(t-s.x)/s.width;e=ki(e,0,1),360*e!==this.#ye[2]&&(this.#ye[2]=360*e,this.#Je(),this.#si(),this.#Ri(),this.#Pi(),this.#Ai(),this.#Ge(),this.#Xe(),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})))};n(t.clientX),this[\"#hue-slider\"].addEventListener(\"pointermove\",e=e=>{e.pointerId===t.pointerId&&n(e.clientX)}),this[\"#hue-slider\"].addEventListener(\"pointerup\",i=()=>{this[\"#hue-slider\"].removeEventListener(\"pointermove\",e),this[\"#hue-slider\"].removeEventListener(\"pointerup\",i),this[\"#hue-slider\"].removeEventListener(\"pointercancel\",i),this[\"#planar-slider-gamut-path\"].style.transition=\"none\",this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0})),this.#ie=!1}),this[\"#hue-slider\"].addEventListener(\"pointercancel\",i)}#Li(t){if(t.button>0||this.#ie)return;let e,i,s=this[\"#planar-slider\"].getBoundingClientRect();this.#ie=!0,this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0})),this[\"#planar-slider\"].setPointerCapture(t.pointerId);let n=(t,e)=>{let i=(t-s.left)/s.width,n=(e-s.top)/s.height;i=ki(i,0,1),n=ki(n,0,1);let[a,r,o]=this.#ye;\"lch\"===this.#ze?(a=100*i,r=(1-n)*fa):\"oklch\"===this.#ze&&(a=i,r=(1-n)*xa),this.#ye=[a,r,o],this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})),this.#si(),this.#Ri(),this.#Ge(),this.#Xe()};n(t.clientX,t.clientY),this[\"#planar-slider\"].addEventListener(\"pointermove\",e=e=>{e.pointerId===t.pointerId&&n(e.clientX,e.clientY)}),this[\"#planar-slider\"].addEventListener(\"pointerup\",i=()=>{this[\"#planar-slider\"].removeEventListener(\"pointermove\",e),this[\"#planar-slider\"].removeEventListener(\"pointerup\",i),this[\"#planar-slider\"].removeEventListener(\"pointercancel\",i),this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0})),this.#ie=!1}),this[\"#planar-slider\"].addEventListener(\"pointercancel\",i)}#Re(t){if(t.button>0||this.#ie)return;let e,i,s=this[\"#alpha-slider-track\"].getBoundingClientRect();this.#ie=!0,this[\"#alpha-slider\"].setPointerCapture(t.pointerId),this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0}));let n=t=>{let e=(t-s.x)/s.width;e=ki(e,0,1),e!==this.#Ce&&(this.#Ce=e,this.#Ve(),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})))};n(t.clientX),this[\"#alpha-slider\"].addEventListener(\"pointermove\",e=e=>{e.pointerId===t.pointerId&&n(e.clientX)}),this[\"#alpha-slider\"].addEventListener(\"pointerup\",i=()=>{this[\"#alpha-slider\"].removeEventListener(\"pointermove\",e),this[\"#alpha-slider\"].removeEventListener(\"pointerup\",i),this[\"#alpha-slider\"].removeEventListener(\"pointercancel\",i),this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0})),this.#ie=!1}),this[\"#alpha-slider\"].addEventListener(\"pointercancel\",i)}#Xt(){this.#Je(),this.#ri(),this.#si(),this.#Ri(),this.#Pi(),this.#Ti(),this.#Ve(),this.#Ge(),this.#Xe(),this.#Be()}#Je(){let[t,e,i]=this.#ye;this[\"#hue-slider-marker\"].style.left=i/360*100+\"%\"}#ri(){let t=[];if(\"oklch\"===this.#ze)for(let e=0;e<=360;e+=5)t.push({space:\"oklch\",coords:[.8,xa,e]});else if(\"lch\"===this.#ze)for(let e=0;e<=360;e+=5)t.push({space:\"lch\",coords:[75,fa,e]});t=t.map((t=>bi(t))),this[\"#hue-slider\"].style.background=`linear-gradient(in ${this.#ze} to right, ${t.join(\",\")})`}#si(){if(\"none\"===this.#$e)this[\"#hue-slider-gamut-path\"].removeAttribute(\"d\");else{let[t,e]=this.#ye,i=this[\"#hue-slider\"].clientWidth,s=1/window.devicePixelRatio,n=[];{let a=null;for(let r=0;r<=i;r+=s){let s,o=r/i;\"lch\"===this.#ze?s={space:\"lch\",coords:[t,e,360*o]}:\"oklch\"===this.#ze&&(s={space:\"oklch\",coords:[t,e,360*o]}),se(s,this.#$e)?(null===a&&(a=[],n.push(a)),a.push(100*o)):a=null}n=n.map((t=>[t.at(0),t.at(-1)]))}if(n.length>0){let t=n.map((([t,e])=>`M ${t} 35 L ${t} 17 L ${e} 17 L ${e} 35`));this[\"#hue-slider-gamut-path\"].setAttribute(\"d\",t.join(\" \"))}else this[\"#hue-slider-gamut-path\"].removeAttribute(\"d\")}}#Ri(){if(\"lch\"===this.#ze){let[t,e]=this.#ye,i=t,s=100-e/fa*100;this[\"#planar-slider-marker\"].style.left=`${i}%`,this[\"#planar-slider-marker\"].style.top=`${s}%`}else if(\"oklch\"===this.#ze){let[t,e]=this.#ye,i=100*t,s=100-e/xa*100;this[\"#planar-slider-marker\"].style.left=`${i}%`,this[\"#planar-slider-marker\"].style.top=`${s}%`}}#Pi(){let t=this[\"#planar-slider-canvas\"],e=t.getContext(\"2d\",{colorSpace:\"display-p3\"}),{width:i,height:s}=t,[,,n]=this.#ye;e.clearRect(0,0,t.width,t.height);for(let t=0;t<=i;t+=1){let a=[];for(let e=0;e<=s;e+=10){let r,o=t/i,l=1-e/s;\"lch\"===this.#ze?r={space:\"lch\",coords:[100*o,l*fa,n]}:\"oklch\"===this.#ze&&(r={space:\"oklch\",coords:[o,l*xa,n]}),a.push(r)}let r=e.createLinearGradient(t,0,i,s);for(let t=0;t<a.length;t+=1){let e=a[t];r.addColorStop(t/a.length,bi(e))}e.fillStyle=r,e.fillRect(t,0,1,s)}}#Ti(){if(\"none\"===this.#$e)this[\"#planar-slider-gamut-path\"].removeAttribute(\"d\");else{let t=this.clientWidth,e=this.clientHeight,i=1/window.devicePixelRatio,[,,s]=this.#ye,n=[],a=(t,e,i)=>{let s;return\"lch\"===this.#ze?s={space:\"lch\",coords:[100*t,e*fa,i]}:\"oklch\"===this.#ze&&(s={space:\"oklch\",coords:[t,e*xa,i]}),se(s,this.#$e)};for(let r=0;r<=t;r+=i){let o=e;for(;o>=0&&a(r/t,1-o/e,s);)o-=10;let l=ba(o+10,e);for(;o<=l&&(o+=i,!a(r/t,1-o/e,s)););n.push([r,o])}if(0===n.length)this[\"#planar-slider-gamut-path\"].removeAttribute(\"d\");else{let i=n.map((([t,e],i)=>`${0===i?\"M\":\"L\"} ${t} ${e}`)).join(\" \");this[\"#planar-slider-gamut-path\"].setAttribute(\"d\",i),this[\"#planar-slider-gamut-svg\"].setAttribute(\"viewBox\",`0 0 ${t} ${e}`)}}}#Ai=Fn(this.#Ti,40,this);#Ve(){this[\"#alpha-slider-marker\"].style.left=100*this.#Ce+\"%\"}#Ge(){let[t,e,i]=this.#ye,s=[{space:this.#ze,coords:[t,e,i],alpha:0},{space:this.#ze,coords:[t,e,i],alpha:1}];s=s.map((t=>bi(t))),this[\"#alpha-slider-gradient\"].style.background=`linear-gradient(in ${this.#ze} to right, ${s.join(\",\")})`}#Xe(){if(\"none\"===this.#$e)this[\"#hue-slider-marker\"].removeAttribute(\"data-warn\"),this[\"#planar-slider-marker\"].removeAttribute(\"data-warn\");else{se({space:this.#ze,coords:[...this.#ye]},this.#$e)?(this[\"#hue-slider-marker\"].removeAttribute(\"data-warn\"),this[\"#planar-slider-marker\"].removeAttribute(\"data-warn\")):(this[\"#hue-slider-marker\"].setAttribute(\"data-warn\",\"\"),this[\"#planar-slider-marker\"].setAttribute(\"data-warn\",\"\"))}}#Be(){this[\"#hue-slider-label\"].hidden=!this.#Se,this[\"#alpha-slider-label\"].hidden=!this.#Se}#Ie(){for(let t of this[\"#gamut-hints-menu\"].querySelectorAll(\"x-menuitem\"))t.toggled=t.value===this.#$e;this[\"#labels-menu-item\"].toggled=this.#Se}}void 0===customElements.get(\"x-lchplanarsliders\")&&customElements.define(\"x-lchplanarsliders\",Ea);class $a extends HTMLElement{static#z=Ns`<template><div id=\"lightness-slider\" class=\"slider\" part=\"slider\"><div id=\"lightness-slider-track\" class=\"slider-track\"><svg id=\"lightness-slider-gamut-svg\" class=\"slider-gamut-svg\" viewBox=\"0 0 100 35\" preserveAspectRatio=\"none\"><path id=\"lightness-slider-gamut-path\" class=\"slider-gamut-path\"></path></svg><div id=\"lightness-slider-marker\" class=\"slider-marker\"><span id=\"lightness-slider-label\" class=\"slider-label\">L</span></div></div></div><div id=\"planar-slider\" part=\"slider\"><canvas id=\"planar-slider-canvas\" width=\"100\" height=\"100\"></canvas><svg id=\"planar-slider-gamut-svg\" viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\"><path id=\"planar-slider-gamut-path\"></path></svg><div id=\"planar-slider-marker\"></div></div><div id=\"alpha-slider\" part=\"slider\"><div id=\"alpha-slider-gradient\"></div><div id=\"alpha-slider-track\"><div id=\"alpha-slider-marker\"><span id=\"alpha-slider-label\">α</span></div></div></div><x-contextmenu id=\"context-menu\"><x-menu><x-menuitem><x-label><x-message href=\"#gamut-hints\" autocapitalize>Gamut Hints</x-message></x-label><x-menu id=\"gamut-hints-menu\"><x-menuitem value=\"none\"><x-label><x-message href=\"#gamut-hints.none\">None</x-message></x-label></x-menuitem><hr><x-menuitem value=\"srgb\" toggled><x-label>sRGB</x-label></x-menuitem><x-menuitem value=\"a98rgb\"><x-label>Adobe RGB</x-label></x-menuitem><x-menuitem value=\"p3\"><x-label>Display P3</x-label></x-menuitem><x-menuitem value=\"rec2020\"><x-label>Rec. 2020</x-label></x-menuitem><x-menuitem value=\"prophoto\"><x-label>ProPhoto RGB</x-label></x-menuitem></x-menu></x-menuitem><hr><x-menuitem id=\"labels-menu-item\" value=\"labels\"><x-label><x-message href=\"#labels\" autocapitalize>Labels</x-message></x-label></x-menuitem></x-menu></x-contextmenu></template>`;static#E=Fs`:host{display:block;user-select:none;-webkit-user-select:none;--marker-width: 18px;}:host([disabled]){pointer-events:none;opacity:0.5}#lightness-slider{width:100%;height:35px;margin-top:10px;padding:0 calc(var(--marker-width) / 2);box-sizing:border-box;touch-action:pinch-zoom}#lightness-slider-track{position:relative;width:100%;height:100%;display:flex;align-items:center}#lightness-slider-marker{position:absolute;left:0%;width:var(--marker-width);height:calc(100% + 6px);box-sizing:border-box;display:flex;align-items:center;justify-content:center;transform:translateX(calc((var(--marker-width) / 2) * -1));background:rgba(0, 0, 0, 0.2);border:3px solid white;box-shadow:0 0 3px black}#lightness-slider-marker[data-warn]::after{content:\"⚠\";position:absolute;right:-26px;color:rgba(255, 255, 255, 0.9);filter:drop-shadow(1px 1px 1px black);pointer-events:none;font-size:1.125rem}#lightness-slider-gamut-svg{width:100%;height:100%}#lightness-slider-gamut-path{fill:none;stroke:white;stroke-width:1px;vector-effect:non-scaling-stroke;stroke-dasharray:2px;opacity:0.8}#lightness-slider-label{font-weight:700;color:rgba(255, 255, 255, 0.9);font-size:0.625rem}#planar-slider{width:100%;height:200px;margin-top:10px;position:relative;touch-action:pinch-zoom}#planar-slider-marker{position:absolute;top:0%;left:0%;width:var(--marker-size);height:var(--marker-size);display:flex;align-items:center;justify-content:center;box-sizing:border-box;transform:translate(calc(var(--marker-size) / -2), calc(var(--marker-size) / -2));background:rgba(0, 0, 0, 0.3);border:3px solid white;border-radius:999px;box-shadow:0 0 3px black;--marker-size: 20px;}#planar-slider-marker[data-warn]::after{content:\"⚠\";position:absolute;top:-30px;color:rgba(255, 255, 255, 0.9);font-size:1.125rem;filter:drop-shadow(1px 1px 1px black);pointer-events:none}#planar-slider-canvas{position:absolute;width:100%;height:100%;overflow:hidden;border-radius:inherit}#planar-slider-gamut-svg{position:absolute;top:0;left:0;width:100%;height:100%}#planar-slider-gamut-path{fill:none;stroke:white;stroke-width:1px;vector-effect:non-scaling-stroke;stroke-dasharray:2px;opacity:0.8}#alpha-slider{display:none;width:100%;height:35px;margin-top:10px;padding:0 calc(var(--marker-width) / 2);position:relative;box-sizing:border-box;touch-action:pinch-zoom;background:var(--checkboard-background)}:host([alpha]) #alpha-slider{display:block}#alpha-slider-track{position:relative;width:100%;height:100%;display:flex;align-items:center}#alpha-slider-marker{position:absolute;left:0%;width:var(--marker-width);height:calc(100% + 6px);box-sizing:border-box;display:flex;align-items:center;justify-content:center;transform:translateX(calc((var(--marker-width) / 2) * -1));background:rgba(0, 0, 0, 0.2);border:3px solid white;box-shadow:0 0 3px black}#alpha-slider-gradient{position:absolute;top:0;left:0;width:100%;height:100%;border-radius:inherit}#alpha-slider-label{font-weight:700;color:rgba(255, 255, 255, 0.9);font-size:0.625rem}\n`;get value(){let[t,e,i]=this.#ye;return[t,e,i,this.#Ce]}set value([t,e,i,s]){this.#ye=[t,e,i],this.#Ce=s,this.#Xt()}get space(){return this.#ze}set space(t){this.#ze!==t&&(this.#ze=t,this.#Xt())}get alpha(){return this.hasAttribute(\"alpha\")}set alpha(t){t?this.setAttribute(\"alpha\",\"\"):this.removeAttribute(\"alpha\")}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}#$=null;#$t;#Si=new ResizeObserver((()=>this.#Mi()));#ie=!1;#ze=\"lab\";#$e=\"srgb\";#Se=!0;#ye=[0,0,0];#Ce=1;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.append(document.importNode($a.#z.content,!0)),this.#$.adoptedStyleSheets=[Gn.themeStyleSheet,$a.#E];for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t;this[\"#lightness-slider\"].addEventListener(\"pointerdown\",(t=>this.#Ke(t))),this[\"#planar-slider\"].addEventListener(\"pointerdown\",(t=>this.#Li(t))),this[\"#alpha-slider\"].addEventListener(\"pointerdown\",(t=>this.#Re(t))),this[\"#context-menu\"].addEventListener(\"click\",(t=>this.#Pe(t))),this[\"#context-menu\"].addEventListener(\"open\",(t=>this.#Te(t)))}connectedCallback(){this.#$e=Os(Gn.getConfig(\"x-colorpicker:gamutHints\",\"srgb\"),\"color.js\"),this.#Se=Gn.getConfig(\"x-colorpicker:labels\",!0),this.#Si.observe(this),Gn.addEventListener(\"configchange\",this.#$t=t=>this.#_t(t))}disconnectedCallback(){this.#Si.unobserve(this),Gn.removeEventListener(\"configchange\",this.#$t)}#_t(t){let{key:e,value:i,origin:s}=t.detail;if(\"self\"===s)if(\"x-colorpicker:gamutHints\"===e){let t=Os(i||\"srgb\",\"color.js\");t!==this.#$e&&(this.#$e=t,this.#Xt())}else if(\"x-colorpicker:labels\"===e){let t=null!==i&&i;t!==this.#Se&&(this.#Se=t,this.#Be())}}#Pe(t){let e=t.target.closest(\"x-menuitem\");e&&(e.parentElement===this[\"#gamut-hints-menu\"]?e.value!==this.#$e&&(this.#$e=e.value,this.#Xt(),Gn.setConfig(\"x-colorpicker:gamutHints\",Os(this.#$e,\"css\"))):\"labels\"===e.value&&(this.#Se=!e.toggled,Gn.setConfig(\"x-colorpicker:labels\",this.#Se),this.#Xt()))}#Te(){this.#Ie()}#Mi(){this.#Ai()}#Ke(t){if(t.button>0||this.#ie)return;let e,i,s=this[\"#lightness-slider-track\"].getBoundingClientRect();this.#ie=!0,this[\"#lightness-slider\"].setPointerCapture(t.pointerId),this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0}));let n=t=>{let e=(t-s.x)/s.width;\"oklab\"===this.#ze?e=ki(e,0,1):\"lab\"===this.#ze&&(e=ki(100*e,0,100)),e!==this.#ye[0]&&(this.#ye[0]=e,this.#ai(),this.#Ai(),this.#Pi(),this.#Ge(),this.#Xe(),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})))};n(t.clientX),this[\"#lightness-slider\"].addEventListener(\"pointermove\",e=e=>{e.pointerId===t.pointerId&&n(e.clientX)}),this[\"#lightness-slider\"].addEventListener(\"pointerup\",i=()=>{this[\"#lightness-slider\"].removeEventListener(\"pointermove\",e),this[\"#lightness-slider\"].removeEventListener(\"pointerup\",i),this[\"#lightness-slider\"].removeEventListener(\"pointercancel\",i),this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0})),this.#ie=!1}),this[\"#lightness-slider\"].addEventListener(\"pointercancel\",i)}#Li(t){if(t.button>0||this.#ie)return;let e,i,s=this[\"#planar-slider\"].getBoundingClientRect();this.#ie=!0,this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0})),this[\"#planar-slider\"].setPointerCapture(t.pointerId);let n=(t,e)=>{let i=(t-s.left)/s.width,n=(e-s.top)/s.height;i=ki(i,0,1),n=ki(n,0,1);let[a,r,o]=this.#ye;\"lab\"===this.#ze?(r=250*i-125,o=250*(1-n)-125):\"oklab\"===this.#ze&&(r=.8*i-.4,o=.8*(1-n)-.4),this.#ye=[a,r,o],this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})),this.#Ri(),this.#ei(),this.#ii(),this.#Ge(),this.#Xe()};n(t.clientX,t.clientY),this[\"#planar-slider\"].addEventListener(\"pointermove\",e=e=>{e.pointerId===t.pointerId&&n(e.clientX,e.clientY)}),this[\"#planar-slider\"].addEventListener(\"pointerup\",i=()=>{this[\"#planar-slider\"].removeEventListener(\"pointermove\",e),this[\"#planar-slider\"].removeEventListener(\"pointerup\",i),this[\"#planar-slider\"].removeEventListener(\"pointercancel\",i),this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0})),this.#ie=!1}),this[\"#planar-slider\"].addEventListener(\"pointercancel\",i)}#Re(t){if(t.button>0||this.#ie)return;let e,i,s=this[\"#alpha-slider-track\"].getBoundingClientRect();this.#ie=!0,this[\"#alpha-slider\"].setPointerCapture(t.pointerId),this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0}));let n=t=>{let e=(t-s.x)/s.width;e=ki(e,0,1),e!==this.#Ce&&(this.#Ce=e,this.#Ve(),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})))};n(t.clientX),this[\"#alpha-slider\"].addEventListener(\"pointermove\",e=e=>{e.pointerId===t.pointerId&&n(e.clientX)}),this[\"#alpha-slider\"].addEventListener(\"pointerup\",i=()=>{this[\"#alpha-slider\"].removeEventListener(\"pointermove\",e),this[\"#alpha-slider\"].removeEventListener(\"pointerup\",i),this[\"#alpha-slider\"].removeEventListener(\"pointercancel\",i),this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0})),this.#ie=!1}),this[\"#alpha-slider\"].addEventListener(\"pointercancel\",i)}#Xt(){this.#Ri(),this.#Pi(),this.#Ti(),this.#ai(),this.#ei(),this.#ii(),this.#Ve(),this.#Ge(),this.#Xe(),this.#Be()}#Ri(){let t,e,[i,s,n]=this.#ye;\"lab\"===this.#ze?(t=s<-125?\"calc(0% - 18px)\":s>125?\"calc(100% + 18px)\":(s+125)/250*100+\"%\",e=n<-125?\"calc(0% - 18px)\":n>125?\"calc(100% + 18px)\":100-(n+125)/250*100+\"%\"):\"oklab\"===this.#ze&&(t=s<-.4?\"calc(0% - 18px)\":s>.4?\"calc(100% + 18px)\":(s+.4)/.8*100+\"%\",e=n<-.4?\"calc(0% - 18px)\":n>.4?\"calc(100% + 18px)\":100-(n+.4)/.8*100+\"%\"),this[\"#planar-slider-marker\"].style.left=t,this[\"#planar-slider-marker\"].style.top=e}#Pi(){let t=this[\"#planar-slider-canvas\"],e=t.getContext(\"2d\",{colorSpace:\"display-p3\"}),{width:i,height:s}=t,[n]=this.#ye;e.clearRect(0,0,i,s);for(let t=0;t<=i;t+=1){let a=[];for(let e=0;e<=s;e+=10){let r,o=t/i,l=1-e/s;\"lab\"===this.#ze?r={space:\"lab\",coords:[n,250*o-125,250*l-125]}:\"oklab\"===this.#ze&&(r={space:\"oklab\",coords:[n,.8*o-.4,.8*l-.4]}),a.push(r)}let r=e.createLinearGradient(t,0,i,s);for(let t=0;t<a.length;t+=1){let e=a[t];r.addColorStop(t/a.length,bi(e))}e.fillStyle=r,e.fillRect(t,0,1,s)}}#Ti(){if(\"none\"===this.#$e)this[\"#planar-slider-gamut-path\"].removeAttribute(\"d\");else{let t=this[\"#planar-slider-gamut-svg\"].clientWidth,e=this[\"#planar-slider-gamut-svg\"].clientHeight,i=pa(ca(t/2,2)+ca(e/2,2)),s={x:t/2,y:e/2},[n,a,r]=this.#ye,o=[];for(let a=0;a<360;a+=3){let r;for(let o=i;o>=0;o-=15){let i,l,h=$i({x:t/2,y:e/2-o},s,a);if(\"lab\"===this.#ze?(i=h.x/t*250-125,l=-(h.y/e*250-125)):\"oklab\"===this.#ze&&(i=h.x/t*.8-.4,l=-(h.y/e*.8-.4)),se({space:this.#ze,coords:[n,i,l]},this.#$e)){r=o;break}}for(let l=r;l<=i;l+=1){let i,r,h=$i({x:t/2,y:e/2-l},s,a);if(\"lab\"===this.#ze?(i=h.x/t*250-125,r=-(h.y/e*250-125)):\"oklab\"===this.#ze&&(i=h.x/t*.8-.4,r=-(h.y/e*.8-.4)),!1===se({space:this.#ze,coords:[n,i,r]},this.#$e)){o.push(h);break}}}if(0===o.length)this[\"#planar-slider-gamut-path\"].removeAttribute(\"d\");else{let i=o.map((({x:t,y:e},i)=>`${0===i?\"M\":\"L\"} ${t} ${e}`)).join(\" \")+\" Z\";this[\"#planar-slider-gamut-path\"].setAttribute(\"d\",i),this[\"#planar-slider-gamut-svg\"].setAttribute(\"viewBox\",`0 0 ${t} ${e}`)}}}#Ai=Fn(this.#Ti,40,this);#ai(){let[t,e,i]=this.#ye;\"oklab\"===this.#ze?this[\"#lightness-slider-marker\"].style.left=100*t+\"%\":\"lab\"===this.#ze&&(this[\"#lightness-slider-marker\"].style.left=t+\"%\")}#ei(){let[,t,e]=this.#ye,i=[];if(\"oklab\"===this.#ze)for(let s=0;s<=1;s+=.02)i.push({space:\"oklab\",coords:[s,t,e]});else if(\"lab\"===this.#ze)for(let s=0;s<=100;s+=2)i.push({space:\"lab\",coords:[s,t,e]});i=i.map((t=>bi(t))),this[\"#lightness-slider\"].style.background=`linear-gradient(in ${this.#ze} to right, ${i.join(\",\")})`}#ii(){if(\"none\"===this.#$e)this[\"#lightness-slider-gamut-path\"].removeAttribute(\"d\");else{let t=[];{let e=this[\"#lightness-slider\"].clientWidth,i=1/window.devicePixelRatio,[,s,n]=this.#ye,a=null;for(let r=0;r<=e;r+=i){let i,o=r/e;\"lab\"===this.#ze?i={space:this.#ze,coords:[100*o,s,n]}:\"oklab\"===this.#ze&&(i={space:this.#ze,coords:[o,s,n]}),se(i,this.#$e)?(null===a&&(a=[],t.push(a)),a.push(100*o)):a=null}t=t.map((t=>[t.at(0),t.at(-1)]))}if(t.length>0){let e=t.map((([t,e])=>`M ${t} 35 L ${t} 17 L ${e} 17 L ${e} 35`));this[\"#lightness-slider-gamut-path\"].setAttribute(\"d\",e.join(\" \"))}else this[\"#lightness-slider-gamut-path\"].removeAttribute(\"d\")}}#Ve(){this[\"#alpha-slider-marker\"].style.left=100*this.#Ce+\"%\"}#Ge(){let[t,e,i]=this.#ye,s=[{space:this.#ze,coords:[t,e,i],alpha:0},{space:this.#ze,coords:[t,e,i],alpha:1}];s=s.map((t=>bi(t))),this[\"#alpha-slider-gradient\"].style.background=`linear-gradient(in ${this.#ze} to right, ${s.join(\",\")})`}#Xe(){if(\"none\"===this.#$e)this[\"#planar-slider-marker\"].removeAttribute(\"data-warn\"),this[\"#lightness-slider-marker\"].removeAttribute(\"data-warn\");else{se({space:this.#ze,coords:[...this.#ye]},this.#$e)?(this[\"#planar-slider-marker\"].removeAttribute(\"data-warn\"),this[\"#lightness-slider-marker\"].removeAttribute(\"data-warn\")):(this[\"#planar-slider-marker\"].setAttribute(\"data-warn\",\"\"),this[\"#lightness-slider-marker\"].setAttribute(\"data-warn\",\"\"))}}#Be(){this[\"#lightness-slider-label\"].hidden=!this.#Se,this[\"#alpha-slider-label\"].hidden=!this.#Se}#Ie(){for(let t of this[\"#gamut-hints-menu\"].querySelectorAll(\"x-menuitem\"))t.toggled=t.value===this.#$e;this[\"#labels-menu-item\"].toggled=this.#Se}}void 0===customElements.get(\"x-labplanarsliders\")&&customElements.define(\"x-labplanarsliders\",$a);class Sa extends HTMLElement{static#z=Ns`<template><div id=\"linear-slider\" class=\"slider\" part=\"slider\"><div id=\"linear-slider-track\" class=\"slider-track\"><svg id=\"linear-slider-gamut-svg\" class=\"slider-gamut-svg\" viewBox=\"0 0 100 35\" preserveAspectRatio=\"none\"><path id=\"linear-slider-gamut-path\" class=\"slider-gamut-path\"></path></svg><div id=\"linear-slider-marker\" class=\"slider-marker\"><span id=\"linear-slider-label\" class=\"slider-label\">L</span></div></div></div><div id=\"planar-slider\" part=\"slider\"><canvas id=\"planar-slider-canvas\" width=\"100\" height=\"100\"></canvas><svg id=\"planar-slider-gamut-svg\" viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\"><path id=\"planar-slider-gamut-path\"></path></svg><div id=\"planar-slider-marker\"></div></div><div id=\"alpha-slider\" part=\"slider\"><div id=\"alpha-slider-gradient\"></div><div id=\"alpha-slider-track\"><div id=\"alpha-slider-marker\"><span id=\"alpha-slider-label\">α</span></div></div></div><x-contextmenu id=\"context-menu\"><x-menu><x-menuitem><x-label><x-message href=\"#color-model\" autocapitalize>Color Model</x-message></x-label><x-menu id=\"color-model-menu\"><x-menuitem value=\"x-zy\"><x-label>X-ZY</x-label></x-menuitem><x-menuitem value=\"y-xz\"><x-label>Y-XZ</x-label></x-menuitem><x-menuitem value=\"z-xy\"><x-label>Z-XY</x-label></x-menuitem></x-menu></x-menuitem><x-menuitem><x-label><x-message href=\"#gamut-hints\" autocapitalize>Gamut Hints</x-message></x-label><x-menu id=\"gamut-hints-menu\"><x-menuitem value=\"none\"><x-label><x-message href=\"#gamut-hints.none\">None</x-message></x-label></x-menuitem><hr><x-menuitem value=\"srgb\" toggled><x-label>sRGB</x-label></x-menuitem><x-menuitem value=\"a98rgb\"><x-label>Adobe RGB</x-label></x-menuitem><x-menuitem value=\"p3\"><x-label>Display P3</x-label></x-menuitem><x-menuitem value=\"rec2020\"><x-label>Rec. 2020</x-label></x-menuitem><x-menuitem value=\"prophoto\"><x-label>ProPhoto RGB</x-label></x-menuitem></x-menu></x-menuitem><hr><x-menuitem id=\"labels-menu-item\" value=\"labels\"><x-label><x-message href=\"#labels\" autocapitalize>Labels</x-message></x-label></x-menuitem></x-menu></x-contextmenu></template>`;static#E=Fs`:host{display:block;user-select:none;-webkit-user-select:none;--marker-width: 18px;}:host([disabled]){pointer-events:none;opacity:0.5}#linear-slider{width:100%;height:35px;margin-top:10px;padding:0 calc(var(--marker-width) / 2);box-sizing:border-box;touch-action:pinch-zoom}#linear-slider-track{position:relative;width:100%;height:100%;display:flex;align-items:center}#linear-slider-marker{position:absolute;left:0%;width:var(--marker-width);height:calc(100% + 6px);box-sizing:border-box;display:flex;align-items:center;justify-content:center;transform:translateX(calc((var(--marker-width) / 2) * -1));background:rgba(0, 0, 0, 0.2);border:3px solid white;box-shadow:0 0 3px black}#linear-slider-marker[data-warn]::after{content:\"⚠\";position:absolute;right:-26px;color:rgba(255, 255, 255, 0.9);filter:drop-shadow(1px 1px 1px black);pointer-events:none;font-size:1.125rem}#linear-slider-gamut-svg{width:100%;height:100%}#linear-slider-gamut-path{fill:none;stroke:white;stroke-width:1px;vector-effect:non-scaling-stroke;stroke-dasharray:2px;opacity:0.8}#linear-slider-label{font-weight:700;color:rgba(255, 255, 255, 0.9);font-size:0.625rem}#planar-slider{width:100%;height:200px;margin-top:10px;position:relative;touch-action:pinch-zoom}#planar-slider-marker{position:absolute;top:0%;left:0%;width:var(--marker-size);height:var(--marker-size);display:flex;align-items:center;justify-content:center;box-sizing:border-box;transform:translate(calc(var(--marker-size) / -2), calc(var(--marker-size) / -2));background:rgba(0, 0, 0, 0.3);border:3px solid white;border-radius:999px;box-shadow:0 0 3px black;--marker-size: 20px;}#planar-slider-marker[data-warn]::after{content:\"⚠\";position:absolute;top:-30px;color:rgba(255, 255, 255, 0.9);font-size:1.125rem;filter:drop-shadow(1px 1px 1px black);pointer-events:none}#planar-slider-canvas{position:absolute;width:100%;height:100%;overflow:hidden;border-radius:inherit}#planar-slider-gamut-svg{position:absolute;top:0;left:0;width:100%;height:100%}#planar-slider-gamut-path{fill:none;stroke:white;stroke-width:1px;vector-effect:non-scaling-stroke;stroke-dasharray:2px;opacity:0.8}#alpha-slider{display:none;width:100%;height:35px;margin-top:10px;padding:0 calc(var(--marker-width) / 2);position:relative;box-sizing:border-box;touch-action:pinch-zoom;background:var(--checkboard-background)}:host([alpha]) #alpha-slider{display:block}#alpha-slider-track{position:relative;width:100%;height:100%;display:flex;align-items:center}#alpha-slider-marker{position:absolute;left:0%;width:var(--marker-width);height:calc(100% + 6px);box-sizing:border-box;display:flex;align-items:center;justify-content:center;transform:translateX(calc((var(--marker-width) / 2) * -1));background:rgba(0, 0, 0, 0.2);border:3px solid white;box-shadow:0 0 3px black}#alpha-slider-gradient{position:absolute;top:0;left:0;width:100%;height:100%;border-radius:inherit}#alpha-slider-label{font-weight:700;color:rgba(255, 255, 255, 0.9);font-size:0.625rem}\n`;get value(){let[t,e,i]=this.#ye;return[t,e,i,this.#Ce]}set value([t,e,i,s]){this.#ye=[t,e,i],this.#Ce=s,this.#Xt()}get space(){return this.#ze}set space(t){this.#ze!==t&&(this.#ze=t,this.#Xt())}get alpha(){return this.hasAttribute(\"alpha\")}set alpha(t){t?this.setAttribute(\"alpha\",\"\"):this.removeAttribute(\"alpha\")}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}#$=null;#$t;#Si=new ResizeObserver((()=>this.#Mi()));#ie=!1;#ze=\"xyz-d65\";#Ee=\"x-zy\";#$e=\"srgb\";#Se=!0;#ye=[0,0,0];#Ce=1;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.append(document.importNode(Sa.#z.content,!0)),this.#$.adoptedStyleSheets=[Gn.themeStyleSheet,Sa.#E];for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t;this[\"#planar-slider\"].addEventListener(\"pointerdown\",(t=>this.#Li(t))),this[\"#linear-slider\"].addEventListener(\"pointerdown\",(t=>this.#Di(t))),this[\"#alpha-slider\"].addEventListener(\"pointerdown\",(t=>this.#Re(t))),this[\"#context-menu\"].addEventListener(\"click\",(t=>this.#Pe(t))),this[\"#context-menu\"].addEventListener(\"open\",(t=>this.#Te(t)))}connectedCallback(){this.#Ee=Gn.getConfig(`${this.localName}:model`,\"x-zy\"),this.#$e=Os(Gn.getConfig(\"x-colorpicker:gamutHints\",\"srgb\"),\"color.js\"),this.#Se=Gn.getConfig(\"x-colorpicker:labels\",!0),this.#Si.observe(this),Gn.addEventListener(\"configchange\",this.#$t=t=>this.#_t(t))}disconnectedCallback(){this.#Si.unobserve(this),Gn.removeEventListener(\"configchange\",this.#$t)}#_t(t){let{key:e,value:i,origin:s}=t.detail;if(\"self\"===s)if(e===`${this.localName}:model`){let t=i||\"x-zy\";t!==this.#Ee&&(this.#Ee=t,this.#Xt())}else if(\"x-colorpicker:gamutHints\"===e){let t=Os(i||\"srgb\",\"color.js\");t!==this.#$e&&(this.#$e=t,this.#Xt())}else if(\"x-colorpicker:labels\"===e){let t=null!==i&&i;t!==this.#Se&&(this.#Se=t,this.#Be())}}#Pe(t){let e=t.target.closest(\"x-menuitem\");e&&(e.parentElement===this[\"#color-model-menu\"]?e.value!==this.#Ee&&(this.#Ee=e.value,this.#Xt(),Gn.setConfig(`${this.localName}:model`,e.value)):e.parentElement===this[\"#gamut-hints-menu\"]?e.value!==this.#$e&&(this.#$e=e.value,this.#Xt(),Gn.setConfig(\"x-colorpicker:gamutHints\",Os(this.#$e,\"css\"))):\"labels\"===e.value&&(this.#Se=!e.toggled,Gn.setConfig(\"x-colorpicker:labels\",this.#Se),this.#Xt()))}#Te(){this.#Ie()}#Mi(){this.#Ai()}#Di(t){if(t.button>0||this.#ie)return;let e,i,s=this[\"#linear-slider-track\"].getBoundingClientRect();this.#ie=!0,this[\"#linear-slider\"].setPointerCapture(t.pointerId),this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0}));let n=t=>{let e,i=(t-s.x)/s.width;i=ki(i,0,1),\"x-zy\"===this.#Ee?e=0:\"y-xz\"===this.#Ee?e=1:\"z-xy\"===this.#Ee&&(e=2),i!==this.#ye[e]&&(this.#ye[e]=i,this.#Pi(),this.#Ai(),this.#Bi(),this.#Ge(),this.#Xe(),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})))};n(t.clientX),this[\"#linear-slider\"].addEventListener(\"pointermove\",e=e=>{e.pointerId===t.pointerId&&n(e.clientX)}),this[\"#linear-slider\"].addEventListener(\"pointerup\",i=()=>{this[\"#linear-slider\"].removeEventListener(\"pointermove\",e),this[\"#linear-slider\"].removeEventListener(\"pointerup\",i),this[\"#linear-slider\"].removeEventListener(\"pointercancel\",i),this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0})),this.#ie=!1}),this[\"#linear-slider\"].addEventListener(\"pointercancel\",i)}#Li(t){if(t.button>0||this.#ie)return;let e,i,s=this[\"#planar-slider\"].getBoundingClientRect();this.#ie=!0,this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0})),this[\"#planar-slider\"].setPointerCapture(t.pointerId);let n=(t,e)=>{let i=(t-s.left)/s.width,n=(e-s.top)/s.height;i=ki(i,0,1),n=ki(n,0,1);let[a,r,o]=this.#ye;\"x-zy\"===this.#Ee?this.#ye=[a,n,i]:\"y-xz\"===this.#Ee?this.#ye=[i,r,n]:\"z-xy\"===this.#Ee&&(this.#ye=[i,n,o]),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})),this.#Ri(),this.#Ii(),this.#Oi(),this.#Ge(),this.#Xe()};n(t.clientX,t.clientY),this[\"#planar-slider\"].addEventListener(\"pointermove\",e=e=>{e.pointerId===t.pointerId&&n(e.clientX,e.clientY)}),this[\"#planar-slider\"].addEventListener(\"pointerup\",i=()=>{this[\"#planar-slider\"].removeEventListener(\"pointermove\",e),this[\"#planar-slider\"].removeEventListener(\"pointerup\",i),this[\"#planar-slider\"].removeEventListener(\"pointercancel\",i),this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0})),this.#ie=!1}),this[\"#planar-slider\"].addEventListener(\"pointercancel\",i)}#Re(t){if(t.button>0||this.#ie)return;let e,i,s=this[\"#alpha-slider-track\"].getBoundingClientRect();this.#ie=!0,this[\"#alpha-slider\"].setPointerCapture(t.pointerId),this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0}));let n=t=>{let e=(t-s.x)/s.width;e=ki(e,0,1),e!==this.#Ce&&(this.#Ce=e,this.#Ve(),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})))};n(t.clientX),this[\"#alpha-slider\"].addEventListener(\"pointermove\",e=e=>{e.pointerId===t.pointerId&&n(e.clientX)}),this[\"#alpha-slider\"].addEventListener(\"pointerup\",i=()=>{this[\"#alpha-slider\"].removeEventListener(\"pointermove\",e),this[\"#alpha-slider\"].removeEventListener(\"pointerup\",i),this[\"#alpha-slider\"].removeEventListener(\"pointercancel\",i),this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0})),this.#ie=!1}),this[\"#alpha-slider\"].addEventListener(\"pointercancel\",i)}#Xt(){this.#Bi(),this.#Ii(),this.#Oi(),this.#Ri(),this.#Pi(),this.#Ti(),this.#Ve(),this.#Ge(),this.#Xe(),this.#Be()}#Bi(){let[t,e,i]=this.#ye;\"x-zy\"===this.#Ee?this[\"#linear-slider-marker\"].style.left=100*t+\"%\":\"y-xz\"===this.#Ee?this[\"#linear-slider-marker\"].style.left=100*e+\"%\":\"z-xy\"===this.#Ee&&(this[\"#linear-slider-marker\"].style.left=100*i+\"%\")}#Ii(){let[t,e,i]=this.#ye,s=[];if(\"x-zy\"===this.#Ee)for(let t=0;t<=1;t+=.02)s.push({space:this.#ze,coords:[t,e,i]});else if(\"y-xz\"===this.#Ee)for(let e=0;e<=1;e+=.02)s.push({space:this.#ze,coords:[t,e,i]});else if(\"z-xy\"===this.#Ee)for(let i=0;i<=1;i+=.02)s.push({space:this.#ze,coords:[t,e,i]});s=s.map((t=>bi(t))),this[\"#linear-slider\"].style.background=`linear-gradient(in ${this.#ze} to right, ${s.join(\",\")})`}#Oi(){if(\"none\"===this.#$e)this[\"#linear-slider-gamut-path\"].removeAttribute(\"d\");else{let t=[];{let e=this[\"#linear-slider\"].clientWidth,i=1/window.devicePixelRatio,[s,n,a]=this.#ye,r=null;for(let o=0;o<=e;o+=i){let i,l=o/e;\"x-zy\"===this.#Ee?i={space:this.#ze,coords:[l,n,a]}:\"y-xz\"===this.#Ee?i={space:this.#ze,coords:[s,l,a]}:\"z-xy\"===this.#Ee&&(i={space:this.#ze,coords:[s,n,l]}),se(i,this.#$e)?(null===r&&(r=[],t.push(r)),r.push(100*l)):r=null}t=t.map((t=>[t.at(0),t.at(-1)]))}if(t.length>0){let e=t.map((([t,e])=>`M ${t} 35 L ${t} 17 L ${e} 17 L ${e} 35`));this[\"#linear-slider-gamut-path\"].setAttribute(\"d\",e.join(\" \"))}else this[\"#linear-slider-gamut-path\"].removeAttribute(\"d\")}}#Ri(){let t,e,[i,s,n]=this.#ye;\"x-zy\"===this.#Ee?(t=n<0?\"calc(0% - 18px)\":n>1?\"calc(100% + 18px)\":100*n+\"%\",e=s<0?\"calc(0% - 18px)\":s>1?\"calc(100% + 18px)\":100*s+\"%\"):\"y-xz\"===this.#Ee?(t=i<0?\"calc(0% - 18px)\":i>1?\"calc(100% + 18px)\":100*i+\"%\",e=n<0?\"calc(0% - 18px)\":n>1?\"calc(100% + 18px)\":100*n+\"%\"):\"z-xy\"===this.#Ee&&(t=i<0?\"calc(0% - 18px)\":i>1?\"calc(100% + 18px)\":100*i+\"%\",e=s<0?\"calc(0% - 18px)\":s>1?\"calc(100% + 18px)\":100*s+\"%\"),this[\"#planar-slider-marker\"].style.left=t,this[\"#planar-slider-marker\"].style.top=e}#Pi(){let t=this[\"#planar-slider-canvas\"],e=t.getContext(\"2d\",{colorSpace:\"display-p3\"}),{width:i,height:s}=t,[n,a,r]=this.#ye;e.clearRect(0,0,i,s);for(let t=0;t<=i;t+=1){let o=[];for(let e=0;e<=s;e+=10){let l;if(\"x-zy\"===this.#Ee){let a=t/i,r=e/s;l={space:this.#ze,coords:[n,r,a]}}else if(\"y-xz\"===this.#Ee){let n=t/i,r=e/s;l={space:this.#ze,coords:[n,a,r]}}else if(\"z-xy\"===this.#Ee){let n=t/i,a=e/s;l={space:this.#ze,coords:[n,a,r]}}o.push(l)}let l=e.createLinearGradient(t,0,i,s);for(let t=0;t<o.length;t+=1){let e=o[t];l.addColorStop(t/o.length,bi(e))}e.fillStyle=l,e.fillRect(t,0,1,s)}}#Ti(){if(\"none\"===this.#$e)this[\"#planar-slider-gamut-path\"].removeAttribute(\"d\");else{let t=this[\"#planar-slider-gamut-svg\"].clientWidth,e=this[\"#planar-slider-gamut-svg\"].clientHeight,i=pa(ca(t/2,2)+ca(e/2,2)),s={x:t/2,y:e/2},n=[];for(let a=0;a<360;a+=3){let r,[o,l,h]=this.#ye;for(let n=i;n>=0;n-=15){let i=$i({x:t/2,y:e/2-n},s,a);if(\"x-zy\"===this.#Ee?(h=i.x/t,l=i.y/e):\"y-xz\"===this.#Ee?(o=i.x/t,h=i.y/e):\"z-xy\"===this.#Ee&&(o=i.x/t,l=i.y/e),se({space:this.#ze,coords:[o,l,h]},this.#$e)){r=n;break}}for(let o=r;o<=i;o+=1){let i=$i({x:t/2,y:e/2-o},s,a),[r,l,h]=this.#ye;if(\"x-zy\"===this.#Ee?(h=i.x/t,l=i.y/e):\"y-xz\"===this.#Ee?(r=i.x/t,h=i.y/e):\"z-xy\"===this.#Ee&&(r=i.x/t,l=i.y/e),!1===se({space:this.#ze,coords:[r,l,h]},this.#$e)){n.push(i);break}}}if(0===n.length)this[\"#planar-slider-gamut-path\"].removeAttribute(\"d\");else{let i=n.map((({x:t,y:e},i)=>`${0===i?\"M\":\"L\"} ${t} ${e}`)).join(\" \")+\" Z\";this[\"#planar-slider-gamut-path\"].setAttribute(\"d\",i),this[\"#planar-slider-gamut-svg\"].setAttribute(\"viewBox\",`0 0 ${t} ${e}`)}}}#Ai=Fn(this.#Ti,40,this);#Ve(){this[\"#alpha-slider-marker\"].style.left=100*this.#Ce+\"%\"}#Ge(){let[t,e,i]=this.#ye,s=[{space:this.#ze,coords:[t,e,i],alpha:0},{space:this.#ze,coords:[t,e,i],alpha:1}];s=s.map((t=>bi(t))),this[\"#alpha-slider-gradient\"].style.background=`linear-gradient(in ${this.#ze} to right, ${s.join(\",\")})`}#Xe(){if(\"none\"===this.#$e)this[\"#linear-slider-marker\"].removeAttribute(\"data-warn\"),this[\"#planar-slider-marker\"].removeAttribute(\"data-warn\");else{se({space:this.#ze,coords:[...this.#ye]},this.#$e)?(this[\"#linear-slider-marker\"].removeAttribute(\"data-warn\"),this[\"#planar-slider-marker\"].removeAttribute(\"data-warn\")):(this[\"#linear-slider-marker\"].setAttribute(\"data-warn\",\"\"),this[\"#planar-slider-marker\"].setAttribute(\"data-warn\",\"\"))}}#Be(){this[\"#linear-slider-label\"].hidden=!this.#Se,this[\"#linear-slider-label\"].textContent=this.#Ee[0].toUpperCase(),this[\"#alpha-slider-label\"].hidden=!this.#Se}#Ie(){for(let t of this[\"#color-model-menu\"].querySelectorAll(\"x-menuitem\"))t.toggled=t.value===this.#Ee;for(let t of this[\"#gamut-hints-menu\"].querySelectorAll(\"x-menuitem\"))t.toggled=t.value===this.#$e;this[\"#labels-menu-item\"].toggled=this.#Se}}void 0===customElements.get(\"x-xyzplanarsliders\")&&customElements.define(\"x-xyzplanarsliders\",Sa);class Ma extends HTMLElement{static#z=Ns`<template><div id=\"polar-slider\" part=\"slider\"><div id=\"polar-slider-circle\"><canvas id=\"polar-slider-canvas\" width=\"100\" height=\"100\"></canvas><svg id=\"polar-slider-gamut-svg\" viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\"><path id=\"polar-slider-gamut-path\"></path></svg><div id=\"polar-slider-marker\"></div></div></div><div id=\"linear-slider\" part=\"slider\"><div id=\"linear-slider-track\"><div id=\"linear-slider-marker\"><span id=\"linear-slider-label\"></span></div><svg id=\"linear-slider-gamut-svg\" viewBox=\"0 0 100 35\" preserveAspectRatio=\"none\"><path id=\"linear-slider-gamut-path\"></path></svg></div></div><div id=\"alpha-slider\" part=\"slider\"><div id=\"alpha-slider-gradient\"></div><div id=\"alpha-slider-track\"><div id=\"alpha-slider-marker\"><span id=\"alpha-slider-label\">H</span></div></div></div><x-contextmenu id=\"context-menu\"><x-menu><x-menuitem><x-label><x-message href=\"#color-model\" autocapitalize>Color Model</x-message></x-label><x-menu id=\"color-model-menu\"><x-menuitem value=\"hsv\"><x-label>HSV</x-label></x-menuitem><x-menuitem value=\"hsl\"><x-label>HSL</x-label></x-menuitem></x-menu></x-menuitem><x-menuitem><x-label><x-message href=\"#gamut-hints\" autocapitalize>Gamut Hints</x-message></x-label><x-menu id=\"gamut-hints-menu\"><x-menuitem value=\"none\"><x-label><x-message href=\"#gamut-hints.none\">None</x-message></x-label></x-menuitem><hr><x-menuitem value=\"srgb\" toggled><x-label>sRGB</x-label></x-menuitem><x-menuitem value=\"a98rgb\"><x-label>Adobe RGB</x-label></x-menuitem><x-menuitem value=\"p3\"><x-label>Display P3</x-label></x-menuitem><x-menuitem value=\"rec2020\"><x-label>Rec. 2020</x-label></x-menuitem><x-menuitem value=\"prophoto\"><x-label>ProPhoto RGB</x-label></x-menuitem></x-menu></x-menuitem><hr><x-menuitem id=\"labels-menu-item\" value=\"labels\"><x-label><x-message href=\"#labels\" autocapitalize>Labels</x-message></x-label></x-menuitem></x-menu></x-contextmenu></template>`;static#E=Fs`:host{display:block;user-select:none;-webkit-user-select:none;--marker-width: 18px;}:host([disabled]){pointer-events:none;opacity:0.5}#polar-slider{display:flex;align-items:center;width:100%;max-width:200px;height:200px;margin:0 auto}#polar-slider-circle{touch-action:pinch-zoom;position:relative;width:100%;height:fit-content;aspect-ratio:1 / 1;border-radius:999px!important}#polar-slider-marker{position:absolute;top:0%;left:0%;width:var(--marker-size);height:var(--marker-size);display:flex;align-items:center;justify-content:center;box-sizing:border-box;transform:translate(calc(var(--marker-size) / -2), calc(var(--marker-size) / -2));background:rgba(0, 0, 0, 0.3);border:3px solid white;border-radius:999px;box-shadow:0 0 3px black;--marker-size: 20px;}#polar-slider-marker[data-warn]::after{content:\"⚠\";position:absolute;top:-30px;color:rgba(255, 255, 255, 0.9);font-size:1.125rem;filter:drop-shadow(1px 1px 1px black);pointer-events:none}#polar-slider-canvas{position:absolute;width:100%;height:100%;border-radius:9999px}#polar-slider-gamut-svg{position:absolute;top:0;left:0;width:100%;height:100%;transform:rotate(-90deg)}#polar-slider-gamut-path{fill:none;stroke:white;stroke-width:1px;vector-effect:non-scaling-stroke;stroke-dasharray:2px;opacity:0.8}#linear-slider{width:100%;height:35px;margin-top:10px;padding:0 calc(var(--marker-width) / 2);box-sizing:border-box;touch-action:pinch-zoom}#linear-slider-track{position:relative;width:100%;height:100%;display:flex;align-items:center}#linear-slider-marker{position:absolute;left:0%;width:var(--marker-width);height:calc(100% + 6px);box-sizing:border-box;display:flex;align-items:center;justify-content:center;transform:translateX(calc((var(--marker-width) / 2) * -1));background:rgba(0, 0, 0, 0.2);border:3px solid white;box-shadow:0 0 3px black}#linear-slider-marker[data-warn]::after{content:\"⚠\";position:absolute;right:-26px;color:rgba(255, 255, 255, 0.9);filter:drop-shadow(1px 1px 1px black);pointer-events:none;font-size:1.125rem}#linear-slider-gamut-svg{width:100%;height:100%}#linear-slider-gamut-path{fill:none;stroke:white;stroke-width:1px;vector-effect:non-scaling-stroke;stroke-dasharray:2px;opacity:0.8}#linear-slider-label{font-weight:700;color:rgba(255, 255, 255, 0.9);font-size:0.625rem}#alpha-slider{display:none;width:100%;height:35px;margin-top:10px;padding:0 calc(var(--marker-width) / 2);position:relative;box-sizing:border-box;touch-action:pinch-zoom;background:var(--checkboard-background)}:host([alpha]) #alpha-slider{display:block}#alpha-slider-track{position:relative;width:100%;height:100%;display:flex;align-items:center}#alpha-slider-marker{position:absolute;left:0%;width:var(--marker-width);height:calc(100% + 6px);box-sizing:border-box;display:flex;align-items:center;justify-content:center;transform:translateX(calc((var(--marker-width) / 2) * -1));background:rgba(0, 0, 0, 0.2);border:3px solid white;box-shadow:0 0 3px black}#alpha-slider-gradient{position:absolute;top:0;left:0;width:100%;height:100%;border-radius:inherit}#alpha-slider-label{font-weight:700;color:rgba(255, 255, 255, 0.9);font-size:0.625rem}\n`;get value(){if(\"hsv\"===this.#Ee||\"hsl\"===this.#Ee){let[t,e,i]=this.#ye,[s,n,a]=mi({space:this.#Ee,coords:[360*t,100*e,100*i]},\"srgb\").coords;return[s,n,a,this.#Ce]}}set value([t,e,i,s]){if(\"hsv\"===this.#Ee||\"hsl\"===this.#Ee){let[n,a,r]=mi({space:\"srgb\",coords:[t,e,i]},this.#Ee).coords;this.#ye=[n/360,a/100,r/100],this.#Ce=s}for(let t=0;t<this.#ye.length;t+=1)(null===this.#ye[t]||ga(this.#ye[t]))&&(this.#ye[t]=0);this.#Xt()}get space(){return this.#ze}set space(t){this.#ze!==t&&(this.#ze=t,this.#Xt())}get alpha(){return this.hasAttribute(\"alpha\")}set alpha(t){t?this.setAttribute(\"alpha\",\"\"):this.removeAttribute(\"alpha\")}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}#$=null;#$t;#Si=new ResizeObserver((()=>this.#Mi()));#ie=!1;#ze=\"srgb\";#Ee=\"hsv\";#$e=\"srgb\";#Se=!0;#ye=[0,0,0];#Ce=1;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.append(document.importNode(Ma.#z.content,!0)),this.#$.adoptedStyleSheets=[Gn.themeStyleSheet,Ma.#E];for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t;this[\"#polar-slider\"].addEventListener(\"pointerdown\",(t=>this.#Hi(t))),this[\"#linear-slider\"].addEventListener(\"pointerdown\",(t=>this.#Di(t))),this[\"#alpha-slider\"].addEventListener(\"pointerdown\",(t=>this.#Re(t))),this[\"#context-menu\"].addEventListener(\"click\",(t=>this.#Pe(t))),this[\"#context-menu\"].addEventListener(\"open\",(t=>this.#Te(t)))}connectedCallback(){this.#Ee=Gn.getConfig(`${this.localName}:model`,\"hsv\"),this.#$e=Os(Gn.getConfig(\"x-colorpicker:gamutHints\",\"srgb\"),\"color.js\"),this.#Se=Gn.getConfig(\"x-colorpicker:labels\",!0),this.#Si.observe(this),Gn.addEventListener(\"configchange\",this.#$t=t=>this.#_t(t))}disconnectedCallback(){this.#Si.unobserve(this),Gn.removeEventListener(\"configchange\",this.#$t)}#De(){return\"none\"===this.#$e||\"srgb\"===this.#$e&&[\"srgb\",\"srgb-linear\"].includes(this.#ze)||\"p3\"===this.#$e&&[\"srgb\",\"srgb-linear\",\"p3\"].includes(this.#ze)||\"a98rgb\"===this.#$e&&[\"srgb\",\"srgb-linear\",\"a98rgb\"].includes(this.#ze)||\"rec2020\"===this.#$e&&[\"srgb\",\"srgb-linear\",\"a98rgb\",\"p3\",\"rec2020\"].includes(this.#ze)||\"prophoto\"===this.#$e?\"none\":this.#$e}#_t(t){let{key:e,value:i,origin:s}=t.detail;if(\"self\"===s)if(e===`${this.localName}:model`){let t=i||\"hsv\";if(t!==this.#Ee){let[e,i,s]=this.value;this.#Ee=t,this.value=[e,i,s,this.#Ce]}}else if(\"x-colorpicker:gamutHints\"===e){let t=Os(i||\"srgb\",\"color.js\");t!==this.#$e&&(this.#$e=t,this.#Xt())}else if(\"x-colorpicker:labels\"===e){let t=null!==i&&i;t!==this.#Se&&(this.#Se=t,this.#Be())}}#Pe(t){let e=t.target.closest(\"x-menuitem\");if(e)if(e.parentElement===this[\"#gamut-hints-menu\"])e.value!==this.#$e&&(this.#$e=e.value,this.#Xt(),Gn.setConfig(\"x-colorpicker:gamutHints\",Os(this.#$e,\"css\")));else if(e.parentElement===this[\"#color-model-menu\"]){if(e.value!==this.#Ee){let[t,i,s]=this.value;this.#Ee=e.value,this.value=[t,i,s,this.#Ce],Gn.setConfig(`${this.localName}:model`,e.value)}}else\"labels\"===e.value&&(this.#Se=!e.toggled,Gn.setConfig(\"x-colorpicker:labels\",this.#Se),this.#Xt())}#Te(){this.#Ie()}#Mi(){this.#ji()}#Hi(t){if(t.button>0||this.#ie)return;let e,i,s=this[\"#polar-slider\"].getBoundingClientRect();this.#ie=!0,this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0})),this[\"#polar-slider\"].style.cursor=\"default\",this[\"#polar-slider\"].setPointerCapture(t.pointerId);let n=(t,e)=>{let i=s.width/2,n=t-s.left-i,a=e-s.top-i,r=ca(n,2)+ca(a,2),o=ua(a,n);r>ca(i,2)&&(n=i*da(o),a=i*ha(o),r=ca(n,2)+ca(a,2),o=ua(a,n)),this.#ye[0]=(o+la)/(2*la),\"hsv\"!==this.#Ee&&\"hsl\"!==this.#Ee||(this.#ye[1]=pa(r)/i),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})),this.#Ni(),this.#Ii(),this.#Oi(),this.#Ge(),this.#Xe()};n(t.clientX,t.clientY),this[\"#polar-slider\"].addEventListener(\"pointermove\",e=e=>{e.pointerId===t.pointerId&&n(e.clientX,e.clientY)}),this[\"#polar-slider\"].addEventListener(\"pointerup\",i=()=>{this[\"#polar-slider\"].removeEventListener(\"pointermove\",e),this[\"#polar-slider\"].removeEventListener(\"pointerup\",i),this[\"#polar-slider\"].removeEventListener(\"pointercancel\",i),this[\"#polar-slider\"].style.cursor=null,this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0})),this.#ie=!1}),this[\"#polar-slider\"].addEventListener(\"pointercancel\",i)}#Di(t){if(t.button>0||this.#ie)return;let e,i,s=this[\"#linear-slider-track\"].getBoundingClientRect();this.#ie=!0,this[\"#linear-slider\"].setPointerCapture(t.pointerId),this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0}));let n=t=>{let e=(t-s.x)/s.width;e=ki(e,0,1),e!==this.#ye[2]&&(this.#ye[2]=e,this.#Bi(),this.#ji(),this.#Ge(),this.#Xe(),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})))};n(t.clientX),this[\"#linear-slider\"].addEventListener(\"pointermove\",e=e=>{e.pointerId===t.pointerId&&n(e.clientX)}),this[\"#linear-slider\"].addEventListener(\"pointerup\",i=()=>{this[\"#linear-slider\"].removeEventListener(\"pointermove\",e),this[\"#linear-slider\"].removeEventListener(\"pointerup\",i),this[\"#linear-slider\"].removeEventListener(\"pointercancel\",i),this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0})),this.#ie=!1}),this[\"#linear-slider\"].addEventListener(\"pointercancel\",i)}#Re(t){if(t.button>0||this.#ie)return;let e,i,s=this[\"#alpha-slider-track\"].getBoundingClientRect();this.#ie=!0,this[\"#alpha-slider\"].setPointerCapture(t.pointerId),this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0}));let n=t=>{let e=(t-s.x)/s.width;e=ki(e,0,1),e!==this.#Ce&&(this.#Ce=e,this.#Ve(),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})))};n(t.clientX),this[\"#alpha-slider\"].addEventListener(\"pointermove\",e=e=>{e.pointerId===t.pointerId&&n(e.clientX)}),this[\"#alpha-slider\"].addEventListener(\"pointerup\",i=()=>{this[\"#alpha-slider\"].removeEventListener(\"pointermove\",e),this[\"#alpha-slider\"].removeEventListener(\"pointerup\",i),this[\"#alpha-slider\"].removeEventListener(\"pointercancel\",i),this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0})),this.#ie=!1}),this[\"#alpha-slider\"].addEventListener(\"pointercancel\",i)}#Xt(){this.#Ni(),this.#Fi(),this.#Gi(),this.#Bi(),this.#Ii(),this.#Oi(),this.#Ve(),this.#Ge(),this.#Xe(),this.#Be()}#Ni(){let[t,e,i]=this.#ye;if(\"hsv\"===this.#Ee||\"hsl\"===this.#Ee){let i=100,s=xi*(360*t)/180,n=e*i/2,a={x:i/2,y:i/2},r=(i-(a.x+n*da(s)))/i*100,o=(a.y-n*ha(s))/i*100;this[\"#polar-slider-marker\"].style.left=r+\"%\",this[\"#polar-slider-marker\"].style.top=o+\"%\"}}#Fi(){let t=\"srgb-linear\"===this.#ze?\"srgb-linear\":\"srgb\",e=\"srgb-linear\"===this.#ze?\"srgb\":this.#ze;if(\"hsv\"===this.#Ee){let i=[{space:this.#ze,coords:mi({space:\"hsv\",coords:[0,0,100]},e).coords},{space:this.#ze,coords:mi({space:\"hsv\",coords:[0,0,0]},e).coords}],s=[{space:this.#ze,coords:[1,0,0]},{space:this.#ze,coords:[1,1,0]},{space:this.#ze,coords:[0,1,0]},{space:this.#ze,coords:[0,1,1]},{space:this.#ze,coords:[0,0,1]},{space:this.#ze,coords:[1,0,1]},{space:this.#ze,coords:[1,0,0]}];i=i.map((t=>bi(t))).join(\",\"),s=s.map((t=>bi(t))).join(\",\"),this[\"#polar-slider-circle\"].style.background=`\\n        radial-gradient(circle closest-side in ${t}, ${i} 100%),\\n        conic-gradient(from -90deg in hsl, ${s})\\n      `,this[\"#polar-slider-circle\"].style.backgroundBlendMode=\"screen, normal\"}else if(\"hsl\"===this.#Ee){let i=[{space:this.#ze,coords:mi({space:\"hsl\",coords:[0,0,50]},e).coords,alpha:1},{space:this.#ze,coords:mi({space:\"hsl\",coords:[0,0,50]},e).coords,alpha:0}],s=[{space:this.#ze,coords:[1,0,0]},{space:this.#ze,coords:[1,1,0]},{space:this.#ze,coords:[0,1,0]},{space:this.#ze,coords:[0,1,1]},{space:this.#ze,coords:[0,0,1]},{space:this.#ze,coords:[1,0,1]},{space:this.#ze,coords:[1,0,0]}];i=i.map((t=>bi(t))).join(\",\"),s=s.map((t=>bi(t))).join(\",\"),this[\"#polar-slider-circle\"].style.background=`\\n        radial-gradient(circle closest-side in ${t}, ${i}),\\n        conic-gradient(from -90deg in hsl, ${s})\\n      `,this[\"#polar-slider-circle\"].style.backgroundBlendMode=\"normal, normal\"}}#Gi(){let t=this.#De();if(\"none\"===t)this[\"#polar-slider-gamut-path\"].removeAttribute(\"d\");else{let e=this[\"#polar-slider-gamut-svg\"].clientWidth,i=this[\"#polar-slider-gamut-svg\"].clientHeight,s=1/window.devicePixelRatio,[n,a,r]=this.#ye,o=(e,i,s)=>se({space:this.#ze,coords:mi({space:this.#Ee,coords:[360*e,100*i,100*s]},\"srgb\").coords},t),l=[];if(\"hsv\"===this.#Ee||\"hsl\"===this.#Ee)for(let t=0;t<=1;t+=.01)for(let n=i/2;n>=0;n-=s){if(o(t,n/(i/2),r)){let s=$i({x:e/2,y:i/2-n},{x:e/2,y:i/2},360*t);l.push(s);break}}if(0===l.length)this[\"#polar-slider-gamut-path\"].removeAttribute(\"d\");else{let t=l.map((({x:t,y:e},i)=>`${0===i?\"M\":\"L\"} ${t} ${e}`)).join(\" \")+\" Z\";this[\"#polar-slider-gamut-path\"].setAttribute(\"d\",t),this[\"#polar-slider-gamut-svg\"].setAttribute(\"viewBox\",`0 0 ${e} ${i}`)}}}#ji=Fn(this.#Gi,40,this);#Bi(){let[,t,e]=this.#ye;\"hsv\"!==this.#Ee&&\"hsl\"!==this.#Ee||(this[\"#linear-slider-marker\"].style.left=100*e+\"%\")}#Ii(){if(\"hsv\"===this.#Ee){let[t,e]=this.#ye,i=\"srgb-linear\"===this.#ze?\"srgb-linear\":\"srgb\",s=\"srgb-linear\"===this.#ze?\"srgb\":this.#ze,n=[{space:this.#ze,coords:mi({space:\"hsv\",coords:[360*t,100*e,0]},s).coords},{space:this.#ze,coords:mi({space:\"hsv\",coords:[360*t,100*e,100]},s).coords}];n=n.map((t=>bi(t))).join(\",\"),this[\"#linear-slider\"].style.background=`linear-gradient(in ${i} to right, ${n})`}else if(\"hsl\"===this.#Ee){let[t,e]=this.#ye,i=\"srgb-linear\"===this.#ze?\"srgb-linear\":\"srgb\",s=\"srgb-linear\"===this.#ze?\"srgb\":this.#ze,n=[{space:this.#ze,coords:mi({space:\"hsl\",coords:[360*t,100*e,0]},s).coords},{space:this.#ze,coords:mi({space:\"hsl\",coords:[360*t,100*e,50]},s).coords},{space:this.#ze,coords:mi({space:\"hsl\",coords:[360*t,100*e,100]},s).coords}];n=n.map((t=>bi(t))).join(\",\"),this[\"#linear-slider\"].style.background=`linear-gradient(in ${i} to right, ${n})`}}#Oi(){let t=this.#De();if(\"none\"===t)this[\"#linear-slider-gamut-path\"].removeAttribute(\"d\");else{let[e,i,s]=this.#ye,n=this[\"#linear-slider\"].clientWidth,a=1/window.devicePixelRatio,r=[];{let s=null;for(let o=0;o<=n;o+=a)if(\"hsv\"===this.#Ee||\"hsl\"===this.#Ee){let a=o/n;se({space:this.#ze,coords:mi({space:this.#Ee,coords:[360*e,100*i,100*a]},\"srgb\").coords},t)?(null===s&&(s=[],r.push(s)),s.push(100*a)):s=null}r=r.map((t=>[t.at(0),t.at(-1)]))}if(r.length>0){let t=r.map((([t,e])=>`M ${t} 35 L ${t} 17 L ${e} 17 L ${e} 35`));this[\"#linear-slider-gamut-path\"].setAttribute(\"d\",t.join(\" \"))}else this[\"#linear-slider-gamut-path\"].removeAttribute(\"d\")}}#Ve(){this[\"#alpha-slider-marker\"].style.left=100*this.#Ce+\"%\"}#Ge(){if(\"hsv\"===this.#Ee||\"hsl\"===this.#Ee){let[t,e,i]=this.#ye,s=\"srgb-linear\"===this.#ze?\"srgb\":this.#ze,n=[{space:this.#ze,coords:mi({space:this.#Ee,coords:[360*t,100*e,100*i]},s).coords,alpha:0},{space:this.#ze,coords:mi({space:this.#Ee,coords:[360*t,100*e,100*i]},s).coords,alpha:1}];n=n.map((t=>bi(t))).join(\",\"),this[\"#alpha-slider-gradient\"].style.background=`linear-gradient(in srgb to right, ${n})`}}#Xe(){let t=this.#De();if(\"none\"===t)this[\"#polar-slider-marker\"].removeAttribute(\"data-warn\"),this[\"#linear-slider-marker\"].removeAttribute(\"data-warn\");else{let[e,i,s]=this.#ye;se({space:this.#ze,coords:mi({space:this.#Ee,coords:[360*e,100*i,100*s]},\"srgb\").coords},t)?(this[\"#polar-slider-marker\"].removeAttribute(\"data-warn\"),this[\"#linear-slider-marker\"].removeAttribute(\"data-warn\")):(this[\"#polar-slider-marker\"].setAttribute(\"data-warn\",\"\"),this[\"#linear-slider-marker\"].setAttribute(\"data-warn\",\"\"))}}#Be(){this.#Se?(\"hsv\"===this.#Ee?this[\"#linear-slider-label\"].textContent=\"V\":\"hsl\"===this.#Ee&&(this[\"#linear-slider-label\"].textContent=\"L\"),this[\"#alpha-slider-label\"].textContent=\"A\"):(this[\"#linear-slider-label\"].textContent=\"\",this[\"#alpha-slider-label\"].textContent=\"\")}#Ie(){for(let t of this[\"#color-model-menu\"].querySelectorAll(\"x-menuitem\"))t.toggled=t.value===this.#Ee;for(let t of this[\"#gamut-hints-menu\"].querySelectorAll(\"x-menuitem\"))t.toggled=t.value===this.#$e;this[\"#labels-menu-item\"].toggled=this.#Se}}void 0===customElements.get(\"x-rgbpolarsliders\")&&customElements.define(\"x-rgbpolarsliders\",Ma);class La extends HTMLElement{static observedAttributes=[\"value\",\"alpha\",\"spaces\",\"disabled\",\"size\"];static#z=Ns`<template><div id=\"preview\"></div><x-popover id=\"popover\" part=\"popover\" modal><x-colorpicker id=\"color-picker\"></x-colorpicker></x-popover></template>`;static#E=Fs`:host{display:block;width:32px;height:32px;box-sizing:border-box;position:relative;overflow:hidden;background:var(--checkboard-background)}:host([hidden]){display:none}:host([disabled]){pointer-events:none;opacity:0.4}#preview{width:100%;height:100%}#popover{overflow:visible;--align: left;}\n`;get value(){return this.hasAttribute(\"value\")?this.getAttribute(\"value\"):\"#000000\"}set value(t){this.setAttribute(\"value\",t)}get alpha(){return this.hasAttribute(\"alpha\")}set alpha(t){t?this.setAttribute(\"alpha\",\"\"):this.removeAttribute(\"alpha\")}get spaces(){return this.hasAttribute(\"spaces\")?this.getAttribute(\"spaces\").replace(/\\s+/g,\" \").split(\" \"):[\"srgb\",\"p3\"]}set spaces(t){this.setAttribute(\"spaces\",t.join(\" \"))}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}get size(){let t=this.getAttribute(\"size\");return\"small\"===t||\"large\"===t?t:null}set size(t){\"small\"===t||\"large\"===t?this.setAttribute(\"size\",t):this.removeAttribute(\"size\")}#$=null;#X=!1;#Xi=!1;#U=0;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.adoptedStyleSheets=[Gn.themeStyleSheet,La.#E],this.#$.append(document.importNode(La.#z.content,!0));for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t;this.addEventListener(\"keydown\",(t=>this.#W(t))),this.addEventListener(\"pointerdown\",(t=>this.#Y(t))),this[\"#preview\"].addEventListener(\"click\",(t=>this.#P(t))),this[\"#popover\"].addEventListener(\"close\",(()=>this.#_i())),this[\"#color-picker\"].addEventListener(\"changestart\",(()=>this.#Zi())),this[\"#color-picker\"].addEventListener(\"change\",(t=>this.#Ui(t))),this[\"#color-picker\"].addEventListener(\"changeend\",(()=>this.#Yi()))}connectedCallback(){this[\"#color-picker\"].setAttribute(\"value\",this.value),this.#J(),this.#Vi()}attributeChangedCallback(t,e,i){e!==i&&(\"value\"===t?this.#Zt():\"alpha\"===t?this.#pe():\"spaces\"===t?this.#me():\"disabled\"===t?this.#vt():\"size\"===t&&this.#qi())}async#Vt(){!1===this.hasAttribute(\"expanded\")&&(this.#X=this.matches(\":focus\"),this.setAttribute(\"expanded\",\"\"),await this[\"#popover\"].open(this),this[\"#popover\"].focus())}async#Wt(t=null){if(this.hasAttribute(\"expanded\")){if(this[\"#popover\"].setAttribute(\"closing\",\"\"),await this[\"#popover\"].close(),this.removeAttribute(\"expanded\"),this.#X)this.focus();else{let t=Zn(this.parentNode,\"[tabindex]\");t&&t.focus()}this[\"#popover\"].removeAttribute(\"closing\")}}#Vi(){this[\"#preview\"].style.background=this.value}#J(){this.setAttribute(\"aria-disabled\",this.disabled),this.disabled?(this.#U=this.tabIndex>0?this.tabIndex:0,this.tabIndex=-1):(this.tabIndex<0&&(this.tabIndex=this.#U>0?this.#U:0),this.#U=0)}#Zt(){!1===this.#Xi&&(this.#Vi(),this[\"#color-picker\"].getAttribute(\"value\")!==this.getAttribute(\"value\")&&this[\"#color-picker\"].setAttribute(\"value\",this.getAttribute(\"value\")))}#pe(){this[\"#color-picker\"].alpha=this.alpha}#me(){this[\"#color-picker\"].spaces=this.spaces}#vt(){this.#J()}#qi(){this[\"#color-picker\"].size=this.size}#Zi(){this.#Xi=!0,this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0}))}#Ui(t){this.value=this[\"#color-picker\"].value,this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})),this.#Vi()}#Yi(){this.#Xi=!1,this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0}))}#Y(t){t.target===this&&!1===this.matches(\":focus\")&&t.preventDefault()}#P(t){!1===this[\"#popover\"].opened&&(t.preventDefault(),this.#Vt())}#W(t){\"Enter\"===t.code||\"NumpadEnter\"===t.code||\"Space\"===t.code?(t.preventDefault(),t.stopPropagation(),this.hasAttribute(\"expanded\")?this.#Wt():this.#Vt()):\"Escape\"===t.code?this.hasAttribute(\"expanded\")&&(t.preventDefault(),this.#Wt()):\"Tab\"===t.code&&this.hasAttribute(\"expanded\")&&t.preventDefault()}#_i(){this.dispatchEvent(new CustomEvent(\"collapse\")),this.#Wt()}}customElements.define(\"x-colorselect\",La);class Aa extends HTMLElement{static#z=Ns`<template><slot></slot></template>`;static#E=Fs`:host{display:block;position:fixed;width:0px;height:0px;font-size:0.875rem;z-index:1001}\n`;get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}#$=null;#Wi=null;#Ki=null;#Ji=null;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.adoptedStyleSheets=[Aa.#E],this.#$.append(document.importNode(Aa.#z.content,!0)),this[\"#backdrop\"]=Xn(\"x-backdrop\"),this[\"#backdrop\"].style.background=\"rgba(0, 0, 0, 0)\",this[\"#backdrop\"].addEventListener(\"contextmenu\",(t=>this.#Qi(t))),this[\"#backdrop\"].addEventListener(\"pointerdown\",(t=>this.#ut(t))),this[\"#backdrop\"].addEventListener(\"click\",(t=>this.#At(t))),this.addEventListener(\"blur\",(t=>this.#ts())),this.addEventListener(\"keydown\",(t=>this.#W(t)),!0),this.addEventListener(\"click\",(t=>this.#P(t)))}connectedCallback(){this.#Wi=this.parentElement||this.parentNode.host,window.addEventListener(\"blur\",this.#Ki=()=>{this.#ts()}),this.#Wi.addEventListener(\"contextmenu\",this.#Ji=t=>{this.#es(t)})}disconnectedCallback(){window.removeEventListener(\"blur\",this.#Ki),this.#Wi.removeEventListener(\"contextmenu\",this.#Ji),this.#Wi=null}open(t,e){let i=this.querySelector(\"x-menu\");!1===i.opened&&(i.openAtPoint(t,e),this[\"#backdrop\"].ownerElement=i,this[\"#backdrop\"].show(!1),i.focus())}close(){return new Promise((async t=>{this[\"#backdrop\"].hide(!1);let e=this.querySelector(\"x-menu\");if(e&&!0===e.opened&&(await e.close(),this.isConnected)){let t=Zn(this.parentNode,\"[tabindex]\");t&&t.focus()}t()}))}#ts(){this.close()}#es(t){!1===this.disabled&&(t.preventDefault(),this.open(t.clientX,t.clientY))}#Qi(t){\"touch\"!==t.pointerType&&(t.preventDefault(),t.stopImmediatePropagation(),this.close().then((()=>{let e=((t,e,i=!0)=>{let s=document.elementFromPoint(t,e);if(i&&s)for(;;){let i=s.shadowRoot||s._shadowRoot;if(!i)break;{let n=i.elementFromPoint(t,e);if(n.getRootNode()!==i&&(n=null),!n||n===s)break;s=n}}return s})(t.clientX,t.clientY,!0),i=new MouseEvent(t.type,t);e.dispatchEvent(i)})))}#ut(t){t.buttons<=1&&\"touch\"!==t.pointerType&&(t.preventDefault(),t.stopImmediatePropagation(),this.close())}#At(t){\"touch\"===t.pointerType&&this.close()}async#P(t){let e=t.target.closest(\"x-menuitem\");if(e&&!1===e.disabled){let t=e.querySelector(\"x-menu\");t?t.opened?t.close():t.openNextToElement(e,\"horizontal\"):(this.setAttribute(\"closing\",\"\"),await e.whenTriggerEnd,await this.close(),this.removeAttribute(\"closing\"))}}#W(t){if(\"Escape\"===t.code){this.querySelector(\"x-menu\").opened&&(t.preventDefault(),this.close())}else if(\"Tab\"===t.code){t.preventDefault(),t.stopPropagation(),this.querySelector(\"x-menu\").focusNextMenuItem()}}}customElements.define(\"x-contextmenu\",Aa);class Ra extends HTMLElement{static#z=Ns`<template><slot></slot></template>`;static#E=Fs`:host{display:none;width:300px;height:100%;left:0px;right:auto;top:0px;bottom:auto;padding:0;box-sizing:border-box;border-width:0;transition-duration:200ms;transition-timing-function:linear}:host([position=\"right\"]){top:0px;bottom:auto;left:auto;right:0px}:host([position=\"top\"]){top:0px;bottom:auto;left:0px;right:auto;width:100%;height:300px}:host([position=\"bottom\"]){top:auto;bottom:0px;left:0px;right:auto;width:100%;height:300px}:host([popover]){display:block}:host(:popover-open){display:block}:host([hidden]){display:none}:host(:focus){outline:none}:host::backdrop{background-color:color(srgb 0 0 0 / 0.25);transition-property:all;transition-duration:200ms;transition-timing-function:linear;transition-behavior:allow-discrete}\n`;get position(){return this.hasAttribute(\"position\")?this.getAttribute(\"position\"):\"left\"}set position(t){this.setAttribute(\"position\",t)}get manual(){return this.hasAttribute(\"manual\")}set manual(t){t?this.setAttribute(\"manual\",\"\"):this.removeAttribute(\"manual\")}#$=null;#is;#ss;#ns;showPopover=void 0;hidePopover=void 0;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.adoptedStyleSheets=[Ra.#E],this.#$.append(document.importNode(Ra.#z.content,!0)),this.addEventListener(\"pointerdown\",(t=>{t.stopPropagation()})),this.addEventListener(\"click\",(t=>{t.stopPropagation()}))}open(){return new Promise((async t=>{if(!1===this.isConnected)return void t();this.#is&&await this.#is.finished,this.#ss&&await this.#ss.finished,this.setAttribute(\"popover\",\"manual\"),this.setAttribute(\"tabindex\",\"0\"),this.setAttribute(\"position\",this.position);let e=getComputedStyle(this),i=1e3*parseFloat(e.getPropertyValue(\"transition-duration\")||\"0s\"),s=e.getPropertyValue(\"transition-timing-function\"),n=this.getBoundingClientRect();\"left\"===this.position?this.#is=this.animate({transform:[`translateX(-${n.right}px)`,\"translateX(0px)\"]},{duration:i,easing:s}):\"right\"===this.position?this.#is=this.animate({transform:[`translateX(${n.width}px)`,\"translateX(0px)\"]},{duration:i,easing:s}):\"top\"===this.position?this.#is=this.animate({transform:[`translateY(-${n.bottom}px)`,\"translateY(0px)\"]},{duration:i,easing:s}):\"bottom\"===this.position&&(this.#is=this.animate({transform:[`translateY(${n.height}px)`,\"translateY(0px)\"]},{duration:i,easing:s})),window.addEventListener(\"click\",this.#ns=t=>{if(\"finished\"===this.#is.playState&&this.popover){let e=this.getBoundingClientRect();!1===Ei(e,{x:t.clientX,y:t.clientY})&&(getComputedStyle(this,\"::backdrop\").pointerEvents,this.manual||this.close())}}),super.showPopover(),t()}))}close(){return new Promise((async t=>{this.#is&&await this.#is.finished,this.#ss&&await this.#ss.finished,window.removeEventListener(\"click\",this.#ns);let e=getComputedStyle(this),i=1e3*parseFloat(e.getPropertyValue(\"transition-duration\")||\"0s\"),s=e.getPropertyValue(\"transition-timing-function\")||\"ease\",n=this.getBoundingClientRect();\"left\"===this.position?this.#ss=this.animate({transform:[\"translateX(0px)\",`translateX(-${n.right}px)`]},{duration:i,easing:s}):\"right\"===this.position?this.#ss=this.animate({transform:[\"translateX(0px)\",`translateX(${n.width}px)`]},{duration:i,easing:s}):\"top\"===this.position?this.#ss=this.animate({transform:[\"translateY(0px)\",`translateY(-${n.bottom+50}px)`]},{duration:i,easing:s}):\"bottom\"===this.position&&(this.#ss=this.animate({transform:[\"translateY(0px)\",`translateY(${n.height}px)`]},{duration:i,easing:s})),this.#ss&&(await this.#ss.finished,this.#ss=null),super.hidePopover(),this.removeAttribute(\"popover\"),this.removeAttribute(\"tabindex\"),t()}))}toggle(){this.hasAttribute(\"popover\")?this.close():this.open()}}customElements.define(\"x-drawer\",Ra);class Pa extends HTMLElement{static observedAttributes=[\"href\"];static#z=Ns`<template><svg id=\"svg\" preserveAspectRatio=\"none\" viewBox=\"0 0 100 100\" width=\"0px\" height=\"0px\"></svg><slot></slot></template>`;static#E=Fs`:host{display:block;color:currentColor;display:flex;align-items:center;justify-content:center;width:17px;height:17px}:host([disabled]){opacity:0.5}:host([hidden]){display:none}#svg{width:100%;height:100%;fill:currentColor;stroke:none;overflow:inherit;pointer-events:none}\n`;get href(){return this.hasAttribute(\"href\")?this.getAttribute(\"href\"):\"\"}set href(t){this.setAttribute(\"href\",t)}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}get size(){let t=this.getAttribute(\"size\");return\"small\"===t||\"large\"===t?t:null}set size(t){\"small\"===t||\"large\"===t?this.setAttribute(\"size\",t):this.removeAttribute(\"size\")}#$=null;#as=null;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.adoptedStyleSheets=[Pa.#E],this.#$.append(document.importNode(Pa.#z.content,!0));for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t;this.addEventListener(\"pointerenter\",(()=>this.#V())),this.addEventListener(\"pointerleave\",(()=>this.#q()))}connectedCallback(){Gn.addEventListener(\"iconschange\",this.#as=()=>{this.#Xt()})}disconnectedCallback(){Gn.removeEventListener(\"iconschange\",this.#as)}attributeChangedCallback(t,e,i){e!==i&&\"href\"===t&&this.#Xt()}#V(){let t=this.querySelector(\":scope > x-tooltip\");t&&!1===t.disabled&&t.open(this)}#q(){let t=this.querySelector(\":scope > x-tooltip\");t&&t.close()}async#Xt(){let t=null,e=this.href.trim();if(\"\"!==e){let i=null,s=null;if(e.includes(\"#\")){let t=e.split(\"#\");\"\"!==t[0]&&(i=t[0]),\"\"!==t[1]&&(s=t[1])}if(null!==s)if(null===i)await Gn.whenIconsReady,t=Gn.queryIcon(\"#\"+CSS.escape(s));else{let e=await _s(i);e&&(t=e.querySelector(\"#\"+CSS.escape(s)))}}if(t){let e=new Set;for(let i of t.querySelectorAll(\"*\"))for(let s of[\"fill\",\"stroke\"]){let n=\"\";if(\"\"!==i.style[s]?n=i.style[s].trim():i.hasAttribute(s)&&(n=i.getAttribute(s).trim()),n.startsWith(\"url(\")&&n.endsWith(\")\")&&(n=n.substring(n.indexOf(\"(\")+1,n.indexOf(\")\")),n=n.replace(/['\"]+/g,\"\"),n.startsWith(\"#\"))){let i=t.ownerSVGElement.querySelector(n);if(i){e.add(i);for(let t of Yn(i))e.add(t)}}}e=[...e].filter((e=>!1===t.contains(e)));let i=\"\";e.length>0&&(i=\"<defs>\"+e.map((t=>t.outerHTML)).join(\"\")+\"</defs>\"),this[\"#svg\"].setAttribute(\"viewBox\",t.getAttribute(\"viewBox\")),this[\"#svg\"].innerHTML=i+t.innerHTML}else this[\"#svg\"].innerHTML=\"\"}}customElements.define(\"x-icon\",Pa);class Ta extends HTMLElement{static observedAttributes=[\"type\",\"value\",\"spellcheck\",\"minlength\",\"maxlength\",\"readonly\",\"disabled\",\"validation\"];static#z=Ns`<template><div id=\"main\"><slot></slot><input id=\"input\" spellcheck=\"false\" part=\"input\"></div></template>`;static#E=Fs`:host{display:block;position:relative;max-width:160px;height:32px;box-sizing:border-box;font-size:0.78125rem}:host(:focus){z-index:10}:host(:hover){cursor:text}:host([mixed]){color:rgba(0, 0, 0, 0.7)}:host([disabled]){pointer-events:none;opacity:0.5}:host([hidden]){display:none}::selection{color:var(--selection-color);background-color:var(--selection-background-color)}#main{display:flex;align-items:center;width:100%;height:100%}#input{width:100%;height:100%;padding:0 6px;box-sizing:border-box;color:inherit;background:none;border:none;outline:none;font-family:inherit;font-size:inherit;font-weight:inherit;text-align:inherit;cursor:inherit;z-index:1}#input:-webkit-autofill{z-index:1}#input:-internal-autofill-previewed, #input:-internal-autofill-selected{-webkit-box-shadow:var(--autofill-background-color) 0px 0px 0px 30px inset}:host(:not(:focus)) ::selection{color:inherit;background:transparent}\n`;get type(){return this.hasAttribute(\"type\")?this.getAttribute(\"type\"):\"text\"}set type(t){this.setAttribute(\"type\",t)}get value(){return this[\"#input\"].value}set value(t){this[\"#input\"].value!==t&&(this.matches(\":focus\")?(this[\"#input\"].selectionStart=0,this[\"#input\"].selectionEnd=this[\"#input\"].value.length,document.execCommand(\"insertText\",!1,t)):this[\"#input\"].value=t,\"instant\"===this.validation?this.reportValidity():\"auto\"!==this.validation&&\"manual\"!==this.validation||(this.#Et||this.#rs)&&this.reportValidity(),this.#zt())}get spellcheck(){return this.hasAttribute(\"spellcheck\")}set spellcheck(t){t?this.setAttribute(\"spellcheck\",\"\"):this.removeAttribute(\"spellcheck\")}get minLength(){return this.hasAttribute(\"minlength\")?parseInt(this.getAttribute(\"minlength\")):0}set minLength(t){this.setAttribute(\"minlength\",t)}get maxLength(){return this.hasAttribute(\"maxlength\")?parseInt(this.getAttribute(\"maxlength\")):Infinity}set maxLength(t){this.setAttribute(\"maxlength\",t)}get required(){return this.hasAttribute(\"required\")}set required(t){t?this.setAttribute(\"required\",\"\"):this.removeAttribute(\"required\")}get readOnly(){return this.hasAttribute(\"readonly\")}set readOnly(t){!0===t?this.setAttribute(\"readonly\",t):this.removeAttribute(\"readonly\")}get mixed(){return this.hasAttribute(\"mixed\")}set mixed(t){t?this.setAttribute(\"mixed\",\"\"):this.removeAttribute(\"mixed\")}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}get validation(){return this.hasAttribute(\"validation\")?this.getAttribute(\"validation\"):\"auto\"}set validation(t){this.setAttribute(\"validation\",t)}get size(){let t=this.getAttribute(\"size\");return\"small\"===t||\"large\"===t?t:null}set size(t){\"small\"===t||\"large\"===t?this.setAttribute(\"size\",t):this.removeAttribute(\"size\")}get empty(){return this.hasAttribute(\"empty\")}get error(){return this.hasAttribute(\"error\")}#$=null;#U=0;#os=0;#Et=null;#rs=null;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\",delegatesFocus:!0}),this.#$.adoptedStyleSheets=[Ta.#E],this.#$.append(document.importNode(Ta.#z.content,!0));for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t;this.addEventListener(\"click\",(t=>this.#P(t))),this.addEventListener(\"pointerenter\",(()=>this.#V())),this.addEventListener(\"pointerleave\",(()=>this.#q())),this.addEventListener(\"focusin\",(t=>this.#Rt(t))),this.addEventListener(\"focusout\",(t=>this.#Pt(t))),this.addEventListener(\"keydown\",(t=>this.#W(t))),this[\"#input\"].addEventListener(\"input\",(t=>this.#Tt(t))),this[\"#input\"].addEventListener(\"change\",(t=>this.#de(t))),this[\"#input\"].addEventListener(\"search\",(t=>this.#Bt(t)))}connectedCallback(){this.#J(),this.#zt(),\"instant\"===this.validation?this.reportValidity():\"auto\"!==this.validation&&\"manual\"!==this.validation||(this.#Et||this.#rs)&&this.reportValidity()}attributeChangedCallback(t,e,i){e!==i&&(\"type\"===t?this.#ls():\"value\"===t?this.#Zt():\"spellcheck\"===t?this.#hs():\"minlength\"===t?this.#ds():\"maxlength\"===t?this.#cs():\"readonly\"===t?this.#us():\"disabled\"===t?this.#vt():\"validation\"===t&&this.#ps())}selectAll(){this[\"#input\"].select()}clear(){this.value=\"\",this.#Et=null,this.#rs=null,this.#Yt()}reportValidity(){let t=new CustomEvent(\"beforevalidate\",{bubbles:!1,cancelable:!0});return this.dispatchEvent(t),!1===t.defaultPrevented&&(this.value.length<this.minLength?this.#Et={href:\"#entered-text-is-too-short\"}:this.value.length>this.maxLength?this.#Et={href:\"#entered-text-is-too-long\"}:this.required&&0===this.value.length?this.#Et={href:\"#required-field\"}:\"email\"===this.type&&!1===this[\"#input\"].validity.valid?this.#Et={href:\"#invalid-email\"}:\"url\"===this.type&&!1===this[\"#input\"].validity.valid?this.#Et={href:\"#invalid-url\"}:\"color\"===this.type&&!1===Hs(this[\"#input\"].value)?this.#Et={href:\"#invalid-color\"}:this.#Et=null,this.#Yt()),null===this.#Et&&null===this.#rs}setCustomValidity(t){this.#rs=\"\"===t?null:t,this.#Yt()}#Yt(){let t=this.#rs||this.#Et;t?this.setAttribute(\"error\",\"\"):this.removeAttribute(\"error\");{let e=this.querySelector(':scope > x-tooltip[type=\"error\"]');if(t&&this.matches(\":focus\")){if(e||(e=Xn(\"x-tooltip\"),e.setAttribute(\"type\",\"error\"),this.append(e)),t.href){let i=t.args?Object.entries(t.args).map((([t,e])=>`${t}:${e}`)).join(\",\"):\"\";e.innerHTML=`<x-message href=\"${t.href}\" args=\"${i}\"></x-message>`}else e.innerHTML=t;jn(10).then((()=>{e.open(this)}))}else e&&e.close().then((()=>e.remove()))}}#zt(){0===this.value.length?this.setAttribute(\"empty\",\"\"):this.removeAttribute(\"empty\")}#J(){this.setAttribute(\"role\",\"input\"),this.setAttribute(\"aria-disabled\",this.disabled),this.setAttribute(\"aria-readonly\",this.readOnly),this.disabled?(this.#U=this.tabIndex>0?this.tabIndex:0,this.tabIndex=-1):(this.tabIndex<0&&(this.tabIndex=this.#U>0?this.#U:0),this.#U=0)}#ls(){\"color\"===this.type?this[\"#input\"].type=\"text\":this[\"#input\"].type=this.type}#Zt(){this.value=this.hasAttribute(\"value\")?this.getAttribute(\"value\"):\"\",this.matches(\":focus\")&&this.selectAll()}#hs(){this[\"#input\"].spellcheck=this.spellcheck}#ds(){this[\"#input\"].minLength=this.minLength}#cs(){this[\"#input\"].maxLength=this.maxLength}#us(){this[\"#input\"].readOnly=this.readOnly,this.#J()}#vt(){this[\"#input\"].disabled=this.disabled,this.#J()}#ps(){\"instant\"===this.validation?this.reportValidity():\"auto\"!==this.validation&&\"manual\"!==this.validation||(this.#Et||this.#rs)&&this.reportValidity()}#P(){this.#Yt()}#V(){let t=this.querySelector(\":scope > x-tooltip\");t&&!1===t.disabled&&t.open(this)}#q(){let t=this.querySelector(\":scope > x-tooltip\");t&&t.close()}#Rt(){this.#Yt(),this.dispatchEvent(new CustomEvent(\"textinputmodestart\",{bubbles:!0,composed:!0}))}#Pt(){this.dispatchEvent(new CustomEvent(\"textinputmodeend\",{bubbles:!0,composed:!0})),\"auto\"===this.validation||\"instant\"===this.validation?this.reportValidity():\"manual\"===this.validation&&this.#Yt()}#W(t){\"Enter\"!==t.code&&\"NumpadEnter\"!==t.code||(document.execCommand(\"selectAll\"),\"instant\"===this.validation?this.reportValidity():\"auto\"!==this.validation&&\"manual\"!==this.validation||this.reportValidity())}#Tt(t){\"instant\"===this.validation?this.reportValidity():\"auto\"!==this.validation&&\"manual\"!==this.validation||(this.#Et||this.#rs)&&this.reportValidity(),t.stopPropagation(),this.#zt(),this.dispatchEvent(new CustomEvent(\"input\",{bubbles:!0}))}#de(t){this.#os=t.timeStamp,this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0}))}#Bt(t){t.timeStamp-this.#os>100&&this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0}))}}customElements.define(\"x-input\",Ta);class Da extends HTMLElement{static#z=Ns`<template><slot></slot></template>`;static#E=Fs`:host{display:block;cursor:inherit;user-select:none;-webkit-user-select:none;box-sizing:border-box;font-size:0.8125rem;font-weight:400;line-height:1.2}:host([disabled]){opacity:0.5}:host([hidden]){display:none}:host([level=\"1\"]){margin:12px 0px;font-size:1.625rem;font-weight:600}:host([level=\"2\"]){margin:10px 0px;font-size:1rem;font-weight:700}:host([level=\"3\"]){margin:8px 0px;font-size:0.8125rem;font-weight:700}:host([level=\"4\"]){margin:4px 0px;font-size:0.75rem;font-weight:500}slot{text-decoration:inherit}\n`;get value(){return this.hasAttribute(\"value\")?this.getAttribute(\"value\"):null}set value(t){null===t?this.removeAttribute(\"value\"):this.setAttribute(\"value\",t)}get level(){return this.hasAttribute(\"level\")?parseInt(this.getAttribute(\"level\")):null}set level(t){null===t?this.removeAttribute(\"level\"):this.setAttribute(\"level\",t)}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}#$=null;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.adoptedStyleSheets=[Da.#E],this.#$.append(document.importNode(Da.#z.content,!0))}}customElements.define(\"x-label\",Da);let{isFinite:Ba,isNaN:Ia,parseFloat:Oa}=Number;class Ha extends HTMLElement{static observedAttributes=[\"href\",\"args\",\"autocapitalize\",\"ellipsis\"];get href(){return this.hasAttribute(\"href\")?this.getAttribute(\"href\"):\"\"}set href(t){this.setAttribute(\"href\",t)}get args(){let t=Object.create(null),e=this.hasAttribute(\"args\")?this.getAttribute(\"args\").trim():\"\";if(\"\"!==e)for(let i of e.split(\",\")){let[e,...s]=i.split(\":\"),n=s.join(\":\");e=e.trim(),n=n.trim();let a=parseFloat(n),r=n-a+1>=0;t[e]=r?a:n}return t}set args(t){let e=Object.keys(t).map((e=>`${e}: ${t[e]}`)).join(\", \");0===t.length?this.removeAttribute(\"args\"):this.setAttribute(\"args\",e)}get autocapitalize(){return!!this.hasAttribute(\"autocapitalize\")}set autocapitalize(t){t?this.setAttribute(\"autocapitalize\",\"\"):this.removeAttribute(\"autocapitalize\")}get ellipsis(){return this.hasAttribute(\"ellipsis\")}set ellipsis(t){t?this.setAttribute(\"ellipsis\",\"\"):this.removeAttribute(\"ellipsis\")}get whenReady(){return new Promise((t=>{null===this.#ms?t():this.#ms.push(t)}))}#bs=null;#St=null;#ms=[];#gs=\"\";constructor(){super(),this.textContent.length>0&&(this.#gs=this.textContent)}connectedCallback(){this.#Xt(),Gn.addEventListener(\"localeschange\",this.#bs=()=>{this.#Xt()}),Gn.addEventListener(\"themechange\",this.#St=()=>{this.#Xt()})}disconnectedCallback(){Gn.removeEventListener(\"localeschange\",this.#bs),Gn.removeEventListener(\"themechange\",this.#St)}attributeChangedCallback(t,e,i){e!==i&&!1!==this.isConnected&&(\"href\"===t||\"args\"===t||\"autocapitalize\"===t||\"ellipsis\"===t)&&this.#Xt()}async#Xt(){await Gn.whenLocalesReady;let t=Gn.queryMessage(this.href,this.args);if(t.fallback&&this.#gs?this.textContent=this.#gs:\"html\"===t.format?this.innerHTML=t.content+(this.ellipsis?\"…\":\"\"):!0===this.autocapitalize&&\"titlecase\"===Gn.autocapitalize?this.textContent=(t=>{let e=/^(a|an|and|as|at|but|by|en|for|if|in|nor|of|on|or|per|the|to|v.?|vs.?|via)$/i,i=/([A-Za-z0-9\\u00C0-\\u00FF])/;return t.split(/([ :–—-])/).map(((t,s,n)=>t.search(e)>-1&&0!==s&&s!==n.length-1&&\":\"!==n[s-3]&&\":\"!==n[s+1]&&(\"-\"!==n[s+1]||\"-\"===n[s-1]&&\"-\"===n[s+1])?t.toLowerCase():t.substr(1).search(/[A-Z]|\\../)>-1||\":\"===n[s+1]&&\"\"!==n[s+2]?t:t.replace(i,(t=>t.toUpperCase())))).join(\"\")})(t.content)+(this.ellipsis?\"…\":\"\"):this.textContent=t.content+(this.ellipsis?\"…\":\"\"),null!==this.#ms){for(let t of this.#ms)t();this.#ms=null}}}customElements.define(\"x-message\",Ha);let ja=t=>{let[e,i,...s]=t.trim().split(\" \");return[i,parseFloat(e),s.join(\" \")]},{abs:Na}=Math;class Fa extends HTMLElement{static observedAttributes=[\"opened\"];static#z=Ns`<template><slot id=\"slot\"></slot></template>`;static#E=Fs`:host{display:none;top:0;left:0;width:fit-content;padding:4px 0;z-index:1001;box-sizing:border-box;background:white;cursor:default;overflow:auto;flex-direction:column;-webkit-app-region:no-drag;--align: start;--scrollbar-background: rgba(0, 0, 0, 0.2);--scrollbar-width: 6px;--open-transition: none;--close-transition: none;}:host([opened]), :host([animating]){display:flex}:host(:focus){outline:none}:host-context([debug]):host(:focus){outline:2px solid red}::-webkit-scrollbar{max-width:var(--scrollbar-width);background:none}::-webkit-scrollbar-thumb{background-color:var(--scrollbar-background)}::-webkit-scrollbar-corner{display:none}\n`;get opened(){return this.hasAttribute(\"opened\")}#$=null;#fs=[];#xs=null;#ws=null;#vs=0;#ks=0;#ys=!1;#Cs=!1;#zs=null;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.adoptedStyleSheets=[Fa.#E],this.#$.append(document.importNode(Fa.#z.content,!0));for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t;this.addEventListener(\"pointerdown\",(t=>this.#Y(t))),this.addEventListener(\"pointerover\",(t=>this.#Es(t))),this.addEventListener(\"pointerout\",(t=>this.#$s(t))),this.addEventListener(\"pointermove\",(t=>this.#Ss(t))),this.addEventListener(\"keydown\",(t=>this.#W(t))),this.addEventListener(\"wheel\",(t=>this.#Ms(t)),{passive:!1}),this.addEventListener(\"scroll\",(t=>this.#Ls(t)),{passive:!0})}connectedCallback(){this.setAttribute(\"role\",\"menu\"),this.setAttribute(\"aria-hidden\",!this.opened),this.setAttribute(\"tabindex\",\"0\")}attributeChangedCallback(t,e,i){e!==i&&\"opened\"===t&&this.#As()}openOverElement(t,e){return new Promise((async i=>{let s=this.querySelectorAll(\":scope > x-menuitem\");if(s.length>0){this.#ys=!0,this.#zs=Nn(),this.#Rs(),this.setAttribute(\"opened\",\"\");let i=[...s].find((t=>t.contains(e)))||s[0],n=this.getBoundingClientRect(),a=t.getBoundingClientRect(),r=e.getBoundingClientRect(),o=0,l=0;i.focus(),0===n.top&&0===n.left||(o=-n.left,l=-n.top),this.style.left=a.x-(r.x-n.x)+o+\"px\",this.style.top=a.y-(r.y-n.y)+l+\"px\",n=this.getBoundingClientRect(),n.left<7&&(this.style.left=7+o+\"px\",n=this.getBoundingClientRect());7-n.top>0&&(this.style.height=n.bottom-7+\"px\",this.style.top=7+l+\"px\",this.scrollTop=9999,n=this.getBoundingClientRect());if(n.bottom+7>window.innerHeight){let t=n.bottom-window.innerHeight,e=n.height-t-7;this.style.height=e+\"px\"}if(n.right+7>window.innerWidth){let t=n.right-window.innerWidth,e=n.width-t-7;this.style.width=`${e}px`}{let t=getComputedStyle(this).getPropertyValue(\"--open-transition\"),[e,i,s]=ja(t);if(\"transform\"===e){let t=this.getBoundingClientRect(),e=a.y+a.height/2-t.top;await this.animate({transform:[\"scaleY(0)\",\"scaleY(1)\"],transformOrigin:[`0 ${e}px`,`0 ${e}px`]},{duration:i,easing:s}).finished}}this.dispatchEvent(new CustomEvent(\"open\",{bubbles:!0,detail:this})),this.#ks=l}i()}))}openOverLabel(t){return new Promise((async e=>{let i=this.querySelectorAll(\":scope > x-menuitem\");if(i.length>0){this.#Rs(),this.setAttribute(\"opened\",\"\"),this.#ys=!0,this.#zs=Nn();let e=[...i].find((e=>{let i=e.querySelector(\"x-label\");return!(!i||i.textContent!==t.textContent)}));e||(e=i[0]);let s=e.querySelector(\"x-label\");await this.openOverElement(t,s)}e()}))}openNextToElement(t,e=\"horizontal\",i=0){return new Promise((async s=>{this.#ys=!1,this.#zs=Nn(),this.#Rs(),this.setAttribute(\"opened\",\"\"),this.dispatchEvent(new CustomEvent(\"open\",{bubbles:!0,detail:this})),\"x-menuitem\"===t.localName&&t.setAttribute(\"expanded\",\"\");let n=getComputedStyle(this).getPropertyValue(\"--align\").trim(),a=t.getBoundingClientRect(),r=this.getBoundingClientRect(),o=0,l=0;if(0===r.top&&0===r.left||(o=-r.left,l=-r.top),\"horizontal\"===e){this.style.top=a.top+l+\"px\",this.style.left=a.left+a.width+i+o+\"px\";let t=\"right\";{let t=this.getBoundingClientRect();t.width>window.innerWidth-10&&(this.style.width=window.innerWidth-10+\"px\"),t.height>window.innerHeight-10&&(this.style.height=window.innerHeight-10+\"px\")}{let e=this.getBoundingClientRect();e.left+e.width+7>window.innerWidth&&(a.left>e.width+7?(this.style.left=a.left-e.width+o+\"px\",t=\"left\"):a.left>window.innerWidth-(a.left+a.width)?(this.style.left=7+o+\"px\",t=\"left\"):(this.style.left=window.innerWidth-e.width-7+o+\"px\",t=\"right\"))}{let t=this.getBoundingClientRect();if(t.top+t.height+7>window.innerHeight){let e=t.top+t.height+7-window.innerHeight;this.style.top=t.top-e+l+\"px\"}}{let e=getComputedStyle(this).getPropertyValue(\"--open-transition\"),[i,s,n]=ja(e);\"transform\"===i&&await this.animate({transform:[\"scale(0, 0)\",\"scale(1, 1)\"],transformOrigin:[\"left\"===t?\"100% 0\":\"0 0\",\"left\"===t?\"100% 0\":\"0 0\"]},{duration:s,easing:n}).finished}}else if(\"vertical\"===e){this.style.top=a.top+a.height+i+l+\"px\",this.style.left=\"0px\";let e=\"bottom\";{let t=this.getBoundingClientRect();t.width>window.innerWidth-10&&(this.style.width=window.innerWidth-10+\"px\"),t.height>window.innerHeight-10&&(this.style.height=window.innerHeight-10+\"px\")}if(t.parentElement&&\"x-menubar\"===t.parentElement.localName){let t=this.getBoundingClientRect();t.top+t.height+7>window.innerHeight&&(this.style.height=window.innerHeight-(a.top+a.height)-10+\"px\")}else{let t=this.getBoundingClientRect();t.top+t.height+7>window.innerHeight&&(a.top>t.height+7?(this.style.top=a.top-t.height-i+l+\"px\",e=\"top\"):a.top>window.innerHeight-(a.top+a.height)?(this.style.top=7+l+\"px\",e=\"top\"):(this.style.top=window.innerHeight-t.height-7+l+\"px\",e=\"bottom\"))}if(\"start\"===n){this.style.left=a.left+o+\"px\";{let t=this.getBoundingClientRect();t.left+t.width+7>window.innerWidth&&(this.style.left=a.left+a.width-t.width+o+\"px\")}this.getBoundingClientRect().left<7&&(this.style.left=7+o+\"px\")}else if(\"end\"===n){this.style.left=a.left+a.width-r.width+o+\"px\";this.getBoundingClientRect().left<7&&(this.style.left=a.left+o+\"px\");{let t=this.getBoundingClientRect();t.left+t.width+7>window.innerWidth&&(this.style.left=window.innerWidth-7+o+\"px\")}}{let t=getComputedStyle(this).getPropertyValue(\"--open-transition\"),[i,s,n]=ja(t);\"transform\"===i&&await this.animate({transform:[\"scale(1, 0)\",\"scale(1, 1)\"],transformOrigin:[\"top\"===e?\"0 100%\":\"0 0\",\"top\"===e?\"0 100%\":\"0 0\"]},{duration:s,easing:n}).finished}}this.#ks=l,s()}))}openAtPoint(t,e){return new Promise((async i=>{this.#ys=!1,this.#zs=Nn(),this.#Rs(),this.setAttribute(\"opened\",\"\"),this.dispatchEvent(new CustomEvent(\"open\",{bubbles:!0,detail:this}));let s=0,n=0,a=[...this.querySelectorAll(\":scope > x-menuitem > x-label > x-message\")];await Promise.all(a.map((t=>t.whenReady)));let r=this.getBoundingClientRect();0===r.top&&0===r.left||(s=-r.left,n=-r.top),this.style.left=t+s+\"px\",this.style.top=e+n+\"px\",r=this.getBoundingClientRect(),r.right+7>window.innerWidth&&(t-=r.width,this.style.left=t+s+\"px\",r=this.getBoundingClientRect()),r.bottom+7>window.innerHeight&&(e=e+window.innerHeight-(r.top+r.height)-7,this.style.top=e+n+\"px\",r=this.getBoundingClientRect(),r.top<7&&(e=7,this.style.top=e+n+\"px\",this.style.height=window.innerHeight-7-7+\"px\"));{let t=getComputedStyle(this).getPropertyValue(\"--open-transition\"),[e,i,s]=ja(t);\"transform\"===e&&await this.animate({transform:[\"scale(0)\",\"scale(1)\"],transformOrigin:[\"0 0\",\"0 0\"]},{duration:80,easing:\"cubic-bezier(0.4, 0.0, 0.2, 1)\"}).finished}this.#ks=n,i()}))}close(t=!0){return new Promise((async e=>{if(this.opened){this.removeAttribute(\"opened\"),this.dispatchEvent(new CustomEvent(\"close\",{bubbles:!0,detail:this}));let e=this.closest(\"x-menuitem\");if(e&&e.removeAttribute(\"expanded\"),t){this.setAttribute(\"animating\",\"\");let t=getComputedStyle(this).getPropertyValue(\"--close-transition\"),[e,i,s]=ja(t);\"opacity\"===e&&await this.animate({opacity:[\"1\",\"0\"]},{duration:i,easing:s}).finished,this.removeAttribute(\"animating\")}for(let t of this.querySelectorAll(\":scope > x-menuitem\")){let e=t.querySelector(\"x-menu[opened]\");e&&e.close()}}e()}))}focusNextMenuItem(){let t=this.querySelector(\":scope > x-menuitem:focus, :scope > x-menuitem[expanded]\");if(t){let e=null;for(let i=t.nextElementSibling;i;i=i.nextElementSibling)if(\"x-menuitem\"===i.localName&&!1===i.disabled&&!1===i.hidden){e=i;break}if(null===e&&null!=t.parentElement)for(let i of t.parentElement.children)if(\"x-menuitem\"===i.localName&&!1===i.disabled&&!1===i.hidden){e=i;break}if(e){e.focus();let i=t.querySelector(\"x-menu\");i&&i.close()}}else this.focusFirstMenuItem()}focusPreviousMenuItem(){let t=this.querySelector(\":scope > x-menuitem:focus, :scope > x-menuitem[expanded]\");if(t){let e=null;for(let i=t.previousElementSibling;i;i=i.previousElementSibling)if(\"x-menuitem\"===i.localName&&!1===i.disabled&&!1===i.hidden){e=i;break}if(null===e&&null!=t.parentElement)for(let i of[...t.parentElement.children].reverse())if(\"x-menuitem\"===i.localName&&!1===i.disabled&&!1===i.hidden){e=i;break}if(e){e.focus();let i=t.querySelector(\"x-menu\");i&&i.close()}}else this.focusLastMenuItem()}focusFirstMenuItem(){let t=this.querySelectorAll(\"x-menuitem:not([disabled]):not([hidden])\")[0]||null;t&&t.focus()}focusLastMenuItem(){let t=this.querySelectorAll(\"x-menuitem:not([disabled]):not([hidden])\"),e=t.length>0?t[t.length-1]:null;e&&e.focus()}#Ps(t){let e=0;{let t=this.#fs[this.#fs.length-1],i=this.#fs[0];if(this.querySelector(\"x-menu[opened]\")&&t){i||(i=t);let s=this.getBoundingClientRect(),n={x:s.left,y:s.top-75},a={x:s.left+s.width,y:n.y},r={x:s.left,y:s.top+s.height+75},o={x:s.left+s.width,y:r.y},l=!0;if((i.x<s.left||i.x>o.x||i.y<s.top||i.y>o.y)&&(l=!1),this.#ws&&t.x===this.#ws.x&&t.y===this.#ws.y&&(l=!1),l){let s,n;s=a,n=o;let r=(t,e)=>(e.y-t.y)/(e.x-t.x),l=r(t,s),h=r(t,n),d=r(i,s),c=r(i,n);l<d&&h>c?(this.#ws=t,e=300):this.#ws=null}}}e>0?this.#xs=setTimeout((()=>{this.#Ps(t)}),e):t()}#Ts(){this.#xs&&(clearTimeout(this.#xs),this.#xs=null)}#Rs(){this.style.position=\"fixed\",this.style.top=\"0px\",this.style.left=\"0px\",this.style.width=null,this.style.height=null,this.style.minWidth=null,this.style.maxWidth=null}#Ds(){return this.matches(\"*[closing], *[closing] x-menu\")}#As(){this.setAttribute(\"aria-hidden\",!this.opened)}#Y(t){if(t.target!==this&&\"hr\"!==t.target.localName||t.stopPropagation(),\"touch\"===t.pointerType&&t.target.closest(\"x-menu\")===this){!1===this.#Cs&&this.#Bs();{let e=t.target.closest(\"x-menuitem\");e&&!1===e.disabled&&e.closest(\"x-menu\")===this?!1===e.matches(\":focus\")&&this.#Ps((async()=>{let t=this.querySelector(\":scope > x-menuitem:focus\");if(t){let e=t.querySelector(\"x-menu\");e&&e.close()}e.closest(\"x-menu\");let i=e.querySelector(\"x-menu\"),s=[...this.querySelectorAll(\":scope > x-menuitem\")].filter((t=>t!==e));i&&!1===i.opened&&i.openNextToElement(e,\"horizontal\");for(let t of s){let e=t.querySelector(\"x-menu\");e&&e.close()}})):this.#Ps((()=>{this.focus()}))}}}#Es(t){if(!this.#Ds()&&\"touch\"!==t.pointerType&&t.target.closest(\"x-menu\")===this){!1===this.#Cs&&this.#Bs();{let e=t.target.closest(\"x-menuitem\");e&&!1===e.disabled&&e.closest(\"x-menu\")===this?!1===e.matches(\":focus\")&&this.#Ps((async()=>{let t=this.querySelector(\":scope > x-menuitem:focus\");if(t){let e=t.querySelector(\"x-menu\");e&&e.close()}e.focus(),e.closest(\"x-menu\");let i=e.querySelector(\"x-menu\"),s=[...this.querySelectorAll(\":scope > x-menuitem\")].filter((t=>t!==e));i&&(await jn(60),e.matches(\":focus\")&&!1===i.opened&&i.openNextToElement(e,\"horizontal\"));for(let t of s){let e=t.querySelector(\"x-menu\");e&&e.close()}})):this.#Ps((()=>{this.focus()}))}}}#$s(t){t.relatedTarget&&Zn(t.relatedTarget,\"x-menu\")===this||!0===this.#Cs&&this.#Is()}#Bs(){this.#Ds()||(this.#Cs=!0,this.#Ts())}#Is(){this.#Ds()||(this.#Cs=!1,this.#Ts(),this.focus())}#Ss(t){this.#fs.push({x:t.clientX,y:t.clientY}),this.#fs.length>3&&this.#fs.shift()}#Ms(t){t.target.closest(\"x-menu\")===this?(t.preventDefault(),this.scrollTop=this.scrollTop+t.deltaY,this.#Cs=!0):this.#Cs=!1}#Ls(){if(this.#ys){let t=this.scrollTop-this.#vs;if(this.#vs=this.scrollTop,Nn()-this.#zs>100){let e=this.getBoundingClientRect();t<0?e.bottom+Na(t)<=window.innerHeight-7?this.style.height=e.height+Na(t)+\"px\":this.style.height=window.innerHeight-14+\"px\":t>0&&(e.top-t>=7?(this.style.top=this.#ks+e.top-t+\"px\",this.style.height=e.height+t+\"px\",this.scrollTop=0,this.#vs=0):(this.style.top=7+this.#ks+\"px\",this.style.height=window.innerHeight-14+\"px\"))}}}#W(t){if(this.#Ds())t.preventDefault(),t.stopPropagation();else if(\"ArrowUp\"===t.code)t.preventDefault(),t.stopPropagation(),this.focusPreviousMenuItem();else if(\"ArrowDown\"===t.code)t.preventDefault(),t.stopPropagation(),this.focusNextMenuItem();else if(\"ArrowRight\"===t.code||\"Enter\"===t.code||\"NumpadEnter\"===t.code||\"Space\"===t.code){let e=this.querySelector(\"x-menuitem:focus\");if(e){let i=e.querySelector(\"x-menu\");if(i){t.preventDefault(),t.stopPropagation(),!1===i.opened&&i.openNextToElement(e,\"horizontal\");let s=i.querySelector(\"x-menuitem:not([disabled]):not([hidden])\");s&&s.focus()}}}else if(\"ArrowLeft\"===t.code){let e=this.querySelector(\"x-menuitem:focus\");if(e){let i=e.closest(\"x-menu\").closest(\"x-menuitem\");i&&i.closest(\"x-menu\")&&(t.preventDefault(),t.stopPropagation(),i.focus(),this.close())}}}}customElements.define(\"x-menu\",Fa);const Ga=Symbol();class Xa extends HTMLElement{static observedAttributes=[\"disabled\"];static#z=Ns`<template><svg id=\"backdrop\" hidden><path id=\"backdrop-path\"></path></svg><x-box id=\"container\"><div id=\"main\"><slot></slot></div><div id=\"aside\"><slot name=\"aside\"></slot></div></x-box></template>`;static#E=Fs`:host{display:flex;align-items:center;width:100%;height:36px;font-size:0.875rem;box-sizing:border-box}:host([disabled]){pointer-events:none;opacity:0.6}:host([hidden]){display:none}#backdrop{position:fixed;top:0;left:0;width:100%;height:100%;z-index:1000;pointer-events:none;touch-action:none}#backdrop[hidden]{display:none}#backdrop path{fill:red;fill-rule:evenodd;opacity:0;pointer-events:all}#container{flex:1;width:100%;height:100%}#main{display:flex;align-items:center;width:fit-content;height:100%}#aside{margin-left:auto;display:flex;align-items:center;height:100%}::slotted(x-menuitem[ellipsis]){order:9999}\n`;get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}get size(){let t=this.getAttribute(\"size\");return\"small\"===t||\"large\"===t?t:null}set size(t){\"small\"===t||\"large\"===t?this.setAttribute(\"size\",t):this.removeAttribute(\"size\")}#$=null;#Os=!1;#Hs=null;#L=null;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.adoptedStyleSheets=[Xa.#E],this.#$.append(document.importNode(Xa.#z.content,!0));for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t;new ResizeObserver((()=>this.#js())).observe(this[\"#container\"],{box:\"border-box\"}),new ResizeObserver((()=>this.#Ns())).observe(this[\"#main\"],{box:\"border-box\"}),this.#L=new MutationObserver((t=>this.#Fs())),this.#L.observe(this,{childList:!0}),this.addEventListener(\"focusout\",(t=>this.#Pt(t))),this.addEventListener(\"click\",(t=>this.#P(t))),this.#$.addEventListener(\"click\",(t=>this.#Gs(t))),this.#$.addEventListener(\"pointerdown\",(t=>this.#Xs(t))),this.#$.addEventListener(\"pointerover\",(t=>this.#_s(t))),this.#$.addEventListener(\"wheel\",(t=>this.#Zs(t))),this.#$.addEventListener(\"keydown\",(t=>this.#Us(t)))}connectedCallback(){this.setAttribute(\"role\",\"menubar\"),this.setAttribute(\"aria-disabled\",this.disabled),this.#Ys(),window.addEventListener(\"orientationchange\",this.#Hs=()=>{this.#Vs()})}disconnectedCallback(){window.removeEventListener(\"orientationchange\",this.#Hs)}attributeChangedCallback(t,e,i){e!==i&&\"disabled\"===t&&this.#vt()}#Ys(){{let t=this.querySelector(\":scope > x-menuitem[ellipsis]\");t?t.hasAttribute(\"slot\")&&t.removeAttribute(\"slot\"):(t=Ns`<x-menuitem ellipsis><x-label><strong>⋯</strong></x-label><x-menu id=\"ellipsis-menu\"></x-menu></x-menuitem>`,this.append(t))}let t=[...this.children].filter((t=>\"x-menuitem\"===t.localName&&\"\"===t.slot)),e=t.find((t=>t.hasAttribute(\"ellipsis\"))),i=[];for(let e of t)e.hasAttribute(\"autohidden\")&&(i.push(e),e.removeAttribute(\"autohidden\"));let s=this.getBoundingClientRect(),n=this[\"#aside\"].getBoundingClientRect(),a=[];for(let e=0;e<t.length;e+=1){let i=t[e];i.getBoundingClientRect().right>s.right-n.width&&a.push(i)}if(a.length<=1)e.setAttribute(\"autohidden\",\"\");else for(let i of[...t].reverse())if(i!==e){if(i.setAttribute(\"autohidden\",\"\"),e.getBoundingClientRect().right<=s.right-n.width)break}{let s=[...this.querySelectorAll(\":scope > x-menuitem[autohidden]\")];if(!1===rt(s,i,!0)){let i=e.querySelector(\"x-menu\");i.innerHTML=\"\";for(let n of t)if(n!==e)if(n[Ga]||(n[Ga]=n.querySelector(\":scope > x-menu\")),s.includes(n)){let t=n.cloneNode(!1);for(let e of n.children)\"x-menu\"!==e.localName&&t.append(e.cloneNode(!0));n[Ga]&&t.append(n[Ga]),i.append(t)}else n[Ga]&&n[Ga].parentElement!==n&&n.append(n[Ga])}}}#qs=Fn(this.#Ys,100,this);#Ws(t){let e=t.querySelector(\":scope > x-menu\");if(e&&!1===e.opened){let i=this.#Os;t.focus(),this.#Os=!0,this.style.touchAction=\"none\",\"aside\"!==t.slot&&(this[\"#aside\"].style.pointerEvents=\"none\");{e.openNextToElement(t,\"vertical\");let i=[...this.querySelectorAll(\":scope > x-menuitem > x-menu\")].filter((t=>t!==e));for(let t of i)t&&t.close(!1)}{let{x:t,y:e,width:i,height:s}=this.getBoundingClientRect();this[\"#backdrop-path\"].setAttribute(\"d\",`\\n          M 0 0\\n          L ${window.innerWidth} 0\\n          L ${window.innerWidth} ${window.innerHeight}\\n          L 0 ${window.innerHeight}\\n          L 0 0\\n          M ${t} ${e}\\n          L ${t+i} ${e}\\n          L ${t+i} ${e+s}\\n          L ${t} ${e+s}\\n        `),this[\"#backdrop\"].removeAttribute(\"hidden\")}!1===i&&this.dispatchEvent(new CustomEvent(\"expand\"))}}#Ks(){return new Promise((async t=>{let e=this.#Os;this.#Os=!1,this.style.touchAction=null,this[\"#aside\"].style.pointerEvents=null,this[\"#backdrop\"].setAttribute(\"hidden\",\"\"),this[\"#backdrop-path\"].setAttribute(\"d\",\"\");{let t=this.querySelectorAll(\":scope > x-menuitem > x-menu[opened]\");for(let e of t)await e.close(!0)}let i=this.querySelector(\"x-menuitem:focus\");i&&i.blur(),!0===e&&this.dispatchEvent(new CustomEvent(\"collapse\")),t()}))}#Js(){let t=[...this.querySelectorAll(\":scope > x-menuitem:not([disabled])\")],e=this.querySelector(\":focus\").closest(\"x-menubar > x-menuitem\");if(t.length>1&&e){let i=t.indexOf(e),s=t[i-1]||t[t.length-1];this.#Ws(s)}}#Qs(){let t=[...this.querySelectorAll(\":scope > x-menuitem:not([disabled])\")],e=this.querySelector(\":focus\").closest(\"x-menubar > x-menuitem\");if(e&&t.length>1){let i=t.indexOf(e),s=t[i+1]||t[0];this.#Ws(s)}}#vt(){this.setAttribute(\"aria-disabled\",this.disabled)}#Pt(t){null!==t.relatedTarget&&!1!==this.contains(t.relatedTarget)||this.#Ks()}#Vs(){this.#Ks()}#js(){this.isConnected&&this.#qs()}#Ns(){this.isConnected&&this.#qs()}#Fs(){this.isConnected&&this.#qs()}#Zs(t){let e=this.querySelector(\"x-menu[opened]\");e&&!1===e.contains(t.target)&&t.preventDefault()}async#P(t){let e=t.target.closest(\"x-menuitem\");if(e&&!1===t.isTrusted&&!1===t.isTrusted&&!e.closest(\"[expanded]\")){let t=null;for(let i=e;i!==this;i=i.parentElement)\"x-menuitem\"===i.localName&&(t=i);t.setAttribute(\"highlighted\",\"\"),await jn(150),t.removeAttribute(\"highlighted\")}}async#Gs(t){if(this.hasAttribute(\"closing\"))return;let e=t.target.closest(\"x-menuitem\"),i=t.target.closest(\"x-menu\");if(e&&!1===e.disabled&&i){let t=e.querySelector(\":scope > x-menu\");e.parentElement!==this&&(t?t.opened&&!1===t.opened&&t.openNextToElement(e,\"horizontal\"):(this.setAttribute(\"closing\",\"\"),await e.whenTriggerEnd,await this.#Ks(),this.removeAttribute(\"closing\")))}else t.target===this[\"#backdrop-path\"]&&(this.#Ks(),t.preventDefault(),t.stopPropagation())}#Xs(t){if(this.hasAttribute(\"closing\"))return;let e=t.target.closest(\"x-menuitem\");if(e&&!1===e.disabled&&e.parentElement===this){let i=e.querySelector(\":scope > x-menu\");i?i.opened?this.#Ks():this.#Ws(e):t.preventDefault()}}#_s(t){if(this.hasAttribute(\"closing\"))return;let e=t.target.closest(\"x-menuitem\"),i=t.target.closest(\"x-menu\");e&&!1===e.disabled&&e.parentElement===this&&!i&&this.#Os&&\"touch\"!==t.pointerType&&(!1===e.hasAttribute(\"expanded\")?this.#Ws(e):e.focus())}#Us(t){if(this.hasAttribute(\"closing\"))t.stopPropagation(),t.preventDefault();else if(\"Enter\"===t.code||\"NumpadEnter\"===t.code||\"Space\"===t.code){let e=this.querySelector(\":scope > x-menuitem:focus\");e&&(t.preventDefault(),e.click())}else if(\"Escape\"===t.code)this.#Os&&(t.preventDefault(),this.#Ks());else if(\"Tab\"===t.code){let t=this.querySelector(\":scope > x-menuitem:focus, :scope > x-menuitem[expanded]\");if(t){t.focus();let e=t.querySelector(\":scope > x-menu\");e&&(e.tabIndex=-1,e.close().then((()=>{e.tabIndex=-1})))}}else if(\"ArrowRight\"===t.code)this.#Qs();else if(\"ArrowLeft\"===t.code)this.#Js();else if(\"ArrowDown\"===t.code){let e=this.querySelector(\"x-menuitem:focus > x-menu\");e&&(t.preventDefault(),e.focusFirstMenuItem())}else if(\"ArrowUp\"===t.code){let e=this.querySelector(\"x-menuitem:focus > x-menu\");e&&(t.preventDefault(),e.focusLastMenuItem())}}}customElements.define(\"x-menubar\",Xa);class _a extends HTMLElement{static observedAttributes=[\"disabled\"];static#z=Ns`<template><svg id=\"checkmark\" part=\"checkmark\" viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\"><path id=\"checkmark-path\"></path></svg><slot></slot><svg id=\"arrow\" part=\"arrow\" viewBox=\"0 0 100 100\" hidden><path id=\"arrow-path\"></path></svg></template>`;static#E=Fs`:host{display:flex;flex-flow:row;align-items:center;position:relative;padding:0 12px 0 23px;min-height:28px;box-sizing:border-box;cursor:default;user-select:none;-webkit-user-select:none;--trigger-effect: blink}:host([hidden]){display:none}:host([disabled]){pointer-events:none;opacity:0.6}:host(:focus){outline:none}:host-context([debug]):host(:focus){outline:2px solid red}#checkmark{display:none;transition:transform 0.2s cubic-bezier(0.4, 0.0, 0.2, 1);align-self:center;width:18px;height:18px;margin:0 2px 0 -20px;color:inherit;--path-data: M 44 61 L 29 47 L 21 55 L 46 79 L 79 27 L 70 21 L 44 61 Z;}:host([togglable]) #checkmark{display:flex;transform:scale(0);transform-origin:50% 50%}:host([toggled]) #checkmark{display:flex;transform:scale(1)}#checkmark-path{fill:currentColor}#arrow{display:flex;width:16px;height:16px;transform:scale(1.1);align-self:center;margin-left:8px;opacity:1;color:inherit;--path-data: M 26 20 L 26 80 L 74 50 Z;}#arrow[hidden]{display:none}#arrow path{fill:currentColor}\n`;get value(){return this.hasAttribute(\"value\")?this.getAttribute(\"value\"):null}set value(t){this.value!==t&&(null===t?this.removeAttribute(\"value\"):this.setAttribute(\"value\",t))}get toggled(){return this.hasAttribute(\"toggled\")}set toggled(t){t?this.setAttribute(\"toggled\",\"\"):this.removeAttribute(\"toggled\")}get togglable(){return this.hasAttribute(\"togglable\")}set togglable(t){t?this.setAttribute(\"togglable\",\"\"):this.removeAttribute(\"togglable\")}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}get size(){let t=this.getAttribute(\"size\");return\"small\"===t||\"large\"===t?t:null}set size(t){\"small\"===t||\"large\"===t?this.setAttribute(\"size\",t):this.removeAttribute(\"size\")}get whenTriggerEnd(){return new Promise((t=>{!1===this.#tn?t():this.#en.push(t)}))}#$=null;#U=0;#tn=!1;#en=[];#in=!1;#R=null;#sn=new MutationObserver((()=>this.#nn()));constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.adoptedStyleSheets=[_a.#E],this.#$.append(document.importNode(_a.#z.content,!0)),this.addEventListener(\"pointerdown\",(t=>this.#Y(t))),this.addEventListener(\"click\",(t=>this.#P(t))),this.addEventListener(\"keydown\",(t=>this.#W(t)));for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t}connectedCallback(){Gn.whenThemeReady.then((()=>{this.#ft(),this.#I()})),this.#nn(),this.#J(),this.#sn.observe(this,{childList:!0,attributes:!1,characterData:!1,subtree:!1}),Gn.addEventListener(\"themechange\",this.#R=()=>this.#an())}disconnectedCallback(){this.#sn.disconnect(),Gn.removeEventListener(\"themechange\",this.#R)}attributeChangedCallback(t,e,i){e!==i&&\"disabled\"===t&&this.#J()}#ft(){let t=getComputedStyle(this[\"#checkmark\"]).getPropertyValue(\"--path-data\");this[\"#checkmark-path\"].setAttribute(\"d\",t)}#I(){let t=getComputedStyle(this[\"#arrow\"]).getPropertyValue(\"--path-data\");this[\"#arrow-path\"].setAttribute(\"d\",t)}#nn(){if(this.parentElement&&\"x-menubar\"===this.parentElement.localName)this[\"#arrow\"].setAttribute(\"hidden\",\"\");else{this.querySelector(\"x-menu\")?this[\"#arrow\"].removeAttribute(\"hidden\"):this[\"#arrow\"].setAttribute(\"hidden\",\"\")}}#J(){this.setAttribute(\"role\",\"menuitem\"),this.setAttribute(\"aria-disabled\",this.disabled),this.disabled?(this.#U=this.tabIndex>0?this.tabIndex:0,this.tabIndex=-1):(this.tabIndex<0&&(this.tabIndex=this.#U>0?this.#U:0),this.#U=0)}#an(){this.#ft(),this.#I()}async#Y(t){if(this.#in=this.matches(\":focus\"),t.buttons>1)return!1;if(this.matches(\"[closing] x-menuitem\"))return t.preventDefault(),void t.stopPropagation();if(t.target.closest(\"x-menuitem\")===this){this.setPointerCapture(t.pointerId);{let e,i=!0,s=Date.now();this.addEventListener(\"pointerup\",e=async()=>{this.removeEventListener(\"pointerup\",e),this.removeEventListener(\"pointercancel\",e),i=!1;let n=Date.now()-s,a=\"touch\"===t.pointerType?600:150;n<a&&await jn(a-n),this.removeAttribute(\"pressed\")}),this.addEventListener(\"pointercancel\",e),i&&this.setAttribute(\"pressed\",\"\")}}}async#P(t){if(t.buttons>1)return;let e=t.target.closest(\"x-menuitem\"),i=t.target.closest(\"x-menu\");if(e===this&&i===this.closest(\"x-menu\")&&!this.matches(\"[closing] x-menuitem\"))if(t.detail>0&&!1===Ei(e.getBoundingClientRect(),new DOMPoint(t.clientX,t.clientY)))t.stopImmediatePropagation();else{if(this.togglable){let t=new CustomEvent(\"toggle\",{bubbles:!0,cancelable:!0});this.dispatchEvent(t),!1===t.defaultPrevented&&(this.toggled=!this.toggled)}if(!this.querySelector(\":scope > x-menu\")&&\"x-menubar\"!==this.parentElement.localName){let t=getComputedStyle(this).getPropertyValue(\"--trigger-effect\").trim();if(\"blink\"===t){this.#tn=!0,this.#in?(this.parentElement.focus(),await jn(150),this.focus(),await jn(150)):(this.focus(),await jn(150),this.parentElement.focus(),await jn(150));for(let t of this.#en)t();this.#en=[],this.#tn=!1}else if(\"none\"===t){this.#tn=!0,await jn(50);for(let t of this.#en)t();this.#en=[],this.#tn=!1}}}}#W(t){\"Enter\"!==t.code&&\"NumpadEnter\"!==t.code&&\"Space\"!==t.code||(t.preventDefault(),this.querySelector(\"x-menu\")||(t.stopPropagation(),this.click()))}}customElements.define(\"x-menuitem\",_a);class Za extends HTMLElement{static#z=Ns`<template><slot></slot></template>`;static#E=Fs`:host{display:block;box-sizing:border-box}\n`;get value(){let t=this.querySelector(\"x-navitem[toggled]\");return t?t.value:null}set value(t){let e=[...this.querySelectorAll(\"x-navitem\")],i=null===t?null:e.find((e=>e.value===t));for(let t of e)t.toggled=t===i}#$=null;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.adoptedStyleSheets=[Za.#E],this.#$.append(document.importNode(Za.#z.content,!0)),this.addEventListener(\"click\",(t=>this.#P(t))),this.addEventListener(\"pointerdown\",(t=>this.#Y(t))),this.addEventListener(\"keydown\",(t=>this.#W(t)))}connectedCallback(){this.setAttribute(\"role\",\"navigation\"),\"x-navitem\"===this.parentElement?.localName&&this.parentElement.setAttribute(\"expandable\",\"\"),this.closest(\"x-navitem\")&&this.setAttribute(\"slot\",\"expandable\")}#rn(){let t=this;for(;;){let e=t.parentElement?.closest(\"x-nav\");if(!e)break;t=e}return t}#P(t){let e=t.target.closest(\"x-navitem\");if(e&&!1===e.hasAttribute(\"expandable\")&&(\"a\"!==e.parentElement.localName||\"_blank\"!==e.parentElement.getAttribute(\"target\"))&&e.closest(\"x-nav\")===this){for(let t of this.#rn().querySelectorAll(\"x-navitem\"))t===e?!1===t.toggled&&(t.toggled=!0):t.toggled=!1;e.dispatchEvent(new CustomEvent(\"toggle\",{bubbles:!0}))}}#Y(t){if(t.buttons>1)return void t.preventDefault();let e=t.target.closest(\"x-navitem\");if(e&&e.closest(\"x-nav\")===this){if(t.preventDefault(),!1===this.matches(\":focus\")){let t,e=Zn(this.parentNode,\"*[tabindex]:not(a,x-navitem)\");this.addEventListener(\"pointerup\",t=()=>{this.removeEventListener(\"pointerup\",t),this.removeEventListener(\"pointercancel\",t),e?e.focus():(this.focus(),this.blur())}),this.addEventListener(\"pointercancel\",t)}if(\"x-nav\"!==t.target.localName){let t,i=Date.now(),s=!0,n=parseInt(getComputedStyle(e).getPropertyValue(\"--min-pressed-time\")||\"150ms\");this.addEventListener(\"pointerup\",t=async()=>{this.removeEventListener(\"pointerup\",t),this.removeEventListener(\"pointercancel\",t),s=!1;let a=Date.now()-i;a<n&&await jn(n-a),e.removeAttribute(\"pressed\")}),this.addEventListener(\"pointercancel\",t),(async()=>{!1===e.hasAttribute(\"toggled\")&&await jn(40),s&&e.setAttribute(\"pressed\",\"\")})()}}}#W(t){let e=this.#rn(),i=e.querySelector(\"x-navitem:focus\");if(\"Enter\"===t.code||\"NumpadEnter\"===t.code||\"Space\"===t.code)t.preventDefault(),t.stopPropagation(),i.click();else if(\"ArrowLeft\"===t.code)i.expandable&&i.expanded&&(t.preventDefault(),t.stopPropagation(),i.click());else if(\"ArrowRight\"===t.code)i.expandable&&!1===i.expanded&&(t.preventDefault(),t.stopPropagation(),i.click());else if(\"ArrowUp\"===t.code||\"ArrowDown\"===t.code){let s=[...e.querySelectorAll(\"x-navitem:not([disabled])\")];s=s.filter((t=>0!==t.clientHeight));let n=s.indexOf(i),a=\"ArrowUp\"===t.code?s[n-1]:s[n+1];a&&(t.preventDefault(),t.stopPropagation(),a.focus())}}}customElements.define(\"x-nav\",Za);class Ua extends HTMLElement{static observedAttributes=[\"disabled\"];static#z=Ns`<template><div id=\"button\" part=\"button\"><slot></slot><div id=\"arrow\" part=\"arrow\"><svg id=\"arrow-svg\" viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\"><path id=\"arrow-path\"></path></svg></div></div><div id=\"main\"><slot name=\"expandable\"></slot></div></template>`;static#E=Fs`:host{display:block;box-sizing:border-box}:host([disabled]){pointer-events:none;opacity:0.5}:host([hidden]){display:none}#button{display:flex;align-items:center;justify-content:center;padding:8px 15px;min-height:36px;box-sizing:border-box}#main{height:0;display:none;overflow:hidden}:host([expanded]) #main, :host([animating]) #main{display:block;height:auto}:host([expanded]:not([animating])) #main{overflow:visible}#arrow{display:none;align-items:center;justify-content:flex-start;pointer-events:none;margin-left:auto;padding-left:4px;--path-data: M 26 20 L 26 80 L 74 50 Z;}:host([expandable]) #arrow{display:flex}:host([animating]) #arrow{outline:none!important}#arrow-svg{display:flex;width:16px;height:16px;transform:rotate(0deg);color:currentColor}#arrow-svg:focus{background:transparent;outline:none}:host([expanded]) #arrow-svg{transform:rotate(90deg)}#arrow-path{fill:currentColor}\n`;get value(){return this.hasAttribute(\"value\")?this.getAttribute(\"value\"):\"\"}set value(t){this.setAttribute(\"value\",t)}get toggled(){return this.hasAttribute(\"toggled\")}set toggled(t){t?this.setAttribute(\"toggled\",\"\"):this.removeAttribute(\"toggled\")}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}get expanded(){return this.hasAttribute(\"expanded\")}set expanded(t){t?this.setAttribute(\"expanded\",\"\"):this.removeAttribute(\"expanded\")}get expandable(){return this.hasAttribute(\"expandable\")}#$;#R;#A=[];#U=0;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.adoptedStyleSheets=[Ua.#E],this.#$.append(document.importNode(Ua.#z.content,!0));for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t;this.addEventListener(\"click\",(t=>this.#P(t)))}connectedCallback(){Gn.whenThemeReady.then((()=>{this.#I()})),Gn.addEventListener(\"themechange\",this.#R=()=>this.#I()),this.parentElement&&\"a\"===this.parentElement.localName&&-1!==this.parentElement.tabIndex&&(this.parentElement.tabIndex=-1),this.#J()}disconnectedCallback(){Gn.removeEventListener(\"themechange\",this.#R)}attributeChangedCallback(t,e,i){e!==i&&\"disabled\"===t&&this.#J()}expand(t=!0){return new Promise((async e=>{if(!1===this.expanded)if(!1===t)this.#H(),this.removeAttribute(\"animating\"),this.expanded=!0;else if(!0===t){let t=this[\"#main\"].getBoundingClientRect();this.#H(),this.removeAttribute(\"animating\"),this.expanded=!0;let e=this[\"#main\"].getBoundingClientRect();this.setAttribute(\"animating\",\"\");let i=[this[\"#main\"].animate({height:[`${t.height}px`,`${e.height}px`]},{duration:200,easing:\"cubic-bezier(0.4, 0, 0.2, 1)\"}),this[\"#arrow-svg\"].animate({transform:[\"rotate(0deg)\",\"rotate(90deg)\"]},{duration:200,easing:\"cubic-bezier(0.4, 0, 0.2, 1)\"})];this.#A=i,await Promise.all(i.map((t=>t.finished))),this.#A===i&&this.removeAttribute(\"animating\")}e()}))}collapse(t=!0){return new Promise((async e=>{if(!0===this.expanded)if(!1===t)this.#H(),this.removeAttribute(\"animating\"),this.expanded=!1;else if(!0===t){let t=this[\"#main\"].getBoundingClientRect();this.#H(),this.removeAttribute(\"animating\"),this.expanded=!1;let e=this[\"#main\"].getBoundingClientRect();this.setAttribute(\"animating\",\"\");let i=[this[\"#main\"].animate({height:[`${t.height}px`,`${e.height}px`]},{duration:200,easing:\"cubic-bezier(0.4, 0, 0.2, 1)\"}),this[\"#arrow-svg\"].animate({transform:[\"rotate(90deg)\",\"rotate(0deg)\"]},{duration:200,easing:\"cubic-bezier(0.4, 0, 0.2, 1)\"})];this.#A=i,await Promise.all(i.map((t=>t.finished))),this.#A===i&&this.removeAttribute(\"animating\")}e()}))}#P(t){if(this===t.target.closest(\"x-navitem\")&&this.hasAttribute(\"expandable\")&&\"x-nav\"!==t.target.localName)if(this.expanded){let t=new CustomEvent(\"collapse\",{bubbles:!0,cancelable:!0});this.dispatchEvent(t),!1===t.defaultPrevented&&this.collapse()}else{let t=new CustomEvent(\"expand\",{bubbles:!0,cancelable:!0});this.dispatchEvent(t),!1===t.defaultPrevented&&this.expand()}}#H(){this.#A.length>0&&this.#A.map((t=>t.finish()))}#J(){this.setAttribute(\"role\",\"button\"),this.setAttribute(\"aria-disabled\",this.disabled),this.disabled?(this.#U=this.tabIndex>0?this.tabIndex:0,this.tabIndex=-1):(this.tabIndex<0&&(this.tabIndex=this.#U>0?this.#U:0),this.#U=0)}#I(){let t=getComputedStyle(this[\"#arrow\"]).getPropertyValue(\"--path-data\");this[\"#arrow-path\"].setAttribute(\"d\",t)}}customElements.define(\"x-navitem\",Ua);class Ya extends HTMLElement{static observedAttributes=[\"opened\"];static#z=Ns`<template><slot></slot></template>`;static#E=Fs`:host{display:none;position:fixed;min-width:15px;min-height:15px;bottom:15px;left:50%;transform:translateX(-50%);padding:5px 12px;box-sizing:border-box;color:rgba(255, 255, 255, 0.9);background:#434343;z-index:9999;font-size:0.75rem;user-select:text;-webkit-user-select:none;transition:transform 0.15s cubic-bezier(0.4, 0, 0.2, 1)}:host([opened]), :host([animating]){display:block}:host(:focus){outline:none}\n`;get opened(){return this.hasAttribute(\"opened\")}set opened(t){!0===t?this.setAttribute(\"opened\",\"\"):this.removeAttribute(\"opened\"),this.#on=0}get timeout(){return this.hasAttribute(\"timeout\")?parseFloat(this.getAttribute(\"timeout\")):0}set timeout(t){this.setAttribute(\"timeout\",t)}get size(){let t=this.getAttribute(\"size\");return\"small\"===t||\"large\"===t?t:null}set size(t){\"small\"===t||\"large\"===t?this.setAttribute(\"size\",t):this.removeAttribute(\"size\")}#$=null;#on=0;#ln=null;#hn=null;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.adoptedStyleSheets=[Ya.#E],this.#$.append(document.importNode(Ya.#z.content,!0))}connectedCallback(){this.setAttribute(\"tabindex\",\"0\")}attributeChangedCallback(t,e,i){e!==i&&\"opened\"===t&&(this.opened?this.#dn():this.#K())}#dn(){if(this.isConnected){let t=0-this.getBoundingClientRect().height-10+\"px\",e=getComputedStyle(this).bottom;this.animate({bottom:[t,e]},{duration:300,easing:\"cubic-bezier(0.4, 0, 0.2, 1)\"})}if(this.timeout>0&&(this.#on=0,this.#ln=setInterval((()=>{this.#on+=100,this.timeout>0&&this.#on>this.timeout&&(this.opened=!1)}),100)),this.timeout>=0){let t=Nn();window.addEventListener(\"pointerdown\",this.#hn=e=>{let i=Nn(),s=this.getBoundingClientRect();i-t>10&&!1===Ei(s,new DOMPoint(e.clientX,e.clientY))&&(this.opened=!1)},!0)}}async#K(){if(null!==this.#ln&&(clearInterval(this.#ln),this.#ln=null),this.isConnected){this.setAttribute(\"animating\",\"\");let t=getComputedStyle(this).bottom,e=0-this.getBoundingClientRect().height-10+\"px\",i=this.animate({bottom:[t,e]},{duration:300,easing:\"cubic-bezier(0.4, 0, 0.2, 1)\"});await i.finished,this.removeAttribute(\"animating\")}window.removeEventListener(\"pointerdown\",this.#hn,!0)}}customElements.define(\"x-notification\",Ya);let{isFinite:Va}=Number;const qa=[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"-\",\"+\",\",\",\".\"];class Wa extends HTMLElement{static observedAttributes=[\"value\",\"min\",\"max\",\"prefix\",\"suffix\",\"disabled\"];static#z=Ns`<template><div id=\"main\"><div id=\"editor-container\"><div id=\"editor\" contenteditable=\"plaintext-only\" spellcheck=\"false\"></div></div><slot></slot></div></template>`;static#E=Fs`:host{display:block;position:relative;max-width:160px;height:32px;box-sizing:border-box;font-size:0.78125rem;line-height:10;--inner-padding: 0 6px;}:host(:hover){cursor:text}:host([mixed]){color:rgba(0, 0, 0, 0.7)}:host([disabled]){pointer-events:none;opacity:0.5}:host([hidden]){display:none}::selection{color:var(--selection-color);background-color:var(--selection-background-color)}#main{display:flex;align-items:center;height:100%}#editor-container{display:flex;align-items:center;width:100%;height:100%;padding:var(--inner-padding);box-sizing:border-box;overflow:hidden}#editor{width:100%;color:inherit;background:none;border:none;outline:none;font-family:inherit;font-size:inherit;line-height:inherit;white-space:nowrap;font-variant-numeric:tabular-nums;overflow:hidden;text-overflow:ellipsis}:host(:focus) #editor{overflow:visible;text-overflow:clip}:host([disabled]) #editor{user-select:none;-webkit-user-select:none}#editor::-webkit-scrollbar{display:none}#editor::before{content:attr(data-prefix);pointer-events:none}#editor::after{content:attr(data-suffix);pointer-events:none}:host([empty]) #editor::before, :host([empty]) #editor::after, :host(:focus) #editor::before, :host(:focus) #editor::after{display:none}\n`;get value(){return this.hasAttribute(\"value\")?parseFloat(this.getAttribute(\"value\")):null}set value(t){null===t?this.removeAttribute(\"value\"):this.setAttribute(\"value\",t)}get min(){return this.hasAttribute(\"min\")?parseFloat(this.getAttribute(\"min\")):-Infinity}set min(t){Va(t)?this.setAttribute(\"min\",t):this.removeAttribute(\"min\")}get max(){return this.hasAttribute(\"max\")?parseFloat(this.getAttribute(\"max\")):Infinity}set max(t){Va(t)?this.setAttribute(\"max\",t):this.removeAttribute(\"max\")}get mixed(){return this.hasAttribute(\"mixed\")}set mixed(t){t?this.setAttribute(\"mixed\",\"\"):this.removeAttribute(\"mixed\")}get precision(){return this.hasAttribute(\"precision\")?parseFloat(this.getAttribute(\"precision\")):20}set precision(t){this.setAttribute(\"precision\",t)}get step(){return this.hasAttribute(\"step\")?parseFloat(this.getAttribute(\"step\")):1}set step(t){this.setAttribute(\"step\",t)}get prefix(){return this.hasAttribute(\"prefix\")?this.getAttribute(\"prefix\"):\"\"}set prefix(t){this.setAttribute(\"prefix\",t)}get suffix(){return this.hasAttribute(\"suffix\")?this.getAttribute(\"suffix\"):\"\"}set suffix(t){this.setAttribute(\"suffix\",t)}get mixed(){return this.hasAttribute(\"mixed\")}set mixed(t){t?this.setAttribute(\"mixed\",\"\"):this.removeAttribute(\"mixed\")}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}get size(){let t=this.getAttribute(\"size\");return\"small\"===t||\"large\"===t?t:null}set size(t){\"small\"===t||\"large\"===t?this.setAttribute(\"size\",t):this.removeAttribute(\"size\")}#$=null;#U=0;#cn=!1;#un=!1;#pn=!1;#mn=!1;#bn=!1;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\",delegatesFocus:!0}),this.#$.adoptedStyleSheets=[Wa.#E],this.#$.append(document.importNode(Wa.#z.content,!0));for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t;this.#$.addEventListener(\"pointerdown\",(t=>this.#Xs(t))),this.#$.addEventListener(\"wheel\",(t=>this.#Ms(t))),this[\"#editor\"].addEventListener(\"paste\",(t=>this.#gn(t))),this[\"#editor\"].addEventListener(\"input\",(t=>this.#fn(t))),this.addEventListener(\"pointerdown\",(t=>this.#Y(t))),this.addEventListener(\"pointerenter\",(()=>this.#V())),this.addEventListener(\"pointerleave\",(()=>this.#q())),this.addEventListener(\"keydown\",(t=>this.#W(t))),this.addEventListener(\"keyup\",(t=>this.#xn(t))),this.addEventListener(\"keypress\",(t=>this.#wn(t))),this.addEventListener(\"incrementstart\",(t=>this.#vn(t))),this.addEventListener(\"decrementstart\",(t=>this.#kn(t))),this.addEventListener(\"focusin\",(t=>this.#Rt(t))),this.addEventListener(\"focusout\",(t=>this.#Pt(t))),\"gecko\"===Hn()&&(this[\"#editor\"].setAttribute(\"contenteditable\",\"\"),this[\"#editor\"].addEventListener(\"beforeinput\",(t=>{if(\"insertFromPaste\"===t.inputType&&t.dataTransfer.types.includes(\"text/plain\")){t.preventDefault();let e=window.getSelection(),i=e.getRangeAt(0);i.deleteContents(),i.insertNode(document.createTextNode(t.dataTransfer.getData(\"text/plain\"))),e.collapseToEnd()}})))}connectedCallback(){this.#J(),this.#Xt()}attributeChangedCallback(t,e,i){e!==i&&(\"value\"===t?this.#Zt():\"min\"===t?this.#yn():\"max\"===t?this.#Cn():\"prefix\"===t?this.#zn():\"suffix\"===t?this.#En():\"disabled\"===t&&this.#vt())}#$n(t=!1){let e=this.value,i=this.value;i+=t?10*this.step:this.step,i=ki(i,this.min,this.max,Ci(this.step)),e!==i&&(this.value=i),this.matches(\":focus\")&&document.execCommand(\"selectAll\"),this.#Sn()}#Mn(t=!1){let e=this.value,i=this.value;i-=t?10*this.step:this.step,i=ki(i,this.min,this.max,Ci(this.step)),e!==i&&(this.value=i),this.matches(\":focus\")&&document.execCommand(\"selectAll\"),this.#Sn()}#Ln(){this.#un||(this.#un=!0,this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0})))}#An=((t,e,i,s=!1)=>{let n=null,a=null;return(...r)=>{let o=s&&!n;return clearTimeout(n),n=setTimeout((()=>{n=null,s||(a=t.apply(i,r))}),e),o&&(a=t.apply(i,r)),a}})((()=>{!this.#un||this.#pn||this.#mn||this.#bn||(this.#un=!1,this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0})))}),500);#Rn(){let t=this[\"#editor\"].textContent,e=parseFloat(t);Number.isNaN(e)&&(e=null);let i=null===e?null:ki(e,this.min,this.max);i!==this.value?(this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0})),this.value=i,this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})),this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0}))):e!==this.value?this.value=i:this.#Pn()}#Xt(){this.#Pn(),this.#Sn(),this.#Tn()}#Pn(){if(this.hasAttribute(\"value\"))if(this.step<1){let t=parseFloat(this.getAttribute(\"value\")),e=Ci(this.step),i=Ci(t);this[\"#editor\"].textContent=e>0&&i<e?t.toFixed(e):this.getAttribute(\"value\").trim()}else this[\"#editor\"].textContent=this.getAttribute(\"value\").trim();else this[\"#editor\"].textContent=\"\"}#Sn(){let t=null;if(this.matches(\":focus\")){let e=this[\"#editor\"].textContent;t=\"\"===e.trim()?null:parseFloat(e)}else t=this.value;null===t?this.setAttribute(\"empty\",\"\"):this.removeAttribute(\"empty\")}#Tn(){let t=this.querySelector(\"x-stepper\");if(t){let e=this.value>this.min,i=this.value<this.max;!0===i&&!0===e?t.removeAttribute(\"disabled\"):!1===i&&!1===e?t.setAttribute(\"disabled\",\"\"):!1===i?t.setAttribute(\"disabled\",\"increment\"):!1===e&&t.setAttribute(\"disabled\",\"decrement\")}}#J(){this.setAttribute(\"role\",\"input\"),this.setAttribute(\"aria-disabled\",this.disabled),this.disabled?(this.#U=this.tabIndex>0?this.tabIndex:0,this.tabIndex=-1):(this.tabIndex<0&&(this.tabIndex=this.#U>0?this.#U:0),this.#U=0)}#Zt(){this.#Xt()}#yn(){this.#Tn()}#Cn(){this.#Tn()}#zn(){this[\"#editor\"].setAttribute(\"data-prefix\",this.prefix)}#En(){this[\"#editor\"].setAttribute(\"data-suffix\",this.suffix)}#vt(){this[\"#editor\"].contentEditable=this.disabled?\"false\":\"plaintext-only\",this.#J()}#Rt(){document.execCommand(\"selectAll\"),this.dispatchEvent(new CustomEvent(\"textinputmodestart\",{bubbles:!0,composed:!0}))}#Pt(){\"chromium\"===Hn()&&this.#$.getSelection().collapse(this[\"#main\"]),this[\"#editor\"].scrollLeft=0,this.#Rn(),this.dispatchEvent(new CustomEvent(\"textinputmodeend\",{bubbles:!0,composed:!0}))}#fn(){this.#Sn(),this.#Tn()}#Ms(t){this.matches(\":focus\")&&(t.preventDefault(),this.#Ln(),t.wheelDeltaX>0||t.wheelDeltaY>0?(this.#$n(t.shiftKey),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0}))):(this.#Mn(t.shiftKey),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0}))),this.#An())}#P(t){t.preventDefault()}#Y(t){\"x-stepper\"===t.target.localName&&t.preventDefault()}#Xs(t){if(t.buttons>1||!1===t.isPrimary)t.preventDefault();else if(t.target===this[\"#editor\"]&&!1===this[\"#editor\"].matches(\":focus\")){t.preventDefault();let e,i,s=this.value,n=t.clientX,a=new DOMPoint(t.clientX,t.clientY);this.style.cursor=\"col-resize\",this[\"#editor\"].setPointerCapture(t.pointerId),this[\"#editor\"].addEventListener(\"pointermove\",e=e=>{let i=new DOMPoint(e.clientX,e.clientY),r=e.timeStamp-t.timeStamp,o=e.clientX!==n,l=zi(a,i)>3||r>80;if(n=e.clientX,o&&l&&e.isPrimary){!1===this.#cn&&(this.#cn=!0,this.#un=!0,this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0})));let i=e.clientX-t.clientX,n=s+i*this.step;n=ki(n,this.min,this.max,Ci(this.step)),this.value=n,this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0}))}}),this[\"#editor\"].addEventListener(\"pointerup\",i=()=>{this[\"#editor\"].removeEventListener(\"pointermove\",e),this[\"#editor\"].removeEventListener(\"pointerup\",i),this[\"#editor\"].removeEventListener(\"pointercancel\",i),this.style.cursor=null,!0===this.#cn?(this.#cn=!1,this.#un=!1,this.dispatchEvent(new CustomEvent(\"changeend\",{detail:this.value!==s,bubbles:!0}))):(this[\"#editor\"].focus(),document.execCommand(\"selectAll\"))}),this[\"#editor\"].addEventListener(\"pointercancel\",i)}}#V(){let t=this.querySelector(\":scope > x-tooltip\");t&&!1===t.disabled&&t.open(this)}#q(){let t=this.querySelector(\":scope > x-tooltip\");t&&t.close()}#vn(t){let e,i;this.matches(\":focus\")&&this.#Rn(),this.#bn=!0,this.addEventListener(\"increment\",e=t=>{this.#Ln(),this.#$n(t.detail.shiftKey),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})),this.#An()}),this.addEventListener(\"incrementend\",i=t=>{this.#bn=!1,this.removeEventListener(\"increment\",e),this.removeEventListener(\"incrementend\",i)})}#kn(t){let e,i;this.matches(\":focus\")&&this.#Rn(),this.#bn=!0,this.addEventListener(\"decrement\",e=t=>{this.#Ln(),this.#Mn(t.detail.shiftKey),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})),this.#An()}),this.addEventListener(\"decrementend\",i=t=>{this.#bn=!1,this.removeEventListener(\"decrement\",e),this.removeEventListener(\"decrementend\",i)})}#W(t){\"ArrowDown\"===t.code?(t.preventDefault(),this.#pn=!0,this.#Ln(),this.#Mn(t.shiftKey),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})),this.#An()):\"ArrowUp\"===t.code?(t.preventDefault(),this.#pn=!0,this.#Ln(),this.#$n(t.shiftKey),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})),this.#An()):\"Backspace\"===t.code?this.#mn=!0:\"Enter\"!==t.code&&\"NumpadEnter\"!==t.code||(this.#Rn(),document.execCommand(\"selectAll\"))}#xn(t){\"ArrowDown\"===t.code||\"ArrowUp\"===t.code?(this.#pn=!1,this.#An()):\"Backspace\"===t.code&&(this.#mn=!1)}#wn(t){!1===t.ctrlKey&&!1===t.altKey&&!1===t.metaKey&&!1===qa.includes(t.key)&&t.preventDefault()}async#gn(t){t.preventDefault();let e=t.clipboardData.getData(\"text/plain\").trim();(t=>{let e=Oa(t);return!1===Ia(e)&&Ba(e)})(e)&&(await jn(1),document.execCommand(\"insertText\",!1,e))}}customElements.define(\"x-numberinput\",Wa);class Ka extends HTMLElement{static observedAttributes=[\"value\",\"max\",\"controls\",\"href\"];static#z=Ns`<template><div id=\"items\"></div></template>`;static#E=Fs`:host{display:block;box-sizing:border-box;width:100%;--prev-path-data:  M 74 20 L 74 80 L 26 50 L 74 20 Z;--next-path-data:  M 26 20 L 26 80 L 74 50 Z;--first-path-data: M 16 20 L 26 20 L 26 80 L 16 80 L 16 20 Z M 84 20 L 84 80 L 36 50 L 84 20 Z;--last-path-data:  M 84 20 L 74 20 L 74 80 L 84 80 L 84 20 Z M 16 20 L 16 80 L 64 50 L 16 20 Z;}:host([hidden]){display:none}:host([max=\"1\"]){display:none}#items{display:flex;align-items:center;justify-content:center}#items a{color:inherit;text-decoration:none}.item{display:flex;align-items:center;justify-content:center;margin:0 3px;height:30px;box-sizing:border-box;border-width:1px;border-style:solid;outline-offset:0;font-size:0.875rem;font-weight:700;line-height:1;user-select:none;-webkit-user-select:none}div.item{cursor:default}.item[data-disabled]{opacity:0}#first-item, #last-item, #prev-item, #next-item{padding:0 4px}.nth-item{padding:0 10px}.ellipsis-item{background:none;border:none}.item:first-child{margin-left:0}.item:last-child{margin-right:0}.ellipsis-item{flex:0}.arrow{display:flex;width:16px;height:16px}.arrow path{fill:currentColor}\n`;get value(){return this.hasAttribute(\"value\")?parseInt(this.getAttribute(\"value\")):1}set value(t){t=ki(t,1,this.max),this.setAttribute(\"value\",t)}get max(){return this.hasAttribute(\"max\")?parseFloat(this.getAttribute(\"max\")):5}set max(t){this.setAttribute(\"max\",t)}get controls(){return this.hasAttribute(\"controls\")?this.getAttribute(\"controls\").replace(/\\s+/g,\" \").split(\" \"):[\"prev\",\"next\",\"nth\"]}set controls(t){this.setAttribute(\"controls\",t.join(\" \"))}get href(){return this.getAttribute(\"href\")}set href(t){t?this.setAttribute(\"href\",t):this.removeAttribute(\"href\")}#$;#R;constructor(){super()}connectedCallback(){if(!this.#$){this.setAttribute(\"role\",\"navigation\"),this.setAttribute(\"aria-label\",\"pagination\"),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.adoptedStyleSheets=[Ka.#E],this.#$.append(document.importNode(Ka.#z.content,!0));for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t;this.#$.addEventListener(\"pointerdown\",(t=>this.#Y(t))),this.#$.addEventListener(\"click\",(t=>this.#P(t))),this.addEventListener(\"keydown\",(t=>this.#W(t)))}Gn.addEventListener(\"themechange\",this.#R=()=>this.#an()),Gn.whenThemeReady.then((()=>this.#Xt()))}disconnectedCallback(){Gn.removeEventListener(\"themechange\",this.#R)}attributeChangedCallback(t,e,i){e!==i&&this.#$&&(\"value\"===t||\"max\"===t||\"controls\"===t||\"href\"===t)&&this.#Xt()}#an(){this.#Xt()}#Y(t){if(t.buttons>1)return void t.preventDefault();let e=t.target.closest(\".item\");if(e&&(t.preventDefault(),!1===e.matches(\":focus\"))){let t,e=Zn(this,\"*[tabindex]:not(a)\");this.addEventListener(\"pointerup\",t=()=>{this.removeEventListener(\"pointerup\",t),this.removeEventListener(\"pointercancel\",t),e?e.focus():(this.focus(),this.blur())}),this.addEventListener(\"pointercancel\",t)}}#P(t){let e=t.target.closest(\".item\"),i=t.target.closest(\"a\");e&&void 0!==e.dataset.value&&(i&&t.preventDefault(),!1===e.part.contains(\"toggled-item\")&&(this.value=parseInt(e.dataset.value),this.dispatchEvent(new CustomEvent(\"toggle\"))))}#W(t){let e=this[\"#items\"].querySelector(\":focus\");if(e)if(\"Enter\"===t.code||\"NumpadEnter\"===t.code||\"Space\"===t.code)t.preventDefault(),t.stopPropagation(),e.click();else if(\"ArrowRight\"===t.code||\"ArrowLeft\"===t.code){let i=[...this[\"#items\"].children].filter((t=>t.hasAttribute(\"data-value\")&&!t.hasAttribute(\"data-disabled\"))),s=i.indexOf(e);if(\"ArrowRight\"===t.code){let t=i[s+1];t&&t.focus()}else if(\"ArrowLeft\"===t.code){let t=i[s-1];t&&t.focus()}}}#Dn(){let t=\"\";if(this.controls.includes(\"first\")&&this.max>1&&(t+=this.#Bn(1,\"first\")),this.controls.includes(\"prev\")&&this.max>1&&(t+=this.#Bn(Math.max(1,this.value-1),\"prev\")),this.controls.includes(\"nth\"))if(this.max<=10)for(let e=1;e<=this.max;e+=1)e===this.value?t+=this.#In(e,!0):t+=this.#In(e,!1);else if(this.value<=6){for(let e=1;e<=7;e+=1)e===this.value?t+=this.#In(e,!0):t+=this.#In(e,!1);t+=this.#On();for(let e of[this.max-1,this.max])t+=this.#In(e,!1)}else if(this.value>this.max-6){for(let e of[1,2])t+=this.#In(e,!1);t+=this.#On();for(let e=this.max-6;e<=this.max;e+=1)t+=this.#In(e,e===this.value)}else{for(let e of[1,2])t+=this.#In(e,!1);t+=this.#On();for(let e=this.value-1;e<this.value+4;e+=1)t+=this.#In(e,e===this.value);t+=this.#On();for(let e of[this.max-1,this.max])t+=this.#In(e,!1)}return this.controls.includes(\"next\")&&this.max>1&&(t+=this.#Bn(Math.min(this.max,this.value+1),\"next\")),this.controls.includes(\"last\")&&this.max>1&&(t+=this.#Bn(this.max,\"last\")),t}#Bn(t=1,e=\"prev\"){let i='part=\"item\"',s=`data-value=\"${t}\"`,n=t===this.value?\"data-disabled\":\"\",a=t===this.value?'tabindex=\"-1\"':'tabindex=\"0\"';if(this.href){return`\\n        <a id=\"${e}-item\" class=\"item\" ${i} ${s} ${n} ${`href=\"${this.#Hn(t)}\" rel=\"${e}\"`} ${a}>\\n          <svg id=\"${e}-arrow\" class=\"arrow\" viewBox=\"0 0 100 100\">\\n            <path id=\"${e}-path\"></path>\\n          </svg>\\n        </a>\\n      `}return`\\n        <div id=\"${e}-item\" class=\"item\" ${i} ${s} ${n} ${a}>\\n          <svg id=\"${e}-arrow\" class=\"arrow\" viewBox=\"0 0 100 100\">\\n            <path id=\"${e}-path\"></path>\\n          </svg>\\n        </div>\\n      `}#In(t=1,e=!1){let i=e||!this.href?null:this.#Hn(t),s=`id=\"item-${t}\"`,n=`part=\"item ${e?\" toggled-item\":\"\"}\"`,a=`data-value=\"${t}\"`,r=e?'tabindex=\"-1\"':'tabindex=\"0\"';if(i){return`<a class=\"item nth-item\" ${s} ${n} ${a} ${r} ${`href=\"${i}\" rel=\"${t}\"`}>${t}</a>`}return`<div class=\"item nth-item\" ${s} ${n} ${a} ${r}>${t}</div>`}#On(){return'<div class=\"item ellipsis-item\">…</div>'}#Hn(t=1){let e=new URL(this.href);return 1===t?e.searchParams.delete(\"page\"):e.searchParams.set(\"page\",t),e.href}#Xt(){let t=this[\"#items\"].querySelector(\":focus\");this[\"#items\"].innerHTML=this.#Dn();for(let t of this[\"#items\"].querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t;if(t){let e=this[\"#items\"].querySelector(`#${t.id}:not([data-disabled])`);e?e.focus():(e=this[\"#items\"].querySelector('[part*=\"toggled-item\"]'),e&&e.focus())}{let t=getComputedStyle(this);for(let e of[\"prev\",\"next\",\"first\",\"last\"]){let i=this[\"#items\"].querySelector(`#${e}-path`);i&&i.setAttribute(\"d\",t.getPropertyValue(`--${e}-path-data`))}}}}customElements.define(\"x-pager\",Ka);class Ja extends HTMLElement{static observedAttributes=[\"modal\"];static#z=Ns`<template><svg id=\"arrow\" viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\"><path id=\"arrow-path\" part=\"arrow-path\"></path></svg><slot id=\"slot\"></slot></template>`;static#E=Fs`:host{position:fixed;display:none;top:0;left:0;min-height:30px;z-index:1001;box-sizing:border-box;background:white;-webkit-app-region:no-drag;--align: bottom;--arrow-size: 20px;--open-transition: 900 transform cubic-bezier(0.4, 0, 0.2, 1);--close-transition: 200 opacity cubic-bezier(0.4, 0, 0.2, 1);}:host(:focus){outline:none}:host([opened]), :host([animating]){display:block}#arrow{position:fixed;box-sizing:border-box;content:\"\";overflow:visible}#arrow[data-align=\"top\"], #arrow[data-align=\"bottom\"]{width:var(--arrow-size);height:calc(var(--arrow-size) * 0.6);transform:translate(-50%, 0)}#arrow[data-align=\"left\"], #arrow[data-align=\"right\"]{width:calc(var(--arrow-size) * 0.6);height:var(--arrow-size);transform:translate(0, -50%)}#arrow-path{stroke-width:1;vector-effect:non-scaling-stroke}#arrow[data-align=\"left\"] #arrow-path{clip-path:polygon(0% -50%, 150% -50%, 150% 200%, 0% 150%)}#arrow[data-align=\"right\"] #arrow-path{clip-path:polygon(-50% -50%, 100% -50%, 100% 150%, -50% 150%)}#arrow[data-align=\"top\"] #arrow-path{clip-path:polygon(-50% 0%, 150% 0%, 150% 150%, -50% 150%)}#arrow[data-align=\"bottom\"] #arrow-path{clip-path:polygon(-50% -50%, 150% -50%, 150% 100%, -50% 100%)}#slot{border-radius:inherit}\n`;get opened(){return this.hasAttribute(\"opened\")}get modal(){return this.hasAttribute(\"modal\")}set modal(t){t?this.setAttribute(\"modal\",\"\"):this.removeAttribute(\"modal\")}#$=null;#jn=null;#Nn=new ResizeObserver((()=>this.#Mi()));#Fn=null;#Gn;#Xn;#St;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.adoptedStyleSheets=[Ja.#E],this.#$.append(document.importNode(Ja.#z.content,!0));for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t;this[\"#backdrop\"]=Xn(\"x-backdrop\"),this[\"#backdrop\"].style.background=\"rgba(0, 0, 0, 0)\",this[\"#backdrop\"].ownerElement=this,this[\"#backdrop\"].addEventListener(\"click\",(t=>{t.preventDefault()})),this[\"#backdrop\"].addEventListener(\"pointerdown\",(t=>{this.hasAttribute(\"animating\")?t.stopPropagation():this.parentNode&&\"x-button\"!==this.parentNode.localName&&\"x-colorselect\"!==this.parentNode.localName&&this.close()}))}connectedCallback(){this.tabIndex=-1}attributeChangedCallback(t,e,i){e!==i&&\"modal\"===t&&(this.modal&&this.opened?this[\"#backdrop\"].show():this[\"#backdrop\"].hide())}#Mi(){this.#_n(this.#Fn)}open(t,e=!0){return new Promise((async i=>{if(this.#Fn=t,!1===this.opened&&(this.modal&&this[\"#backdrop\"].show(!1),this.setAttribute(\"opened\",\"\"),this.#Nn.observe(this),window.addEventListener(\"resize\",this.#Xn=()=>this.#Mi()),Gn.addEventListener(\"themechange\",this.#St=()=>this.#Zn()),this.dispatchEvent(new CustomEvent(\"open\",{bubbles:!0,detail:this})),await new Promise((t=>{requestAnimationFrame(t)})),this.#Zn(),this.#_n(t),this.#jn=Un(this),this.#jn&&this.#jn.addEventListener(\"scroll\",this.#Gn=()=>{this.close()},{once:!0}),e)){let t=getComputedStyle(this).getPropertyValue(\"--open-transition\"),[e,i,s]=ja(t);\"transform\"===e&&await this.animate({transform:[\"scale(1, 0)\",\"scale(1, 1)\"],transformOrigin:[\"0 0\",\"0 0\"]},{duration:i,easing:s}).finished}i()}))}close(t=!0){return new Promise((async e=>{if(!0===this.opened&&(this.removeAttribute(\"opened\"),this.#Nn.disconnect(),window.removeEventListener(\"resize\",this.#Xn),Gn.removeEventListener(\"themechange\",this.#St),this[\"#backdrop\"].hide(),this.dispatchEvent(new CustomEvent(\"close\",{bubbles:!0,detail:this})),this.#jn.removeEventListener(\"scroll\",this.#Gn),t)){let t=getComputedStyle(this).getPropertyValue(\"--close-transition\"),[e,i,s]=ja(t);this.setAttribute(\"animating\",\"\"),\"opacity\"===e&&await this.animate({opacity:[\"1\",\"0\"]},{duration:i,easing:s}).finished,this.removeAttribute(\"animating\")}e()}))}#_n(t){let e=getComputedStyle(this).getPropertyValue(\"--align\").trim(),i=parseInt(getComputedStyle(this).borderWidth),s=0,n=0,a=null;this.style.maxWidth=null,this.style.maxHeight=null,this.style.left=\"0px\",this.style.top=\"0px\";{let e=this.getBoundingClientRect();0===e.top&&0===e.left||(s=-e.left,n=-e.top),a=t instanceof DOMPoint?new DOMRect(t.x,t.y,0,0):t instanceof DOMRect?t:t instanceof Element?t.getBoundingClientRect():new DOMRect}if(\"bottom\"===e||\"top\"===e){let t=(t=!1)=>{this.style.maxHeight=null,this[\"#arrow\"].setAttribute(\"data-align\",\"bottom\"),this[\"#arrow-path\"].setAttribute(\"d\",\"M 0 100, L 50 0, L 100 100\");let e=this.getBoundingClientRect(),s=this[\"#arrow\"].getBoundingClientRect(),r=0;if(this[\"#arrow\"].style.top=n+a.bottom+2+i+\"px\",this.style.top=n+a.bottom+2+s.height+\"px\",e=this.getBoundingClientRect(),r=e.bottom+8-window.innerHeight,t&&r>0){let t=e.height-r;r=0,this.style.maxHeight=t+\"px\"}return r},r=(t=!1)=>{this.style.maxHeight=null,this[\"#arrow\"].setAttribute(\"data-align\",\"top\"),this[\"#arrow-path\"].setAttribute(\"d\",\"M 0 0, L 50 100, L 100 0\");let e=this.getBoundingClientRect(),s=this[\"#arrow\"].getBoundingClientRect(),r=0;if(this[\"#arrow\"].style.top=Math.floor(n+a.top-2-i-s.height)+\"px\",this.style.top=n+a.top-2-s.height-e.height+\"px\",e=this.getBoundingClientRect(),r=-(e.top-8),t&&r>0){let t=e.height-r;r=0,this.style.maxHeight=t+\"px\",this.style.top=n+a.top-2-s.height-t+\"px\"}return r},o=()=>{this.style.maxWidth=null;let t=this.getBoundingClientRect(),e=0,i=0;return this[\"#arrow\"].style.left=s+a.left+a.width/2+\"px\",this.style.left=s+a.left+a.width/2-t.width/2+\"px\",t=this.getBoundingClientRect(),e=-(t.left-8),i=t.right+8-window.innerWidth,[e,i]},l=(t=!1)=>{this.style.maxWidth=null;let e=this.getBoundingClientRect(),i=0;if(this[\"#arrow\"].style.left=s+a.left+a.width/2+\"px\",this.style.left=s+window.innerWidth-8-e.width+\"px\",e=this.getBoundingClientRect(),i=-(e.left-8),t&&i>0){let t=e.width-i;i=0,this.style.maxWidth=t+\"px\",this.style.left=s+window.innerWidth-8-t+\"px\"}return i},h=(t=!1)=>{this.style.maxWidth=null;let e=this.getBoundingClientRect(),i=0;if(this[\"#arrow\"].style.left=s+a.left+a.width/2+\"px\",this.style.left=s+8+\"px\",e=this.getBoundingClientRect(),i=e.right+8-window.innerWidth,t&&i>0){let t=e.width-i;i=0,this.style.maxWidth=t+\"px\"}return i};if(\"bottom\"===e){let e=t();if(e>0){let i=r();i>0&&(i>e?t(!0):r(!0))}}else if(\"top\"===e){let e=r();if(e>0){let i=t();i>0&&(i>e?r(!0):t(!0))}}{let[t,e]=o();e>0?(t=l(),t>0&&l(!0)):t>0&&(e=h(),e>0&&h(!0))}}else if(\"right\"===e||\"left\"===e){let t=(t=!1)=>{this.style.maxWidth=null,this[\"#arrow\"].setAttribute(\"data-align\",\"right\"),this[\"#arrow-path\"].setAttribute(\"d\",\"M 100 0, L 0 50, L 100 100\");let e=this.getBoundingClientRect(),n=this[\"#arrow\"].getBoundingClientRect(),r=0;if(this[\"#arrow\"].style.left=s+a.right+2+i+\"px\",this.style.left=s+a.right+2+n.width+\"px\",e=this.getBoundingClientRect(),r=e.right+8-window.innerWidth,t&&r>0){let t=e.width-r;r=0,this.style.maxWidth=t+\"px\"}return r},r=(t=!1)=>{this.style.maxWidth=null,this[\"#arrow\"].setAttribute(\"data-align\",\"left\"),this[\"#arrow-path\"].setAttribute(\"d\",\"M 0 0, L 100 50, L 00 100\");let e=this.getBoundingClientRect(),n=this[\"#arrow\"].getBoundingClientRect(),r=0;if(this[\"#arrow\"].style.left=s+a.left-2-i-n.width+\"px\",this.style.left=s+a.left-2-n.width-e.width+\"px\",e=this.getBoundingClientRect(),r=-(e.left-8),t&&r>0){let t=e.width-r;r=0,this.style.maxWidth=t+\"px\",this.style.left=s+a.left-2-n.width-t+\"px\"}return r},o=()=>{this.style.maxHeight=null;let t=this.getBoundingClientRect(),e=0,i=0;return this[\"#arrow\"].style.top=n+a.top+a.height/2+\"px\",this.style.top=n+a.top+a.height/2-t.height/2+\"px\",t=this.getBoundingClientRect(),e=-(t.top-8),i=t.bottom+8-window.innerHeight,[e,i]},l=(t=!1)=>{this.style.maxHeight=null;let e=this.getBoundingClientRect(),i=0;if(this[\"#arrow\"].style.top=n+a.top+a.height/2+\"px\",this.style.top=n+window.innerHeight-8-e.height+\"px\",e=this.getBoundingClientRect(),i=-(e.top-8),t&&i>0){let t=e.height-i;i=0,this.style.maxHeight=t+\"px\",this.style.top=n+window.innerHeight-8-t+\"px\"}return i},h=(t=!1)=>{this.style.maxHeight=null;let e=this.getBoundingClientRect(),i=0;if(this[\"#arrow\"].style.top=n+a.top+a.height/2+\"px\",this.style.top=n+8+\"px\",e=this.getBoundingClientRect(),i=e.bottom+8-window.innerHeight,t&&i>0){let t=e.height-i;i=0,this.style.maxHeight=t+\"px\"}return i};if(\"right\"===e){let e=t();if(e>0){let i=r();i>0&&(i>e?t(!0):r(!0))}}else if(\"left\"===e){let e=r();if(e>0){let i=t();i>0&&(i>e?r(!0):t(!0))}}{let[t,e]=o();e>0?(t=l(),t>0&&l(!0)):t>0&&(e=h(),e>0&&h(!0))}}}#Zn(){{let{backgroundColor:t,borderColor:e,borderWidth:i}=getComputedStyle(this);this[\"#arrow-path\"].style.fill=t,this[\"#arrow-path\"].style.stroke=e,this[\"#arrow-path\"].style.strokeWidth=i}}}customElements.define(\"x-popover\",Ja);class Qa extends HTMLElement{static observedAttributes=[\"value\",\"max\",\"disabled\"];static#z=Ns`<template><div id=\"determinate-bar\" part=\"bar\"></div><div id=\"indeterminate-bars\"><div id=\"primary-indeterminate-bar\" part=\"bar\"></div><div id=\"secondary-indeterminate-bar\" part=\"bar\"></div></div></template>`;static#E=Fs`:host{display:block;box-sizing:border-box;height:8px;width:100%;position:relative;contain:strict;overflow:hidden;cursor:default}:host([hidden]){display:none}#indeterminate-bars{width:100%;height:100%}#determinate-bar{position:absolute;top:0;left:0;bottom:0;width:0%;height:100%;background:#3B99FB;transition:width 0.4s ease-in-out;will-change:left, right}:host([value=\"-1\"]) #determinate-bar{visibility:hidden}#primary-indeterminate-bar{position:absolute;top:0;left:0;bottom:0;height:100%;background:#3B99FB;will-change:left, right}#secondary-indeterminate-bar{position:absolute;top:0;left:0;bottom:0;height:100%;background:#3B99FB;will-change:left, right}\n`;get value(){return this.hasAttribute(\"value\")?parseFloat(this.getAttribute(\"value\")):null}set value(t){null===t?this.removeAttribute(\"value\"):this.setAttribute(\"value\",t)}get max(){return this.hasAttribute(\"max\")?parseFloat(this.getAttribute(\"max\")):1}set max(t){this.setAttribute(\"max\",t)}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}get size(){let t=this.getAttribute(\"size\");return\"small\"===t||\"large\"===t?t:null}set size(t){\"small\"===t||\"large\"===t?this.setAttribute(\"size\",t):this.removeAttribute(\"size\")}#$=null;#Un=null;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.adoptedStyleSheets=[Qa.#E],this.#$.append(document.importNode(Qa.#z.content,!0));for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t}connectedCallback(){this.#Xt()}attributeChangedCallback(t,e,i){e!==i&&(\"value\"===t||\"disabled\"===t)&&this.#Xt()}#Xt(){if(null===this.value||-1===this.value||this.disabled?this[\"#determinate-bar\"].style.width=\"0%\":this[\"#determinate-bar\"].style.width=this.value/this.max*100+\"%\",null!==this.value||this.disabled){if(this.#Un){for(let t of this.#Un)t.cancel();this.#Un=null}}else this.#Un||(this.#Un=[this[\"#primary-indeterminate-bar\"].animate([{left:\"-35%\",right:\"100%\",offset:0},{left:\"100%\",right:\"-90%\",offset:.6},{left:\"100%\",right:\"-90%\",offset:1}],{duration:2e3,easing:\"ease-in-out\",iterations:Infinity}),this[\"#secondary-indeterminate-bar\"].animate([{left:\"-100%\",right:\"100%\",offset:0},{left:\"110%\",right:\"-30%\",offset:.8},{left:\"110%\",right:\"-30%\",offset:1}],{duration:2e3,delay:1e3,easing:\"ease-in-out\",iterations:Infinity})])}}customElements.define(\"x-progressbar\",Qa);class tr extends HTMLElement{static observedAttributes=[\"toggled\",\"disabled\"];static#z=Ns`<template><div id=\"main\"><div id=\"indicator\" part=\"indicator\"><div id=\"indicator-dot\" part=\"indicator-dot\"></div></div><div id=\"description\"><slot></slot></div></div></template>`;static#E=Fs`:host{display:block;position:relative;width:fit-content}:host(:focus){outline:none}:host([disabled]){opacity:0.4;pointer-events:none}:host([hidden]){display:none}#main{display:flex;align-items:center}#indicator{position:relative;border:3px solid black;width:19px;height:19px;border-radius:99px;display:flex;align-items:center;justify-content:center}#indicator-dot{width:100%;height:100%;background:currentColor;border-radius:99px;transform:scale(0)}:host([mixed][toggled]) #indicator-dot{height:33%;border-radius:0}:host([toggled]) #indicator-dot{transform:scale(0.5)}#description{flex:1}\n`;get value(){return this.hasAttribute(\"value\")?this.getAttribute(\"value\"):null}set value(t){null===t?this.removeAttribute(\"value\"):this.setAttribute(\"value\",t)}get toggled(){return this.hasAttribute(\"toggled\")}set toggled(t){t?this.setAttribute(\"toggled\",\"\"):this.removeAttribute(\"toggled\")}get mixed(){return this.hasAttribute(\"mixed\")}set mixed(t){t?this.setAttribute(\"mixed\",\"\"):this.removeAttribute(\"mixed\")}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}get size(){let t=this.getAttribute(\"size\");return\"small\"===t||\"large\"===t?t:null}set size(t){\"small\"===t||\"large\"===t?this.setAttribute(\"size\",t):this.removeAttribute(\"size\")}#$=null;#U=0;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.adoptedStyleSheets=[tr.#E],this.#$.append(document.importNode(tr.#z.content,!0));for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t;this.addEventListener(\"click\",(t=>this.#P(t))),this.addEventListener(\"pointerdown\",(t=>this.#Y(t))),this.addEventListener(\"keydown\",(t=>this.#W(t)))}connectedCallback(){this.#J()}attributeChangedCallback(t,e,i){e!==i&&(\"toggled\"===t?this.#xt():\"disabled\"===t&&this.#vt())}#J(){this.setAttribute(\"role\",\"radio\"),this.setAttribute(\"aria-checked\",this.toggled),this.setAttribute(\"aria-disabled\",this.disabled),this.closest(\"x-radios\")||(this.disabled?(this.#U=this.tabIndex>0?this.tabIndex:0,this.tabIndex=-1):(this.tabIndex<0&&(this.tabIndex=this.#U>0?this.#U:0),this.#U=0))}#xt(){this.setAttribute(\"aria-checked\",this.toggled)}#vt(){this.#J()}#P(t){this.closest(\"x-radios\")||(this.toggled&&this.mixed?this.mixed=!1:(this.mixed=!1,this.toggled=!this.toggled),this.dispatchEvent(new CustomEvent(\"toggle\",{bubbles:!0})))}#Y(t){if(!1===this.matches(\":focus\")){t.preventDefault();let e=Zn(this.parentNode,\"[tabindex]\");e&&e.focus()}}#W(t){\"Enter\"!==t.code&&\"NumpadEnter\"!==t.code&&\"Space\"!==t.code||(t.preventDefault(),this.click())}}customElements.define(\"x-radio\",tr);class er extends HTMLElement{get value(){let t=this.querySelector(\"x-radio[toggled]\");return t?t.value:null}set value(t){for(let e of this.querySelectorAll(\"x-radio\"))e.toggled=e.value===t&&null!==t}#$=null;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.innerHTML=\"<slot></slot>\",this.addEventListener(\"click\",(t=>this.#P(t)),!0),this.addEventListener(\"keydown\",(t=>this.#W(t)))}connectedCallback(){this.setAttribute(\"role\",\"radiogroup\");let t=[...this.querySelectorAll(\"x-radio\")].filter((t=>t.closest(\"x-radios\")===this)),e=t.find((t=>t.toggled&&!t.disabled))||t.find((t=>!t.disabled));for(let i of t)i.setAttribute(\"tabindex\",i===e?\"0 \":\"-1\"),i.setAttribute(\"aria-checked\",i===e)}#P(t){let e=t.target.closest(\"x-radio\");if(e&&!e.disabled&&t.buttons<=1){let t=[...this.querySelectorAll(\"x-radio\")].filter((t=>t.closest(\"x-radios\")===this&&t!==e));if(!1===e.toggled||!0===e.mixed){e.toggled=!0,e.mixed=!1,e.tabIndex=0;for(let e of t)e.toggled=!1,e.mixed=!1,e.tabIndex=-1;this.dispatchEvent(new CustomEvent(\"toggle\",{bubbles:!0,detail:e}))}}}#W(t){if(\"ArrowDown\"===t.code||\"ArrowRight\"===t.code){let e=[...this.querySelectorAll(\"x-radio\")],i=e.filter((t=>!1===t.disabled&&t.closest(\"x-radios\")===this)),s=e.find((t=>t.matches(\":focus\")));if(s){let e=i.indexOf(s),n=i.length>1?i[e+1]||i[0]:null;n&&(t.preventDefault(),n.focus(),n.tabIndex=0,s.tabIndex=-1)}}else if(\"ArrowUp\"===t.code||\"ArrowLeft\"===t.code){let e=[...this.querySelectorAll(\"x-radio\")],i=e.filter((t=>!1===t.disabled&&t.closest(\"x-radios\")===this)),s=e.find((t=>t.matches(\":focus\")));if(s){let e=i.indexOf(s),n=i[i.length-1],a=i.length>1?i[e-1]||n:null;a&&(t.preventDefault(),a.focus(),a.tabIndex=0,s.tabIndex=-1)}}}}customElements.define(\"x-radios\",er);let ir=Symbol();class sr extends HTMLElement{static observedAttributes=[\"disabled\"];static#z=Ns`<template><div id=\"button\"><div id=\"arrow-container\"><svg id=\"arrow\" part=\"arrow\" viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\"><path id=\"arrow-path\"></path></svg></div></div><slot></slot></template>`;static#E=Fs`:host{display:block;width:fit-content;height:32px;padding:0 0 0 8px;max-width:100%;box-sizing:border-box;position:relative;outline:none;font-size:0.875rem;user-select:none;-webkit-user-select:none}:host([disabled]){pointer-events:none;opacity:0.5}:host([hidden]){display:none}:host(:hover){cursor:default}:host([size=\"small\"]){font-size:0.78125rem}#button{display:flex;flex-flow:row;align-items:center;justify-content:flex-start;flex:1;width:100%;height:100%}:host([mixed]) #button > *{opacity:0.7}#button > x-label{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}#button > #arrow-container{display:flex;align-content:center;justify-content:center;margin:0 0 0 auto;z-index:1}#button > #arrow-container #arrow{display:flex;width:13px;height:13px;min-width:13px;margin:0 2px 0 11px;color:currentColor;--text-color: 50%;--path-data: M 25 41 L 50 16 L 75 41 L 83 34 L 50 1 L 17 34 Z M 17 66 L 50 100 L 83 66 L 75 59 L 50 84 L 25 59 Z;}#button > #arrow-container #arrow path{fill:currentColor}\n`;get value(){let t=this.querySelector(\"x-menuitem[toggled]\");return t?t.value:null}set value(t){for(let e of this.querySelectorAll(\"x-menuitem\"))e.toggled=e.value===t&&null!==t}get mixed(){return this.hasAttribute(\"mixed\")}set mixed(t){t?this.setAttribute(\"mixed\",\"\"):this.removeAttribute(\"mixed\")}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}get size(){let t=this.getAttribute(\"size\");return\"small\"===t||\"large\"===t?t:null}set size(t){\"small\"===t||\"large\"===t?this.setAttribute(\"size\",t):this.removeAttribute(\"size\")}#$=null;#U=0;#X=!1;#Mt=null;#Lt=null;#R=null;#Yn=new MutationObserver((t=>this.#Vn(t)));#Si=new ResizeObserver((()=>this.#Mi()));constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.adoptedStyleSheets=[sr.#E],this.#$.append(document.importNode(sr.#z.content,!0));for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t;this[\"#backdrop\"]=Xn(\"x-backdrop\"),this[\"#backdrop\"].style.opacity=\"0\",this[\"#backdrop\"].ownerElement=this,this[\"#backdrop\"].addEventListener(\"click\",(t=>this.#At(t))),this.addEventListener(\"pointerdown\",(t=>this.#Y(t))),this.addEventListener(\"toggle\",(t=>this.#qn(t))),this.addEventListener(\"click\",(t=>this.#P(t))),this.addEventListener(\"keydown\",(t=>this.#W(t)))}connectedCallback(){this.#Yn.observe(this,{childList:!0,attributes:!0,characterData:!0,subtree:!0}),this.#Si.observe(this),this.#Wn(),this.#J(),Gn.whenThemeReady.then((()=>{this.#I()})),Gn.addEventListener(\"themechange\",this.#R=()=>this.#I())}disconnectedCallback(){this.#Yn.disconnect(),this.#Si.disconnect(),Gn.removeEventListener(\"themechange\",this.#R)}attributeChangedCallback(t,e,i){e!==i&&\"disabled\"===t&&this.#J()}#Vt(){if(!1===this.#qt())return;this.#X=this.matches(\":focus\"),this[\"#backdrop\"].show(!1),window.addEventListener(\"resize\",this.#Mt=()=>{this.#Wt()}),window.addEventListener(\"blur\",this.#Lt=()=>{this.#Wt()});let t=this.querySelector(\":scope > x-menu\");{let e=null;for(let i of t.querySelectorAll(\"x-menuitem\"))i.togglable=!0,i.toggled&&(null===e?e=i:i.toggled=!1)}if(t.querySelector(\"x-menuitem[toggled]\")){let e=this[\"#button\"].querySelector(\"x-label\")||this[\"#button\"].firstElementChild,i=e[ir];t.openOverElement(e,i)}else{let e=t.querySelector(\"x-menuitem\").firstElementChild;t.openOverElement(this[\"#button\"],e)}{let e=t.getBoundingClientRect(),i=this[\"#button\"].getBoundingClientRect(),s=parseFloat(getComputedStyle(this).paddingRight);e.right-s<i.right&&(t.style.minWidth=i.right-e.left+s+\"px\")}{let t=this.getBoundingClientRect();t.right+7>window.innerWidth&&(this.style.maxWidth=window.innerWidth-t.left-7+\"px\")}}async#Wt(t=null){if(!1===this.#Kt())return;let e=this.querySelector(\":scope > x-menu\");if(e.setAttribute(\"closing\",\"\"),await t,this[\"#backdrop\"].hide(!1),this.#X)this.focus();else{let t=Zn(this.parentNode,\"[tabindex]\");t&&t.focus()}window.removeEventListener(\"resize\",this.#Mt),window.removeEventListener(\"blur\",this.#Lt),await e.close(),e.removeAttribute(\"closing\")}#qt(){if(this.disabled)return!1;{let t=this.querySelector(\":scope > x-menu\"),e=t.querySelector(\"x-menuitem\");return null!==t&&!1===t.opened&&!1===t.hasAttribute(\"closing\")&&null!==e}}#Kt(){if(this.disabled)return!1;{let t=this.querySelector(\":scope > x-menu\");return t.querySelector(\"x-menuitem\"),null!==t&&!0===t.opened&&!1===t.hasAttribute(\"closing\")}}#Wn(){let t=this.querySelector(\":scope > x-menu x-menuitem[toggled]\");if(this[\"#button\"].innerHTML=\"\",t){for(let e of t.children){let t=e.cloneNode(!0);t[ir]=e,t.removeAttribute(\"id\"),t.removeAttribute(\"style\"),this[\"#button\"].append(t)}this.#Kn()}this[\"#button\"].append(this[\"#arrow-container\"])}#Jn=Fn(this.#Wn,300,this);#Kn(){for(let t of this[\"#button\"].children)if(t!==this[\"#arrow-container\"]){let{width:e,height:i,margin:s,padding:n,border:a,borderRadius:r}=getComputedStyle(t[ir]);[\"x-icon\",\"x-swatch\",\"img\",\"svg\"].includes(t[ir].localName)&&(t.style.width=e,t.style.height=i,t.style.minWidth=e,t.style.borderRadius=r),t.style.margin=s,t.style.padding=n,t.style.border=a}}#I(){let t=getComputedStyle(this[\"#arrow\"]).getPropertyValue(\"--path-data\");this[\"#arrow-path\"].setAttribute(\"d\",t)}#J(){this.setAttribute(\"aria-disabled\",this.disabled),this.disabled?(this.#U=this.tabIndex>0?this.tabIndex:0,this.tabIndex=-1):(this.tabIndex<0&&(this.tabIndex=this.#U>0?this.#U:0),this.#U=0);{this.setAttribute(\"role\",\"button\");let t=this.querySelector(\":scope > x-menu\");if(t){t.setAttribute(\"role\",\"listbox\");for(let e of t.querySelectorAll(\"x-menuitem\"))e.setAttribute(\"role\",\"option\")}}}async#Vn(t){for(let e of t)if(\"attributes\"===e.type&&\"x-menuitem\"===e.target.localName&&\"toggled\"===e.attributeName){await jn(10),this.#Jn();break}}#Mi(){this.#Kn()}#Y(t){t.target.closest(\"x-menu\")||!1!==this.matches(\":focus\")||t.preventDefault()}async#P(t){if(!(t.buttons>1))if(this.#qt())this.#Vt();else if(this.#Kt()){let e=t.target.closest(\"x-menuitem\");if(e){let t=this.value,i=e.value;for(let t of this.querySelectorAll(\"x-menuitem\"))t.toggled=t===e;await this.#Wt(e.whenTriggerEnd),(t!==i||this.mixed)&&(this.mixed=!1,this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0,detail:{oldValue:t,newValue:i}})))}}}#qn(t){t.preventDefault()}#At(t){this.#Wt()}#W(t){!1===t.defaultPrevented&&(this.querySelector(\":scope > x-menu\"),\"Enter\"===t.code||\"NumpadEnter\"===t.code||\"Space\"===t.code||\"ArrowUp\"===t.code||\"ArrowDown\"===t.code?this.#qt()&&(t.preventDefault(),this.#Vt()):\"Escape\"===t.code&&this.#Kt()&&(t.preventDefault(),this.#Wt()))}}customElements.define(\"x-select\",sr);const nr=navigator.platform.startsWith(\"Mac\")||[\"iPhone\",\"iPad\"].includes(navigator.platform),ar=[\"Alt\",\"AltGraph\",\"CapsLock\",\"Control\",\"Fn\",\"FnLock\",\"Meta\",\"NumLock\",\"ScrollLock\",\"Shift\",\"Symbol\",\"SymbolLock\"];class rr extends HTMLElement{static observedAttributes=[\"value\"];static#z=Ns`<template><div id=\"main\"></div></template>`;static#E=Fs`:host{display:inline-block;box-sizing:border-box;font-size:0.875rem;line-height:1}:host([hidden]){display:none}::selection{color:var(--selection-color);background-color:var(--selection-background-color)}\n`;get value(){let t=[];if(this.hasAttribute(\"value\")){let e=this.getAttribute(\"value\").replace(\"++\",\"+PLUS\").split(\"+\");e=e.map((t=>t.trim().replace(\"PLUS\",\"+\"))).filter((t=>\"\"!==t)),t=e}return t}set value(t){this.setAttribute(\"value\",t.join(\"+\"))}get modKeys(){return this.value.filter((t=>ar.includes(t)))}get normalKey(){let t=this.value.find((t=>!1===ar.includes(t)));return void 0===t?null:t}#$=null;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.adoptedStyleSheets=[rr.#E],this.#$.append(document.importNode(rr.#z.content,!0));for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t}attributeChangedCallback(t,e,i){e!==i&&\"value\"===t&&this.#Xt()}#Xt(){let t=\"\";this.value;let e=this.modKeys,i=this.normalKey;if(nr){e.includes(\"Meta\")&&(t+=\"^\"),e.includes(\"Alt\")&&(t+=\"⌥\"),e.includes(\"Shift\")&&(t+=\"⇧\"),e.includes(\"Control\")&&(t+=\"⌘\"),e.includes(\"Symbol\")&&(t+=\"☺\"),void 0!==i&&(t+={ArrowUp:\"↑\",ArrowDown:\"↓\",ArrowLeft:\"←\",ArrowRight:\"→\",Backspace:\"⌦\"}[i]||i)}else{let s=[];e.includes(\"Control\")&&s.push(\"Ctrl\"),e.includes(\"Alt\")&&s.push(\"Alt\"),e.includes(\"Meta\")&&s.push(\"Meta\"),e.includes(\"Shift\")&&s.push(\"Shift\"),e.includes(\"Symbol\")&&s.push(\"Symbol\");let n={ArrowUp:\"Up\",ArrowDown:\"Down\",ArrowLeft:\"Left\",ArrowRight:\"Right\"};null!==i&&s.push(n[i]||i),t=s.join(\"+\")}this[\"#main\"].textContent=t}}customElements.define(\"x-shortcut\",rr);class or extends HTMLElement{static observedAttributes=[\"value\",\"min\",\"max\",\"ticks\",\"disabled\"];static#z=Ns`<template><div id=\"main\"><div id=\"groove-track\" part=\"track groove-track\"></div><div id=\"range-track\" part=\"track range-track\"></div><div id=\"thumbs\" part=\"thumbs\"><div id=\"ticks\"></div><div id=\"start-thumb\" class=\"thumb\" part=\"thumb start-thumb\" data-value=\"start\" tabindex=\"0\"></div><div id=\"end-thumb\" class=\"thumb\" part=\"thumb end-thumb\" data-value=\"end\" tabindex=\"0\"></div></div></div></template>`;static#E=Fs`:host{display:block;width:100%;height:20px;position:relative;box-sizing:border-box;touch-action:pan-y}:host(:focus){outline:none}:host(:hover){cursor:default}:host([disabled]){pointer-events:none;opacity:0.4}:host([size=\"small\"]){height:17px}:host([size=\"large\"]){height:23px}#main{display:flex;flex-flow:column;width:100%;height:100%;position:relative}#range-track{position:absolute;width:0%;height:4px;background:black;top:50%;transform:translateY(-50%)}#groove-track{position:absolute;width:100%;height:4px;background:gray;top:50%;transform:translateY(-50%)}#thumbs{position:relative;width:calc(100% - var(--computed-thumb-width));height:100%;margin:0 auto}#thumbs .thumb{position:absolute;top:0;left:0%;width:fit-content;height:100%;aspect-ratio:1;margin-left:calc(var(--computed-thumb-width) / -2);box-sizing:border-box;background:gray;border:1px solid rgba(0, 0, 0, 0.2)}#thumbs .thumb:focus{outline:none;z-index:2}#ticks{position:absolute;left:0px;bottom:0px;width:100%;height:100%}#ticks:empty{display:none}#ticks .tick{position:absolute;left:0%;bottom:-5px;width:1px;height:5px;background:rgba(0, 0, 0, 0.4)}\n`;get min(){return this.hasAttribute(\"min\")?parseFloat(this.getAttribute(\"min\")):0}set min(t){this.setAttribute(\"min\",t)}get max(){return this.hasAttribute(\"max\")?parseFloat(this.getAttribute(\"max\")):100}set max(t){this.setAttribute(\"max\",t)}get value(){if(this.hasAttribute(\"value\")){let t=this.getAttribute(\"value\").split(/[ ,]+/);return t.length>=2?t.map((t=>parseFloat(t))).slice(0,2):parseFloat(t[0])}return this.max>=this.min?this.min+(this.max-this.min)/2:this.min}set value(t){Array.isArray(t)?((t=t.map((t=>ki(t,this.min,this.max)))).length=2,this.setAttribute(\"value\",t.join(\" \"))):(t=ki(t,this.min,this.max),this.setAttribute(\"value\",t))}get step(){return this.hasAttribute(\"step\")?parseFloat(this.getAttribute(\"step\")):1}set step(t){this.setAttribute(\"step\",t)}get ticks(){return this.hasAttribute(\"ticks\")}set ticks(t){t?this.setAttribute(\"ticks\",\"\"):this.removeAttribute(\"ticks\")}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}get size(){let t=this.getAttribute(\"size\");return\"small\"===t||\"large\"===t?t:null}set size(t){\"small\"===t||\"large\"===t?this.setAttribute(\"size\",t):this.removeAttribute(\"size\")}get range(){return this.hasAttribute(\"range\")}get dragging(){return this.getAttribute(\"dragging\")}#$=null;#U=0;#Qn=null;#ta=new ResizeObserver((()=>this.#ea()));constructor(){super(),this.#$=this.attachShadow({mode:\"closed\",delegatesFocus:!0}),this.#$.adoptedStyleSheets=[or.#E],this.#$.append(document.importNode(or.#z.content,!0));for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t;this.#$.addEventListener(\"pointerdown\",(t=>this.#Xs(t))),this.addEventListener(\"pointerdown\",(t=>this.#Y(t))),this.addEventListener(\"keydown\",(t=>this.#W(t)))}connectedCallback(){this.setAttribute(\"value\",this.value),this.#ta.observe(this[\"#start-thumb\"]),this.#Xt(),this.#J()}disconnectedCallback(){this.#ta.unobserve(this[\"#start-thumb\"])}attributeChangedCallback(t,e,i){e!==i&&!1!==this.isConnected&&(\"value\"===t?this.#Zt():\"min\"===t?this.#yn():\"max\"===t?this.#Cn():\"ticks\"===t?this.#ia():\"disabled\"===t&&this.#vt())}#Zt(){this.#Xt()}#yn(){this.#Xt()}#Cn(){this.#Xt()}#ia(){this.#Xt()}#vt(){this.#J()}#ea(){let t=this[\"#start-thumb\"].getBoundingClientRect();t.width!==this.#Qn&&(this.#Qn=t.width,this[\"#main\"].style.setProperty(\"--computed-thumb-width\",t.width+\"px\"))}#Y(t){if(!1===this.matches(\":focus\")){t.preventDefault();let e=Zn(this.parentNode,\"[tabindex]\");e&&e.focus()}}#Xs(t){if(t.buttons>1||!1===t.isPrimary)return;let e,i,s=null,{width:n,height:a}=this[\"#start-thumb\"].getBoundingClientRect(),r=this[\"#main\"].getBoundingClientRect(),o=!1;if(t.target.matches(\".thumb\"))s=t.target;else if(!0===this[\"#end-thumb\"].hidden)s=this[\"#start-thumb\"];else{let e=this[\"#start-thumb\"].getBoundingClientRect(),i=this[\"#end-thumb\"].getBoundingClientRect(),n=new DOMPoint(e.x+e.width/2,e.y+e.height/2),a=new DOMPoint(i.x+i.width/2,i.y+i.height/2),r=new DOMPoint(t.clientX,t.clientY),o=zi(r,n),l=zi(r,a);s=o<=l?this[\"#start-thumb\"]:this[\"#end-thumb\"]}let l=(t,e)=>{let i=t-(r.x+n/2);i=ki(i,0,r.width-n);let a=i/(r.width-n)*(this.max-this.min)+this.min;var l,h;if(l=a,h=this.step,a=wi(wi(l/h)*h,Ci(h)),Array.isArray(this.value)){let[t,e]=this.value;s===this[\"#start-thumb\"]?(a>=e&&(a=e),a!==t&&(this.value=[a,e],!1===o&&(o=!0,this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0}))),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})))):s===this[\"#end-thumb\"]&&(a<=t&&(a=t),a!==e&&(this.value=[t,a],!1===o&&(o=!0,this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0}))),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0}))))}else this.value!==a&&(this.value=a,!1===o&&(o=!0,this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0}))),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0})))};s.setPointerCapture(t.pointerId),this.setAttribute(\"dragging\",s.dataset.value),l(t.clientX,t.clientY);for(let t of this[\"#thumbs\"].children)t.style.zIndex=t===s?\"1\":\"0\";s.addEventListener(\"pointermove\",e=t=>{t.isPrimary&&l(t.clientX,t.clientY)}),s.addEventListener(\"pointerup\",i=()=>{s.removeEventListener(\"pointermove\",e),s.removeEventListener(\"pointerup\",i),s.removeEventListener(\"pointercancel\",i),this.removeAttribute(\"dragging\"),o&&this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0}))}),s.addEventListener(\"pointercancel\",i)}#W(t){if(\"ArrowLeft\"===t.code||\"ArrowDown\"===t.code){t.preventDefault(),this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0}));let e=this.value;if(Array.isArray(this.value)){let[i,s]=this.value;this.#$.activeElement===this[\"#start-thumb\"]?t.shiftKey?i-=10*this.step:i-=this.step:this.#$.activeElement===this[\"#end-thumb\"]&&(t.shiftKey?s-=10*this.step:s-=this.step,s<=i&&(s=i)),this.value=[i,s],!1===rt(e,this.value)&&this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0}))}else t.shiftKey?this.value-=10*this.step:this.value-=this.step,e!==this.value&&this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0}));this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0}))}else if(\"ArrowRight\"===t.code||\"ArrowUp\"===t.code){t.preventDefault(),this.dispatchEvent(new CustomEvent(\"changestart\",{bubbles:!0}));let e=this.value;if(Array.isArray(this.value)){let[i,s]=this.value;this.#$.activeElement===this[\"#start-thumb\"]?(t.shiftKey?i+=10*this.step:i+=this.step,i>=s&&(i=s)):this.#$.activeElement===this[\"#end-thumb\"]&&(t.shiftKey?s+=10*this.step:s+=this.step),this.value=[i,s],!1===rt(e,this.value)&&this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0}))}else t.shiftKey?this.value+=10*this.step:this.value+=this.step,e!==this.value&&this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0}));this.dispatchEvent(new CustomEvent(\"changeend\",{bubbles:!0}))}}#Xt(){if(Array.isArray(this.value)){let[t,e]=this.value,i=(t-this.min)/(this.max-this.min)*100,s=(e-this.min)/(this.max-this.min)*100;this.setAttribute(\"range\",\"\"),this[\"#start-thumb\"].style.left=`${i}%`,this[\"#start-thumb\"].hidden=!1,this[\"#end-thumb\"].style.left=`${s}%`,this[\"#end-thumb\"].hidden=!1,this[\"#range-track\"].style.left=`${i}%`,this[\"#range-track\"].style.width=s-i+\"%\"}else{let t=(this.value-this.min)/(this.max-this.min)*100;this.removeAttribute(\"range\"),this[\"#start-thumb\"].style.left=`${t}%`,this[\"#start-thumb\"].hidden=!1,this[\"#end-thumb\"].hidden=!0;{let e=((this.min>0?this.min:0)-this.min)/(this.max-this.min)*100;t>=e?(this[\"#range-track\"].style.left=`${e}%`,this[\"#range-track\"].style.width=t-e+\"%\",this[\"#range-track\"].style.removeProperty(\"border-top-left-radius\"),this[\"#range-track\"].style.removeProperty(\"border-bottom-left-radius\"),this[\"#range-track\"].style.setProperty(\"border-top-right-radius\",\"0px\",\"important\"),this[\"#range-track\"].style.setProperty(\"border-bottom-right-radius\",\"0px\",\"important\")):(this[\"#range-track\"].style.left=`${t}%`,this[\"#range-track\"].style.width=e-t+\"%\",this[\"#range-track\"].style.setProperty(\"border-top-left-radius\",\"0px\",\"important\"),this[\"#range-track\"].style.setProperty(\"border-bottom-left-radius\",\"0px\",\"important\"),this[\"#range-track\"].style.removeProperty(\"border-top-right-radius\"),this[\"#range-track\"].style.removeProperty(\"border-bottom-right-radius\"))}}if(this[\"#ticks\"].innerHTML=\"\",this.ticks){let t=(this.max-this.min)/this.step;for(let e=this.min,i=0;e<=this.max;e+=this.step,i+=1){let s=(e-this.min)/(this.max-this.min)*100,n=[\"tick\"];if(0===i?n.push(\"first-tick\"):i===t&&n.push(\"last-tick\"),Array.isArray(this.value)){let[t,i]=this.value;e>=t&&e<=i&&n.push(\"range-tick\")}else e<=this.value&&n.push(\"range-tick\");this[\"#ticks\"].insertAdjacentHTML(\"beforeend\",`<div class=\"tick\" part=\"${n.join(\" \")}\" data-value=\"${e}\" style=\"left: ${s}%\"></div>`)}}}#J(){this.setAttribute(\"aria-disabled\",this.disabled),this.disabled?(this.#U=this.tabIndex>0?this.tabIndex:0,this.tabIndex=-1):(this.tabIndex<0&&(this.tabIndex=this.#U>0?this.#U:0),this.#U=0),this[\"#start-thumb\"].tabIndex=this.tabIndex,this[\"#end-thumb\"].tabIndex=this.tabIndex}}customElements.define(\"x-slider\",or);class lr extends HTMLElement{static observedAttributes=[\"disabled\"];static#z=Ns`<template><div id=\"decrement-button\" part=\"decrement-button\" class=\"button\"><svg id=\"decrement-arrow\" part=\"decrement-arrow\" viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\"><path id=\"decrement-arrow-path\"></path></svg></div><div id=\"increment-button\" part=\"increment-button\" class=\"button\"><svg id=\"increment-arrow\" part=\"increment-arrow\" viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\"><path id=\"increment-arrow-path\"></path></svg></div></template>`;static#E=Fs`:host{display:flex;flex-flow:column-reverse;align-items:center;justify-content:center;box-sizing:border-box;height:100%;width:fit-content;color:rgba(0, 0, 0, 0.6)}:host(:hover){cursor:default}:host([disabled=\"\"]){opacity:0.5;pointer-events:none}.button{display:flex;align-items:center;justify-content:center;width:100%;height:100%;user-select:none;-webkit-user-select:none;box-sizing:border-box;color:inherit;border-left:none}.button[data-pressed]{color:white;background:rgba(0, 0, 0, 0.3)}:host([disabled=\"increment\"]) #increment-button, :host([disabled=\"decrement\"]) #decrement-button{opacity:0.3;pointer-events:none}#increment-arrow{width:11px;height:11px;pointer-events:none;--path-data: M 24 69 L 50 43 L 76 69 L 69 76 L 50 58 L 31 76 L 24 69 Z;}#decrement-arrow{width:11px;height:11px;pointer-events:none;--path-data: M 24 32 L 50 58 L 76 32 L 69 25 L 50 44 L 31 25 L 24 32 Z;}#increment-arrow-path, #decrement-arrow-path{fill:currentColor}\n`;get disabled(){return!!this.hasAttribute(\"disabled\")&&(\"increment\"===this.getAttribute(\"disabled\")?\"increment\":\"decrement\"!==this.getAttribute(\"disabled\")||\"decrement\")}set disabled(t){!0===t?this.setAttribute(\"disabled\",\"\"):!1===t?this.removeAttribute(\"disabled\"):this.setAttribute(\"disabled\",t)}#$=null;#sa=null;#R=null;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.adoptedStyleSheets=[lr.#E],this.#$.append(document.importNode(lr.#z.content,!0));for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t;this.#$.addEventListener(\"pointerdown\",(t=>this.#Y(t))),this.addEventListener(\"contextmenu\",(t=>t.preventDefault()))}connectedCallback(){Gn.whenThemeReady.then((()=>{this.#na()})),Gn.addEventListener(\"themechange\",this.#R=()=>this.#na()),\"x-numberinput\"===this.parentElement?.localName&&(this.#sa=this.parentElement,this.#sa.setAttribute(\"hasstepper\",\"\"))}disconnectedCallback(){Gn.removeEventListener(\"themechange\",this.#R),this.#sa&&(null===this.#sa.querySelector(\":scope > x-stepper\")&&this.#sa.removeAttribute(\"hasstepper\",\"\"),this.#sa=null)}attributeChangedCallback(t,e,i){e!==i&&\"disabled\"===t&&this.#vt()}#na(){let t=getComputedStyle(this[\"#increment-arrow\"]).getPropertyValue(\"--path-data\"),e=getComputedStyle(this[\"#decrement-arrow\"]).getPropertyValue(\"--path-data\");this[\"#increment-arrow-path\"].setAttribute(\"d\",t),this[\"#decrement-arrow-path\"].setAttribute(\"d\",e)}#vt(){this.hasAttribute(\"disabled\")&&(this.removeAttribute(\"pressed\"),this[\"#increment-button\"].removeAttribute(\"data-pressed\"),this[\"#decrement-button\"].removeAttribute(\"data-pressed\"))}#Y(t){let e=t.target.closest(\".button\"),i=null;if(e===this[\"#increment-button\"]?i=\"increment\":e===this[\"#decrement-button\"]&&(i=\"decrement\"),!(t.buttons>1||null===i)){this.setPointerCapture(t.pointerId);{let t,s=Date.now();e.setAttribute(\"data-pressed\",\"\"),this.setAttribute(\"pressed\",i),this.addEventListener(\"pointerup\",t=async()=>{this.removeEventListener(\"pointerup\",t),this.removeEventListener(\"pointercancel\",t);let i=Date.now()-s;i<100&&await jn(100-i),e.removeAttribute(\"data-pressed\"),this.removeAttribute(\"pressed\")},{once:!0}),this.addEventListener(\"pointercancel\",t)}{let e,s=null,n=Date.now(),{shiftKey:a}=t;this.dispatchEvent(new CustomEvent(i+\"start\",{bubbles:!0})),this.dispatchEvent(new CustomEvent(i,{bubbles:!0,detail:{shiftKey:a}})),this.addEventListener(\"pointerup\",e=()=>{this.removeEventListener(\"pointerup\",e),this.removeEventListener(\"pointercancel\",e),clearInterval(s),this.dispatchEvent(new CustomEvent(i+\"end\",{bubbles:!0}))}),this.addEventListener(\"pointercancel\",e),s=setInterval((()=>{Date.now()-n>500&&this.dispatchEvent(new CustomEvent(i,{bubbles:!0,detail:{shiftKey:a}}))}),100)}}}}customElements.define(\"x-stepper\",lr);class hr extends HTMLElement{static observedAttributes=[\"value\"];static#z=Ns`<template><div id=\"preview\"></div></template>`;static#E=Fs`:host{display:block;width:18px;height:18px;cursor:default;box-sizing:border-box;overflow:hidden;border-width:1px;border-style:solid;background:var(--checkboard-background);background-size:8px 8px;background-position:0 0, 0 4px, 4px -4px, -4px 0px}#preview{width:100%;height:100%;position:relative}\n`;get value(){return this.hasAttribute(\"value\")?this.getAttribute(\"value\"):\"white\"}set value(t){this.setAttribute(\"value\",t)}get size(){let t=this.getAttribute(\"size\");return\"small\"===t||\"large\"===t?t:null}set size(t){\"small\"===t||\"large\"===t?this.setAttribute(\"size\",t):this.removeAttribute(\"size\")}#$=null;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.adoptedStyleSheets=[hr.#E],this.#$.append(document.importNode(hr.#z.content,!0));for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t}connectedCallback(){this.#Vi()}attributeChangedCallback(t,e,i){e!==i&&\"value\"===t&&this.#Vi()}#Vi(){this[\"#preview\"].style.background=this.value}}customElements.define(\"x-swatch\",hr);class dr extends HTMLElement{static observedAttributes=[\"toggled\",\"disabled\"];static#z=Ns`<template><div id=\"main\"><div id=\"indicator\" part=\"indicator\"><div id=\"indicator-track\" part=\"indicator-track\"><div id=\"indicator-thumb\" part=\"indicator-thumb\" style=\"transition: none;\"></div></div></div><div id=\"description\"><slot></slot></div></div></template>`;static#E=Fs`:host{display:block;width:fit-content;margin:2px 0}:host(:focus){outline:none}:host([disabled]){opacity:0.4;pointer-events:none}#main{display:flex;align-items:center}#indicator{position:relative;width:34px;height:15px;display:flex;align-items:center}#indicator-track{display:flex;align-items:center;width:100%;height:65%;background:currentColor;border-radius:999px}#indicator-thumb{position:absolute;left:0px;width:16px;height:16px;background:currentColor;border-radius:999px;transition:left 0.2s cubic-bezier(0.4, 0, 0.2, 1)}:host([toggled]) #indicator-thumb{left:calc(100% - 16px)}:host([mixed]) #indicator-thumb{left:calc(50% - 16px / 2)}#description{flex:1}\n`;get toggled(){return this.hasAttribute(\"toggled\")}set toggled(t){t?this.setAttribute(\"toggled\",\"\"):this.removeAttribute(\"toggled\")}get mixed(){return this.hasAttribute(\"mixed\")}set mixed(t){t?this.setAttribute(\"mixed\",\"\"):this.removeAttribute(\"mixed\")}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}get size(){let t=this.getAttribute(\"size\");return\"small\"===t||\"large\"===t?t:null}set size(t){\"small\"===t||\"large\"===t?this.setAttribute(\"size\",t):this.removeAttribute(\"size\")}#$=null;#U=0;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.adoptedStyleSheets=[dr.#E],this.#$.append(document.importNode(dr.#z.content,!0));for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t;this.addEventListener(\"pointerdown\",(t=>this.#Y(t))),this.addEventListener(\"click\",(t=>this.#P(t))),this.addEventListener(\"keydown\",(t=>this.#W(t)))}connectedCallback(){jn(100).then((()=>this[\"#indicator-thumb\"].style.transition=null)),this.#J()}disconnectedCallback(){this[\"#indicator-thumb\"].style.transition=\"none\"}attributeChangedCallback(t,e,i){e!==i&&(\"toggled\"===t?this.#xt():\"disabled\"===t&&this.#vt())}#J(){this.setAttribute(\"role\",\"switch\"),this.setAttribute(\"aria-checked\",this.mixed?\"mixed\":this.toggled),this.setAttribute(\"aria-disabled\",this.disabled),this.disabled?(this.#U=this.tabIndex>0?this.tabIndex:0,this.tabIndex=-1):(this.tabIndex<0&&(this.tabIndex=this.#U>0?this.#U:0),this.#U=0)}#xt(){this.setAttribute(\"aria-checked\",this.mixed?\"mixed\":this.toggled)}#vt(){this.#J()}#Y(t){if(t.buttons>1)t.preventDefault();else if(!1===this.matches(\":focus\")){t.preventDefault();let e=Zn(this.parentNode,\"[tabindex]\");e&&e.focus()}}async#P(t){this.mixed?this.mixed=!1:this.toggled=!this.toggled,this.dispatchEvent(new CustomEvent(\"toggle\"))}#W(t){\"Enter\"!==t.code&&\"NumpadEnter\"!==t.code&&\"Space\"!==t.code||(t.preventDefault(),this.click())}}customElements.define(\"x-switch\",dr);class cr extends HTMLElement{static observedAttributes=[\"toggled\",\"disabled\"];static#z=Ns`<template><div id=\"selection-indicator\" part=\"selection-indicator\"></div><div id=\"content\"><slot></slot></div></template>`;static#E=Fs`:host{position:relative;display:flex;align-items:center;justify-content:center;min-height:30px;padding:2px 12px;box-sizing:border-box;cursor:default;user-select:none;-webkit-user-select:none;box-sizing:border-box;font-size:0.875rem}:host(:focus){z-index:10;outline:none}:host([disabled]){pointer-events:none;opacity:0.5}:host([hidden]){display:none}#content{display:inherit;flex-flow:inherit;align-items:inherit;z-index:100}#selection-indicator{display:none;width:100%;height:0px;background:var(--accent-color);position:absolute;bottom:0;left:0}:host([toggled]) #selection-indicator{display:block}\n`;get value(){return this.hasAttribute(\"value\")?this.getAttribute(\"value\"):\"\"}set value(t){this.setAttribute(\"value\",t)}get toggled(){return this.hasAttribute(\"toggled\")}set toggled(t){t?this.setAttribute(\"toggled\",\"\"):this.removeAttribute(\"toggled\")}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}get size(){let t=this.getAttribute(\"size\");return\"small\"===t||\"large\"===t?t:null}set size(t){\"small\"===t||\"large\"===t?this.setAttribute(\"size\",t):this.removeAttribute(\"size\")}#$=null;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.adoptedStyleSheets=[cr.#E],this.#$.append(document.importNode(cr.#z.content,!0));for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t;this.addEventListener(\"pointerdown\",(t=>this.#Y(t)))}connectedCallback(){this.#J()}attributeChangedCallback(t,e,i){e!==i&&(\"toggled\"===t||\"disabled\"===t)&&this.#J()}animateSelectionIndicator(t){return new Promise((async e=>{if(\"0px\"!==getComputedStyle(this[\"#selection-indicator\"]).height){let e=this.getBoundingClientRect(),i=t.getBoundingClientRect(),s=getComputedStyle(this[\"#selection-indicator\"]),n=1e3*parseFloat(s.getPropertyValue(\"transition-duration\")||\"0s\"),a=s.getPropertyValue(\"transition-timing-function\")||\"linear\",r=this[\"#selection-indicator\"].animate([{left:\"0px\",width:e.width+\"px\"},{left:i.left-e.left+\"px\",width:i.width+\"px\"}],{duration:n,easing:a,iterations:1,delay:0});await r.finished}e()}))}#J(){this.setAttribute(\"role\",\"tab\"),this.setAttribute(\"aria-selected\",this.toggled),this.setAttribute(\"aria-disabled\",this.disabled),this.setAttribute(\"tabindex\",this.toggled?\"0\":\"-1\")}async#Y(t){if(!1===this.matches(\":focus\")){t.preventDefault();let e=Zn(this.parentNode,\"[tabindex]\");e&&e.focus()}if(!(t.buttons>1)){this.setPointerCapture(t.pointerId);{let t,e=Date.now();this.setAttribute(\"pressed\",\"\"),this.addEventListener(\"pointerup\",t=async()=>{if(this.removeEventListener(\"pointerup\",t),this.removeEventListener(\"pointercancel\",t),!0===this.toggled){let t=Date.now()-e,i=100;t<i&&await jn(i-t)}this.removeAttribute(\"pressed\")}),this.addEventListener(\"pointercancel\",t)}}}}customElements.define(\"x-tab\",cr);class ur extends HTMLElement{static#z=Ns`<template><slot></slot></template>`;static#E=Fs`:host{position:relative;display:flex;margin:0 auto;width:fit-content;max-width:100%;box-sizing:border-box;justify-content:center}::slotted(x-tab){flex:0}\n`;get value(){let t=this.querySelector(\"x-tab[toggled]\");return t?t.value:null}set value(t){let e=[...this.querySelectorAll(\"x-tab\")],i=null===t?null:e.find((e=>e.value===t));for(let t of e)t.toggled=t===i}#$=null;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.adoptedStyleSheets=[ur.#E],this.#$.append(document.importNode(ur.#z.content,!0)),this.addEventListener(\"click\",(t=>this.#P(t))),this.addEventListener(\"keydown\",(t=>this.#W(t)))}connectedCallback(){this.setAttribute(\"role\",\"tablist\")}async#P(t){if(!(t.buttons>1)&&t.target.closest(\"x-tab\")){let e=this.querySelectorAll(\"x-tab\"),i=t.target.closest(\"x-tab\"),s=this.querySelector(\"x-tab[toggled]\");if(i!==s){s&&await s.animateSelectionIndicator(i);for(let t of e)t.toggled=t===i;this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0}))}}}#W(t){if(\"Enter\"===t.code||\"NumpadEnter\"===t.code||\"Space\"===t.code){let e=t.target;t.preventDefault(),e.click()}else if(\"ArrowLeft\"===t.code){let e=[...this.querySelectorAll(\"x-tab:not([disabled])\")],i=this.querySelector('x-tab[tabindex=\"0\"]');if(t.target,t.preventDefault(),i&&e.length>0){let t=e.indexOf(i),s=e[t-1]||e[e.length-1];i.tabIndex=-1,s.tabIndex=0,s.focus()}}else if(\"ArrowRight\"===t.code){let e=[...this.querySelectorAll(\"x-tab:not([disabled])\")],i=this.querySelector('x-tab[tabindex=\"0\"]');if(t.target,t.preventDefault(),i&&e.length>0){let t=e.indexOf(i),s=e[t+1]||e[0];i.tabIndex=-1,s.tabIndex=0,s.focus()}}}}customElements.define(\"x-tabs\",ur);class pr extends HTMLElement{static#z=Ns`<template><div id=\"container\"><div id=\"scope\" part=\"scope\"><slot id=\"scope-slot\" name=\"scope\"></slot></div><div id=\"main\" part=\"main\"><slot></slot><svg id=\"remove-button\" part=\"remove-button\" width=\"12\" height=\"12\" viewBox=\"0 0 100 100\"><path id=\"remove-button-path\"></path></svg></div></div></template>`;static#E=Fs`:host{display:inline-block;height:24px;box-sizing:border-box;overflow:hidden;color:var(--text-color);border-width:1px;border-style:solid;cursor:default}:host([toggled]){background:gray;color:white;outline:none}:host([disabled]){pointer-events:none;opacity:0.5}:host([hidden]){display:none}:host(:focus){outline:none;z-index:1}#container{width:100%;height:100%;display:flex;align-items:center;justify-content:center}#scope{height:100%;padding:0 6px;display:none;align-items:center;justify-content:center;border-right-width:1px;border-right-style:solid}:host([scoped]) #scope{display:flex}#main{height:100%;padding:0 6px;display:flex;align-items:center;justify-content:center}#remove-button{display:none;opacity:0.8;width:12px;height:12px;vertical-align:middle;margin-left:4px;fill:currentColor;color:inherit;--path-data: M 25 16 L 50 41 L 75 16 L 84 25 L 59 50 L 84 75 L 75 84 L 50 59 L 25 84 L 16 75 L 41 50 L 16 25 Z;}:host([removable]) #remove-button{display:block}#remove-button:hover{opacity:1}#remove-button path{fill:inherit;pointer-events:none}\n`;get value(){return this.hasAttribute(\"value\")?this.getAttribute(\"value\"):null}set value(t){null===t?this.removeAttribute(\"value\"):this.setAttribute(\"value\",t)}get removable(){return this.hasAttribute(\"removable\")}set removable(t){t?this.setAttribute(\"removable\",\"\"):this.removeAttribute(\"removable\")}get toggled(){return this.hasAttribute(\"toggled\")}set toggled(t){t?this.setAttribute(\"toggled\",\"\"):this.removeAttribute(\"toggled\")}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}get size(){let t=this.getAttribute(\"size\");return\"small\"===t||\"large\"===t?t:null}set size(t){\"small\"===t||\"large\"===t?this.setAttribute(\"size\",t):this.removeAttribute(\"size\")}#$=null;#R=null;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.adoptedStyleSheets=[pr.#E],this.#$.append(document.importNode(pr.#z.content,!0));for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t;this[\"#scope-slot\"].addEventListener(\"slotchange\",(()=>this.#aa())),this[\"#remove-button\"].addEventListener(\"click\",(t=>this.#ra(t)))}connectedCallback(){Gn.whenThemeReady.then((()=>{this.#oa()})),this.#aa(),Gn.addEventListener(\"themechange\",this.#R=()=>this.#oa()),this.closest(\"x-tags\")?(this.tabIndex=0,this.removable=!1):this.closest(\"x-tagsinput\")?(this.toggled=!1,this.tabIndex=0,this.removable=!0):this.removable=!1}disconnectedCallback(){Gn.removeEventListener(\"themechange\",this.#R)}#ra(t){t.buttons<=1&&this.dispatchEvent(new CustomEvent(\"remove\",{bubbles:!0}))}#oa(){let t=getComputedStyle(this[\"#remove-button\"]).getPropertyValue(\"--path-data\");this[\"#remove-button-path\"].setAttribute(\"d\",t)}#aa(){0===this[\"#scope-slot\"].assignedElements().length?this.removeAttribute(\"scoped\"):this.setAttribute(\"scoped\",\"\")}}customElements.define(\"x-tag\",pr);class mr extends HTMLElement{static#z=Ns`<template><slot></slot></template>`;static#E=Fs`:host{display:flex;box-sizing:border-box;align-items:center;justify-content:flex-start}:host([hidden]){display:none}\n`;get value(){return[...this.children].filter((t=>\"x-tag\"===t.localName)).filter((t=>t.toggled)).map((t=>t.value)).filter((t=>null!==t))}set value(t){let e=[...this.children].filter((t=>\"x-tag\"===t.localName));for(let i of e)i.toggled=t.includes(i.value)}#$=null;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.adoptedStyleSheets=[mr.#E],this.#$.append(document.importNode(mr.#z.content,!0)),this.addEventListener(\"pointerdown\",(t=>this.#Y(t))),this.addEventListener(\"click\",(t=>this.#P(t))),this.addEventListener(\"keydown\",(t=>this.#W(t)))}#Y(t){if(t.buttons>1)t.preventDefault();else if(t.preventDefault(),!1===this.matches(\":focus\")){let t=Zn(this.parentNode,\"*[tabindex]:not(a)\");this.addEventListener(\"pointerup\",(()=>{t?t.focus():this.blur()}),{once:!0})}}#P(t){let e=t.target.closest(\"x-tag\");e&&!1===t.defaultPrevented&&(e.toggled=!e.toggled,this.dispatchEvent(new CustomEvent(\"toggle\",{detail:e})))}#W(t){if(!1===t.defaultPrevented)if(\"Enter\"===t.code||\"NumpadEnter\"===t.code||\"Space\"===t.code){let e=this.querySelector(\"x-tag:focus\");e&&(t.preventDefault(),e.click())}else if(\"ArrowRight\"===t.code){let t=this.querySelector(\"x-tag:focus\");t&&(t.nextElementSibling?t.nextElementSibling.focus():t!==t.parentElement.firstElementChild&&t.parentElement.firstElementChild.focus())}else if(\"ArrowLeft\"===t.code){let t=this.querySelector(\"x-tag:focus\");t&&(t.previousElementSibling?t.previousElementSibling.focus():t!==t.parentElement.lastElementChild&&t.parentElement.lastElementChild.focus())}}}customElements.define(\"x-tags\",mr);class br extends HTMLElement{static observedAttributes=[\"spellcheck\",\"disabled\"];static#z=Ns`<template><div id=\"main\"><slot></slot><input id=\"input\" type=\"text\" part=\"input\" spellcheck=\"false\" tabindex=\"0\"></div><x-popover id=\"suggestions-popover\" part=\"suggestions\"><div id=\"suggested-tags\"></div></x-popover></template>`;static#E=Fs`:host{display:block flex;position:relative;box-sizing:border-box;align-items:center;padding:3px;gap:3px;font-size:0.78125rem}:host(:focus){z-index:10}:host([disabled]){pointer-events:none;opacity:0.5}:host([hidden]){display:none}::selection{color:var(--selection-color);background-color:var(--selection-background-color)}#main{width:100%;height:100%;cursor:text;display:flex;align-items:center;flex-wrap:wrap;gap:inherit}:host([mixed]) #main{opacity:0.7}#input{width:10px;height:20px;margin:2px;padding:0px 3px 0 5px;box-sizing:border-box;line-height:22px;color:inherit;background:none;border:none;outline:none;font-size:inherit;font-family:inherit}#suggestions-popover{width:200px;max-height:200px;padding:4px;box-sizing:border-box}#suggestions-popover #suggested-tags{flex:1;overflow:auto}#suggestions-popover x-tag{display:block;margin:4px 0 0 0}#suggestions-popover x-tag:first-child{margin-top:0}\n`;get value(){return[...this.children].filter((t=>\"x-tag\"===t.localName)).map((t=>t.value)).filter((t=>null!==t))}get delimiter(){return this.hasAttribute(\"delimiter\")?this.getAttribute(\"delimiter\"):\",\"}set delimiter(t){this.setAttribute(\"delimiter\",t)}get spellcheck(){return this.hasAttribute(\"spellcheck\")}set spellcheck(t){t?this.setAttribute(\"spellcheck\",\"\"):this.removeAttribute(\"spellcheck\")}get mixed(){return this.hasAttribute(\"mixed\")}set mixed(t){t?this.setAttribute(\"mixed\",\"\"):this.removeAttribute(\"mixed\")}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}get suggestions(){return this.hasAttribute(\"suggestions\")}set suggestions(t){t?this.setAttribute(\"suggestions\",\"\"):this.removeAttribute(\"suggestions\")}get size(){let t=this.getAttribute(\"size\");return\"small\"===t||\"large\"===t?t:null}set size(t){\"small\"===t||\"large\"===t?this.setAttribute(\"size\",t):this.removeAttribute(\"size\")}#$=null;#U=0;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\",delegatesFocus:!0}),this.#$.adoptedStyleSheets=[Gn.themeStyleSheet,br.#E],this.#$.append(document.importNode(br.#z.content,!0));for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t;this.addEventListener(\"pointerdown\",(t=>this.#Y(t))),this.#$.addEventListener(\"pointerdown\",(t=>this.#Xs(t))),this.#$.addEventListener(\"remove\",(t=>this.#ra(t))),this.#$.addEventListener(\"keydown\",(t=>this.#W(t))),this[\"#input\"].addEventListener(\"focusin\",(t=>this.#la(t))),this[\"#input\"].addEventListener(\"focusout\",(t=>this.#ha(t))),this[\"#input\"].addEventListener(\"input\",(t=>this.#Tt(t)))}connectedCallback(){this.#da(),this.#J()}attributeChangedCallback(t,e,i){e!==i&&(\"spellcheck\"===t?this.#hs():\"disabled\"===t&&this.#vt())}clear(){let t=[...this.children].filter((t=>\"x-tag\"===t.localName));if(t.length>0){for(let e of t)e.remove(),this.dispatchEvent(new CustomEvent(\"remove\",{detail:e}));this.#ca(),this.#da(),this.dispatchEvent(new CustomEvent(\"change\"))}}getSuggestions(t){return[]}#ua(){let t=this[\"#input\"].value;if(this[\"#input\"].value=\"\",this.#pa(),t.endsWith(this.delimiter)&&(t=t.substring(0,t.length-1)),t=t.trim(),t.length>0&&!1===this.value.includes(t)){let e;if(t.includes(\":\")){let[i,s]=t.split(\":\").map((t=>t.trim()));e=Ns`<x-tag class=\"tag\" value=\"${t}\" removable><x-label slot=\"scope\">${i}</x-label><x-label>${s}</x-label></x-tag>`}else e=Ns`<x-tag class=\"tag\" value=\"${t}\" removable><x-label>${t}</x-label></x-tag>`;this.append(e),this.dispatchEvent(new CustomEvent(\"add\",{detail:e})),this.dispatchEvent(new CustomEvent(\"change\"))}this[\"#input\"].style.minWidth=\"0px\",this[\"#input\"].style.minWidth=this[\"#input\"].scrollWidth+\"px\"}#ma(){this[\"#suggested-tags\"].innerHTML=\"\",!0===this[\"#suggestions-popover\"].opened&&this[\"#suggestions-popover\"].close()}#ba=0;#Y(t){t.target===this&&!1===t.defaultPrevented&&(t.preventDefault(),this[\"#input\"].focus())}#Xs(t){if(this.#ba=Nn(),t.target===this[\"#input\"])this[\"#input\"].value.length>0&&this.#ma();else if(t.target===this[\"#main\"])t.preventDefault(),this[\"#input\"].focus(),this.#ca(!1);else if(t.target.closest(\"x-popover\")){t.preventDefault();let e=t.target.closest(\"x-tag\");e&&(this.append(e),this[\"#input\"].value=\"\",this.#pa(),this.#ca(!1),this.dispatchEvent(new CustomEvent(\"add\",{detail:e})),this.dispatchEvent(new CustomEvent(\"change\")))}else t.target.closest(\"x-tag\")&&\"\"!==this[\"#input\"].value&&(this.#ua(),this.#ca(),this.#da())}#ra(t){t.stopPropagation();let e=t.target;e.remove(),this.#da(),this.dispatchEvent(new CustomEvent(\"remove\",{detail:e})),this.dispatchEvent(new CustomEvent(\"change\"))}#hs(){this[\"#input\"].spellcheck=this.spellcheck}#vt(){this.#J()}async#la(){this.dispatchEvent(new CustomEvent(\"textinputmodestart\",{bubbles:!0,composed:!0}))}#ha(){this.#ua(),this.#da(),this.dispatchEvent(new CustomEvent(\"textinputmodeend\",{bubbles:!0,composed:!0})),this[\"#suggestions-popover\"].close()}#Tt(t){this[\"#input\"].value.includes(this.delimiter)?(this.#ua(),this.#da(),this.#pa(),this.#ca(!1)):(this.dispatchEvent(new CustomEvent(\"input\")),this.#da(),this.#pa(),this.#ca(\"deleteContentBackward\"!==t.inputType))}#W(t){if(\"Enter\"===t.code||\"NumpadEnter\"===t.code)t.target===this[\"#input\"]&&(t.preventDefault(),this.#ua(),this.#ca(!1),this.#da(),this.#pa());else if(\"Backspace\"===t.code){if(t.target===this[\"#input\"]){if(0===this[\"#input\"].value.length){let t=[...this.children].filter((t=>\"x-tag\"===t.localName)),e=t[t.length-1]||null;e&&(e.remove(),this.#ca(),this.#da(),this.dispatchEvent(new CustomEvent(\"remove\",{detail:e})),this.dispatchEvent(new CustomEvent(\"change\")))}}else if(\"x-tag\"===t.target.localName){t.stopImmediatePropagation(),t.preventDefault();let e=[...this.children].filter((t=>\"x-tag\"===t.localName)),i=t.target,s=e.indexOf(i),n=e[s+1]||null,a=e[s-1]||null;n?n.focus():a?a.focus():this[\"#input\"].focus(),i.remove(),this.#da(),this.dispatchEvent(new CustomEvent(\"remove\",{detail:i})),this.dispatchEvent(new CustomEvent(\"change\"))}}else if(\"ArrowDown\"===t.code){if(this[\"#suggestions-popover\"].opened){let e=[...this[\"#suggested-tags\"].children];if(e.length>1){t.preventDefault();let i=null;{let t=e.find((t=>t.toggled));if(t){t.toggled=!1;let s=e.indexOf(t);i=e[s+1]||e[0]}else i=e[0]}i.toggled=!0,i.scrollIntoViewIfNeeded();{let t=i.querySelector(\"x-label\").textContent,e=this[\"#input\"].selectionStart;this[\"#input\"].value=t,this.#pa(),this.#ga(e,t.length)}}}}else if(\"ArrowUp\"===t.code){if(this[\"#suggestions-popover\"].opened){let e=[...this[\"#suggested-tags\"].children];if(e.length>1){t.preventDefault();let i=null;{let t=e.find((t=>t.toggled));if(t){t.toggled=!1;let s=e.indexOf(t);i=e[s-1]||e[e.length-1]}else i=e[e.length-1]}i.toggled=!0,i.scrollIntoViewIfNeeded();{let t=i.querySelector(\"x-label\").textContent,e=this[\"#input\"].selectionStart;this[\"#input\"].value=t,this.#pa(),this.#ga(e,t.length)}}}}else\"ArrowLeft\"!==t.code&&\"ArrowRight\"!==t.code||this.#ma()}#Xt(){this.#da()}#da(){let t=this.querySelector(\":scope > x-label\");t&&(t.hidden=this.value.length>0||this[\"#input\"].value.length>0)}#J(){this.setAttribute(\"role\",\"input\"),this.setAttribute(\"aria-disabled\",this.disabled),this.disabled?(this.#U=this.tabIndex>0?this.tabIndex:0,this.tabIndex=-1):(this.tabIndex<0&&(this.tabIndex=this.#U>0?this.#U:0),this.#U=0)}#pa(){this[\"#input\"].style.minWidth=\"0px\",this[\"#input\"].style.minWidth=this[\"#input\"].scrollWidth+\"px\"}#ga(t=0,e=this[\"#input\"].value.length){this[\"#input\"].selectionStart=t,this[\"#input\"].selectionEnd=e}#ca(t=!0){if(this.suggestions){let e=this[\"#input\"].value;this[\"#input\"].selectionStart!==this[\"#input\"].selectionEnd&&(e=e.substring(0,this[\"#input\"].selectionStart));let i=this.getSuggestions(e);if(i.length>0&&!0===t){let t=this[\"#input\"].value,e=i[0].querySelector(\"x-label\").textContent;this[\"#input\"].value=e,this.#pa(),this.#ga(t.length,e.length)}if(0===i.length)this[\"#suggested-tags\"].innerHTML=\"\",!0===this[\"#suggestions-popover\"].opened&&this[\"#suggestions-popover\"].close();else{let s=this[\"#input\"].getBoundingClientRect();this[\"#suggested-tags\"].innerHTML=\"\",this[\"#suggested-tags\"].append(...i),!0===t&&e.length>0&&(i[0].toggled=!0),!1===this[\"#suggestions-popover\"].opened||this[\"#suggestions-popover\"].close(!1),this[\"#suggestions-popover\"].open(s),this[\"#suggested-tags\"].scrollTop=0}}}}customElements.define(\"x-tagsinput\",br);class gr extends HTMLElement{static observedAttributes=[\"value\",\"spellcheck\",\"disabled\",\"validation\"];static#z=Ns`<template><div id=\"main\"><slot></slot><div id=\"editor\" contenteditable=\"plaintext-only\" spellcheck=\"false\"></div></div></template>`;static#E=Fs`:host{display:block flex;position:relative;width:100%;min-height:100px;box-sizing:border-box;font-size:0.78125rem;overflow:auto}:host(:hover){cursor:text}:host([mixed]){color:rgba(0, 0, 0, 0.7)}:host([disabled]){pointer-events:none;opacity:0.5}:host([hidden]){display:none}::selection{color:var(--selection-color);background-color:var(--selection-background-color)}:host(:not(:focus)) ::selection{color:inherit;background:none}::-webkit-scrollbar{max-width:6px;max-height:6px;background:none}::-webkit-scrollbar-track{border-radius:25px}::-webkit-scrollbar-thumb{background-color:rgba(0, 0, 0, 0.2);border-radius:25px}::-webkit-scrollbar-corner{display:none}#main{display:flex;flex-flow:column;width:100%;min-height:100%}#editor{flex:1;padding:2px 6px;box-sizing:border-box;color:inherit;background:none;border:none;outline:none;font-family:inherit;font-size:inherit}\n`;get value(){return this[\"#editor\"].textContent}set value(t){if(this[\"#editor\"].textContent=t,this.matches(\":focus\")){document.execCommand(\"selectAll\"),(\"chromium\"===Hn()?this.#$.getSelection():window.getSelection()).collapseToEnd()}\"instant\"===this.validation?this.reportValidity():\"auto\"!==this.validation&&\"manual\"!==this.validation||(this.#Et||this.#rs)&&this.reportValidity(),this.#zt()}get spellcheck(){return this.hasAttribute(\"spellcheck\")}set spellcheck(t){t?this.setAttribute(\"spellcheck\",\"\"):this.removeAttribute(\"spellcheck\")}get minLength(){return this.hasAttribute(\"minlength\")?parseInt(this.getAttribute(\"minlength\")):0}set minLength(t){this.setAttribute(\"minlength\",t)}get maxLength(){return this.hasAttribute(\"maxlength\")?parseInt(this.getAttribute(\"maxlength\")):Infinity}set maxLength(t){this.setAttribute(\"maxlength\",t)}get required(){return this.hasAttribute(\"required\")}set required(t){t?this.setAttribute(\"required\",\"\"):this.removeAttribute(\"required\")}get mixed(){return this.hasAttribute(\"mixed\")}set mixed(t){t?this.setAttribute(\"mixed\",\"\"):this.removeAttribute(\"mixed\")}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}get validation(){return this.hasAttribute(\"validation\")?this.getAttribute(\"validation\"):\"auto\"}set validation(t){this.setAttribute(\"validation\",t)}get size(){let t=this.getAttribute(\"size\");return\"small\"===t||\"large\"===t?t:null}set size(t){\"small\"===t||\"large\"===t?this.setAttribute(\"size\",t):this.removeAttribute(\"size\")}get empty(){return this.hasAttribute(\"empty\")}get error(){return this.hasAttribute(\"error\")}#$=null;#fa=\"\";#U=0;#Et=null;#rs=null;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\",delegatesFocus:!0}),this.#$.adoptedStyleSheets=[gr.#E],this.#$.append(document.importNode(gr.#z.content,!0));for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t;this.addEventListener(\"click\",(t=>this.#P(t))),this.addEventListener(\"focusin\",(t=>this.#Rt(t))),this.addEventListener(\"focusout\",(t=>this.#Pt(t))),this[\"#editor\"].addEventListener(\"click\",(t=>this.#xa(t))),this[\"#editor\"].addEventListener(\"input\",(t=>this.#fn(t))),\"gecko\"===Hn()&&(this[\"#editor\"].setAttribute(\"contenteditable\",\"\"),this[\"#editor\"].addEventListener(\"beforeinput\",(t=>{if(\"insertFromPaste\"===t.inputType&&t.dataTransfer.types.includes(\"text/plain\")){t.preventDefault();let e=window.getSelection(),i=e.getRangeAt(0);i.deleteContents(),i.insertNode(document.createTextNode(t.dataTransfer.getData(\"text/plain\"))),e.collapseToEnd()}})))}connectedCallback(){this.#J(),this.#zt(),\"instant\"===this.validation?this.reportValidity():\"auto\"!==this.validation&&\"manual\"!==this.validation||(this.#Et||this.#rs)&&this.reportValidity()}attributeChangedCallback(t,e,i){e!==i&&(\"value\"===t?this.#Zt():\"spellcheck\"===t?this.#hs():\"disabled\"===t?this.#vt():\"validation\"===t&&this.#ps())}reportValidity(){let t=new CustomEvent(\"beforevalidate\",{bubbles:!1,cancelable:!0});return this.dispatchEvent(t),!1===t.defaultPrevented&&(this.value.length<this.minLength?this.#Et={href:\"#entered-text-is-too-short\"}:this.value.length>this.maxLength?this.#Et={href:\"#entered-text-is-too-long\"}:this.required&&0===this.value.length?this.#Et={href:\"#required-field\"}:this.#Et=null,this.#Yt()),null===this.#Et&&null===this.#rs}setCustomValidity(t){this.#rs=\"\"===t?null:t,this.#Yt()}#Yt(){let t=this.#rs||this.#Et;t?this.setAttribute(\"error\",\"\"):this.removeAttribute(\"error\");{let e=this.querySelector(':scope > x-tooltip[type=\"error\"]');if(t&&this.matches(\":focus\")){if(e||(e=Xn(\"x-tooltip\"),e.setAttribute(\"type\",\"error\"),this.append(e)),t.href){let i=t.args?Object.entries(t.args).map((([t,e])=>`${t}:${e}`)).join(\",\"):\"\";e.innerHTML=`<x-message href=\"${t.href}\" args=\"${i}\"></x-message>`}else e.innerHTML=t;jn(10).then((()=>{e.open(this)}))}else e&&e.close().then((()=>e.remove()))}}#zt(){0===this.value.length?this.setAttribute(\"empty\",\"\"):this.removeAttribute(\"empty\")}#J(){this.setAttribute(\"role\",\"input\"),this.setAttribute(\"aria-disabled\",this.disabled),this.disabled?(this.#U=this.tabIndex>0?this.tabIndex:0,this.tabIndex=-1):(this.tabIndex<0&&(this.tabIndex=this.#U>0?this.#U:0),this.#U=0)}#Zt(){this.value=this.hasAttribute(\"value\")?this.getAttribute(\"value\"):\"\",this.matches(\":focus\")&&document.execCommand(\"selectAll\")}#hs(){this[\"#editor\"].spellcheck=this.spellcheck}#vt(){this[\"#editor\"].contentEditable=this.disabled?\"false\":\"plaintext-only\",this.#J()}#ps(){\"instant\"===this.validation?this.reportValidity():\"auto\"!==this.validation&&\"manual\"!==this.validation||(this.#Et||this.#rs)&&this.reportValidity()}#P(){this.#Yt()}#Rt(){this.#fa=this.value,this.#Yt(),this.dispatchEvent(new CustomEvent(\"textinputmodestart\",{bubbles:!0,composed:!0}))}#Pt(){this.dispatchEvent(new CustomEvent(\"textinputmodeend\",{bubbles:!0,composed:!0})),\"auto\"===this.validation||\"instant\"===this.validation?this.reportValidity():\"manual\"===this.validation&&this.#Yt(),null!==(this.#Et||this.#rs)||this.value===this.#fa&&!this.mixed||(this.mixed=!1,this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0}))),(\"chromium\"===Hn()?this.#$:window).getSelection().collapse(this[\"#main\"])}#xa(t){t.detail>=4&&document.execCommand(\"selectAll\")}#fn(t){this.dispatchEvent(new CustomEvent(\"input\",{bubbles:!0})),this.#zt(),\"instant\"===this.validation?this.reportValidity():\"auto\"!==this.validation&&\"manual\"!==this.validation||(this.#Et||this.#rs)&&this.reportValidity()}}customElements.define(\"x-texteditor\",gr);class fr extends HTMLElement{static#z=Ns`<template><svg viewBox=\"0 0 100 100\"><circle cx=\"50\" cy=\"50\" r=\"40\"><animate attributeName=\"stroke-dasharray\" values=\"0,1000; 200,1000; 245,1000\" begin=\"0s\" dur=\"2s\" calcMode=\"spline\" keyTimes=\"0; 0.5; 1\" keySplines=\"0.8 0.25 0.25 0.9; 0.8 0.25 0.25 0.9\" repeatCount=\"indefinite\"></animate><animate attributeName=\"stroke-dashoffset\" values=\"0px;0px;-260px\" begin=\"0s\" dur=\"2s\" keyTimes=\"0; 0.5; 1\" repeatCount=\"indefinite\"></animate><animateTransform type=\"rotate\" additive=\"sum\" attributeName=\"transform\" values=\"0;360\" begin=\"0s\" dur=\"2s\" fill=\"freeze\" repeatCount=\"indefinite\" keyTimes=\"0; 1\"></animateTransform></circle></svg></template>`;static#E=Fs`:host{display:block;width:30px;height:30px;box-sizing:border-box}:host([hidden]){display:none}svg{color:inherit;width:100%;height:100%}svg circle{fill:none;stroke:currentColor;stroke-linecap:round;stroke-width:10px;stroke-dasharray:10, 1000;transform-box:fill-box;transform-origin:50% 50%}\n`;get size(){let t=this.getAttribute(\"size\");return\"small\"===t||\"large\"===t?t:null}set size(t){\"small\"===t||\"large\"===t?this.setAttribute(\"size\",t):this.removeAttribute(\"size\")}#$=null;#wa=null;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.adoptedStyleSheets=[fr.#E],this.#wa=new IntersectionObserver((t=>this.#Xt()))}connectedCallback(){this.#Xt(),this.#wa.observe(this)}disconnectedCallback(){this.#wa.unobserve(this)}#Xt(){if(this.hidden||this.checkVisibility&&!1===this.checkVisibility())this.#$.innerHTML=\"\";else{null===this.#$.firstElementChild&&this.#$.append(document.importNode(fr.#z.content,!0))}}}customElements.define(\"x-throbber\",fr);class xr extends HTMLElement{static observedAttributes=[\"title\"];static#z=Ns`<template><slot></slot><x-buttons part=\"buttons\" id=\"buttons\"><x-button id=\"minimize-button\" value=\"minimize\" skin=\"flat\" part=\"button minimize-button\" condensed><svg part=\"icon\" viewBox=\"0 0 100 100\"><path></path></svg></x-button><x-button id=\"maximize-button\" value=\"maximize\" skin=\"flat\" part=\"button maximize-button\" condensed><svg part=\"icon\" viewBox=\"0 0 100 100\"><path></path></svg></x-button><x-button id=\"restore-button\" value=\"restore\" skin=\"flat\" part=\"button restore-button\" condensed><svg part=\"icon\" viewBox=\"0 0 100 100\"><path></path></svg></x-button><x-button id=\"close-button\" value=\"close\" skin=\"flat\" part=\"button close-button\" condensed><svg part=\"icon\" viewBox=\"0 0 100 100\"><path></path></svg></x-button></x-buttons></template>`;static#E=Fs`:host{display:block flex;align-items:center;justify-content:space-evenly;width:100%;height:32px;gap:16px;position:relative;box-sizing:border-box;app-region:drag}::slotted(*){user-select:none}#buttons{position:absolute}:host([maximized])::part(maximize-button){display:none}:host(:not([maximized]))::part(restore-button){display:none}#buttons > x-button{margin:0;app-region:no-drag}#buttons > x-button > svg{fill:currentColor}\n`;get maximized(){return this.hasAttribute(\"maximized\")}set maximized(t){t?this.setAttribute(\"maximized\",\"\"):this.removeAttribute(\"maximized\")}#$;#R;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.adoptedStyleSheets=[Gn.themeStyleSheet,xr.#E],this.#$.append(document.importNode(xr.#z.content,!0));for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t;this[\"#buttons\"].addEventListener(\"click\",(t=>this.#va(t)))}async connectedCallback(){Gn.addEventListener(\"themechange\",this.#R=()=>this.#ka()),Gn.whenThemeReady.then((()=>{this.#ka()}))}disconnectedCallback(){Gn.removeEventListener(\"themechange\",this.#R)}#va(t){let e=t.target.closest(\"x-button\");e&&this.dispatchEvent(new CustomEvent(\"buttonclick\",{detail:e.value}))}#ka(){for(let t of this[\"#buttons\"].children){let e=getComputedStyle(t).getPropertyValue(\"--path-data\");t.querySelector(\"path\").setAttribute(\"d\",e)}}}customElements.define(\"x-titlebar\",xr);class wr extends HTMLElement{static observedAttributes=[\"disabled\"];static#z=Ns`<template><slot></slot></template>`;static#E=Fs`:host{display:none;bottom:-30px;position:fixed;padding:3px 10px;width:fit-content;height:fit-content;max-width:300px;box-sizing:border-box;pointer-events:none;border-width:1px;border-style:solid;font-size:0.75rem;z-index:99999;--align: bottom;--whitespace: 8px;--open-transition: 0 opacity cubic-bezier(0.4, 0, 0.2, 1);--close-transition: 0 opacity cubic-bezier(0.4, 0, 0.2, 1);}:host([opened]), :host([animating]){display:block}\n`;get type(){return this.hasAttribute(\"type\")?this.getAttribute(\"type\"):\"hint\"}set type(t){this.setAttribute(\"type\",t)}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}get opened(){return this.hasAttribute(\"opened\")}#$=null;#jn=null;#Gn;#Si;constructor(){super(),this.#$=this.attachShadow({mode:\"closed\"}),this.#$.adoptedStyleSheets=[wr.#E],this.#$.append(document.importNode(wr.#z.content,!0));for(let t of this.#$.querySelectorAll(\"[id]\"))this[\"#\"+t.id]=t}attributeChangedCallback(t,e,i){e!==i&&\"disabled\"===t&&this.disabled&&this.opened&&this.close()}disconnectedCallback(){this.close(!1)}open(t,e=!0){return new Promise((async i=>{if(!1===this.opened&&this.isConnected){if(this.setAttribute(\"opened\",\"\"),this.#_n(t),this.#jn=Un(this),t instanceof Element&&(this.#Si=new ResizeObserver((()=>this.#_n(t))),this.#Si.observe(this)),this.#jn&&this.#jn.addEventListener(\"scroll\",this.#Gn=()=>{this.close()},{once:!0}),e){let t=getComputedStyle(this).getPropertyValue(\"--open-transition\"),[e,i,s]=ja(t);\"opacity\"===e&&await this.animate({opacity:[\"0\",\"1\"]},{duration:i,easing:s}).finished}this.dispatchEvent(new CustomEvent(\"open\",{bubbles:!0,detail:this}))}i()}))}close(t=!0){return new Promise((async e=>{if(!0===this.opened){if(this.removeAttribute(\"opened\"),this.dispatchEvent(new CustomEvent(\"close\",{bubbles:!0,detail:this})),this.#jn&&this.#jn.removeEventListener(\"scroll\",this.#Gn),this.#Si&&(this.#Si.unobserve(this),this.#Si=null),t){let t=getComputedStyle(this).getPropertyValue(\"--close-transition\"),[e,i,s]=ja(t);this.setAttribute(\"animating\",\"\"),\"opacity\"===e&&await this.animate({opacity:[\"1\",\"0\"]},{duration:i,easing:s}).finished}this.removeAttribute(\"animating\")}e()}))}#_n(t){let e=getComputedStyle(this).getPropertyValue(\"--align\").trim();parseInt(getComputedStyle(this).borderWidth);let i=parseInt(getComputedStyle(this).getPropertyValue(\"--whitespace\")),s=0,n=0,a=null;this.style.maxWidth=null,this.style.maxHeight=null,this.style.left=\"0px\",this.style.top=\"0px\";{let e=vi(this.getBoundingClientRect());0===e.top&&0===e.left||(s=-e.left,n=-e.top),a=t instanceof DOMPoint?new DOMRect(t.x,t.y,0,0):t instanceof DOMRect?t:t instanceof Element?t.getBoundingClientRect():new DOMRect}if(\"bottom\"===e||\"top\"===e){let t=(t=!1)=>{this.style.maxHeight=null;let e=vi(this.getBoundingClientRect()),s=0;if(this.style.top=n+a.bottom+i+\"px\",e=vi(this.getBoundingClientRect()),s=e.bottom+8-window.innerHeight,t&&s>0){let t=e.height-s;s=0,this.style.maxHeight=t+\"px\"}return s},r=(t=!1)=>{this.style.maxHeight=null;let e=vi(this.getBoundingClientRect()),s=0;if(this.style.top=n+a.top-i-e.height+\"px\",e=vi(this.getBoundingClientRect()),s=-(e.top-8),t&&s>0){let t=e.height-s;s=0,this.style.maxHeight=t+\"px\",this.style.top=n+a.top-i-t+\"px\"}return s},o=()=>{this.style.maxWidth=null;let t=vi(this.getBoundingClientRect()),e=0,i=0;return this.style.left=s+a.left+a.width/2-t.width/2+\"px\",t=vi(this.getBoundingClientRect()),e=-(t.left-8),i=t.right+8-window.innerWidth,[e,i]},l=(t=!1)=>{this.style.maxWidth=null;let e=vi(this.getBoundingClientRect()),i=0;if(this.style.left=s+window.innerWidth-8-e.width+\"px\",e=vi(this.getBoundingClientRect()),i=-(e.left-8),t&&i>0){let t=e.width-i;i=0,this.style.maxWidth=t+\"px\",this.style.left=s+window.innerWidth-8-t+\"px\"}return i},h=(t=!1)=>{this.style.maxWidth=null;let e=vi(this.getBoundingClientRect()),i=0;if(this.style.left=s+8+\"px\",e=vi(this.getBoundingClientRect()),i=e.right+8-window.innerWidth,t&&i>0){let t=e.width-i;i=0,this.style.maxWidth=t+\"px\"}return i};if(\"bottom\"===e){let e=t();if(e>0){let i=r();i>0&&(i>e?t(!0):r(!0))}}else if(\"top\"===e){let e=r();if(e>0){let i=t();i>0&&(i>e?r(!0):t(!0))}}{let[t,e]=o();e>0?(t=l(),t>0&&l(!0)):t>0&&(e=h(),e>0&&h(!0))}}else if(\"right\"===e||\"left\"===e){let t=(t=!1)=>{this.style.maxWidth=null;let e=vi(this.getBoundingClientRect()),n=0;if(this.style.left=s+a.right+i+\"px\",e=vi(this.getBoundingClientRect()),n=e.right+8-window.innerWidth,t&&n>0){let t=e.width-n;n=0,this.style.maxWidth=t+\"px\"}return n},r=(t=!1)=>{this.style.maxWidth=null;let e=vi(this.getBoundingClientRect()),n=0;if(this.style.left=s+a.left-i-e.width+\"px\",e=vi(this.getBoundingClientRect()),n=-(e.left-8),t&&n>0){let t=e.width-n;n=0,this.style.maxWidth=t+\"px\",this.style.left=s+a.left-i-t+\"px\"}return n},o=()=>{this.style.maxHeight=null;let t=vi(this.getBoundingClientRect()),e=0,i=0;return this.style.top=n+a.top+a.height/2-t.height/2+\"px\",t=vi(this.getBoundingClientRect()),e=-(t.top-8),i=t.bottom+8-window.innerHeight,[e,i]},l=(t=!1)=>{this.style.maxHeight=null;let e=vi(this.getBoundingClientRect()),i=0;if(this.style.top=n+window.innerHeight-8-e.height+\"px\",e=vi(this.getBoundingClientRect()),i=-(e.top-8),t&&i>0){let t=e.height-i;i=0,this.style.maxHeight=t+\"px\",this.style.top=n+window.innerHeight-8-t+\"px\"}return i},h=(t=!1)=>{this.style.maxHeight=null;let e=vi(this.getBoundingClientRect()),i=0;if(this.style.top=n+8+\"px\",e=vi(this.getBoundingClientRect()),i=e.bottom+8-window.innerHeight,t&&i>0){let t=e.height-i;i=0,this.style.maxHeight=t+\"px\"}return i};if(\"right\"===e){let e=t();if(e>0){let i=r();i>0&&(i>e?t(!0):r(!0))}}else if(\"left\"===e){let e=r();if(e>0){let i=t();i>0&&(i>e?r(!0):t(!0))}}{let[t,e]=o();e>0?(t=l(),t>0&&l(!0)):t>0&&(e=h(),e>0&&h(!0))}}}}customElements.define(\"x-tooltip\",wr);export{Gn as default};"
  },
  {
    "path": "src/renderer/router.ts",
    "content": "import { createMemoryHistory, createRouter, RouteRecordRaw } from \"vue-router\";\n\nimport Home from \"./views/Home.vue\";\nimport SetupUI from \"./views/SetupUI.vue\";\nimport Apps from \"./views/Apps.vue\";\nimport About from \"./views/About.vue\";\nimport Blank from \"./views/Blank.vue\";\nimport Config from \"./views/Config.vue\";\nimport Migration from \"./views/Migration.vue\";\n\nexport const routes: RouteRecordRaw[] = [\n    { path: \"/\", name: \"Loading\", component: Blank, meta: { icon: \"line-md:loading-loop\" } },\n    { path: \"/home\", name: \"Home\", component: Home, meta: { icon: \"fluent:home-32-filled\" } },\n    { path: \"/migration\", name: \"Migration\", component: Migration, meta: { icon: \"fluent:home-32-filled\" } },\n    { path: \"/setup\", name: \"SetupUI\", component: SetupUI, meta: { icon: \"fluent-mdl2:install-to-drive\" } },\n    { path: \"/apps\", name: \"Apps\", component: Apps, meta: { icon: \"fluent:apps-32-filled\" } },\n    { path: \"/configuration\", name: \"Configuration\", component: Config, meta: { icon: \"icon-park-outline:config\" } },\n    { path: \"/about\", name: \"About\", component: About, meta: { icon: \"fluent:info-32-filled\" } },\n];\n\nexport const router = createRouter({\n    history: createMemoryHistory(),\n    routes,\n});\n"
  },
  {
    "path": "src/renderer/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"target\": \"esnext\",\n        \"useDefineForClassFields\": true,\n        \"module\": \"esnext\",\n        \"moduleResolution\": \"bundler\",\n        \"strict\": true,\n        \"jsx\": \"preserve\",\n        \"sourceMap\": true,\n        \"resolveJsonModule\": true,\n        \"esModuleInterop\": true,\n        \"lib\": [\"esnext\", \"dom\"],\n        \"types\": [\"vite/client\"]\n    },\n    \"include\": [\"./**/*.ts\", \"./**/*.d.ts\", \"./**/*.tsx\", \"./**/*.vue\"]\n}\n"
  },
  {
    "path": "src/renderer/utils/bus.ts",
    "content": "type Resolver<T> = (value: T) => void;\n\nexport class MessageBus {\n    private readonly resolvers: Map<string, Resolver<any>>;\n\n    constructor() {\n        this.resolvers = new Map();\n    }\n\n    send<T>(channel: string, data: T): void {\n        const resolver = this.resolvers.get(channel);\n        if (resolver) {\n            this.resolvers.delete(channel);\n            resolver(data);\n        }\n    }\n\n    waitFor<T>(channel: string): Promise<T> {\n        return new Promise<T>(resolve => {\n            this.resolvers.set(channel, resolve);\n        });\n    }\n}\n"
  },
  {
    "path": "src/renderer/utils/capitalize.ts",
    "content": "export function capitalizeFirstLetter(val: string) {\n    return String(val).charAt(0).toUpperCase() + String(val).slice(1);\n}\n"
  },
  {
    "path": "src/renderer/utils/debounce.ts",
    "content": "export function debounce(func: Function, timeout = 300): Function {\n    let timer: NodeJS.Timeout;\n    return (...args: any[]) => {\n        clearTimeout(timer);\n        timer = setTimeout(() => {\n            // @ts-ignore - Even casting as any fails\n            func.apply(this, args);\n        }, timeout);\n    };\n}\n"
  },
  {
    "path": "src/renderer/utils/getFreeRDP.ts",
    "content": "import { execFileAsync, stringifyExecFile } from \"../lib/exec-helper\";\n\nexport class FreeRDPInstallation {\n    file: string;\n    defaultArgs: string[];\n\n    constructor(file: string, defaultArgs: string[] = []) {\n        this.file = file;\n        this.defaultArgs = defaultArgs;\n    }\n\n    exec(args: string[]): Promise<{\n        stdout: string;\n        stderr: string;\n    }> {\n        return execFileAsync(this.file, this.defaultArgs.concat(args));\n    }\n\n    stringifyExec(args: string[]): string {\n        return stringifyExecFile(this.file, this.defaultArgs.concat(args));\n    }\n}\n\nconst freeRDPInstallations = [\n    new FreeRDPInstallation(\"xfreerdp3\"),\n    new FreeRDPInstallation(\"xfreerdp\"),\n    new FreeRDPInstallation(\"flatpak\", [\"run\", \"--command=xfreerdp\", \"com.freerdp.FreeRDP\"]),\n];\n\n/**\n * Returns the correct FreeRDP 3.x.x command available on the system or null\n */\nexport async function getFreeRDP() {\n    const VERSION_3_STRING = \"version 3.\";\n    for (let installation of freeRDPInstallations) {\n        try {\n            const shellOutput = await installation.exec([\"--version\"]);\n            if (shellOutput.stdout.includes(VERSION_3_STRING)) {\n                return installation;\n            }\n        } catch {}\n    }\n    return null;\n}\n"
  },
  {
    "path": "src/renderer/utils/icons.ts",
    "content": "import { addCollection } from \"@iconify/vue\";\nimport { type IconifyIcons } from \"@iconify/types\";\n\n/**\n * Creates custom Iconify collection `winboat`, adding every custom icon used.\n *\n * You can specify extra icons as well, but do keep in mind that you can do so once, when the built-in icons are added as well (as per {@link addCollection}'s functionality)\n */\nexport function addWinBoatIconCollection(extraIcons?: IconifyIcons) {\n    // For specifying built-in icons\n    const icons = {\n        ...extraIcons,\n    };\n\n    addCollection({\n        prefix: \"winboat\",\n        icons,\n    });\n}\n"
  },
  {
    "path": "src/renderer/utils/interval.ts",
    "content": "/**\n * Sets an interval but also executes `func` immediately\n */\nexport function setIntervalImmediately(func: Function, interval: number): NodeJS.Timeout {\n    func();\n    // @ts-ignore Should be fine\n    return setInterval(func, interval);\n}\n"
  },
  {
    "path": "src/renderer/utils/log.ts",
    "content": "import { createConsola } from \"consola\";\nconst { writeFileSync, appendFileSync, mkdirSync }: typeof import(\"fs\") = require(\"node:fs\");\nconst { dirname }: typeof import(\"path\") = require(\"node:path\");\n\nexport function createLogger(filePath: string) {\n    const logger = createConsola({\n        level: 4,\n        formatOptions: {\n            colors: true,\n            date: true,\n            compact: false,\n        },\n    });\n\n    // Add file logging with directory creation\n    logger.addReporter({\n        log: logObj => {\n            const timestamp = new Date().toISOString().replace(\"T\", \" \").substring(0, 19);\n            const level = logObj.type.toUpperCase();\n            const message = logObj.args.join(\" \");\n            const logLine = `${timestamp} | ${level} | ${message}\\n`;\n\n            try {\n                appendFileSync(filePath, logLine);\n            } catch {\n                // Create the directory path if it doesn't exist\n                const dir = dirname(filePath);\n                mkdirSync(dir, { recursive: true });\n\n                // Now create the file\n                writeFileSync(filePath, logLine);\n            }\n        },\n    });\n\n    return logger;\n}\n"
  },
  {
    "path": "src/renderer/utils/openLink.ts",
    "content": "const { shell }: typeof import(\"@electron/remote\") = require(\"@electron/remote\");\n\nexport function openLink(link: string) {\n    if (link.startsWith(\"http\")) {\n        shell.openExternal(link);\n    } else {\n        shell.showItemInFolder(link);\n    }\n}\n\nexport function openAnchorLink(e: MouseEvent) {\n    e.preventDefault();\n    const target = e.target as HTMLAnchorElement;\n    const href = target.getAttribute(\"href\");\n    if (href) {\n        openLink(href);\n    }\n}\n"
  },
  {
    "path": "src/renderer/utils/port.ts",
    "content": "import { type ComposeConfig, LongPortMapping, type PortEntryProtocol } from \"../../types\";\n\nconst { createServer, isIPv4, isIPv6 }: typeof import(\"net\") = require(\"node:net\");\n\nenum PortType {\n    HOST = \"Host\",\n    CONTAINER = \"Container\",\n}\n\ntype Port = number;\n\ntype PortEntryOptions = {\n    hostIP?: string;\n    protocol: PortEntryProtocol;\n};\n\nexport class Range {\n    start: number;\n    end: number;\n\n    /**\n     * Instantiates a {@link Range} from the compose string representation.\n     *\n     * @param token Format: `<start>-<end>`\n     */\n    constructor(token: string);\n\n    /**\n     * Instantiates a {@link Range} from numerical `start` and `end` values\n     *\n     * @param start Start of the Range\n     * @param end End of the Range\n     */\n    constructor(start: number, end: number);\n    constructor(_tokenOrStart: number | string, _end?: number) {\n        if (typeof _tokenOrStart === \"number\") {\n            if (!_end) throw new Error(\"Invalid constructor call\");\n\n            this.start = _tokenOrStart;\n            this.end = _end;\n            return;\n        }\n\n        const splitToken = _tokenOrStart.split(\"-\");\n\n        this.start = parseInt(splitToken[0]);\n        this.end = parseInt(splitToken[1]);\n    }\n\n    toString(): string {\n        return `${this.start}-${this.end}`;\n    }\n\n    /**\n     * Checks whether the supplied value is a {@link Range}.\n     */\n    static isRange(value: Port | Range): boolean {\n        if (typeof value === \"number\") return false;\n\n        return \"start\" in value && \"end\" in value;\n    }\n}\n\nexport class ComposePortEntry {\n    static readonly defaultOptions = {\n        hostIP: \"0.0.0.0\",\n        protocol: \"tcp\",\n    };\n\n    hostIP: string;\n    host: Port | Range;\n    container: Port | Range;\n    protocol: PortEntryProtocol;\n\n    /**\n     * Parses a short form Compose Port mapping according to the [Compose Specification](https://github.com/compose-spec/compose-spec/blob/main/spec.md#ports).\n     *\n     * @param entry Format: `[HOST:]CONTAINER[/PROTOCOL]`\n     */\n    constructor(entry: string);\n    constructor(hostPort: number, guestPort: number, options?: PortEntryOptions);\n    constructor(_entryOrHostPort: string | number, _guestPort?: number, _options?: PortEntryOptions) {\n        if (typeof _entryOrHostPort === \"number\") {\n            if (!_guestPort || !_options) throw new Error(\"Invalid constructor call\");\n\n            this.hostIP = _options.hostIP ?? ComposePortEntry.defaultOptions.hostIP;\n            this.protocol = _options.protocol ?? ComposePortEntry.defaultOptions.protocol;\n            this.host = _entryOrHostPort;\n            this.container = _guestPort;\n            return;\n        }\n\n        this.hostIP = ComposePortEntry.parseIP(_entryOrHostPort);\n        this.host = ComposePortEntry.parsePort(PortType.HOST, _entryOrHostPort);\n        this.container = ComposePortEntry.parsePort(PortType.CONTAINER, _entryOrHostPort);\n        this.protocol = ComposePortEntry.parseProtocol(_entryOrHostPort);\n    }\n\n    /**\n     * Converts the {@link ComposePortEntry} into a valid compose string representation\n     *\n     * @note If it was initialized from a compose port entry with implicit default values, then those will be included explicitly (e.g. `/tcp` or `0.0.0.0` binding)\n     */\n    get entry(): string {\n        const host = Number.isNaN(this.host) ? \"\" : this.host; // This accounts for podman's empty host (see: podman publish syntax)\n        return `${this.hostIP}:${host}:${this.container}/${this.protocol}`;\n    }\n\n    static parseProtocol(entry: string): PortEntryProtocol {\n        const protocol = entry.split(\"/\").at(1);\n\n        if (!protocol) return \"tcp\"; // TCP is the default protocol if one isn't specified per the compose spec\n        if (protocol === \"tcp\" || protocol === \"udp\") {\n            return protocol;\n        }\n\n        throw new Error(`Protocol '${protocol}' is not supported by the compose spec.`);\n    }\n\n    /**\n     * Parses a `(port | range)` token specified by the compose spec.\n     */\n    private static parsePortOrRange(token: string): Port | Range {\n        if (token.includes(\"-\")) return new Range(token);\n\n        return parseInt(token);\n    }\n\n    /**\n     * Parses the part of the compose mapping specified by `type`, as defined by the compose spec.\n     *\n     * @note Implicit default values are respected\n     *\n     * @example ComposePortEntry.parsePort(PortType.HOST, \"8080\"); // returns 8080\n     */\n    static parsePort(type: PortType, entry: string): Port | Range {\n        const portEntry = entry.split(\":\");\n        const guest = portEntry.at(-1)!.split(\"/\")[0];\n\n        if (portEntry.length == 1) return ComposePortEntry.parsePortOrRange(guest);\n\n        if (type == PortType.HOST) {\n            const host = portEntry.at(-2)!;\n\n            return ComposePortEntry.parsePortOrRange(host);\n        }\n\n        return ComposePortEntry.parsePortOrRange(guest);\n    }\n\n    private static checkValidIP(ip: string, entry: string): string {\n        if (!isIPv4(ip) && !isIPv6(ip)) throw new Error(`Invalid compose entry: ${entry}, IP: ${ip}`);\n        return ip;\n    }\n\n    /**\n     * Parses the optional IP part of the port mapping, as defined by the compose spec.\n     *\n     * @note Implicit default values are respected\n     *\n     * @example ComposePortEntry.parseIP(\"69:4200\"); // returns \"0.0.0.0\"\n     */\n    static parseIP(entry: string): string {\n        const parts = entry.split(\":\");\n\n        // As per the compose spec, there must be at least 2 colons in the entry for an IP to be specified\n        if (parts.length < 3) return \"0.0.0.0\";\n\n        // Extra logic for allowing empty host port, needed for supporting podman's publish syntax\n        let lastPort = parts.at(-2)!;\n        let colonNum = 1;\n\n        if (lastPort.length === 0) {\n            lastPort = parts.at(-1)!;\n            colonNum = 2;\n        }\n\n        // Here we find the index where the host ip ends (removing one makes sure we remove the colon as well)\n        const hostPortLocation = entry.indexOf(lastPort) - colonNum;\n        const rawIP = entry.substring(0, hostPortLocation);\n\n        // In case the IP isn't enclosed with square brackets, we don't need any further processing\n        if (!rawIP[0].startsWith(\"[\")) return ComposePortEntry.checkValidIP(rawIP, entry);\n\n        const IP = rawIP.substring(1, rawIP.length - 1);\n\n        return ComposePortEntry.checkValidIP(IP, entry);\n    }\n}\n\nexport class ComposePortMapper {\n    private readonly shortPorts: ComposePortEntry[];\n    private readonly longPorts: LongPortMapping[];\n\n    /**\n     * Parses port entries in a {@link ComposeConfig} object.\n     *\n     * @param compose The config to be parsed\n     * @returns A {@link ComposePortMapper} object\n     */\n    constructor(compose: ComposeConfig) {\n        this.shortPorts = [];\n        this.longPorts = [];\n\n        for (const composeMapping of compose.services.windows.ports) {\n            this.pushPortEntry(composeMapping);\n        }\n    }\n\n    /**\n     * **WARNING**: Could introduce duplicate entries, use carefully!\n     *\n     * Pushes a port entry to the internal port array.\n     */\n    private pushPortEntry(entry: string | LongPortMapping) {\n        if (typeof entry === \"string\") {\n            this.shortPorts.push(new ComposePortEntry(entry));\n            return;\n        }\n\n        this.longPorts.push(entry);\n    }\n\n    /**\n     * Finds the index of the short syntax port entry with the same guest port and protocol in the internal shortPorts list\n     */\n    private findGuestPortIndex(guestPort: number | string, protocol: PortEntryProtocol = \"tcp\"): number | undefined {\n        if (typeof guestPort === \"string\") {\n            guestPort = Number.parseInt(guestPort);\n        }\n\n        // TODO: investigate whether we need to handle long syntax port entries here\n        const idx = this.shortPorts.findIndex(\n            entry =>\n                typeof entry.container === \"number\" && entry.container === guestPort && entry.protocol === protocol,\n        );\n\n        return idx === -1 ? undefined : idx;\n    }\n\n    /**\n     * Returns the short syntax port mapping with the same guest port and protocol, or undefined in case given mapping doesn't exist.\n     */\n    getShortPortMapping(guestPort: number | string, protocol: PortEntryProtocol = \"tcp\"): ComposePortEntry | undefined {\n        const mappingIdx = this.findGuestPortIndex(guestPort, protocol);\n\n        if (mappingIdx === undefined) return undefined;\n\n        return this.shortPorts[mappingIdx];\n    }\n\n    /**\n     * Creates a new port mapping or overwrites an existing one.\n     * In case the host port is not open, it tries to find one.\n     */\n    setShortPortMapping(guestPort: number | string, hostPort: number | string, options?: PortEntryOptions): void;\n    setShortPortMapping(guestPort: number | string, hostRange: number | Range, options?: PortEntryOptions): void;\n    setShortPortMapping(\n        _guestPort: number | string,\n        _host: number | string | Range,\n        _options?: PortEntryOptions,\n    ): void {\n        if (typeof _host === \"string\") {\n            _host = Number.parseInt(_host);\n        }\n        if (typeof _guestPort === \"string\") {\n            _guestPort = Number.parseInt(_guestPort);\n        }\n\n        const insertAt = this.findGuestPortIndex(_guestPort, _options?.protocol) ?? this.shortPorts.length;\n\n        if (!(_host instanceof Range)) {\n            this.shortPorts[insertAt] = new ComposePortEntry(_host, _guestPort, _options);\n            return;\n        }\n\n        // TODO: Create ComposePortEntry constructor overload for Ranges as well to avoid this\n        this.shortPorts[insertAt] = new ComposePortEntry(\n            `${_options?.hostIP ?? \"0.0.0.0\"}:${_host}:${_guestPort}/${_options?.protocol ?? \"tcp\"}`,\n        );\n    }\n\n    /**\n     * Returns whether there's a short syntax port mapping tied to given guestPort\n     */\n    hasShortPortMapping(guestPort: string | number, protocol: PortEntryProtocol = \"tcp\"): boolean {\n        if (typeof guestPort === \"string\") {\n            guestPort = Number.parseInt(guestPort);\n        }\n\n        return !!this.findGuestPortIndex(guestPort, protocol);\n    }\n\n    /**\n     * Returns port entries in a string array using {@link ComposeConfig}'s format\n     */\n    get composeFormat(): string[] {\n        const ret = [];\n\n        // TODO!!!: handle long syntax port mappings\n        for (const portEntry of this.shortPorts) {\n            ret.push(portEntry.entry);\n        }\n\n        return ret;\n    }\n\n    /**\n     * Checks if a port is open\n     *\n     * @param port The port to check\n     * @returns True if the port is open, false otherwise\n     */\n    static async isPortOpen(port: number | string): Promise<boolean> {\n        if (typeof port === \"string\") {\n            port = Number.parseInt(port);\n        }\n\n        return new Promise((resolve, reject) => {\n            const server = createServer();\n\n            server.once(\"error\", (err: any) => {\n                if (err.code === \"EADDRINUSE\") {\n                    resolve(false);\n                }\n            });\n\n            server.once(\"listening\", () => {\n                resolve(true);\n                server.close();\n            });\n\n            server.listen(port);\n        });\n    }\n}\n"
  },
  {
    "path": "src/renderer/views/About.vue",
    "content": "<template>\n    <div class=\"flex flex-col items-center justify-center h-[calc(100vh-9rem)]\">\n        <img class=\"w-48\" src=\"/img/winboat_logo.svg\" alt=\"The WinBoat Logo\" />\n        <h2 class=\"mb-0\">WinBoat</h2>\n        <p class=\"text-sm text-gray-500\">Windows for 🐧 penguins</p>\n        <p class=\"text-gray-400 !mt-4\">WinBoat Beta v{{ appVer }} {{ isDev ? \"Dev\" : \"Prod\" }}</p>\n        <div></div>\n        <p class=\"text-gray-400 !mt-16\">\n            WinBoat is\n            <a @click=\"openAnchorLink\" href=\"https://github.com/TibixDev/WinBoat\">open-source software</a>\n        </p>\n        <p class=\"text-gray-400 !mt-0\">Copyright (c) 2026 TibixDev</p>\n        <p class=\"text-sm text-gray-500 text-center !mt-16 w-[40vw]\">\n            WinBoat is not affiliated with Microsoft Corporation, nor is it endorsed or sponsored by them. \"Windows\" is\n            a registered trademark of Microsoft Corporation, and all associated assets (icons, logos, etc.) are the\n            property of Microsoft.\n        </p>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { openAnchorLink } from \"../utils/openLink\";\nconst appVer = import.meta.env.VITE_APP_VERSION;\nconst isDev = import.meta.env.DEV;\n</script>\n"
  },
  {
    "path": "src/renderer/views/Apps.vue",
    "content": "<template>\n    <div>\n        <dialog ref=\"addCustomAppDialog\">\n            <h3 class=\"mb-2\">{{ currentAppForm.Source === \"custom\" ? \"Edit App\" : \"Add App\" }}</h3>\n            <div class=\"flex flex-row gap-5 mt-4 w-[35vw]\">\n                <div class=\"flex flex-col flex-none gap-2 justify-center items-center\">\n                    <div class=\"relative\">\n                        <img\n                            alt=\"Icon for current app\"\n                            v-if=\"currentAppForm.Icon\"\n                            :src=\"currentAppForm.Icon\"\n                            class=\"size-24\"\n                        />\n                        <Icon v-else class=\"size-24 text-neutral-400\" icon=\"mdi:image\"></Icon>\n                        <button\n                            @click=\"pickCustomAppIcon\"\n                            class=\"flex absolute top-0 left-0 flex-col gap-1 justify-center items-center w-full h-full rounded-xl opacity-0 backdrop-blur-sm transition duration-200 absoute bg-black/50 hover:opacity-100\"\n                        >\n                            <Icon icon=\"mdi:pencil\" class=\"size-10\"></Icon>\n                            <x-label>Change Icon</x-label>\n                        </button>\n                    </div>\n                </div>\n                <div class=\"flex flex-col gap-0.5 justify-center w-full\">\n                    <!-- Name field -->\n                    <x-label>Name</x-label>\n                    <x-input\n                        v-model=\"currentAppForm.Name\"\n                        class=\"!max-w-full\"\n                        @input=\"(e: any) => (customAppName = e.target.value)\"\n                        type=\"text\"\n                    />\n\n                    <!-- Path field -->\n                    <x-label class=\"mt-4\">Path</x-label>\n                    <x-input\n                        v-model=\"currentAppForm.Path\"\n                        type=\"text\"\n                        class=\"!max-w-full\"\n                        @input=\"(e: any) => (customAppPath = e.target.value)\"\n                    />\n\n                    <!-- Arguments field -->\n                    <x-label class=\"mt-2\">Arguments</x-label>\n                    <x-input v-model=\"currentAppForm.Args\" type=\"text\" class=\"!max-w-full\" placeholder=\"Optional\" />\n                </div>\n            </div>\n\n            <div class=\"flex flex-col gap-1 mt-2\">\n                <div class=\"flex flex-row gap-2 items-center my-0 font-semibold text-blue-400\">\n                    <Icon icon=\"fluent:info-32-filled\" class=\"inline size-4\"></Icon>\n                    <p class=\"!my-0 break-normal max-w-[30vw]\">\n                        Please make sure the path you enter is a valid path to an executable file, otherwise the app\n                        will not work.\n                    </p>\n                </div>\n                <div class=\"flex flex-row gap-2 items-center my-0 font-semibold text-blue-400\">\n                    <Icon icon=\"fluent:info-32-filled\" class=\"inline size-4\"></Icon>\n                    <p class=\"!my-0 break-normal max-w-[30vw]\">\n                        Custom apps can be removed by right clicking on them and selecting \"Remove Custom App\".\n                    </p>\n                </div>\n                <div\n                    class=\"flex flex-row gap-2 items-center my-0 font-semibold text-red-500\"\n                    v-for=\"(error, k) of customAppAddErrors\"\n                    :key=\"k\"\n                >\n                    <Icon icon=\"fluent:warning-32-filled\" class=\"inline size-4\"></Icon>\n                    <p class=\"!my-0\">{{ error }}</p>\n                </div>\n            </div>\n\n            <template>\n                <div class=\"apps-grid\">\n                    <div\n                        v-for=\"app in apps\"\n                        :key=\"app.id\"\n                        class=\"app-tile\"\n                        @contextmenu.prevent=\"openContextMenu($event, app)\"\n                    >\n                        {{ app.Name }}\n                    </div>\n                </div>\n            </template>\n            <footer>\n                <x-button @click=\"cancelAddCustomApp\" id=\"cancel-button\">\n                    <x-label>Cancel</x-label>\n                </x-button>\n                <x-button\n                    toggled\n                    id=\"add-button\"\n                    :disabled=\"customAppAddErrors.length > 0 || (orginalAppForm?.Source === 'custom' && isSame)\"\n                    @click=\"saveApp\"\n                >\n                    <x-label>{{ currentAppForm.Source === \"custom\" ? \"Save\" : \"Create New\" }}</x-label>\n                </x-button>\n            </footer>\n        </dialog>\n\n        <div\n            class=\"flex justify-between items-center mb-6\"\n            :class=\"{\n                'opacity-50 pointer-events-none':\n                    winboat.containerStatus.value !== ContainerStatus.RUNNING || !winboat.isOnline.value,\n            }\"\n        >\n            <x-label class=\"text-neutral-300\">Apps</x-label>\n            <div class=\"flex flex-row gap-2 justify-center items-center\">\n                <!-- Refresh button -->\n                <x-button class=\"flex flex-row gap-1 items-center\" @click=\"refreshApps\">\n                    <Icon icon=\"mdi:refresh\" class=\"size-4\"></Icon>\n                    <x-label>Refresh</x-label>\n                </x-button>\n\n                <!-- Custom App Add Button -->\n                <x-button class=\"flex flex-row gap-1 items-center\" @click=\"openAddAppDialog()\">\n                    <x-icon href=\"#add\" class=\"qualifier\"></x-icon>\n                    <x-label class=\"qualifier\">Add Custom</x-label>\n                </x-button>\n                <x-select\n                    @change=\"\n                        (e: any) => {\n                            sortBy = e.detail.newValue;\n                            WinboatConfig.getInstance().config.appsSortOrder = e.detail.newValue;\n                        }\n                    \"\n                    :disabled=\"!winboat.isOnline.value\"\n                >\n                    <x-menu class=\"\">\n                        <x-menuitem value=\"name\" :toggled=\"sortBy === 'name'\">\n                            <x-icon href=\"#sort\" class=\"qualifier\"></x-icon>\n                            <x-label>\n                                <span class=\"qualifier\"> Sort By: </span>\n                                Name\n                            </x-label>\n                        </x-menuitem>\n                        <x-menuitem value=\"usage\" :toggled=\"sortBy === 'usage'\">\n                            <x-icon href=\"#sort\" class=\"qualifier\"></x-icon>\n                            <x-label>\n                                <span class=\"qualifier\"> Sort By: </span>\n                                Usage\n                            </x-label>\n                        </x-menuitem>\n                    </x-menu>\n                </x-select>\n                <x-select\n                    @change=\"(e: any) => (filterBy = e.detail.newValue)\"\n                    :disabled=\"!winboat.isOnline.value\"\n                    class=\"flex flex-row-reverse gap-1 items-center justify-center\"\n                >\n                    <Icon icon=\"mdi:filter-outline\" style=\"width: 17; height: 17\"></Icon>\n                    <x-menu class=\"\">\n                        <x-menuitem value=\"all\" toggled>\n                            <x-label>\n                                <span class=\"qualifier\"> Filter: </span>\n                                All\n                            </x-label>\n                        </x-menuitem>\n\n                        <x-menuitem v-for=\"(label, value) in AllSources\" :value=\"value\">\n                            <x-label>\n                                <span class=\"qualifier\"> Filter: </span>\n                                {{ label }}\n                            </x-label>\n                        </x-menuitem>\n                    </x-menu>\n                </x-select>\n\n                <!-- Search Input -->\n                <x-input\n                    id=\"search-term\"\n                    class=\"m-0 w-64 max-w-64\"\n                    type=\"text\"\n                    maxlength=\"32\"\n                    :value=\"searchInput\"\n                    @input=\"(e: any) => (searchInput = e.target.value)\"\n                    :disabled=\"!winboat.isOnline.value\"\n                >\n                    <x-icon href=\"#search\"></x-icon>\n                    <x-label>Search</x-label>\n                </x-input>\n            </div>\n        </div>\n        <div v-if=\"winboat.isOnline.value\" class=\"px-2\">\n            <TransitionGroup\n                v-if=\"apps.length\"\n                name=\"apps\"\n                tag=\"x-card\"\n                class=\"grid gap-4 bg-transparent border-none app-grid\"\n            >\n                <x-card\n                    v-for=\"app of computedApps\"\n                    :key=\"app.id\"\n                    class=\"flex relative flex-row gap-2 justify-between items-center p-2 my-0 backdrop-blur-xl backdrop-brightness-150 cursor-pointer generic-hover bg-neutral-800/20\"\n                    :class=\"{\n                        'bg-gradient-to-r from-yellow-600/20 bg-neutral-800/20': app.Source === 'custom',\n                        'app-launching': launchingAppId === app.id,\n                    }\"\n                    @click=\"handleLaunchApp(app)\"\n                    @contextmenu=\"openContextMenu($event, app)\"\n                >\n                    <div class=\"flex flex-row items-center gap-2 w-[85%]\">\n                        <img\n                            class=\"rounded-md size-10\"\n                            :src=\"`data:image/png;charset=utf-8;base64,${app.Icon}`\"\n                            alt=\"App Icon\"\n                        />\n                        <x-label class=\"truncate text-ellipsis\">{{ app.Name }}</x-label>\n                    </div>\n                    <Icon icon=\"cuida:caret-right-outline\"></Icon>\n                </x-card>\n            </TransitionGroup>\n            <div v-else class=\"flex justify-center items-center mt-40\">\n                <x-throbber class=\"w-16 h-16\"></x-throbber>\n            </div>\n            <WBContextMenu key=\"contextMenu\" ref=\"contextMenuRef\" @hide=\"onContextMenuHide\">\n                <WBMenuItem @click=\"launchApp\">\n                    <Icon class=\"size-4\" icon=\"mdi:play-circle-outline\"></Icon>\n                    <x-label>Launch</x-label>\n                </WBMenuItem>\n\n                <WBMenuItem @click=\"contextMenuTarget && openEditAppDialog(contextMenuTarget)\">\n                    <Icon class=\"size-4\" icon=\"mdi:pencil-outline\"></Icon>\n                    <x-label>Edit</x-label>\n                </WBMenuItem>\n\n                <WBMenuItem v-if=\"contextMenuTarget?.Source === 'custom'\" @click=\"removeCustomApp\">\n                    <Icon class=\"size-4\" icon=\"mdi:trash-can-outline\"></Icon>\n                    <x-label>Remove</x-label>\n                </WBMenuItem>\n            </WBContextMenu>\n        </div>\n        <div v-else class=\"px-2 mt-32\">\n            <div class=\"flex flex-col gap-4 justify-center items-center\">\n                <Icon class=\"text-violet-400 size-32\" icon=\"fluent-mdl2:plug-disconnected\"></Icon>\n                <h1 class=\"text-xl font-semibold w-[30vw] text-center leading-16\">\n                    <span\n                        v-if=\"\n                            winboat.containerStatus.value === ContainerStatus.EXITED ||\n                            winboat.containerStatus.value === ContainerStatus.UNKNOWN\n                        \"\n                    >\n                        The WinBoat Container is not running, please start it to view your apps list.\n                    </span>\n                    <span v-else>\n                        The WinBoat Guest API is not running, please restart the container. If this problem persists,\n                        contact customer support.\n                    </span>\n                </h1>\n            </div>\n        </div>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { Icon } from \"@iconify/vue\";\nimport { computed, onMounted, ref, useTemplateRef, watch, nextTick } from \"vue\";\nimport { Winboat } from \"../lib/winboat\";\nimport { ContainerStatus } from \"../lib/containers/common\";\nimport { type WinApp } from \"../../types\";\nimport WBContextMenu from \"../components/WBContextMenu.vue\";\nimport WBMenuItem from \"../components/WBMenuItem.vue\";\nimport { AppIcons, DEFAULT_ICON } from \"../data/appicons\";\nimport { debounce } from \"../utils/debounce\";\nimport { Jimp, JimpMime } from \"jimp\";\nimport { WinboatConfig } from \"../lib/config\";\nconst nodeFetch: typeof import(\"node-fetch\").default = require(\"node-fetch\");\nconst FormData: typeof import(\"form-data\") = require(\"form-data\");\n\nconst winboat = Winboat.getInstance();\nconst apps = ref<WinApp[]>([]);\nconst searchInput = ref(\"\");\nconst sortBy = ref(\"\");\nconst filterBy = ref(\"all\");\nconst addCustomAppDialog = useTemplateRef(\"addCustomAppDialog\");\nconst customAppName = ref(\"\");\nconst customAppPath = ref(\"\");\nconst customAppIcon = ref(`data:image/png;base64,${AppIcons[DEFAULT_ICON]}`);\nconst customAppArgs = ref(\"\");\nconst orginalAppForm = ref<WinApp | null>(null);\nconst currentAppForm = ref<WinApp>({\n    Name: \"\",\n    Path: \"\",\n    Args: \"\",\n    Icon: \"\",\n    Source: \"\",\n});\n\nconst AllSources = computed(() => {\n    let sourceList: Record<string, string> = {};\n    const sourceMap: Record<string, string> = {\n        system: \"System\",\n        winreg: \"Windows Registry\",\n        startmenu: \"Start Menu\",\n        uwp: \"Microsoft Store\",\n        internal: \"Internal\",\n    };\n\n    for (const app of apps.value) {\n        sourceList[app.Source] = sourceMap[app.Source] || app.Source;\n    }\n\n    return sourceList;\n});\n\nconst computedApps = computed(() => {\n    // Make copy, otherwise UI might glitch, creating \"ghost\" app\n    let appsCache = [...apps.value];\n\n    if (filterBy.value !== \"all\") {\n        appsCache = appsCache.filter(app => app.Source === filterBy.value);\n    }\n\n    if (searchInput.value) {\n        appsCache = appsCache.filter(app => app.Name.toLowerCase().includes(searchInput.value.toLowerCase()));\n    }\n\n    if (sortBy.value === \"usage\") {\n        appsCache.sort((a, b) => (b.Usage ?? 0) - (a.Usage ?? 0));\n    } else {\n        appsCache.sort((a, b) => a.Name.localeCompare(b.Name));\n    }\n\n    return appsCache;\n});\n\nonMounted(async () => {\n    sortBy.value = WinboatConfig.getInstance().config.appsSortOrder;\n\n    await refreshApps();\n\n    watch(winboat.isOnline, async (newVal, _) => {\n        if (newVal) {\n            await refreshApps();\n            console.log(\"Apps list: \", apps.value);\n        }\n    });\n\n    // Fetch icon for custom app path\n    watch(customAppPath, async (newVal, oldVal) => {\n        await debouncedFetchIcon(newVal, oldVal);\n    });\n\n    const onScroll = () => contextMenuRef.value?.hide();\n    window.addEventListener(\"scroll\", onScroll, true);\n    window.addEventListener(\"resize\", onScroll);\n});\n\nasync function refreshApps() {\n    if (winboat.isOnline.value) {\n        const loadedApps = await winboat.appMgr!.getApps(winboat.apiUrl!);\n        apps.value = loadedApps.map(app => ({\n            ...app,\n            id: crypto.randomUUID(),\n        }));\n        // Run in background, won't impact UX\n        await winboat.appMgr!.updateAppCache(winboat.apiUrl!);\n    }\n}\n\nconst debouncedFetchIcon = debounce(async (newVal: string, oldVal: string) => {\n    if (newVal !== oldVal && newVal !== \"\") {\n        const formData = new FormData();\n        formData.append(\"path\", newVal);\n        const iconRes = await nodeFetch(`${winboat.apiUrl!}/get-icon`, {\n            method: \"POST\",\n            body: formData as any,\n        });\n        const icon = await iconRes.text();\n        customAppIcon.value = `data:image/png;base64,${icon}`;\n        console.log(`Custom app icon fetched for ${newVal}:`, customAppIcon.value);\n    }\n}, 500);\n\nconst isSame = computed(() => {\n    const orig = orginalAppForm.value;\n    const curr = currentAppForm.value;\n\n    return orig ? orig.Name === curr.Name && orig.Path === curr.Path && (orig.Args || \"\") === (curr.Args || \"\") : false;\n});\n\nconst customAppAddErrors = computed(() => {\n    const errors: string[] = [];\n\n    if (!customAppName.value) {\n        errors.push(\"A valid name is required for your app\");\n    }\n\n    if (apps.value.some(app => app.Name === customAppName.value) && orginalAppForm.value) {\n        if (orginalAppForm.value.Name !== customAppName.value || orginalAppForm.value.Source !== \"custom\") {\n            errors.push(\"An app with this name already exists\");\n        }\n    }\n\n    if (!customAppPath.value) {\n        errors.push(\"A valid path is required for your app\");\n    }\n\n    if (!customAppIcon.value) {\n        errors.push(\"A valid icon is required for your app\");\n    }\n\n    return errors;\n});\n\nconst launchingAppId = ref<string | null>(null);\n\nfunction handleLaunchApp(app: WinApp) {\n    launchingAppId.value = app.id!;\n    winboat.launchApp(app);\n    setTimeout(() => {\n        launchingAppId.value = null;\n    }, 1200);\n}\n\nconst contextMenuRef = ref();\nconst contextMenuTarget = ref<WinApp | null>(null);\n\nasync function openContextMenu(event: MouseEvent, app: WinApp) {\n    contextMenuTarget.value = app;\n    await nextTick(); // Wait for DOM to update\n    contextMenuRef.value?.show(event); // Let WBContextMenu handle positioning\n}\n\nfunction openAddAppDialog() {\n    orginalAppForm.value = null;\n    const app = {\n        Name: \"\",\n        Path: \"\",\n        Args: \"\",\n        Icon: customAppIcon.value,\n        Source: \"\",\n        Usage: 0,\n    };\n    currentAppForm.value = app;\n    contextMenuTarget.value = null;\n    addCustomAppDialog.value?.showModal();\n}\n\nfunction openEditAppDialog(app: WinApp) {\n    orginalAppForm.value = { ...app };\n    customAppName.value = app.Name;\n    customAppPath.value = app.Path;\n    customAppIcon.value = app.Icon;\n    customAppArgs.value = app.Args;\n    contextMenuTarget.value = app;\n    currentAppForm.value = {\n        Name: app.Name,\n        Path: app.Path,\n        Args: app.Args || \"\",\n        Icon: `data:image/png;base64,${app.Icon}`,\n        Source: app.Source,\n        Usage: app.Usage,\n    };\n    addCustomAppDialog.value?.showModal();\n}\n\nasync function saveApp() {\n    const iconRaw = currentAppForm.value.Icon.split(\"data:image/png;base64,\")[1];\n\n    if (currentAppForm.value.Source === \"custom\" && orginalAppForm.value) {\n        await winboat.appMgr!.updateCustomApp(orginalAppForm.value.Name, {\n            Name: currentAppForm.value.Name,\n            Path: currentAppForm.value.Path,\n            Args: currentAppForm.value.Args,\n            Icon: iconRaw,\n        });\n        console.log(\"Save\");\n    } else {\n        await winboat.appMgr!.addCustomApp(\n            currentAppForm.value.Name,\n            currentAppForm.value.Path,\n            currentAppForm.value.Args,\n            iconRaw,\n        );\n        console.log(\"New save\");\n    }\n\n    refreshApps();\n    cancelAddCustomApp();\n}\n\nfunction onContextMenuHide() {\n    contextMenuTarget.value = null;\n}\n\nfunction launchApp() {\n    if (contextMenuTarget.value) {\n        winboat.launchApp(contextMenuTarget.value);\n    }\n}\n\n/**\n * Triggers the file picker for the custom app icon, then processes the image selected\n */\nfunction pickCustomAppIcon() {\n    const filePicker = document.createElement(\"input\");\n    filePicker.type = \"file\";\n    filePicker.accept = \"image/*\";\n    filePicker.onchange = async (e: Event) => {\n        const file = (e.target as HTMLInputElement)?.files?.[0];\n        if (!file) {\n            console.log(\"No file selected\");\n            return;\n        }\n\n        try {\n            const buf = await file.arrayBuffer();\n\n            const image = await Jimp.read(Buffer.from(buf));\n            image.resize({ w: 128, h: 128 });\n            const pngBuffer = await image.getBuffer(JimpMime.png);\n            customAppIcon.value = `data:image/png;base64,${pngBuffer.toString(\"base64\")}`;\n        } catch (error) {\n            console.error(\"Image processing failed:\", error);\n        }\n    };\n    filePicker.click();\n}\n\n/**\n * Cancels the add custom app dialog and resets the form\n */\nfunction cancelAddCustomApp() {\n    addCustomAppDialog.value!.close();\n    resetCustomAppForm();\n}\n\n/**\n * Removes a custom app from WinBoat's application list\n */\nasync function removeCustomApp() {\n    if (!contextMenuTarget.value) return;\n    await winboat.appMgr!.removeCustomApp(contextMenuTarget.value);\n    await refreshApps();\n}\n\nasync function resetCustomAppForm() {\n    // So there is no visual flicker while the dialog is closing\n    setTimeout(() => {\n        customAppName.value = \"\";\n        customAppPath.value = \"\";\n        customAppIcon.value = `data:image/png;base64,${AppIcons[DEFAULT_ICON]}`;\n        customAppArgs.value = \"\";\n\n        // Because of course Vue reactivity fails here :(\n        addCustomAppDialog.value?.querySelectorAll<HTMLInputElement>(\"x-input\")?.forEach(input => {\n            input.value = \"\";\n        });\n    }, 100);\n}\n</script>\n\n<style scoped>\n.app-grid {\n    grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n}\n\nx-menu .qualifier {\n    display: none;\n}\n\n@keyframes launch-pulse {\n    0% {\n        transform: scale(1);\n        box-shadow: 0 0 0 0 rgba(167, 138, 249, 0);\n    }\n    10% {\n        transform: scale(0.97);\n    }\n    30% {\n        transform: scale(1);\n        box-shadow: 0 0 14px 3px rgba(167, 138, 249, 0.4);\n    }\n    65% {\n        box-shadow: 0 0 20px 5px rgba(167, 138, 249, 0.15);\n    }\n    100% {\n        transform: scale(1);\n        box-shadow: 0 0 0 0 rgba(167, 138, 249, 0);\n    }\n}\n\n.app-launching {\n    animation: launch-pulse 1.2s ease-out;\n}\n\n.apps-move, /* apply transition to moving elements */\n.apps-enter-active,\n.apps-leave-active {\n    transition: all 0.5s ease;\n}\n\n.apps-enter-from,\n.apps-leave-to {\n    opacity: 0;\n    transform: translateX(30px);\n}\n\n/* ensure leaving items are taken out of layout flow so that moving\n   animations can be calculated correctly. */\n.apps-leave-active {\n    position: absolute;\n}\n</style>\n"
  },
  {
    "path": "src/renderer/views/Blank.vue",
    "content": "<template>\n    <div class=\"flex justify-center items-center mt-40\">\n        <x-throbber class=\"w-16 h-16\"></x-throbber>\n    </div>\n</template>\n"
  },
  {
    "path": "src/renderer/views/Config.vue",
    "content": "<template>\n    <div class=\"flex flex-col gap-10 overflow-x-hidden\" :class=\"{ hidden: !maxNumCores }\">\n        <div>\n            <x-label class=\"mb-4 text-neutral-300\">Container</x-label>\n            <div class=\"flex flex-col gap-4\">\n                <!-- RAM Allocation -->\n                <ConfigCard\n                    icon=\"game-icons:ram\"\n                    title=\"RAM Allocation\"\n                    desc=\"How many gigabytes of RAM are allocated to the Windows virtual machine\"\n                    type=\"number\"\n                    unit=\"GB\"\n                    :min=\"2\"\n                    :max=\"maxRamGB\"\n                    v-model:value=\"ramGB\"\n                />\n\n                <!-- CPU Cores -->\n                <ConfigCard\n                    icon=\"solar:cpu-bold\"\n                    title=\"CPU Cores\"\n                    desc=\"How many CPU Cores are allocated to the Windows virtual machine\"\n                    type=\"number\"\n                    unit=\"Cores\"\n                    :min=\"2\"\n                    :max=\"maxNumCores\"\n                    v-model:value=\"numCores\"\n                />\n\n                <!-- Shared Folder -->\n                <ConfigCard\n                    icon=\"fluent:folder-link-32-filled\"\n                    title=\"Shared Folder\"\n                    type=\"switch\"\n                    v-model:value=\"shareFolder\"\n                >\n                    <template v-slot:desc>\n                        If enabled, you will be able to access your selected folder within Windows under\n                        <span class=\"font-mono bg-neutral-700 rounded-md px-1 py-0.5\">Network\\host.lan</span>\n                    </template>\n                </ConfigCard>\n\n                <!-- Shared Folder Location -->\n                <ConfigCard\n                    v-if=\"shareFolder\"\n                    icon=\"mdi:folder-cog\"\n                    title=\"Shared Folder Location\"\n                    type=\"custom\"\n                >\n                    <template v-slot:desc>\n                        <span v-if=\"sharedFolderPath\">\n                            Currently sharing: <span class=\"font-mono bg-neutral-700 rounded-md px-1 py-0.5\">{{ sharedFolderPath }}</span>\n                        </span>\n                        <span v-else>\n                            Select a folder to share with Windows\n                        </span>\n                    </template>\n                    <x-button @click=\"selectSharedFolder\">\n                        Browse\n                    </x-button>\n                </ConfigCard>\n\n                <!-- Auto Start Container -->\n                <ConfigCard\n                    icon=\"clarity:power-solid\"\n                    title=\"Auto Start Container\"\n                    desc=\"If enabled, the Windows container will automatically be started when the system boots up\"\n                    type=\"switch\"\n                    v-model:value=\"autoStartContainer\"\n                />\n\n                <!-- FreeRDP Port -->\n                <ConfigCard\n                    icon=\"lucide:ethernet-port\"\n                    title=\"FreeRDP Port\"\n                    desc=\"You can change what port FreeRDP uses to communicate with the VM\"\n                    type=\"custom\"\n                >\n                    <x-input\n                        class=\"max-w-16 text-right text-[1.1rem]\"\n                        :value=\"Number.isNaN(freerdpPort) ? '' : freerdpPort\"\n                        @input=\"\n                            (e: any) => {\n                                freerdpPort = Number(\n                                    /^\\d+$/.exec(e.target.value)?.at(0) ||\n                                        portMapper?.getShortPortMapping(GUEST_RDP_PORT)?.host,\n                                );\n                            }\n                        \"\n                    >\n                        <x-label v-if=\"Number.isNaN(freerdpPort)\">None</x-label>\n                    </x-input>\n                </ConfigCard>\n                <div class=\"flex flex-col\">\n                    <p class=\"my-0 text-red-500\" v-for=\"(error, k) of errors\" :key=\"k\">❗ {{ error }}</p>\n                </div>\n                <x-button\n                    :disabled=\"saveButtonDisabled || isUpdatingUSBPrerequisites\"\n                    @click=\"saveCompose()\"\n                    class=\"w-24\"\n                >\n                    <span v-if=\"!isApplyingChanges || isUpdatingUSBPrerequisites\">Save</span>\n                    <x-throbber v-else class=\"w-10\"></x-throbber>\n                </x-button>\n            </div>\n        </div>\n        <div v-show=\"wbConfig.config.experimentalFeatures\">\n            <x-label class=\"mb-4 text-neutral-300\">Devices</x-label>\n            <div class=\"flex flex-col gap-4\">\n                <!-- USB Passthrough -->\n                <x-card\n                    class=\"flex relative z-20 flex-row justify-between items-center p-2 py-3 my-0 w-full backdrop-blur-xl backdrop-brightness-150 bg-neutral-800/20\"\n                >\n                    <div class=\"w-full\">\n                        <div class=\"flex flex-row gap-2 items-center mb-2\">\n                            <Icon class=\"inline-flex text-violet-400 size-8\" icon=\"fluent:tv-usb-24-filled\"></Icon>\n                            <h1 class=\"my-0 text-lg font-semibold\">\n                                USB Passthrough\n                                <span class=\"bg-violet-500 rounded-full px-3 py-0.5 text-sm ml-2\"> Experimental </span>\n                            </h1>\n                        </div>\n\n                        <template v-if=\"usbPassthroughDisabled || isUpdatingUSBPrerequisites\">\n                            <x-card\n                                class=\"flex items-center py-2 w-full my-2 backdrop-blur-xl gap-4 backdrop-brightness-150 bg-yellow-200/10\"\n                            >\n                                <Icon class=\"inline-flex text-yellow-500 size-8\" icon=\"clarity:warning-solid\"></Icon>\n                                <h1 class=\"my-0 text-base font-normal text-yellow-200\">\n                                    We need to update your Compose in order to use this feature!\n                                </h1>\n\n                                <x-button\n                                    :disabled=\"isUpdatingUSBPrerequisites\"\n                                    class=\"mt-1 !bg-gradient-to-tl from-yellow-200/20 to-transparent ml-auto hover:from-yellow-300/30 transition !border-0\"\n                                    @click=\"addRequiredComposeFieldsUSB\"\n                                >\n                                    <x-label\n                                        class=\"ext-lg font-normal text-yellow-200\"\n                                        v-if=\"!isUpdatingUSBPrerequisites\"\n                                    >\n                                        Update\n                                    </x-label>\n\n                                    <x-throbber v-else class=\"w-8 text-yellow-300\"></x-throbber>\n                                </x-button>\n                            </x-card>\n                        </template>\n                        <template v-if=\"wbConfig.config.containerRuntime === ContainerRuntimes.PODMAN\">\n                            <x-card\n                                class=\"flex items-center py-2 w-full my-2 backdrop-blur-xl gap-4 backdrop-brightness-150 bg-yellow-200/10\"\n                            >\n                                <Icon class=\"inline-flex text-yellow-500 size-8\" icon=\"clarity:warning-solid\"></Icon>\n                                <h1 class=\"my-0 text-base font-normal text-yellow-200\">\n                                    USB Passthrough is not yet supported while using Podman as the container runtime.\n                                </h1>\n                            </x-card>\n                        </template>\n                        <template\n                            v-if=\"\n                                !usbPassthroughDisabled &&\n                                !isUpdatingUSBPrerequisites &&\n                                wbConfig.config.containerRuntime === ContainerRuntimes.DOCKER\n                            \"\n                        >\n                            <x-label\n                                class=\"text-neutral-400 text-[0.9rem] !pt-0 !mt-0\"\n                                v-if=\"usbManager.ptDevices.value.length == 0\"\n                            >\n                                Press the button below to add USB devices to your passthrough list\n                            </x-label>\n                            <TransitionGroup name=\"devices\" tag=\"x-box\" class=\"flex-col gap-2 mt-4\">\n                                <x-card\n                                    class=\"flex justify-between items-center px-2 py-0 m-0 bg-white/5\"\n                                    v-for=\"device of usbManager.ptDevices.value\"\n                                    :key=\"`${device.vendorId}-${device.productId}`\"\n                                    :class=\"{\n                                        'bg-white/[calc(0.05*0.75)] [&_*:not(div):not(span)]:opacity-75':\n                                            !usbManager.isPTDeviceConnected(device),\n                                    }\"\n                                >\n                                    <div class=\"flex flex-row gap-2 items-center\">\n                                        <span\n                                            v-if=\"\n                                                usbManager.isMTPDevice(device) ||\n                                                usbManager\n                                                    .stringifyPTSerializableDevice(device)\n                                                    .toLowerCase()\n                                                    .includes('mtp')\n                                            \"\n                                            class=\"relative group\"\n                                        >\n                                            <Icon\n                                                icon=\"clarity:warning-solid\"\n                                                class=\"text-yellow-300 size-7 cursor-pointer\"\n                                            />\n                                            <span\n                                                class=\"absolute bottom-5 z-50 w-[320px] bg-neutral-800/90 backdrop-blur-sm text-xs text-gray-300 rounded-lg shadow-lg px-3 py-2 hidden group-hover:block transition-opacity duration-200 pointer-events-none\"\n                                            >\n                                                This device appears to be using the MTP protocol, which is known for\n                                                being problematic. Some Desktop Environments automatically mount MTP\n                                                devices, which in turn causes WinBoat to not be able to pass the device\n                                                through.\n                                            </span>\n                                        </span>\n\n                                        <span v-if=\"!usbManager.isPTDeviceConnected(device)\" class=\"relative group\">\n                                            <Icon\n                                                icon=\"ix:connection-fail\"\n                                                class=\"text-red-500 size-7 cursor-pointer\"\n                                            />\n                                            <span\n                                                class=\"absolute bottom-5 z-50 w-[320px] bg-neutral-800/90 backdrop-blur-sm text-xs text-gray-300 rounded-lg shadow-lg px-3 py-2 hidden group-hover:block transition-opacity duration-200 pointer-events-none\"\n                                            >\n                                                This device is currently not connected.\n                                            </span>\n                                        </span>\n\n                                        <p class=\"text-base !m-0 text-gray-200\">\n                                            {{ usbManager.stringifyPTSerializableDevice(device) }}\n                                        </p>\n                                    </div>\n                                    <x-button\n                                        @click=\"removeDevice(device)\"\n                                        class=\"mt-1 !bg-gradient-to-tl from-red-500/20 to-transparent hover:from-red-500/30 transition !border-0\"\n                                    >\n                                        <x-icon href=\"#remove\"></x-icon>\n                                    </x-button>\n                                </x-card>\n                            </TransitionGroup>\n                            <x-button\n                                v-if=\"availableDevices.length > 0\"\n                                class=\"!bg-gradient-to-tl from-blue-400/20 shadow-md shadow-blue-950/20 to-transparent hover:from-blue-400/30 transition\"\n                                :class=\"{ 'mt-4': usbManager.ptDevices.value.length }\"\n                                @click=\"refreshAvailableDevices()\"\n                            >\n                                <x-icon href=\"#add\"></x-icon>\n                                <x-label>Add Device</x-label>\n                                <TransitionGroup ref=\"usbMenu\" name=\"menu\" tag=\"x-menu\" class=\"max-h-52\">\n                                    <x-menuitem\n                                        v-for=\"(device, k) of availableDevices as Device[]\"\n                                        :key=\"device.portNumbers.join(',')\"\n                                        @click=\"addDevice(device)\"\n                                    >\n                                        <x-label>{{ usbManager.stringifyDevice(device) }}</x-label>\n                                    </x-menuitem>\n                                    <x-menuitem v-if=\"availableDevices.length === 0\" disabled>\n                                        <x-label>No available devices</x-label>\n                                    </x-menuitem>\n                                </TransitionGroup>\n                            </x-button>\n                        </template>\n                    </div>\n                </x-card>\n            </div>\n        </div>\n        <div v-show=\"wbConfig.config.advancedFeatures\">\n            <x-label class=\"mb-4 text-neutral-300\">FreeRDP</x-label>\n            <div class=\"flex flex-col gap-4\">\n                <!-- RDP args -->\n                <x-card\n                    class=\"flex flex-row justify-between items-center p-2 py-3 my-0 w-full backdrop-blur-xl backdrop-brightness-150 bg-neutral-800/20\"\n                >\n                    <div class=\"w-full\">\n                        <div class=\"flex flex-row gap-2 items-center mb-2\">\n                            <Icon class=\"inline-flex text-violet-400 size-8\" icon=\"fluent:tv-24-filled\"></Icon>\n                            <h1 class=\"my-0 text-lg font-semibold\">\n                                FreeRDP Arguments\n                                <span class=\"bg-blue-500 rounded-full px-3 py-0.5 text-sm ml-2\"> Advanced </span>\n                            </h1>\n                        </div>\n\n                        <x-label\n                            v-if=\"wbConfig.config.rdpArgs.length == 0\"\n                            class=\"text-neutral-400 text-[0.9rem] !pt-0 !mt-0\"\n                        >\n                            Press the buttons below to add arguments to FreeRDP, you can choose to either add a new\n                            argument or modify an existing one to your liking via replacement\n                        </x-label>\n                        <TransitionGroup name=\"devices\" tag=\"x-box\" class=\"flex-col gap-2 mt-4\">\n                            <x-card\n                                class=\"flex justify-between items-center gap-2 px-2 py-0 m-0 bg-white/5\"\n                                v-for=\"(arg, index) in wbConfig.config.rdpArgs\"\n                                :key=\"index\"\n                            >\n                                <div class=\"grid grid-cols-2 gap-2 items-center w-full\">\n                                    <x-input\n                                        type=\"text\"\n                                        class=\"!max-w-full\"\n                                        v-if=\"arg.isReplacement\"\n                                        :value=\"arg.original\"\n                                        @input=\"(e: any) => (arg.original = e.target.value)\"\n                                    >\n                                        <x-label>Original Argument</x-label>\n                                    </x-input>\n                                    <x-input\n                                        type=\"text\"\n                                        class=\"!max-w-full !mt-0\"\n                                        :class=\"{ 'col-span-2': !arg.isReplacement }\"\n                                        :value=\"arg.newArg\"\n                                        @input=\"(e: any) => (arg.newArg = e.target.value)\"\n                                    >\n                                        <x-label>New Argument</x-label>\n                                    </x-input>\n                                </div>\n                                <x-button\n                                    class=\"mt-1 !bg-gradient-to-tl from-red-500/20 to-transparent hover:from-red-500/30 transition !border-0\"\n                                    @click=\"wbConfig.config.rdpArgs.splice(index, 1)\"\n                                >\n                                    <x-icon href=\"#remove\"></x-icon>\n                                </x-button>\n                            </x-card>\n                        </TransitionGroup>\n                        <div class=\"flex flex-row gap-2\" :class=\"{ 'mt-4': wbConfig.config.rdpArgs.length }\">\n                            <x-button\n                                class=\"!bg-gradient-to-tl from-blue-400/20 shadow-md shadow-blue-950/20 to-transparent hover:from-blue-400/30 transition\"\n                                @click=\"wbConfig.config.rdpArgs.push({ newArg: '', isReplacement: false })\"\n                            >\n                                <x-icon href=\"#add\"></x-icon>\n                                <x-label>Add Argument</x-label>\n                            </x-button>\n                            <x-button\n                                class=\"!bg-gradient-to-tl from-yellow-400/20 shadow-md shadow-yellow-950/20 to-transparent hover:from-yellow-400/30 transition\"\n                                @click=\"wbConfig.config.rdpArgs.push({ newArg: '', original: '', isReplacement: true })\"\n                            >\n                                <Icon class=\"inline-flex size-6\" icon=\"codex:replace\" />\n                                <x-label>Replace Argument</x-label>\n                            </x-button>\n                        </div>\n                    </div>\n                </x-card>\n            </div>\n        </div>\n        <div>\n            <x-label class=\"mb-4 text-neutral-300\">General</x-label>\n            <div class=\"flex flex-col gap-4\">\n                <!-- Display Scaling -->\n                <ConfigCard\n                    class=\"relative z-10\"\n                    icon=\"uil:scaling-right\"\n                    title=\"Display Scaling\"\n                    desc=\"Controls how large the display scaling is.\"\n                    type=\"dropdown\"\n                    unit=\"%\"\n                    :options=\"[Number(100), 140, 180]\"\n                    v-model:value=\"wbConfig.config.scale\"\n                />\n\n                <!-- Application Scaling -->\n                <ConfigCard\n                    icon=\"uil:apps\"\n                    title=\"Application Scaling\"\n                    desc=\"Controls how large the application scaling is..\"\n                    type=\"number\"\n                    :step=\"10\"\n                    :min=\"100\"\n                    :max=\"500\"\n                    v-model:value=\"wbConfig.config.scaleDesktop\"\n                />\n\n                <!-- Multi Monitor -->\n                <ConfigCard\n                    class=\"relative z-10\"\n                    icon=\"uil:monitor\"\n                    title=\"Multi-Monitor Support\"\n                    type=\"dropdown\"\n                    :options=\"Object.values(MultiMonitorMode)\"\n                    v-model:value=\"wbConfig.config.multiMonitor\"\n                >\n                    <template v-slot:desc>\n                        Controls how multiple monitors are handled. MultiMon creates separate displays for each\n                        monitor, while Span stretches the display across all monitors. Note: Span or MultiMon may\n                        work better depending on your setup.\n                    </template>\n                </ConfigCard>\n\n                <!-- Smartcard Passthrough -->\n                <ConfigCard\n                    icon=\"game-icons:swipe-card\"\n                    title=\"Smartcard Passthrough\"\n                    desc=\"If enabled, your smartcard readers will be passed to Windows when you start an app\"\n                    type=\"switch\"\n                    v-model:value=\"wbConfig.config.smartcardEnabled\"\n                >\n                </ConfigCard>\n\n                <!-- RDP Monitoring -->\n                <ConfigCard\n                    icon=\"fluent:remote-16-filled\"\n                    title=\"RDP Monitoring\"\n                    desc=\"If enabled, a banner will appear when the RDP session is connected (may cause high CPU usage, disable if you notice performance issues)\"\n                    type=\"switch\"\n                    v-model:value=\"wbConfig.config.rdpMonitoringEnabled\"\n                />\n            </div>\n        </div>\n\n        <div>\n            <x-label class=\"mb-4 text-neutral-300\">WinBoat</x-label>\n\n            <div class=\"flex flex-col gap-4\">\n                <!-- Experimental Features -->\n                <ConfigCard\n                    icon=\"streamline-ultimate:lab-tube-experiment\"\n                    title=\"Experimental Features\"\n                    desc=\"If enabled, you'll have access to experimental features that may not be stable or complete\"\n                    type=\"switch\"\n                    v-model:value=\"wbConfig.config.experimentalFeatures\"\n                    @toggle=\"toggleExperimentalFeatures\"\n                />\n\n                <!-- Advanced Settings -->\n                <ConfigCard\n                    icon=\"mdi:administrator\"\n                    title=\"Advanced Settings\"\n                    desc=\"If enabled, you'll have access to advanced settings that may prevent WinBoat from working if misconfigured\"\n                    type=\"switch\"\n                    v-model:value=\"wbConfig.config.advancedFeatures\"\n                />\n\n                <!-- Disable Animations -->\n                <ConfigCard\n                    icon=\"mdi:animation-outline\"\n                    title=\"Disable Animations\"\n                    desc=\"If enabled, all animations in the UI will be disabled (useful when GPU acceleration isn't working well)\"\n                    type=\"switch\"\n                    v-model:value=\"wbConfig.config.disableAnimations\"\n                />\n            </div>\n        </div>\n\n        <div>\n            <x-label class=\"mb-4 text-neutral-300\">Danger Zone</x-label>\n            <x-card class=\"flex flex-col py-3 my-0 mb-6 w-full backdrop-blur-xl backdrop-brightness-150 bg-red-500/10\">\n                <h1 class=\"my-0 text-lg font-normal text-red-300\">\n                    ⚠️ <span class=\"font-bold\">WARNING:</span> All actions here are potentially destructive, proceed at\n                    your own caution!\n                </h1>\n            </x-card>\n            <div></div>\n            <x-button\n                class=\"!bg-red-800/20 px-4 py-1 !border-red-500/10 generic-hover flex flex-row items-center gap-2 !text-red-300\"\n                @click=\"resetWinboat()\"\n                :disabled=\"isResettingWinboat\"\n            >\n                <Icon v-if=\"resetQuestionCounter < 3\" icon=\"mdi:bomb\" class=\"size-8\"></Icon>\n                <x-throbber v-else class=\"size-8\"></x-throbber>\n\n                <span v-if=\"resetQuestionCounter === 0\">Reset Winboat & Remove VM</span>\n                <span v-else-if=\"resetQuestionCounter === 1\">Are you sure? This action cannot be undone.</span>\n                <span v-else-if=\"resetQuestionCounter === 2\">One final check, are you ABSOLUTELY sure?</span>\n                <span v-else-if=\"resetQuestionCounter === 3\">Resetting Winboat...</span>\n            </x-button>\n        </div>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport ConfigCard from \"../components/ConfigCard.vue\";\nimport { computed, onMounted, ref, watch, reactive } from \"vue\";\nimport { computedAsync } from \"@vueuse/core\";\nimport { Winboat } from \"../lib/winboat\";\nimport { ContainerRuntimes, ContainerStatus } from \"../lib/containers/common\";\nimport type { ComposeConfig } from \"../../types\";\nimport { getSpecs } from \"../lib/specs\";\nimport { Icon } from \"@iconify/vue\";\nimport { MultiMonitorMode, RdpArg, WinboatConfig } from \"../lib/config\";\nimport { USBManager, type PTSerializableDeviceInfo } from \"../lib/usbmanager\";\nimport { type Device } from \"usb\";\nimport {\n    USB_VID_BLACKLIST,\n    RESTART_ON_FAILURE,\n    RESTART_NO,\n    GUEST_RDP_PORT,\n    GUEST_QMP_PORT,\n} from \"../lib/constants\";\nimport { ComposePortEntry, ComposePortMapper, Range } from \"../utils/port\";\nconst { app }: typeof import(\"@electron/remote\") = require(\"@electron/remote\");\nconst electron: typeof import(\"electron\") = require(\"electron\").remote || require(\"@electron/remote\");\nconst os: typeof import(\"os\") = require(\"node:os\");\n\n// For Resources\nconst compose = ref<ComposeConfig | null>(null);\nconst numCores = ref(0);\nconst origNumCores = ref(0);\nconst maxNumCores = ref(0);\nconst ramGB = ref(0);\nconst origRamGB = ref(0);\nconst maxRamGB = ref(0);\nconst shareFolder = ref(false);\nconst origShareFolder = ref(false);\nconst sharedFolderPath = ref(\"\");\nconst origSharedFolderPath = ref(\"\");\nconst origAutoStartContainer = ref(false);\nconst autoStartContainer = ref(false);\nconst freerdpPort = ref(0);\nconst origFreerdpPort = ref(0);\nconst isApplyingChanges = ref(false);\nconst resetQuestionCounter = ref(0);\nconst isResettingWinboat = ref(false);\nconst isUpdatingUSBPrerequisites = ref(false);\n\n// For USB Devices\nconst availableDevices = ref<Device[]>([]);\n\n// For handling the QMP port, as we can't rely on the winboat instance doing this for us.\n// A great example is when the container is offline. In that case, winboat's portManager isn't instantiated.\nlet portMapper = ref<ComposePortMapper | null>(null);\n// ^ Has to be reactive for usbPassthroughDisabled computed to trigger.\n\n// For General\nconst wbConfig = reactive(WinboatConfig.getInstance());\nconst winboat = Winboat.getInstance();\nconst usbManager = USBManager.getInstance();\n\n// Constants\nconst USB_BUS_PATH = \"/dev/bus/usb:/dev/bus/usb\";\nconst QMP_ARGUMENT = \"-qmp tcp:0.0.0.0:7149,server,wait=off\"; // 7149 can remain hardcoded as it refers to a guest port\n\nonMounted(async () => {\n    await assignValues();\n});\n\n/**\n * Assigns the initial values from the Compose file to the reactive refs\n * so we can display them and track when a change has been made\n */\nasync function assignValues() {\n    compose.value = Winboat.readCompose(winboat.containerMgr!.composeFilePath);\n    portMapper.value = new ComposePortMapper(compose.value);\n\n    numCores.value = Number(compose.value.services.windows.environment.CPU_CORES);\n    origNumCores.value = numCores.value;\n\n    ramGB.value = Number(compose.value.services.windows.environment.RAM_SIZE.split(\"G\")[0]);\n    origRamGB.value = ramGB.value;\n\n    // Find any volume that ends with /shared\n    const sharedVolume = compose.value.services.windows.volumes.find(v => v.includes(\"/shared\"));\n    if (sharedVolume) {\n        shareFolder.value = true;\n        // Extract the path before :/shared\n        const [hostPath] = sharedVolume.split(\":\");\n        sharedFolderPath.value = hostPath.replace(\"${HOME}\", os.homedir());\n    } else {\n        shareFolder.value = false;\n        sharedFolderPath.value = \"\";\n    }\n    origShareFolder.value = shareFolder.value;\n    origSharedFolderPath.value = sharedFolderPath.value;\n\n    autoStartContainer.value = compose.value.services.windows.restart === RESTART_ON_FAILURE;\n    origAutoStartContainer.value = autoStartContainer.value;\n\n    freerdpPort.value = (portMapper.value.getShortPortMapping(GUEST_RDP_PORT)?.host as number) ?? GUEST_RDP_PORT;\n    origFreerdpPort.value = freerdpPort.value;\n\n    const specs = await getSpecs();\n    maxRamGB.value = specs.ramGB;\n    maxNumCores.value = specs.cpuCores;\n\n    refreshAvailableDevices();\n}\n\n/**\n * Saves the currently specified values to the Compose file\n * and then re-assigns the initial values to the reactive refs\n */\nasync function saveCompose() {\n    compose.value!.services.windows.environment.RAM_SIZE = `${ramGB.value}G`;\n    compose.value!.services.windows.environment.CPU_CORES = `${numCores.value}`;\n\n    // Remove any existing shared volume\n    const existingSharedVolume = compose.value!.services.windows.volumes.find(v => v.includes(\"/shared\"));\n    if (existingSharedVolume) {\n        compose.value!.services.windows.volumes = compose.value!.services.windows.volumes.filter(\n            v => !v.includes(\"/shared\"),\n        );\n    }\n\n    // Add the new shared volume if enabled\n    if (shareFolder.value && sharedFolderPath.value) {\n        const volumeStr = `${sharedFolderPath.value}:/shared`;\n        compose.value!.services.windows.volumes.push(volumeStr);\n    }\n\n    compose.value!.services.windows.restart = autoStartContainer.value ? RESTART_ON_FAILURE : RESTART_NO;\n\n    portMapper.value!.setShortPortMapping(GUEST_RDP_PORT, freerdpPort.value, {\n        protocol: \"tcp\",\n        hostIP: \"127.0.0.1\",\n    });\n\n    portMapper.value!.setShortPortMapping(GUEST_RDP_PORT, freerdpPort.value, {\n        protocol: \"udp\",\n        hostIP: \"127.0.0.1\",\n    });\n\n    compose.value!.services.windows.ports = portMapper.value!.composeFormat;\n\n    isApplyingChanges.value = true;\n    try {\n        await winboat.replaceCompose(compose.value!);\n        await assignValues();\n    } catch (e) {\n        console.error(\"Failed to apply changes\");\n        console.error(e);\n    } finally {\n        isApplyingChanges.value = false;\n    }\n}\n\n/**\n * Opens a dialog to select a folder to share with Windows\n */\nfunction selectSharedFolder() {\n    electron.dialog\n        .showOpenDialog({\n            title: \"Select Folder to Share\",\n            properties: [\"openDirectory\"],\n            defaultPath: sharedFolderPath.value || os.homedir(),\n        })\n        .then(result => {\n            if (!result.canceled && result.filePaths.length > 0) {\n                sharedFolderPath.value = result.filePaths[0];\n            }\n        });\n}\n\n/**\n * Adds the required fields for USB passthrough to work\n * to the Compose file if they don't already exist\n */\nasync function addRequiredComposeFieldsUSB() {\n    if (!usbPassthroughDisabled.value) {\n        return;\n    }\n\n    isUpdatingUSBPrerequisites.value = true;\n    await winboat.stopContainer();\n\n    if (!hasUsbVolume(compose)) {\n        compose.value!.services.windows.volumes.push(USB_BUS_PATH);\n    }\n    if (!hasQmpPort()) {\n        const composePorts = winboat.containerMgr!.defaultCompose.services.windows.ports;\n        const portEntries = composePorts.filter(x => typeof x === \"string\").map(x => new ComposePortEntry(x));\n        const QMPPredicate = (entry: ComposePortEntry) =>\n            (entry.host instanceof Range || Number.isNaN(entry.host)) && // We allow NaN in case the QMP port entry isn't already there on podman for whatever reason\n            typeof entry.container === \"number\" &&\n            entry.container === GUEST_QMP_PORT;\n        const QMPPort = portEntries.find(QMPPredicate)!.host;\n\n        portMapper.value!.setShortPortMapping(GUEST_QMP_PORT, QMPPort, {\n            protocol: \"tcp\",\n            hostIP: \"127.0.0.1\",\n        });\n    }\n\n    if (!compose.value!.services.windows.environment.ARGUMENTS) {\n        compose.value!.services.windows.environment.ARGUMENTS = \"\";\n    }\n    if (!hasQmpArgument(compose)) {\n        compose.value!.services.windows.environment.ARGUMENTS += `\\n${QMP_ARGUMENT}`;\n    }\n\n    if (!compose.value!.services.windows.environment.HOST_PORTS) {\n        compose.value!.services.windows.environment.HOST_PORTS = \"\";\n    }\n    if (!hasHostPort(compose)) {\n        const delimiter = compose.value!.services.windows.environment.HOST_PORTS.length == 0 ? \"\" : \",\";\n        compose.value!.services.windows.environment.HOST_PORTS += delimiter + GUEST_QMP_PORT;\n    }\n\n    await saveCompose();\n\n    isUpdatingUSBPrerequisites.value = false;\n}\n\nconst errors = computedAsync(async () => {\n    let errCollection: string[] = [];\n\n    if (!numCores.value || numCores.value < 2) {\n        errCollection.push(\"You must allocate at least two CPU cores for Windows to run properly\");\n    }\n\n    if (numCores.value > maxNumCores.value) {\n        errCollection.push(\"You cannot allocate more CPU cores to Windows than you have available\");\n    }\n\n    if (!ramGB.value || ramGB.value < 4) {\n        errCollection.push(\"You must allocate at least 4 GB of RAM for Windows to run properly\");\n    }\n\n    if (ramGB.value > maxRamGB.value) {\n        errCollection.push(\"You cannot allocate more RAM to Windows than you have available\");\n    }\n\n    if (\n        freerdpPort.value !== origFreerdpPort.value &&\n        !Number.isNaN(freerdpPort.value) &&\n        !(await ComposePortMapper.isPortOpen(freerdpPort.value))\n    ) {\n        errCollection.push(\"You must choose an open port for your FreeRDP port!\");\n    }\n\n    return errCollection;\n});\n\nconst hasUsbVolume = (_compose: typeof compose) =>\n    _compose.value?.services.windows.volumes?.some(x => x.includes(USB_BUS_PATH));\nconst hasQmpArgument = (_compose: typeof compose) =>\n    _compose.value?.services.windows.environment.ARGUMENTS?.includes(QMP_ARGUMENT);\nconst hasQmpPort = () => portMapper.value!.hasShortPortMapping(GUEST_QMP_PORT) ?? false;\nconst hasHostPort = (_compose: typeof compose) =>\n    _compose.value?.services.windows.environment.HOST_PORTS?.includes(GUEST_QMP_PORT.toString());\n\nconst usbPassthroughDisabled = computed(() => {\n    return !hasUsbVolume(compose) || !hasQmpArgument(compose) || !hasQmpPort() || !hasHostPort(compose);\n});\n\nconst saveButtonDisabled = computed(() => {\n    const hasResourceChanges =\n        origNumCores.value !== numCores.value ||\n        origRamGB.value !== ramGB.value ||\n        shareFolder.value !== origShareFolder.value ||\n        sharedFolderPath.value !== origSharedFolderPath.value ||\n        (!Number.isNaN(freerdpPort.value) && freerdpPort.value !== origFreerdpPort.value) ||\n        autoStartContainer.value !== origAutoStartContainer.value;\n\n    const shouldBeDisabled = errors.value?.length || !hasResourceChanges || isApplyingChanges.value;\n\n    return shouldBeDisabled;\n});\n\nasync function resetWinboat() {\n    if (++resetQuestionCounter.value < 3) {\n        return;\n    }\n\n    isResettingWinboat.value = true;\n    await winboat.resetWinboat();\n    app.exit();\n}\n\n// Reactivity utterly fails here, so we use this function to\n// refresh via the button\nfunction refreshAvailableDevices() {\n    availableDevices.value = usbManager.devices.value.filter(device => {\n        return (\n            !usbManager.isDeviceInPassthroughList(device) &&\n            !USB_VID_BLACKLIST.some(x => usbManager.stringifyDevice(device).includes(x))\n        );\n    });\n    console.info(\"[Available Devices] Debug\", availableDevices.value);\n}\n\nfunction addDevice(device: Device): void {\n    try {\n        usbManager.addDeviceToPassthroughList(device);\n        refreshAvailableDevices();\n    } catch (error) {\n        console.error(\"Failed to add device to passthrough list:\", error);\n    }\n}\n\nfunction removeDevice(ptDevice: PTSerializableDeviceInfo): void {\n    try {\n        usbManager.removeDeviceFromPassthroughList(ptDevice);\n        refreshAvailableDevices();\n    } catch (error) {\n        console.error(\"Failed to remove device from passthrough list:\", error);\n    }\n}\n\nasync function toggleExperimentalFeatures() {\n    // Remove all passthrough USB devices if we're disabling experimental features\n    // since USB passthrough is an experimental feature\n    if (!wbConfig.config.experimentalFeatures) {\n        await usbManager.removeAllPassthroughDevicesAndConfig();\n\n        // Create the QMP interval if experimental features are enabled\n        // This would get created by default since we're changing the compose and re-deploying,\n        // but a scenario could also occur where the user is re-enabling experimental features\n        // after the compose changes, which then would cause a bug\n        // TODO: Remove after USB passthrough is no longer experimental\n    } else if (winboat.containerStatus.value == ContainerStatus.RUNNING && !winboat.hasQMPInterval) {\n        console.log(\"Creating QMP interval because experimental features were turned on\");\n        winboat.createQMPInterval();\n    }\n}\n\n// Watch for when shared folder is enabled and set default path\nwatch(shareFolder, (newValue) => {\n    if (newValue && !sharedFolderPath.value) {\n        sharedFolderPath.value = os.homedir();\n    }\n});\n</script>\n\n<style scoped>\n.devices-move,\n.devices-enter-active,\n.devices-leave-active,\n.menu-move,\n.menu-enter-active,\n.menu-leave-active {\n    transition: all 0.5s ease;\n}\n\n.devices-enter-from,\n.devices-leave-to {\n    opacity: 0;\n    transform: translateX(30px);\n}\n\n.devices-leave-active,\n.menu-leave-active {\n    position: absolute;\n}\n\n.menu-enter-from,\n.menu-leave-to {\n    opacity: 0;\n    transform: translateX(20px) scale(0.9);\n}\n</style>\n"
  },
  {
    "path": "src/renderer/views/Home.vue",
    "content": "<template>\n    <div>\n        <x-card\n            class=\"bg-neutral-800/20 backdrop-brightness-150 backdrop-blur-xl flex flex-row items-center justify-between\"\n        >\n            <div class=\"flex flex-row gap-4 items-center\">\n                <div class=\"border-[0.4rem] border-gray-900/30 rounded-md\">\n                    <img class=\"h-32 rounded-sm\" :src=\"wallpaper\" alt=\"Windows Wallpaper\" />\n                </div>\n\n                <!-- Status Text -->\n                <div>\n                    <div class=\"flex flex-row gap-2 items-center justify-center mb-6 *:m-0\">\n                        <h1 class=\"text-3xl\">\n                            {{ WINDOWS_VERSIONS[compose?.services.windows.environment.VERSION ?? \"11\"] ?? \"Unknown\" }}\n                        </h1>\n                        <p class=\"bg-purple-500 px-4 rounded-full text-lg font-semibold !m-0\">\n                            {{ capitalizeFirstLetter(winboat.containerMgr!.executableAlias) }}\n                        </p>\n                    </div>\n\n                    <div\n                        class=\"flex flex-row items-center gap-1.5 mb-1\"\n                        :class=\"{ 'text-green-500': winboat.isOnline.value, 'text-red-500': !winboat.isOnline.value }\"\n                    >\n                        <Icon class=\"size-7\" icon=\"material-symbols:api\"></Icon>\n                        <p class=\"!my-0 font-semibold text-lg\">\n                            WinBoat Guest API -\n                            {{ winboat.isOnline.value ? \"Online\" : \"Offline\" }}\n                            <a\n                                v-if=\"!winboat.isOnline.value\"\n                                title=\"Get Help\"\n                                href=\"https://rentry.org/winboat_guest_server_borked\"\n                                @click=\"openAnchorLink\"\n                                class=\"text-red-400 hover:text-red-500 hover:underline inline-flex translate-y-1 transition\"\n                            >\n                                <Icon icon=\"mingcute:question-fill\" class=\"size-6 pointer-events-none\"></Icon>\n                            </a>\n                        </p>\n                    </div>\n\n                    <div\n                        class=\"flex flex-row items-center gap-1.5\"\n                        :class=\"{\n                            'text-green-500': winboat.containerStatus.value === ContainerStatus.RUNNING,\n                            'text-red-500': winboat.containerStatus.value === ContainerStatus.EXITED,\n                            'text-yellow-500': winboat.containerStatus.value === ContainerStatus.PAUSED,\n                            'text-orange-500': winboat.containerStatus.value === ContainerStatus.UNKNOWN,\n                            'text-gray-500': winboat.containerStatus.value === ContainerStatus.CREATED,\n                        }\"\n                    >\n                        <Icon class=\"size-7 scale-90\" icon=\"octicon:container-16\"></Icon>\n                        <p class=\"!my-0 font-semibold text-lg\">\n                            Container - {{ capitalizeFirstLetter(winboat.containerStatus.value) }}\n                        </p>\n                    </div>\n                </div>\n            </div>\n\n            <!-- Buttons -->\n            <div v-if=\"!winboat.containerActionLoading.value\" class=\"flex flex-row items-center gap-5 text-gray-200/80\">\n                <button\n                    title=\"Start\"\n                    class=\"generic-hover\"\n                    v-if=\"\n                        winboat.containerStatus.value === ContainerStatus.EXITED ||\n                        winboat.containerStatus.value === ContainerStatus.CREATED ||\n                        winboat.containerStatus.value === ContainerStatus.UNKNOWN\n                    \"\n                    @click=\"winboat.startContainer()\"\n                >\n                    <Icon class=\"w-20 h-20 text-green-300\" icon=\"mingcute:play-fill\"></Icon>\n                </button>\n                <button\n                    title=\"Stop\"\n                    class=\"generic-hover\"\n                    v-if=\"winboat.containerStatus.value === ContainerStatus.RUNNING\"\n                    @click=\"winboat.stopContainer()\"\n                >\n                    <Icon class=\"w-20 h-20 text-red-300\" icon=\"mingcute:stop-fill\"></Icon>\n                </button>\n                <button\n                    title=\"Restart\"\n                    class=\"generic-hover\"\n                    v-if=\"winboat.containerStatus.value === ContainerStatus.RUNNING\"\n                    @click=\"winboat.restartContainer()\"\n                >\n                    <Icon class=\"w-20 h-20 text-orange-300\" icon=\"mingcute:refresh-3-line\"></Icon>\n                </button>\n\n                <button\n                    title=\"Pause / Unpause\"\n                    class=\"generic-hover\"\n                    v-if=\"\n                        winboat.containerStatus.value === ContainerStatus.RUNNING ||\n                        winboat.containerStatus.value === ContainerStatus.PAUSED\n                    \"\n                    @click=\"\n                        winboat.containerStatus.value === ContainerStatus.PAUSED\n                            ? winboat.unpauseContainer()\n                            : winboat.pauseContainer()\n                    \"\n                >\n                    <Icon class=\"w-20 h-20 text-yellow-100\" icon=\"mingcute:pause-line\"></Icon>\n                </button>\n            </div>\n\n            <div v-else>\n                <x-throbber class=\"w-16 h-16\"></x-throbber>\n            </div>\n        </x-card>\n\n        <!-- Metrics -->\n        <div\n            class=\"grid grid-cols-3 w-full gap-8 transition-all duration-200\"\n            :class=\"{ 'blur-sm opacity-50': !winboat.isOnline.value }\"\n        >\n            <x-card class=\"bg-neutral-800/20 backdrop-brightness-150 backdrop-blur-xl flex flex-row gap-2 pl-0 my-0\">\n                <apexchart\n                    class=\"translate-y-2\"\n                    type=\"radialBar\"\n                    :options=\"chartOptions\"\n                    :series=\"[winboat.metrics.value.cpu.usage]\"\n                    :width=\"120\"\n                    :height=\"120\"\n                />\n                <div>\n                    <div class=\"flex flex-row gap-2 items-center mb-2\">\n                        <Icon class=\"size-8 text-violet-400\" icon=\"solar:cpu-bold\"></Icon>\n                        <h2 class=\"my-0 text-2xl\">CPU</h2>\n                    </div>\n                    <p class=\"!my-0 text-gray-400 h-6 overflow-hidden\">\n                        {{ compose?.services.windows.environment.CPU_CORES }} Virtual Cores\n                    </p>\n                    <p class=\"!my-0 text-gray-400 h-6 overflow-hidden\">\n                        Frequency: {{ (winboat.metrics.value.cpu.frequency / 1000).toFixed(2) }} GHz\n                    </p>\n                </div>\n            </x-card>\n            <x-card class=\"bg-neutral-800/20 backdrop-brightness-150 backdrop-blur-xl flex flex-row gap-2 pl-0 my-0\">\n                <apexchart\n                    class=\"translate-y-2\"\n                    type=\"radialBar\"\n                    :options=\"chartOptions\"\n                    :series=\"[winboat.metrics.value.ram.percentage]\"\n                    :width=\"120\"\n                    :height=\"120\"\n                />\n                <div>\n                    <div class=\"flex flex-row gap-2 items-center mb-2\">\n                        <Icon class=\"size-8 text-violet-400\" icon=\"game-icons:ram\"></Icon>\n                        <h2 class=\"my-0 text-2xl\">RAM</h2>\n                    </div>\n                    <p class=\"!my-0 text-gray-400 h-6 overflow-hidden\">\n                        {{ Math.round(winboat.metrics.value.ram.total / 1024).toFixed(2) }} GB Total RAM\n                    </p>\n                    <p class=\"!my-0 text-gray-400 h-6 overflow-hidden\">\n                        {{ (winboat.metrics.value.ram.used / 1024).toFixed(2) }} GB Used RAM\n                    </p>\n                </div>\n            </x-card>\n            <x-card class=\"bg-neutral-800/20 backdrop-brightness-150 backdrop-blur-xl flex flex-row gap-2 pl-0 my-0\">\n                <apexchart\n                    class=\"translate-y-2\"\n                    type=\"radialBar\"\n                    :options=\"chartOptions\"\n                    :series=\"[winboat.metrics.value.disk.percentage]\"\n                    :width=\"120\"\n                    :height=\"120\"\n                />\n                <div>\n                    <div class=\"flex flex-row gap-2 items-center mb-2\">\n                        <Icon class=\"size-8 text-violet-400\" icon=\"carbon:vmdk-disk\"></Icon>\n                        <h2 class=\"my-0 text-2xl\">Disk</h2>\n                    </div>\n                    <p class=\"!my-0 text-gray-400 h-6 overflow-hidden\">\n                        {{ (winboat.metrics.value.disk.total / 1024).toFixed(2) }} GB Total Disk Space\n                    </p>\n                    <p class=\"!my-0 text-gray-400 h-6 overflow-hidden\">\n                        {{ (winboat.metrics.value.disk.used / 1024).toFixed(2) }} GB Used Space\n                    </p>\n                </div>\n            </x-card>\n        </div>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { onMounted, ref } from \"vue\";\nimport { Winboat } from \"../lib/winboat\";\nimport { ContainerStatus } from \"../lib/containers/common\";\nimport { type ComposeConfig } from \"../../types\";\nimport { WINDOWS_VERSIONS } from \"../lib/constants\";\nimport { Icon } from \"@iconify/vue\";\nimport { capitalizeFirstLetter } from \"../utils/capitalize\";\nimport { openAnchorLink } from \"../utils/openLink\";\n\nconst winboat = Winboat.getInstance();\nconst compose = ref<ComposeConfig | null>(null);\nconst wallpaper = ref(\"\");\n\nonMounted(async () => {\n    compose.value = Winboat.readCompose(winboat.containerMgr!.composeFilePath);\n    wallpaper.value = compose.value?.services.windows.environment.VERSION.includes(\"11\")\n        ? \"./img/wallpaper/win11.webp\"\n        : \"./img/wallpaper/win10.webp\";\n\n    // Highlight the navitem for the home page, since by default no\n    // navitem is highlighted and we can't use `toggled`\n    document.querySelector<HTMLButtonElement>(\"x-navitem\")?.click();\n});\n\nconst chartOptions = ref({\n    chart: {\n        type: \"radialBar\",\n        offsetY: -20,\n        sparkline: {\n            enabled: true,\n        },\n        width: 100,\n        height: 100,\n    },\n    plotOptions: {\n        radialBar: {\n            startAngle: -135,\n            endAngle: 135,\n            track: {\n                background: \"#18181b\", // Unfilled section color\n                strokeWidth: \"97%\",\n                margin: 5,\n                // dropShadow: {\n                //     enabled: true,\n                //     top: 2,\n                //     left: 0,\n                //     color: '#444',\n                //     opacity: 1,\n                //     blur: 2\n                // }\n            },\n            dataLabels: {\n                name: {\n                    show: false,\n                },\n                value: {\n                    offsetY: 2,\n                    fontSize: \"12px\",\n                    color: \"#FFFFFF\",\n                    formatter: function (val: number) {\n                        return val.toFixed(1) + \"%\"; // Fixed to 1 decimal place\n                    },\n                },\n            },\n        },\n    },\n    grid: {\n        padding: {\n            top: -10,\n        },\n    },\n    fill: {\n        type: \"solid\", // Switched from gradient to solid\n        colors: [\"#A78AF9\"], // Nice purple for the filled section\n    },\n    labels: [\"Average Results\"],\n});\n</script>\n"
  },
  {
    "path": "src/renderer/views/Migration.vue",
    "content": "<template>\n    <div class=\"flex flex-col gap-2 justify-center items-center mt-12\">\n        <div id=\"stepIcon\" class=\"flex items-center justify-center relative size-[30rem]\">\n            <Icon key=\"icon1\" class=\"size-[60%] text-violet-400 z-30 relative\" :icon=\"currentIcon\" />\n            <Icon\n                key=\"icon-gradient\"\n                class=\"size-[60%] text-violet-400 brightness-75 z-20 absolute top-[50%] translate-y-[-50%] blur-2xl\"\n                :icon=\"currentIcon\"\n            />\n            <Icon\n                key=\"icon2\"\n                class=\"size-[60%] text-violet-400 brightness-75 z-20 absolute top-[51.5%] translate-y-[-50%] translate-x-[1.5%]\"\n                :icon=\"currentIcon\"\n            />\n            <Icon\n                key=\"icon3\"\n                class=\"size-[60%] text-violet-400 brightness-50 z-10 absolute top-[53%] translate-y-[-50%] translate-x-[3%]\"\n                :icon=\"currentIcon\"\n            />\n        </div>\n        <h3 class=\"mt-2\">\n            Performing Migrations\n            <div class=\"loader inline-block translate-y-1\"></div>\n        </h3>\n        <p class=\"text-gray-400 max-w-[40vw] text-center\">\n            Please wait while we migrate your existing WinBoat configuration to ensure compatibility with the latest\n            version.\n        </p>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { Icon } from \"@iconify/vue\";\nimport { ref } from \"vue\";\n\nconst currentIcon = ref(\"line-md:cloud-alt-print-loop\");\n</script>\n\n<style scoped>\n.loader {\n    width: 30px;\n    aspect-ratio: 2;\n    --_g: no-repeat radial-gradient(circle closest-side, rgb(255, 255, 255) 90%, #0000);\n    background:\n        var(--_g) 0% 50%,\n        var(--_g) 50% 50%,\n        var(--_g) 100% 50%;\n    background-size: calc(100% / 3) 50%;\n    animation: l3 1s infinite linear;\n}\n\n@keyframes l3 {\n    20% {\n        background-position:\n            0% 0%,\n            50% 50%,\n            100% 50%;\n    }\n\n    40% {\n        background-position:\n            0% 100%,\n            50% 0%,\n            100% 50%;\n    }\n\n    60% {\n        background-position:\n            0% 50%,\n            50% 100%,\n            100% 0%;\n    }\n\n    80% {\n        background-position:\n            0% 50%,\n            50% 50%,\n            100% 100%;\n    }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/views/SetupUI.vue",
    "content": "<template>\n    <div class=\"relative size-full p-16 overflow-hidden\">\n        <div class=\"size-full rounded-3xl bg-[#1F1F1F] shadow-lg shadow-black/50 gap-4 p-5 grid grid-cols-2\">\n            <div>\n                <div id=\"stepStatus\" class=\"flex flex-row justify-center gap-4 pt-2\">\n                    <div\n                        v-for=\"(_, idx) of steps\"\n                        :key=\"idx\"\n                        class=\"w-4 h-4 rounded-full bg-neutral-700 transition duration-1000\"\n                        :class=\"{\n                            'bg-neutral-500': idx < currentStepIdx,\n                            'bg-violet-400': idx === currentStepIdx,\n                            'bg-neutral-700': idx > currentStepIdx,\n                        }\"\n                    ></div>\n                </div>\n                <Transition name=\"bounce\" mode=\"out-in\">\n                    <div :key=\"currentStepIdx\" id=\"stepIcon\" class=\"flex items-center justify-center relative h-full\">\n                        <Icon key=\"icon1\" class=\"size-[60%] text-violet-400 z-30 relative\" :icon=\"currentStep.icon\" />\n                        <Icon\n                            key=\"icon-gradient\"\n                            class=\"size-[60%] text-violet-400 brightness-75 z-20 absolute top-[50%] translate-y-[-50%] blur-2xl\"\n                            :icon=\"currentStep.icon\"\n                        />\n                        <Icon\n                            key=\"icon2\"\n                            class=\"size-[60%] text-violet-400 brightness-75 z-20 absolute top-[51.5%] translate-y-[-50%] translate-x-[1.5%]\"\n                            :icon=\"currentStep.icon\"\n                        />\n                        <Icon\n                            key=\"icon3\"\n                            class=\"size-[60%] text-violet-400 brightness-50 z-10 absolute top-[53%] translate-y-[-50%] translate-x-[3%]\"\n                            :icon=\"currentStep.icon\"\n                        />\n                    </div>\n                </Transition>\n            </div>\n\n            <Transition name=\"bouncedown\" mode=\"out-in\">\n                <div :key=\"currentStepIdx\" id=\"stepContent\" class=\"overflow-scroll\">\n                    <!-- Welcome -->\n                    <div v-if=\"currentStep.id === StepID.WELCOME\" class=\"step-block\">\n                        <h1 class=\"text-3xl font-semibold\">{{ currentStep.title }}</h1>\n                        <p class=\"text-lg text-gray-400\">\n                            WinBoat is a full-fledged app that helps you natively run Windows applications on your Linux\n                            machine with ease.\n                        </p>\n                        <p class=\"text-lg text-gray-400\">\n                            We will go through a few required steps to get you started in no time.\n                        </p>\n                        <div class=\"flex flex-row gap-4\">\n                            <x-button toggled class=\"px-6\" @click=\"currentStepIdx++\">Next</x-button>\n                        </div>\n                    </div>\n\n                    <!-- License -->\n                    <div v-if=\"currentStep.id === StepID.LICENSE\" class=\"step-block\">\n                        <h1 class=\"text-3xl font-semibold\">{{ currentStep.title }}</h1>\n                        <p class=\"text-lg text-gray-400\">\n                            WinBoat is open-source software licensed under the MIT License. Please review the license\n                            agreement below.\n                        </p>\n                        <pre class=\"text-sm text-gray-400 bg-neutral-800 p-4 rounded-lg overflow-auto\">\n                            {{ license }}\n                        </pre>\n                        <div class=\"flex flex-row gap-4\">\n                            <x-button class=\"px-6\" @click=\"currentStepIdx--\">Back</x-button>\n                            <x-button toggled class=\"px-6\" @click=\"currentStepIdx++\">I Agree</x-button>\n                        </div>\n                    </div>\n\n                    <!-- Pre-Requisites -->\n                    <div v-if=\"currentStep.id === StepID.PREREQUISITES\" class=\"step-block\">\n                        <h1 class=\"text-3xl font-semibold\">{{ currentStep.title }}</h1>\n                        <p class=\"text-lg text-gray-400\">\n                            In order to run WinBoat, your computer must meet the following requirements.\n                        </p>\n                        <ul class=\"text-lg text-gray-400 list-none space-y-1.5 bg-neutral-800 py-3 rounded-lg\">\n                            <li class=\"flex items-center gap-2\">\n                                <span v-if=\"specs.ramGB >= 4\" class=\"text-green-500\">✔</span>\n                                <span v-else class=\"text-red-500\">✘</span>\n                                At least 4 GB of RAM (Detected: {{ specs.ramGB }} GB)\n                            </li>\n\n                            <li class=\"flex items-center gap-2\">\n                                <span v-if=\"specs.cpuCores >= 2\" class=\"text-green-500\">✔</span>\n                                <span v-else class=\"text-red-500\">✘</span>\n                                At least 2 CPU cores (Detected: {{ specs.cpuCores }} cores)\n                            </li>\n\n                            <li class=\"flex items-center gap-2\">\n                                <span v-if=\"specs.kvmEnabled\" class=\"text-green-500\">✔</span>\n                                <span v-else class=\"text-red-500\">✘</span>\n                                Virtualization (KVM) enabled\n                                <a\n                                    href=\"https://duckduckgo.com/?t=h_&q=how+to+enable+virtualization+in+%3Cmotherboard+brand%3E+bios&ia=web\"\n                                    @click=\"openAnchorLink\"\n                                    target=\"_blank\"\n                                    class=\"text-violet-400 hover:underline ml-1\"\n                                >\n                                    How?\n                                </a>\n                            </li>\n\n                            <li class=\"flex items-center gap-2\">\n                                <span v-if=\"containerInstalled(containerSpecs)\" class=\"text-green-500\">✔</span>\n                                <span v-else class=\"text-red-500\">✘</span>\n\n                                <div>\n                                    <x-select\n                                        @change=\"(e: any) => (containerRuntime = e.detail.newValue)\"\n                                        class=\"w-fit\"\n                                    >\n                                        <x-menu>\n                                            <x-menuitem\n                                                v-for=\"(runtime, key) in Object.values(ContainerRuntimes)\"\n                                                :key=\"key\"\n                                                :value=\"runtime\"\n                                                :toggled=\"runtime === containerRuntime\"\n                                            >\n                                                <x-label>{{ runtime }}</x-label>\n                                            </x-menuitem>\n                                        </x-menu>\n                                    </x-select>\n                                </div>\n                                installed\n                                <a\n                                    href=\"https://docs.docker.com/engine/install/\"\n                                    @click=\"openAnchorLink\"\n                                    target=\"_blank\"\n                                    class=\"text-violet-400 hover:underline ml-1\"\n                                    >How?</a\n                                >\n                            </li>\n\n                            <!-- Docker Specific Requirements -->\n                            <template v-if=\"containerRuntime == ContainerRuntimes.DOCKER\">\n                                <li class=\"flex items-center gap-2\">\n                                    <span\n                                        v-if=\"\n                                            containerSpecs &&\n                                            'dockerComposeInstalled' in containerSpecs &&\n                                            containerSpecs.dockerComposeInstalled\n                                        \"\n                                        class=\"text-green-500\"\n                                        >✔</span\n                                    >\n                                    <span v-else class=\"text-red-500\">✘</span>\n                                    Docker Compose v2 installed\n                                    <a\n                                        href=\"https://docs.docker.com/compose/install/#plugin-linux-only\"\n                                        @click=\"openAnchorLink\"\n                                        target=\"_blank\"\n                                        class=\"text-violet-400 hover:underline ml-1\"\n                                        >How?</a\n                                    >\n                                </li>\n\n                                <li class=\"flex items-center gap-2\">\n                                    <span\n                                        v-if=\"\n                                            containerSpecs &&\n                                            'dockerIsInUserGroups' in containerSpecs &&\n                                            containerSpecs.dockerIsInUserGroups\n                                        \"\n                                        class=\"text-green-500\"\n                                        >✔</span\n                                    >\n                                    <span v-else class=\"text-red-500\">✘</span>\n                                    User added to the\n                                    <span class=\"font-mono bg-neutral-700 rounded-md px-0.5\">docker</span> group\n                                    <span class=\"text-gray-600\"> (Relog required) </span>\n                                    <a\n                                        href=\"https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user\"\n                                        @click=\"openAnchorLink\"\n                                        target=\"_blank\"\n                                        class=\"text-violet-400 hover:underline ml-1\"\n                                        >How?</a\n                                    >\n                                </li>\n\n                                <li class=\"flex items-center gap-2\">\n                                    <span\n                                        v-if=\"\n                                            containerSpecs &&\n                                            'dockerIsRunning' in containerSpecs &&\n                                            containerSpecs.dockerIsRunning\n                                        \"\n                                        class=\"text-green-500\"\n                                        >✔</span\n                                    >\n                                    <span v-else class=\"text-red-500\">✘</span>\n                                    Docker daemon is running\n                                    <span class=\"text-gray-600\"> (Also enable on boot) </span>\n                                    <a\n                                        href=\"https://docs.docker.com/config/daemon/start/\"\n                                        @click=\"openAnchorLink\"\n                                        target=\"_blank\"\n                                        class=\"text-violet-400 hover:underline ml-1\"\n                                        >How?</a\n                                    >\n                                </li>\n                            </template>\n\n                            <!-- Podman Specific Requirements -->\n                            <template v-else>\n                                <li class=\"flex items-center gap-2\">\n                                    <span\n                                        v-if=\"\n                                            containerSpecs &&\n                                            'podmanComposeInstalled' in containerSpecs &&\n                                            containerSpecs.podmanComposeInstalled\n                                        \"\n                                        class=\"text-green-500\"\n                                        >✔</span\n                                    >\n                                    <span v-else class=\"text-red-500\">✘</span>\n                                    Podman Compose installed\n                                    <a\n                                        href=\"https://github.com/containers/podman-compose?tab=readme-ov-file#installation\"\n                                        @click=\"openAnchorLink\"\n                                        target=\"_blank\"\n                                        class=\"text-violet-400 hover:underline ml-1\"\n                                        >How?</a\n                                    >\n                                </li>\n                            </template>\n                            <li class=\"flex items-center gap-2\">\n                                <span v-if=\"specs.freeRDP3Installed\" class=\"text-green-500\">✔</span>\n                                <span v-else class=\"text-red-500\">✘</span>\n                                FreeRDP 3.x.x installed\n                                <a\n                                    href=\"https://github.com/FreeRDP/FreeRDP/wiki/PreBuilds\"\n                                    @click=\"openAnchorLink\"\n                                    target=\"_blank\"\n                                    class=\"text-violet-400 hover:underline ml-1\"\n                                >\n                                    How?\n                                </a>\n                            </li>\n                        </ul>\n                        <div class=\"flex flex-row gap-4 mt-6\">\n                            <x-button class=\"px-6\" @click=\"currentStepIdx--\">Back</x-button>\n                            <x-button\n                                toggled\n                                class=\"px-6\"\n                                @click=\"currentStepIdx++\"\n                                :disabled=\"!satisfiesPrequisites(specs, containerSpecs)\"\n                            >\n                                Next\n                            </x-button>\n                        </div>\n                    </div>\n\n                    <!-- Install Location -->\n                    <div v-if=\"currentStep.id === StepID.INSTALL_LOCATION\" class=\"step-block\">\n                        <h1 class=\"text-3xl font-semibold\">{{ currentStep.title }}</h1>\n                        <p class=\"text-lg text-gray-400\">\n                            Choose where you want to install WinBoat. Files related to the Windows virtual machine will\n                            be stored in this location.\n                        </p>\n                        <p class=\"text-lg text-gray-400\">\n                            Make sure you have at least {{ MIN_DISK_GB }}GB of disk space available in the selected\n                            location.\n                        </p>\n\n                        <div class=\"flex flex-row items-center mt-4\">\n                            <x-input\n                                id=\"install-location\"\n                                type=\"text\"\n                                placeholder=\"Select Install Location\"\n                                readonly\n                                :value=\"installFolder\"\n                                class=\"!max-w-full w-[300px] rounded-r-none\"\n                            >\n                                <x-icon href=\"#folder\"></x-icon>\n                                <x-label>/your/install/folder</x-label>\n                            </x-input>\n                            <x-button class=\"!rounded-l-none\" toggled @click=\"selectInstallFolder\">\n                                {{ installFolder ? \"Change\" : \"Select\" }}\n                            </x-button>\n                        </div>\n\n                        <div id=\"install-folder-errors\" class=\"h-[4rem] text-red-400 text-sm font-semibold space-y-1\">\n                            <div v-for=\"error in installFolderErrors\" :key=\"error\">\n                                <Icon icon=\"line-md:alert\" class=\"inline size-4 -translate-y-0.5\"></Icon>\n                                {{ error }}\n                            </div>\n                            <div\n                                v-if=\"installFolder && !installFolderErrors?.length\"\n                                class=\"text-green-400 font-semibold\"\n                            >\n                                <Icon icon=\"line-md:check-all\" class=\"inline size-4 -translate-y-0.5\"></Icon>\n                                Valid install folder\n                            </div>\n                        </div>\n\n                        <div class=\"flex flex-row gap-4 mt-6\">\n                            <x-button class=\"px-6\" @click=\"currentStepIdx--\">Back</x-button>\n                            <x-button\n                                toggled\n                                class=\"px-6\"\n                                :disabled=\"!installFolder || installFolderErrors?.length\"\n                                @click=\"currentStepIdx++\"\n                            >\n                                Next\n                            </x-button>\n                        </div>\n                    </div>\n\n                    <!-- Windows Configuration -->\n                    <div v-if=\"currentStep.id === StepID.WINDOWS_CONFIG\" class=\"step-block\">\n                        <h1 class=\"text-3xl font-semibold\">{{ currentStep.title }}</h1>\n                        <p class=\"text-lg text-gray-400\">\n                            Pick the version of Windows you want to install, and the language you'd like to use.\n                        </p>\n                        <p class=\"text-lg text-gray-400\">\n                            You can only change these settings now. Once the installation is complete, you will not be\n                            able to change them unless you reinstall.\n                        </p>\n                        <div>\n                            <label for=\"select-edition\" class=\"text-sm mb-4 text-neutral-400\">Select Edition</label>\n                            <x-select\n                                id=\"select-edition\"\n                                @change=\"(e: any) => (windowsVersion = e.detail.newValue)\"\n                                class=\"w-64\"\n                                :disabled=\"!!customIsoPath\"\n                            >\n                                <x-menu>\n                                    <x-menuitem\n                                        v-for=\"(version, key) in WINDOWS_VERSIONS\"\n                                        :key=\"key\"\n                                        :value=\"key\"\n                                        :toggled=\"windowsVersion === key\"\n                                        v-show=\"key !== 'custom'\"\n                                    >\n                                        <x-label>{{ version }}</x-label>\n                                    </x-menuitem>\n                                </x-menu>\n                            </x-select>\n                        </div>\n                        <div>\n                            <label for=\"select-language\" class=\"text-sm mb-4 text-neutral-400\">Select Language</label>\n                            <x-select\n                                id=\"select-language\"\n                                @change=\"(e: any) => (windowsLanguage = e.detail.newValue)\"\n                                class=\"w-64\"\n                                :disabled=\"!!customIsoPath\"\n                            >\n                                <x-menu @change=\"(e: any) => (windowsLanguage = e.detail.newValue)\">\n                                    <x-menuitem\n                                        v-for=\"(language, languageWithBanner) in WINDOWS_LANGUAGES\"\n                                        :key=\"language\"\n                                        :value=\"language\"\n                                        :toggled=\"windowsLanguage === language\"\n                                        :disabled=\"['German', 'Hungarian'].includes(language)\"\n                                    >\n                                        <x-label>\n                                            {{ languageWithBanner }}\n                                            <span\n                                                v-if=\"['German', 'Hungarian'].includes(language)\"\n                                                class=\"text-red-400\"\n                                            >\n                                                (Broken, use Language Pack)\n                                            </span>\n                                        </x-label>\n                                    </x-menuitem>\n                                </x-menu>\n                            </x-select>\n                        </div>\n                        <div class=\"mt-4\">\n                            <div class=\"flex flex-col gap-2\">\n                                <label for=\"select-iso\" class=\"text-xs text-neutral-400\">Custom ISO (Optional)</label>\n                                <div class=\"flex items-center gap-2\">\n                                    <x-button id=\"select-iso\" class=\"text-sm w-64\" @click=\"selectIsoFile\">\n                                        Select ISO File\n                                    </x-button>\n                                    <span class=\"relative group\">\n                                        <Icon icon=\"line-md:alert\" class=\"text-neutral-400 cursor-pointer\" />\n                                        <span\n                                            class=\"absolute bottom-5 left-[-160px] z-50 w-[320px] bg-neutral-900 text-xs text-gray-300 rounded-lg shadow-lg px-3 py-2 hidden group-hover:block transition-opacity duration-200 pointer-events-none\"\n                                        >\n                                            We offer you the possibility of using a custom Windows ISO for your\n                                            convenience, however we can't provide any support if your custom ISO breaks\n                                            or certain features within WinBoat stop working.\n                                        </span>\n                                    </span>\n                                </div>\n                                <span\n                                    v-if=\"customIsoPath\"\n                                    class=\"text-xs text-gray-400 font-semibold flex items-center gap-2\"\n                                >\n                                    Selected: {{ customIsoFileName }}\n                                    <x-button size=\"small\" class=\"ml-2 px-2 py-0\" @click=\"deselectIsoFile\"\n                                        >Remove</x-button\n                                    >\n                                </span>\n                            </div>\n                        </div>\n                        <div class=\"flex flex-row gap-4 mt-6\" :class=\"{ '!mt-2': customIsoPath }\">\n                            <x-button class=\"px-6\" @click=\"currentStepIdx--\">Back</x-button>\n                            <x-button toggled class=\"px-6\" @click=\"currentStepIdx++\">Next</x-button>\n                        </div>\n                    </div>\n\n                    <!-- User Configuration -->\n                    <div v-if=\"currentStep.id === StepID.USER_CONFIG\" class=\"step-block\">\n                        <h1 class=\"text-3xl font-semibold\">{{ currentStep.title }}</h1>\n                        <p class=\"text-lg text-gray-400\">Configure the username and password for Windows.</p>\n\n                        <p class=\"text-lg text-gray-400\">\n                            These credentials will be used to log in to the Windows virtual machine and to access it\n                            through Remote Desktop Protocol (RDP). You will not be able to change these settings later\n                            on unless you reinstall.\n                        </p>\n\n                        <div class=\"flex flex-row gap-4\">\n                            <div class=\"flex flex-col gap-4\">\n                                <div>\n                                    <label for=\"select-username\" class=\"text-sm mb-4 text-neutral-400\">Username</label>\n                                    <x-input\n                                        id=\"select-username\"\n                                        class=\"w-64 max-w-64\"\n                                        type=\"text\"\n                                        minlength=\"2\"\n                                        maxlength=\"32\"\n                                        required\n                                        size=\"large\"\n                                        :value=\"username\"\n                                        @input=\"(e: any) => (username = e.target.value)\"\n                                    >\n                                        <x-icon href=\"#person\"></x-icon>\n                                        <x-label>Name</x-label>\n                                    </x-input>\n                                </div>\n\n                                <div>\n                                    <label for=\"select-password\" class=\"text-sm mb-4 text-neutral-400\">Password</label>\n                                    <x-input\n                                        id=\"select-password\"\n                                        class=\"w-64 max-w-64\"\n                                        type=\"password\"\n                                        minlength=\"2\"\n                                        maxlength=\"64\"\n                                        required\n                                        size=\"large\"\n                                        :value=\"password\"\n                                        @input=\"(e: any) => (password = e.target.value)\"\n                                    >\n                                        <x-icon href=\"#lock\"></x-icon>\n                                        <x-label>Password</x-label>\n                                    </x-input>\n                                </div>\n\n                                <div>\n                                    <label for=\"confirm-password\" class=\"text-sm mb-4 text-neutral-400\">\n                                        Confirm Password\n                                    </label>\n                                    <x-input\n                                        id=\"confirm-password\"\n                                        class=\"w-64 max-w-64\"\n                                        type=\"password\"\n                                        minlength=\"2\"\n                                        maxlength=\"64\"\n                                        required\n                                        size=\"large\"\n                                        :value=\"confirmPassword\"\n                                        @input=\"(e: any) => (confirmPassword = e.target.value)\"\n                                    >\n                                        <x-icon href=\"#lock\" />\n                                        <x-label>Confirm Password</x-label>\n                                    </x-input>\n                                </div>\n                            </div>\n\n                            <div class=\"flex flex-col gap-4 mt-6\">\n                                <div id=\"username-errors\" class=\"h-[4rem] text-red-400 text-sm font-semibold space-y-1\">\n                                    <div v-for=\"error in usernameErrors\" :key=\"error\">\n                                        <Icon icon=\"line-md:alert\" class=\"inline size-4 -translate-y-0.5\"></Icon>\n                                        {{ error }}\n                                    </div>\n                                </div>\n                                <div id=\"password-errors\" class=\"text-red-400 text-sm font-semibold space-y-1\">\n                                    <div v-for=\"error in passwordErrors\" :key=\"error\">\n                                        <Icon icon=\"line-md:alert\" class=\"inline size-4 -translate-y-0.5\"></Icon>\n                                        {{ error }}\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n\n                        <div class=\"flex flex-row gap-4 mt-6\">\n                            <x-button class=\"px-6\" @click=\"currentStepIdx--\">Back</x-button>\n                            <x-button\n                                :disabled=\"usernameErrors.length || passwordErrors.length\"\n                                toggled\n                                class=\"px-6\"\n                                @click=\"currentStepIdx++\"\n                            >\n                                Next\n                            </x-button>\n                        </div>\n                    </div>\n\n                    <!-- Hardware Configuration -->\n                    <div v-if=\"currentStep.id === StepID.HARDWARE_CONFIG\" class=\"step-block\">\n                        <h1 class=\"text-3xl font-semibold\">{{ currentStep.title }}</h1>\n                        <p class=\"text-lg text-gray-400\">\n                            WinBoat utilizes a containerized KVM virtual machine to run Windows applications. Please\n                            configure the hardware settings for the virtual machine.\n                        </p>\n\n                        <p class=\"text-lg text-gray-400\">\n                            It is not recommended to allocate more than half of your system resources to Windows. You\n                            will be able to change these settings later on if needed.\n                        </p>\n\n                        <div class=\"flex flex-col gap-6\">\n                            <div>\n                                <label for=\"select-cpu-cores\" class=\"text-sm text-neutral-400\">Select CPU Cores</label>\n                                <div class=\"flex flex-row gap-4 items-center\">\n                                    <x-slider\n                                        id=\"select-cpu-cores\"\n                                        @change=\"(e: any) => (cpuCores = Number(e.target.value))\"\n                                        class=\"w-[50%]\"\n                                        :value=\"cpuCores\"\n                                        :min=\"MIN_CPU_CORES\"\n                                        :max=\"specs.cpuCores\"\n                                        step=\"1\"\n                                        ticks\n                                    />\n                                    <x-label>{{ cpuCores }} Core{{ cpuCores > 1 ? \"s\" : \"\" }}</x-label>\n                                </div>\n                            </div>\n\n                            <div>\n                                <label for=\"select-ram\" class=\"text-sm text-neutral-400\">\n                                    Select RAM\n                                    <span\n                                        v-if=\"memoryInfo.availableGB < ramGB\"\n                                        class=\"relative group text-white font-bold text-xs rounded-full bg-red-600 px-2 pb-0.5 ml-2 hover:bg-red-700 transition\"\n                                    >\n                                        <Icon icon=\"line-md:alert\" class=\"inline size-4 -translate-y-0.5\" />\n                                        Warning\n                                        <span\n                                            class=\"absolute bottom-5 right-[-160px] z-50 w-[320px] bg-neutral-900 text-xs text-gray-300 rounded-lg shadow-lg px-3 py-2 hidden group-hover:block transition-opacity duration-200 pointer-events-none\"\n                                        >\n                                            You don't have enough unused memory available to allocate the requested\n                                            amount of RAM. You currently have ~{{ memoryInfo.availableGB }} GB of unused\n                                            memory available. If you continue with this amount of RAM, the container\n                                            will likely crash.\n                                        </span>\n                                    </span>\n                                </label>\n                                <div class=\"flex flex-row gap-4 items-center\">\n                                    <x-slider\n                                        id=\"select-ram\"\n                                        @change=\"(e: any) => (ramGB = Number(e.target.value))\"\n                                        class=\"w-[50%]\"\n                                        :value=\"ramGB\"\n                                        :min=\"MIN_RAM_GB\"\n                                        :max=\"specs.ramGB\"\n                                        step=\"1\"\n                                    />\n                                    <x-label>{{ ramGB }} GB</x-label>\n                                </div>\n                            </div>\n\n                            <div>\n                                <label for=\"select-disk\" class=\"text-sm text-neutral-400\">\n                                    Select Disk Size\n                                    <span\n                                        v-if=\"(installFolderDiskSpaceGB || 0) - diskSpaceGB < 5\"\n                                        class=\"relative group text-white font-bold text-xs rounded-full bg-red-600 px-2 pb-0.5 ml-2 hover:bg-red-700 transition\"\n                                    >\n                                        <Icon icon=\"line-md:alert\" class=\"inline size-4 -translate-y-0.5\"></Icon>\n                                        Warning\n                                        <span\n                                            class=\"absolute bottom-5 right-[-160px] z-50 w-[320px] bg-neutral-900 text-xs text-gray-300 rounded-lg shadow-lg px-3 py-2 hidden group-hover:block transition-opacity duration-200 pointer-events-none\"\n                                        >\n                                            You're about to allocate most of your remaining disk space with less than\n                                            5GB in excess. You currently have ~{{ installFolderDiskSpaceGB }} GB of disk\n                                            space available for the drive corresponding to {{ installFolder }}. If you\n                                            continue with this disk size, you may run out of space and encounter\n                                            unexpected issues.\n                                        </span>\n                                    </span>\n                                </label>\n                                <div class=\"flex flex-row gap-4 items-center\">\n                                    <x-slider\n                                        id=\"select-disk\"\n                                        @change=\"(e: any) => (diskSpaceGB = Number(e.target.value))\"\n                                        class=\"w-[50%]\"\n                                        :value=\"diskSpaceGB\"\n                                        :min=\"MIN_DISK_GB\"\n                                        :max=\"installFolderDiskSpaceGB || 0\"\n                                        step=\"8\"\n                                    />\n                                    <x-label>{{ diskSpaceGB }} GB</x-label>\n                                </div>\n                            </div>\n                        </div>\n\n                        <div class=\"flex flex-row gap-4 mt-6\">\n                            <x-button class=\"px-6\" @click=\"currentStepIdx--\">Back</x-button>\n                            <x-button toggled class=\"px-6\" @click=\"currentStepIdx++\">Next</x-button>\n                        </div>\n                    </div>\n\n                    <!-- Folder Sharing -->\n                    <div v-if=\"currentStep.id === StepID.SHOULD_SHARE_HOME_FOLDER\" class=\"step-block\">\n                        <h1 class=\"text-3xl font-semibold\">Folder Sharing</h1>\n                        <p class=\"text-lg text-gray-400\">\n                            WinBoat allows you to share a folder from your Linux system with the Windows virtual machine.\n                            You can choose whether to enable this feature and select which folder to share.\n                        </p>\n                        <p class=\"text-lg text-gray-400\">\n                            <b>⚠️ WARNING:</b>\n                            Sharing a folder exposes your Linux files to Windows-specific malware and viruses.\n                            Only enable this feature if you understand the risks involved. Always be careful with the\n                            files you download and open in Windows.\n                        </p>\n\n                        <x-checkbox\n                            class=\"my-4\"\n                            @toggle=\"folderSharing = !folderSharing\"\n                            :toggled=\"folderSharing\"\n                        >\n                            <x-label><strong>Enable folder sharing</strong></x-label>\n                            <x-label class=\"text-gray-400\">\n                                By checking this box, you acknowledge the risks mentioned above\n                            </x-label>\n                        </x-checkbox>\n\n                        <div v-if=\"folderSharing\" class=\"flex flex-col gap-2 my-4\">\n                            <label class=\"text-sm text-neutral-400\">Shared Folder Location</label>\n                            <div class=\"flex flex-row items-center\">\n                                <x-input\n                                    type=\"text\"\n                                    placeholder=\"Select Folder to Share\"\n                                    readonly\n                                    :value=\"sharedFolderPath\"\n                                    class=\"!max-w-full w-[300px] rounded-r-none\"\n                                >\n                                    <x-icon href=\"#folder\"></x-icon>\n                                    <x-label>/your/shared/folder</x-label>\n                                </x-input>\n                                <x-button class=\"!rounded-l-none\" toggled @click=\"selectSharedFolder\">\n                                    {{ sharedFolderPath ? \"Change\" : \"Select\" }}\n                                </x-button>\n                            </div>\n                        </div>\n\n                        <div class=\"flex flex-row gap-4 mt-6\">\n                            <x-button class=\"px-6\" @click=\"currentStepIdx--\">Back</x-button>\n                            <x-button\n                                toggled\n                                class=\"px-6\"\n                                @click=\"currentStepIdx++\"\n                                :disabled=\"folderSharing && !sharedFolderPath\"\n                            >\n                                Next\n                            </x-button>\n                        </div>\n                    </div>\n\n                    <!-- Review -->\n                    <div v-if=\"currentStep.id === StepID.REVIEW\" class=\"step-block\">\n                        <h1 class=\"text-3xl font-semibold\">{{ currentStep.title }}</h1>\n                        <p class=\"text-lg text-gray-400\">\n                            Please review the settings you've chosen for your WinBoat installation. If everything looks\n                            correct, click \"Install\" to begin.\n                        </p>\n\n                        <div class=\"bg-neutral-800 p-6 rounded-lg flex flex-col gap-4\">\n                            <h2 class=\"text-xl font-medium text-white mt-0 mb-2\">Your Configuration</h2>\n\n                            <div class=\"grid grid-cols-2 gap-4\">\n                                <div class=\"flex flex-col\">\n                                    <span class=\"text-sm text-gray-400\">Container Runtime</span>\n                                    <span class=\"text-base text-white\">{{ containerRuntime }}</span>\n                                </div>\n                                <div class=\"flex flex-col\">\n                                    <span class=\"text-sm text-gray-400\">Language</span>\n                                    <span class=\"text-base text-white\">{{ windowsLanguage }}</span>\n                                </div>\n                                <div class=\"flex flex-col\">\n                                    <span class=\"text-sm text-gray-400\">Windows Version</span>\n                                    <span class=\"text-base text-white\">{{ WINDOWS_VERSIONS[windowsVersion] }}</span>\n                                </div>\n                                <div class=\"flex flex-col\">\n                                    <span class=\"text-sm text-gray-400\">CPU Cores</span>\n                                    <span class=\"text-base text-white\">{{ cpuCores }} Cores</span>\n                                </div>\n                                <div class=\"flex flex-col\">\n                                    <span class=\"text-sm text-gray-400\">RAM</span>\n                                    <span class=\"text-base text-white\">{{ ramGB }} GB</span>\n                                </div>\n                                <div class=\"flex flex-col\">\n                                    <span class=\"text-sm text-gray-400\">Disk Size</span>\n                                    <span class=\"text-base text-white\">{{ diskSpaceGB }} GB</span>\n                                </div>\n                                <div class=\"flex flex-col\">\n                                    <span class=\"text-sm text-gray-400\">Username</span>\n                                    <span class=\"text-base text-white\">{{ username }}</span>\n                                </div>\n                                <div class=\"flex flex-col\">\n                                    <span class=\"text-sm text-gray-400\">Install Location</span>\n                                    <span class=\"text-base text-white\">{{ installFolder }}</span>\n                                </div>\n                            </div>\n                        </div>\n\n                        <div class=\"flex flex-row gap-4 mt-6\">\n                            <x-button class=\"px-6\" @click=\"currentStepIdx--\">Back</x-button>\n                            <x-button\n                                toggled\n                                class=\"px-6\"\n                                @click=\"\n                                    currentStepIdx++;\n                                    install();\n                                \"\n                            >\n                                Install\n                            </x-button>\n                        </div>\n                    </div>\n\n                    <!-- Installation -->\n                    <div v-if=\"currentStep.id === StepID.INSTALL\" class=\"step-block\">\n                        <h1 class=\"text-3xl font-semibold\">Installation</h1>\n                        <p class=\"text-lg text-gray-400 text-justify\">\n                            WinBoat is now installing Windows. Please be patient as this may take up to an hour. In the\n                            meantime, you can grab a coffee and check the installation status\n                            <span v-if=\"linkableInstallSteps.includes(installState)\">\n                                <a :href=\"`http://127.0.0.1:${vncPort}`\" @click=\"openAnchorLink\">in your browser</a>.\n                            </span>\n                            <span v-else>\n                                over at\n                                <div\n                                    style=\"animation-duration: 3s!important;\"\n                                    class=\"ml-1 inline-block relative text-transparent rounded-md bg-neutral-700 animate-pulse select-none\"\n                                >\n                                    in your browser\n                                    <Icon icon=\"eos-icons:three-dots-loading\" class=\"pointer-events-none absolute top-0 left-[50%] size-16 text-violet-400 -translate-x-[50%] -translate-y-[27.5%]\"></Icon>\n                                </div>\n                            </span>\n                        </p>\n\n                        <!-- Installing -->\n                        <div\n                            v-if=\"\n                                installState !== InstallStates.COMPLETED && installState !== InstallStates.INSTALL_ERROR\n                            \"\n                            class=\"flex flex-col h-full items-center justify-center gap-4\"\n                        >\n                            <x-throbber class=\"size-16\"></x-throbber>\n                            <x-label\n                                v-if=\"installState !== InstallStates.MONITORING_PREINSTALL\"\n                                class=\"text-lg text-gray-400 text-center\"\n                            >\n                                {{ installState }}...\n                            </x-label>\n                            <x-label v-else class=\"text-lg text-gray-400 text-center\">\n                                {{ preinstallMsg }}\n                            </x-label>\n                        </div>\n\n                        <!-- Error -->\n                        <div\n                            v-if=\"installState === InstallStates.INSTALL_ERROR\"\n                            class=\"flex flex-col h-full items-center justify-center gap-4\"\n                        >\n                            <Icon icon=\"line-md:alert\" class=\"size-16 text-red-500\"></Icon>\n                            <x-label class=\"text-lg text-gray-400 text-center\">\n                                An error occurred while installing Windows. Please check the logs in\n                                <span class=\"font-mono bg-neutral-700 rounded-md px-0.5\">~/.winboat</span>\n                                and verify\n                                <span class=\"font-mono bg-neutral-700 rounded-md px-0.5\"\n                                    >{{ installManager!.container.executableAlias }} logs WinBoat</span\n                                >\n                                in your terminal for more information.\n                            </x-label>\n                            <x-label class=\"text-lg text-gray-400 text-center\">\n                                To reset and try again, follow\n                                <a href=\"https://rentry.org/winboat_retry_install\" @click=\"openAnchorLink\">these</a>\n                                instructions.\n                            </x-label>\n                        </div>\n\n                        <!-- Completed -->\n                        <div\n                            v-if=\"installState === InstallStates.COMPLETED\"\n                            class=\"flex flex-col h-full items-center justify-center gap-4\"\n                        >\n                            <Icon icon=\"line-md:confirm-circle\" class=\"size-16 text-green-500\"></Icon>\n                            <x-label class=\"text-lg text-gray-400 text-center\">\n                                Windows has been installed successfully!\n                            </x-label>\n                            <x-button @click=\"$router.push('/home')\">Finish</x-button>\n                        </div>\n                    </div>\n                </div>\n            </Transition>\n        </div>\n        <div class=\"absolute gradient-bg left-[50%] top-[50%] translate-x-[-50%] translate-y-[-50%] -z-10\"></div>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { Icon } from \"@iconify/vue\";\nimport { computed, onMounted, onUnmounted, ref, watch } from \"vue\";\nimport { useRouter } from \"vue-router\";\nimport { computedAsync } from \"@vueuse/core\";\nimport { InstallConfiguration, Specs } from \"../../types\";\nimport { getSpecs, getMemoryInfo, defaultSpecs, satisfiesPrequisites, type MemoryInfo } from \"../lib/specs\";\nimport { WINDOWS_VERSIONS, WINDOWS_LANGUAGES, type WindowsVersionKey } from \"../lib/constants\";\nimport { InstallManager, InstallStates } from \"../lib/install\";\nimport { openAnchorLink } from \"../utils/openLink\";\nimport license from \"../assets/LICENSE.txt?raw\";\nimport {\n    ContainerRuntimes,\n    DockerSpecs,\n    PodmanSpecs,\n    getContainerSpecs,\n} from \"../lib/containers/common\";\nimport { WinboatConfig } from \"../lib/config\";\n\nconst path: typeof import(\"path\") = require(\"node:path\");\nconst electron: typeof import(\"electron\") = require(\"electron\").remote || require(\"@electron/remote\");\nconst fs: typeof import(\"fs\") = require(\"node:fs\");\nconst os: typeof import(\"os\") = require(\"node:os\");\nconst checkDiskSpace: typeof import(\"check-disk-space\").default = require(\"check-disk-space\").default;\n\ntype Step = {\n    id: string;\n    title: string;\n    icon: string;\n};\n\nenum StepID {\n    WELCOME = \"STEP_WELCOME\",\n    PREREQUISITES = \"STEP_PREREQUISITES\",\n    LICENSE = \"STEP_LICENSE\",\n    INSTALL_LOCATION = \"STEP_INSTALL_LOCATION\",\n    WINDOWS_CONFIG = \"STEP_WINDOWS_CONFIG\",\n    HARDWARE_CONFIG = \"STEP_HARDWARE_CONFIG\",\n    USER_CONFIG = \"STEP_USER_CONFIG\",\n    SHOULD_SHARE_HOME_FOLDER = \"STEP_SHOULD_SHARE_HOME_FOLDER\",\n    REVIEW = \"STEP_OVERVIEW\",\n    INSTALL = \"STEP_INSTALL\",\n    FINISH = \"STEP_FINISH\",\n}\n\nconst steps: Step[] = [\n    {\n        id: StepID.WELCOME,\n        title: \"Welcome to WinBoat\",\n        icon: \"tdesign:wave-bye-filled\",\n    },\n    {\n        id: StepID.LICENSE,\n        title: \"License Agreement\",\n        icon: \"line-md:text-box-multiple\",\n    },\n    {\n        id: StepID.PREREQUISITES,\n        title: \"Pre-Requisites\",\n        icon: \"line-md:check-all\",\n    },\n    {\n        id: StepID.INSTALL_LOCATION,\n        title: \"Install Location\",\n        icon: \"line-md:folder-arrow-down-filled\",\n    },\n    {\n        id: StepID.WINDOWS_CONFIG,\n        title: \"Configure Windows\",\n        icon: \"mage:microsoft-windows\",\n    },\n    {\n        id: StepID.USER_CONFIG,\n        title: \"User Configuration\",\n        icon: \"line-md:account\",\n    },\n    {\n        id: StepID.HARDWARE_CONFIG,\n        title: \"Hardware Configuration\",\n        icon: \"famicons:hardware-chip-outline\",\n    },\n    {\n        id: StepID.SHOULD_SHARE_HOME_FOLDER,\n        title: \"Folder Sharing\",\n        icon: \"line-md:link\",\n    },\n    {\n        id: StepID.REVIEW,\n        title: \"Review\",\n        icon: \"solar:pin-list-bold\",\n    },\n    {\n        id: StepID.INSTALL,\n        title: \"Installation\",\n        icon: \"line-md:downloading-loop\",\n    },\n    {\n        id: StepID.FINISH,\n        title: \"Finish\",\n        icon: \"bx:bxs-check-circle\",\n    },\n];\n\nconst MIN_CPU_CORES = 1;\nconst MIN_RAM_GB = 2;\nconst MIN_DISK_GB = 32;\nconst $router = useRouter();\nconst specs = ref<Specs>({ ...defaultSpecs });\nconst currentStepIdx = ref(0);\nconst currentStep = computed(() => steps[currentStepIdx.value]);\nconst installFolder = ref(path.join(os.homedir(), \"winboat\"));\nconst windowsVersion = ref<WindowsVersionKey>(\"11\");\nconst windowsLanguage = ref(\"English\");\nconst customIsoPath = ref(\"\");\nconst customIsoFileName = ref(\"\");\nconst cpuCores = ref(2);\nconst ramGB = ref(4);\nconst memoryInfo = ref<MemoryInfo>({ totalGB: 0, availableGB: 0 });\nconst memoryInterval = ref<NodeJS.Timeout | null>(null);\nconst diskSpaceGB = ref(32);\nconst username = ref(\"winboat\");\nconst password = ref(\"\");\nconst confirmPassword = ref(\"\");\nconst folderSharing = ref(false);\nconst sharedFolderPath = ref(\"\");\nconst installState = ref<InstallStates>(InstallStates.IDLE);\nconst preinstallMsg = ref(\"\");\nconst containerRuntime = ref(ContainerRuntimes.DOCKER);\nconst vncPort = ref(8006);\n// These are the install steps where the container is actually up and running\nconst linkableInstallSteps = [ InstallStates.MONITORING_PREINSTALL, InstallStates.INSTALLING_WINDOWS, InstallStates.COMPLETED ];\n\nlet installManager: InstallManager | null;\n\nonMounted(async () => {\n    specs.value = await getSpecs();\n    console.log(\"Specs\", specs.value);\n\n    memoryInfo.value = await getMemoryInfo();\n    memoryInterval.value = setInterval(async () => {\n        memoryInfo.value = await getMemoryInfo();\n    }, 1000);\n    console.log(\"Memory Info\", memoryInfo.value);\n\n    username.value = os.userInfo().username;\n    console.log(\"Username\", username.value);\n\n    // Set default shared folder path to home directory\n    sharedFolderPath.value = os.homedir();\n});\n\nonUnmounted(() => {\n    if (memoryInterval.value) {\n        clearInterval(memoryInterval.value);\n    }\n});\n\n// Watch for when folder sharing is enabled and set default path\nwatch(folderSharing, (newValue) => {\n    if (newValue && !sharedFolderPath.value) {\n        sharedFolderPath.value = os.homedir();\n    }\n});\n\nconst containerSpecs = computedAsync(async () => {\n    return await getContainerSpecs(containerRuntime.value);\n});\n\nfunction containerInstalled(containerSpecs: DockerSpecs | PodmanSpecs | undefined) {\n    if (!containerSpecs) return false;\n    if (\"dockerInstalled\" in containerSpecs) return containerSpecs.dockerInstalled;\n    if (\"podmanInstalled\" in containerSpecs) return containerSpecs.podmanInstalled;\n    return false;\n}\n\nconst usernameErrors = computed(() => {\n    let errors: string[] = [];\n\n    // At least 2 characters\n    if (username.value.length < 2) {\n        errors.push(\"Must be at least 2 characters long\");\n    }\n\n    // Only alphanumeric characters are allowed\n    if (!/^[a-zA-Z0-9]+$/.test(username.value)) {\n        errors.push(\"Must only contain alphanumeric characters\");\n    }\n\n    return errors;\n});\n\nconst passwordErrors = computed(() => {\n    let errors: string[] = [];\n\n    // Must match confirm password\n    if (password.value !== confirmPassword.value) {\n        errors.push(\"Passwords do not match\");\n    }\n\n    // Only alphanumeric characters are allowed\n    if (!/^[a-zA-Z0-9]+$/.test(password.value)) {\n        errors.push(\"Must only contain alphanumeric characters\");\n    }\n\n    // At least 4 characters\n    if (password.value.length < 4) {\n        errors.push(\"Must be at least 4 characters long\");\n    }\n\n    return errors;\n});\n\nfunction selectIsoFile() {\n    electron.dialog\n        .showOpenDialog({\n            title: \"Select ISO File\",\n            filters: [\n                {\n                    name: \"ISO Files\",\n                    extensions: [\"iso\"],\n                },\n            ],\n            properties: [\"openFile\"],\n        })\n        .then(result => {\n            if (!result.canceled && result.filePaths.length > 0) {\n                customIsoPath.value = result.filePaths[0];\n                customIsoFileName.value = path.basename(result.filePaths[0]);\n                windowsLanguage.value = \"English\"; // Language can't be custom\n                windowsVersion.value = \"custom\";\n                console.log(\"ISO path updated:\", customIsoPath.value);\n            }\n        });\n}\n\nfunction deselectIsoFile() {\n    customIsoPath.value = \"\";\n    customIsoFileName.value = \"\";\n    windowsLanguage.value = \"English\";\n    windowsVersion.value = \"11\";\n}\n\nfunction selectInstallFolder() {\n    electron.dialog\n        .showOpenDialog({\n            title: \"Select Install Folder\",\n            properties: [\"openDirectory\", \"createDirectory\"],\n        })\n        .then(result => {\n            if (!result.canceled && result.filePaths.length > 0) {\n                const selectedPath = result.filePaths[0];\n                const finalPath = path.join(selectedPath, \"winboat\");\n                console.log(\"Install path selected:\", finalPath);\n                installFolder.value = finalPath;\n            }\n        });\n}\n\nconst installFolderErrors = computedAsync(async () => {\n    let errors: string[] = [];\n\n    if (!installFolder.value) {\n        errors.push(\"Please select an install location\");\n        return errors; // <- The rest shouldn't be ran if no path is selected\n    }\n\n    // Path without /winboat\n    const parentPath = path.dirname(installFolder.value);\n    console.log(\"Parent path\", parentPath);\n\n    // Check if path is writable\n    try {\n        fs.accessSync(parentPath, fs.constants.W_OK);\n    } catch (err) {\n        console.error(err);\n        errors.push(\"The selected install location is not writable\");\n    }\n\n    // Check if we have enough disk space\n    const diskSpace = await checkDiskSpace(parentPath);\n    const freeGB = Math.floor(diskSpace.free / (1024 * 1024 * 1024));\n    if (freeGB < MIN_DISK_GB) {\n        errors.push(\n            `Not enough disk space available. At least ${MIN_DISK_GB} GB is required, but only ${freeGB} GB is available.`,\n        );\n    }\n\n    return errors;\n});\n\nconst installFolderDiskSpaceGB = computedAsync(async () => {\n    if (!installFolder.value) return 0;\n\n    const parentPath = path.dirname(installFolder.value);\n    const diskSpace = await checkDiskSpace(parentPath);\n    const freeGB = Math.floor(diskSpace.free / (1024 * 1024 * 1024));\n    return freeGB;\n});\n\nfunction selectSharedFolder() {\n    electron.dialog\n        .showOpenDialog({\n            title: \"Select Folder to Share\",\n            properties: [\"openDirectory\"],\n            defaultPath: sharedFolderPath.value || os.homedir(),\n        })\n        .then(result => {\n            if (!result.canceled && result.filePaths.length > 0) {\n                sharedFolderPath.value = result.filePaths[0];\n            }\n        });\n}\n\nfunction install() {\n    const installConfig: InstallConfiguration = {\n        windowsVersion: windowsVersion.value,\n        windowsLanguage: windowsLanguage.value,\n        cpuCores: cpuCores.value,\n        ramGB: ramGB.value,\n        installFolder: installFolder.value,\n        diskSpaceGB: diskSpaceGB.value,\n        username: username.value,\n        password: password.value,\n        sharedFolderPath: folderSharing.value ? sharedFolderPath.value : undefined,\n        ...(customIsoPath.value ? { customIsoPath: customIsoPath.value } : {}),\n        container: containerRuntime.value, // Hardcdde for now\n    };\n\n    const wbConfig = WinboatConfig.getInstance(); // Create winboat config.\n    wbConfig.config.containerRuntime = containerRuntime.value; // Save which runtime to use.\n\n    installManager = new InstallManager(installConfig);\n\n    // Begin installation and attach event listeners\n    installManager.emitter.on(\"stateChanged\", newState => {\n        installState.value = newState;\n        console.log(\"Install state changed\", newState);\n    });\n\n    installManager.emitter.on(\"preinstallMsg\", msg => {\n        preinstallMsg.value = msg;\n        console.log(\"Preinstall msg\", msg);\n    });\n\n    installManager.emitter.on(\"vncPortChanged\", port => {\n        vncPort.value = port;\n    });\n\n    installManager.install();\n}\n</script>\n\n<style>\n.gradient-bg {\n    width: 90vw;\n    height: 80vh;\n    border-radius: 10px;\n    background:\n        linear-gradient(197.37deg, #7450db -0.38%, rgba(138, 234, 240, 0) 101.89%),\n        linear-gradient(115.93deg, #3e88f6 4.86%, rgba(62, 180, 246, 0.33) 38.05%, rgba(62, 235, 246, 0) 74.14%),\n        radial-gradient(\n            56.47% 76.87% at 6.92% 7.55%,\n            rgba(62, 136, 246, 0.7) 0%,\n            rgba(62, 158, 246, 0.182) 52.16%,\n            rgba(62, 246, 246, 0) 100%\n        ),\n        linear-gradient(306.53deg, #2ee4e3 19.83%, rgba(46, 228, 227, 0) 97.33%);\n    background-blend-mode: normal, normal, normal, normal, normal, normal;\n    filter: blur(50px);\n}\n\n.step-block {\n    @apply flex flex-col gap-4 h-full justify-center;\n}\n\n.flex p {\n    margin-top: 5px;\n    margin-bottom: 5px;\n}\n\n/* Transitions */\n.bounce-enter-active {\n    animation: bounce-in 0.4s;\n}\n.bounce-leave-active {\n    animation: bounce-in 0.4s reverse;\n}\n\n@keyframes bounce-in {\n    0% {\n        transform: scale(0.7) translateY(-20%);\n        opacity: 0%;\n    }\n    100% {\n        transform: scale(1) translateY(0);\n    }\n}\n\n.bouncedown-enter-active {\n    animation: bouncedown-in 0.5s;\n}\n.bouncedown-leave-active {\n    animation: bouncedown-in 0.5s reverse;\n}\n@keyframes bouncedown-in {\n    0% {\n        transform: scale(0.7) translateY(-20%);\n        opacity: 0%;\n    }\n    100% {\n        transform: scale(1) translateY(0);\n    }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/vite-env.d.ts",
    "content": "/// <reference types=\"vite/client\" />\n\ndeclare module \"*.vue\" {\n    import type { DefineComponent } from \"vue\";\n    const component: DefineComponent<{}, {}, any>;\n    export default component;\n}\n"
  },
  {
    "path": "src/renderer/window.d.ts",
    "content": "type Specs = import(\"../types\").Specs;\n\ninterface Window {\n    electronAPI: {\n        executeShellCommand: (command: string) => Promise<string>;\n        openLink: (link: string) => Promise<void>;\n        minimizeWindow: () => void;\n        maximizeWindow: () => void;\n        closeWindow: () => void;\n        specs: () => Promise<Specs>;\n    };\n}\n"
  },
  {
    "path": "src/types.ts",
    "content": "import { type WindowsVersionKey } from \"./renderer/lib/constants\";\nimport { ContainerRuntimes } from \"./renderer/lib/containers/common\";\nimport { type Winboat } from \"./renderer/lib/winboat\";\n\nexport type Specs = {\n    cpuCores: number;\n    ramGB: number;\n    kvmEnabled: boolean;\n    freeRDP3Installed: boolean;\n};\n\nexport type InstallConfiguration = {\n    windowsVersion: WindowsVersionKey;\n    windowsLanguage: string;\n    cpuCores: number;\n    ramGB: number;\n    installFolder: string;\n    diskSpaceGB: number;\n    username: string;\n    password: string;\n    customIsoPath?: string;\n    sharedFolderPath?: string;\n    container: ContainerRuntimes;\n};\n\nexport type WinApp = {\n    id?: string;\n    Name: string;\n    Path: string;\n    Args: string;\n    Icon: string;\n    Source: string;\n    Usage?: number;\n};\n\nexport type CustomAppCallbacks = {\n    [key: string]: null | ((context: Winboat) => void);\n};\n\nexport type PortEntryProtocol = \"tcp\" | \"udp\";\n\nexport type LongPortMapping = {\n    target: number;\n    published?: string;\n    host_ip?: string;\n    protocol?: PortEntryProtocol;\n    app_protocol?: string;\n    mode?: \"host\" | \"ingress\";\n    name?: string;\n};\n\nexport type ComposeConfig = {\n    name: string;\n    volumes: {\n        [key: string]: null | string;\n    };\n    networks?: {\n        [key: string]: {\n            external: boolean;\n        };\n    };\n    services: {\n        windows: {\n            image: string;\n            container_name: string;\n            environment: {\n                VERSION: WindowsVersionKey;\n                RAM_SIZE: string;\n                CPU_CORES: string;\n                DISK_SIZE: string;\n                USERNAME: string;\n                PASSWORD: string;\n                HOME: string;\n                LANGUAGE: string;\n                ARGUMENTS: string;\n                HOST_PORTS: string;\n                [key: string]: string; // Allow additional env vars\n            };\n            privileged?: boolean;\n            ports: Array<string | LongPortMapping>;\n            network_mode?: string;\n            cap_add: string[];\n            stop_grace_period: string;\n            restart: string;\n            volumes: string[];\n            devices: string[];\n        };\n    };\n};\n\nexport type Metrics = {\n    cpu: {\n        usage: number; // Percentage, from 0 to 100%\n        frequency: number; // Frequency in Mhz (e.g. 2700)\n    };\n    ram: {\n        used: number; // RAM Usage in MB (e.g. 500)\n        total: number; // RAM Total in MB (e.g. 4096)\n        percentage: number; // RAM Usage in percentage (e.g. 70%)\n    };\n    disk: {\n        used: number; // Disk Usage in MB (e.g. 29491)\n        total: number; // Disk Total in MB (e.g. 102400)\n        percentage: number; // Disk Usage in percentage (e.g. 70%)\n    };\n};\n\nexport type GuestServerVersion = {\n    version: string;\n    commit_hash: string;\n    build_time: string;\n};\n\nexport type GuestServerUpdateResponse = {\n    filename: string;\n    status: string;\n    temp_path: string;\n};\n\nexport type USBDevice = {\n    vendorID: string;\n    productID: string;\n    alias: string;\n};\n"
  },
  {
    "path": "tailwind.config.ts",
    "content": "/** @type {import('tailwindcss').Config} */\nexport default {\n    content: [\"./src/renderer/index.html\", \"./src/renderer/**/*.{vue,js,ts,jsx,tsx}\"],\n    darkMode: false, // or 'media' or 'class'\n    theme: {\n        extend: {},\n    },\n    variants: {\n        extend: {},\n    },\n    plugins: [],\n};\n"
  },
  {
    "path": "vite.config.ts",
    "content": "import path from \"path\";\nimport vuePlugin from \"@vitejs/plugin-vue\";\nimport { defineConfig } from \"vite\";\nimport * as packageJson from \"./package.json\";\n\nconst config = defineConfig({\n    root: path.join(__dirname, \"src\", \"renderer\"),\n    publicDir: \"public\",\n    server: {\n        port: 8080,\n    },\n    define: {\n        \"import.meta.env.VITE_APP_VERSION\": JSON.stringify(packageJson.version),\n        open: false,\n    },\n    build: {\n        outDir: path.join(__dirname, \"build\", \"renderer\"),\n        emptyOutDir: true,\n        chunkSizeWarningLimit: NaN, // Not needed for a desktop app\n    },\n    plugins: [\n        vuePlugin({\n            template: {\n                compilerOptions: {\n                    isCustomElement: tag => tag.startsWith(\"x-\"),\n                },\n            },\n        }),\n    ],\n    resolve: {\n        alias: {\n            path: \"path-browserify\",\n        },\n    },\n});\n\nexport default config;\n"
  }
]